Rogerbl Skrevet 30. april 2019 Skrevet 30. april 2019 På 28.4.2019 den 17.50, Rogerbl skrev: Dessverre, har skanna nettet etter en løsning på det men ikke funnet noen hittil. En får nøye seg med pålitelige data om dag og natt... spennende hva som vises etter vi går inn i midnattsoltida her nord. Da burde det stå permanent dag, håper også på at det blir permanent natt i mørketida. Vi får se.. ? Her har jeg et script for domoticz som visstnok skal kunne hente ut LUX verdier uavhengig av hviken kilde du har, men det trenger visse data som skydekke, sol altitude mm for å virke. Hvis det er noen som vil oversette dette til f.eks python? lux.txt Siter
Moskus Skrevet 1. mai 2019 Skrevet 1. mai 2019 11 timer siden, Rogerbl skrev: Her har jeg et script for domoticz som visstnok skal kunne hente ut LUX verdier uavhengig av hviken kilde du har, men det trenger visse data som skydekke, sol altitude mm for å virke. Hvis det er noen som vil oversette dette til f.eks python? lux.txt Det er vel dette scriptet hele denne tråden er basert på, trodde jeg. Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 1 minutt siden, Moskus skrev: Det er vel dette scriptet hele denne tråden er basert på, trodde jeg. Dette er en oppdatert versjon som ikke henter data eksternt fra WU, osv. Den tar seg bare av beregningene. Så hvis man kan få de nødvendige grunnlagsdata inn i devicer i HomeSeer, så kan man bruke scriptet til å beregne. Mulig man kan hente noe grunnlagsdata med Jon00DataScraper? 1 Siter
Moskus Skrevet 1. mai 2019 Skrevet 1. mai 2019 4 minutter siden, ZoRaC skrev: Mulig man kan hente noe grunnlagsdata med Jon00DataScraper? Det kan man sikkert, men det er jo mer praktisk å gjøre det uten i stor stil. Du burde seriøst se litt mer på C# eller vb, @ZoRaC. 4 minutter siden, ZoRaC skrev: Den tar seg bare av beregningene. AH, OK. Lettere å konvertere til VB.net da. Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 5 minutter siden, Moskus skrev: Det kan man sikkert, men det er jo mer praktisk å gjøre det uten i stor stil. Du burde seriøst se litt mer på C# eller vb, @ZoRaC. AH, OK. Lettere å konvertere til VB.net da. Jeg mener å ha lest at de som bruker scriptet på Domoticz nå henter alle grunnlagsdata fra Dark Sky sitt API. Ser ut til at weatherXML støtter deres API nå, så kanskje den kan hente ut alt man trenger? i såfall er det jo bare for «noen» ( ) å skrive om beregningsscriptet til VB.net. Siter
Moskus Skrevet 1. mai 2019 Skrevet 1. mai 2019 Ja, scriptet som @Rogerbl postet ser jo forholdsvis greit ut. Nå er det ikke lenge til huset roer seg, kanskje jeg kan se på det da. Det er jo et savn. Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 2 timer siden, Moskus skrev: Ja, scriptet som @Rogerbl postet ser jo forholdsvis greit ut. Nå er det ikke lenge til huset roer seg, kanskje jeg kan se på det da. Det er jo et savn. Her er en start, som gir sun alt. og azimuth (kalkulert, ikke hentet fra API! ? https://forums.homeseer.com/forum/developer-support/scripts-plug-ins-development-and-libraries/script-plug-in-library/1286064-solar-position-script Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 35 minutter siden, ZoRaC skrev: Her er en start, som gir sun alt. og azimuth (kalkulert, ikke hentet fra API! ? https://forums.homeseer.com/forum/developer-support/scripts-plug-ins-development-and-libraries/script-plug-in-library/1286064-solar-position-script ja, har prøvd dette, men det gir avikende resultat i forhold til Suncalc.net og andre kilder: suncalc.net og NOOA: 36.16 176.64 script: 28.2 125,1 Mulig jeg har oversett noen settinger i scriptet, men la inn lon og lat.. Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 1 minutt siden, Rogerbl skrev: ja, har prøvd dette, men det gir avikende resultat i forhold til Suncalc.net og andre kilder: suncalc.net og NOOA: 36.16 176.64 script: 28.2 125,1 Mulig jeg har oversett noen settinger i scriptet, men la inn lon og lat.. Brukte du riktig tidssone på suncalc.net? Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 (endret) 6 minutter siden, ZoRaC skrev: Brukte du riktig tidssone på suncalc.net? tidssone 1 og DST i NOAA stemmer med suncalc.org https://www.esrl.noaa.gov/gmd/grad/solcalc/ Endret 1. mai 2019 av Rogerbl Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 Kan det være at lat eller lon må oppgis med negativt fortegn? Mener det har vært en bug på det i HomeSeer tidligere, så kanskje samme problem gjelder her? Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 (endret) 5 timer siden, ZoRaC skrev: Kan det være at lat eller lon må oppgis med negativt fortegn? Mener det har vært en bug på det i HomeSeer tidligere, så kanskje samme problem gjelder her? Ja det kan være at lengdegrad(lon) må oppgis med negativt fortegn , skal prøve det. Prøvd å ta vekk negativt fortegn på lon og da stemmer dataene!! Takk for innspill!? Endret 1. mai 2019 av Rogerbl 1 Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 Trenger man «sun radiation» for å beregne Lux? Hva med Octa? Ser noen API har «cloudlyness» (0-100), det kan kanskje brukes som Octa? Eller må man bare hente Octa fra samme kilde som før? Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 (endret) 2 minutter siden, ZoRaC skrev: Trenger man «sun radiation» for å beregne Lux? Hva med Octa? Ser noen API har «cloudlyness» (0-100), det kan kanskje brukes som Octa? Eller må man bare hente Octa fra samme kilde som før? Man trenger octa i beregningen. Octa går fra 0 til 8, hvor 8 er helt overskyet. 4 er 50% skydekke osv. Sun radiation er jeg usikker på. Endret 1. mai 2019 av Rogerbl Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 1 minutt siden, Rogerbl skrev: Man trenger octa i beregningen. Octa går fra 0 til 8, hvor 8 er helt overskyet. 4 er 50% skydekke osv. Sun radiation er jeg usikker på. Men jeg ser ikke Octa i det scriptet du la ut i går? Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 (endret) 12 minutter siden, ZoRaC skrev: Men jeg ser ikke Octa i det scriptet du la ut i går? Kanskje det heter noe annet som CloudCover e.l. ? local idxCloudCover = 78 -- (Integer) Device ID of device holding cloudcoverage local idxBarometer = 75 -- (Integer) Device ID of device barometric presusure -- Variables to customize (can be nil )------------------------------------------ local idxSolarAzimuth = 1997 -- (Integer) Virtual Azimuth Device ID local idxSolarAltitude = 1998 -- (Integer) Your virtual Solar Altitude Device ID local idxRadiation = 1999 -- (Integer) Domoticz virtual Radiation device ID local idxLux = 1996 -- (Integer) Domoticz virtual Lux device ID Du trenger verdiene ovenfor... Endret 1. mai 2019 av Rogerbl Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 3 minutter siden, Rogerbl skrev: Kanskje det heter noe annet som CloudCover e.l. ? Du har rett - de har brukt CloudCover og Okta (med K), så jeg kikket nok litt raskt. De regner om Octa til prosent, så da kan kanskje API som gir 0-100 for «cloudlyness» funke. 1 Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 Forøvrig ser jeg at Homeseer nå viser riktig soloppgang/nedgang etter at jeg tok vekk minus fortegn på lengdegrad. Må ha vært en bug der tidligere... Men blir likevel spennende å se om den takler midnattsol og mørketid. Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 Da ser det ut til at man kan få det meste man trenger via Dark Sky API (cloud cover og barometer). Dette kan hentes med weatherXML eller Jon00DataScraper. Har åpnet en tråd her: https://forums.homeseer.com/forum/weather-plug-ins/weather-discussion/weatherxml-cfguy/1302303-dark-sky-cloud-cover Så da må @Moskus få ut fingeren og skrive om til VB.net... 1 Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 Sånn, da har jeg alle grunndata på plass igjen! 1 Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 (endret) 6 minutter siden, ZoRaC skrev: Da ser det ut til at det virker igjen! Mener du at det opprinnelige scriptet mot weather underground er oppe igjen? Eller har du gjort en jobb med de dataene selv? Endret 1. mai 2019 av Rogerbl Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 13 minutter siden, Rogerbl skrev: Mener du at det opprinnelige scriptet mot weather underground er oppe igjen? Eller har du gjort en jobb med de dataene selv? Jeg har modifisert scriptet slik at den ikke bruker verken WU eller OGIMET lengre. 1 Siter
Rogerbl Skrevet 1. mai 2019 Skrevet 1. mai 2019 Bra jobba! Etter å ha gått gjennom scriptet så ser jeg at det er mulig å beregne det meste utifra Darksky data. Har du tenkt å dele dette modifiserte scriptet? ? Siter
ZoRaC Skrevet 1. mai 2019 Skrevet 1. mai 2019 Her er workaround til @Moskus får skrevet om hele sulamitten til VB.net. 1. Opprett scriptet "sun-azimuth-altitude.vb": Spoiler 'From c code posted here: http://www.psa.es/sdg/sunpos.htm 'VB.NET Conversion posted here: http://www.vbforums.com/showthread.php?832645-Solar-position-calculator 'converted for HomeSeer use by Sparkman v1.0 Imports System.Math Sub Main(ByVal Parms As String) Dim Debug As Boolean = False Dim logName As String = "Solar Position" Dim dLatitude As Double = 71.1234 Dim dLongitude As Double = 11.1234 Dim hsAzimuthDevice As Integer = 198 Dim hsAltitudeDevice As Integer = 191 Dim pi As Double = 3.14159265358979 Dim rad As Double = pi / 180 Dim dEarthMeanRadius As Double = 6371.01 Dim dAstronomicalUnit As Double = 149597890 Dim iYear As Integer = DateTime.UtcNow.Year Dim iMonth As Integer = DateTime.UtcNow.Month Dim iDay As Integer = DateTime.UtcNow.Day Dim dHours As Double = DateTime.UtcNow.Hour Dim dMinutes As Double = DateTime.UtcNow.Minute Dim dSeconds As Double = DateTime.UtcNow.Second Dim dZenithAngle As Double Dim dZenithAngleParallax As Double Dim dAzimuth As Double Dim dAltitudeAngle As Double Dim dElapsedJulianDays As Double Dim dDecimalHours As Double Dim dEclipticLongitude As Double Dim dEclipticObliquity As Double Dim dRightAscension As Double Dim dDeclination As Double Dim dY As Double Dim dX As Double Dim dJulianDate As Double Dim liAux1 As Integer Dim liAux2 As Integer Dim dMeanLongitude As Double Dim dMeanAnomaly As Double Dim dOmega As Double Dim dSin_EclipticLongitude As Double Dim dGreenwichMeanSiderealTime As Double Dim dLocalMeanSiderealTime As Double Dim dLatitudeInRadians As Double Dim dHourAngle As Double Dim dCos_Latitude As Double Dim dSin_Latitude As Double Dim dCos_HourAngle As Double Dim dParallax As Double Try ' Calculate difference in days between the current Julian Day and JD 2451545.0, which is noon 1 January 2000 Universal Time ' Calculate time of the day in UT decimal hours dDecimalHours = dHours + (dMinutes + dSeconds / 60.0) / 60.0 ' Calculate current Julian Day liAux1 = (iMonth - 14) \ 12 liAux2 = (1461 * (iYear + 4800 + liAux1)) \ 4 + (367 * (iMonth - 2 - 12 * liAux1)) \ 12 - (3 * ((iYear + 4900 + liAux1) \ 100)) \ 4 + iDay - 32075 dJulianDate = CDbl(liAux2) - 0.5 + dDecimalHours / 24.0 ' Calculate difference between current Julian Day and JD 2451545.0 dElapsedJulianDays = dJulianDate - 2451545.0 If Debug Then hs.writelog(logName,"Elapsed Julian Days Since 2000/01/01: " & CStr(dElapsedJulianDays)) ' Calculate ecliptic coordinates (ecliptic longitude and obliquity of the ecliptic in radians but without limiting the angle to be less than 2*Pi ' (i.e., the result may be greater than 2*Pi) dOmega = 2.1429 - 0.0010394594 * dElapsedJulianDays dMeanLongitude = 4.895063 + 0.017202791698 * dElapsedJulianDays ' Radians dMeanAnomaly = 6.24006 + 0.0172019699 * dElapsedJulianDays dEclipticLongitude = dMeanLongitude + 0.03341607 * Math.Sin(dMeanAnomaly) + 0.00034894 * Math.Sin(2 * dMeanAnomaly) - 0.0001134 - 0.0000203 * Math.Sin(dOmega) dEclipticObliquity = 0.4090928 - 0.000000006214 * dElapsedJulianDays + 0.0000396 * Math.Cos(dOmega) If Debug Then hs.writelog(logName,"Ecliptic Longitude: " & CStr(dEclipticLongitude)) If Debug Then hs.writelog(logName,"Ecliptic Obliquity: " & CStr(dEclipticObliquity)) ' Calculate celestial coordinates ( right ascension and declination ) in radians but without limiting the angle to be less than 2*Pi (i.e., the result may be greater than 2*Pi) dSin_EclipticLongitude = Math.Sin(dEclipticLongitude) dY = Math.Cos(dEclipticObliquity) * dSin_EclipticLongitude dX = Math.Cos(dEclipticLongitude) dRightAscension = Math.Atan2(dY, dX) If dRightAscension < 0.0 Then dRightAscension = dRightAscension + (2 * pi) End If dDeclination = Math.Asin(Math.Sin(dEclipticObliquity) * dSin_EclipticLongitude) If Debug Then hs.writelog(logName,"Declination: " & CStr(dDeclination)) ' Calculate local coordinates ( azimuth and zenith angle ) in degrees dGreenwichMeanSiderealTime = 6.6974243242 + 0.0657098283 * dElapsedJulianDays + dDecimalHours dLocalMeanSiderealTime = (dGreenwichMeanSiderealTime * 15 + dLongitude) * rad dHourAngle = dLocalMeanSiderealTime - dRightAscension If Debug Then hs.writelog(logName,"Hour Angle: " & CStr(dHourAngle)) dLatitudeInRadians = dLatitude * rad dCos_Latitude = Math.Cos(dLatitudeInRadians) dSin_Latitude = Math.Sin(dLatitudeInRadians) dCos_HourAngle = Math.Cos(dHourAngle) dZenithAngle = (Math.Acos(dCos_Latitude * dCos_HourAngle * Math.Cos(dDeclination) + Math.Sin(dDeclination) * dSin_Latitude)) dY = -Math.Sin(dHourAngle) dX = Math.Tan(dDeclination) * dCos_Latitude - dSin_Latitude * dCos_HourAngle dAzimuth = Math.Atan2(dY, dX) If dAzimuth < 0.0 Then dAzimuth = dAzimuth + (2 * pi) End If dAzimuth = dAzimuth / rad If Debug Then hs.writelog(logName,"Azimuth: " & CStr(dAzimuth)) hs.setdevicevaluebyref(hsAzimuthDevice,dAzimuth,True) ' Parallax Correction dParallax = (dEarthMeanRadius / dAstronomicalUnit) * Math.Sin(dZenithAngle) dZenithAngleParallax = (dZenithAngle + dParallax) / rad dAltitudeAngle = (dZenithAngleParallax * -1) + 90 If Debug Then hs.writelog(logName,"Altitude Angle: " & CStr(dAltitudeAngle)) hs.setdevicevaluebyref(hsAltitudeDevice,dAltitudeAngle,True) Catch ex As Exception hs.WriteLog(logName, "Exception " & ex.ToString) End Try End Sub 2. Registrer deg og finn API-key hos Dark Sky: https://darksky.net/dev 3. Bruk denne i Jon00DataScraper: [Grab15] Devicemode=2 Path=https://api.darksky.net/forecast/API-KEY/71.123,11.123 Encoding=UTF-8 Pattern1=(?s)"currently".*?"cloudCover":(.*?), Pattern2=(?s)"currently".*?"pressure":(.*?), DeviceName1=CloudCover (DarkSky API) DeviceValue1=[0] DeviceText1=[0] DeviceName2=Pressure (DarkSky API) DeviceValue2=[100] DeviceText2=[100] 4. Jeg har valgt å bruke den eksisterende Octa-devicen, så da må man i eventet legge til denne som "immidiate script": &hs.setDeviceValueByRef(<octa-dvRef>, hs.DeviceValueEx(<cloudcover-dvRef>)*100/12.5, True) PS! Etter at «cloud cover»-devicen har blitt opprettet, så må du inn på «status graphics» og definere at den har to desimaler! 5. Bytt ut SolarSensor.lua med denne: Spoiler #!/usr/bin/lua --[[ Virtual Lux sensor and other real-time solar data -- Autors ---------------------------------------------------------------- V1.0 - Sébastien Joly - Great original work V1.1 - Neutrino - Adaptation to Domoticz V1.2 - Jmleglise - An acceptable approximation of the lux below 1° altitude for Dawn and dusk + translation + several changes to be more userfriendly. V1.3 - Jmleglise - No update of the Lux data when <=0 to get the sunset and sunrise with lastUpdate V1.4 - use the API instead of updateDevice to update the data of the virtual sensor to be able of using devicechanged['Lux'] in our scripts. (Due to a bug in Domoticz that doesn't catch the devicechanged event of the virtual sensor) VH.1 - Adapted by Diderik From @ hjemmeautomasjon.no to work with HomeSeer instead of domoticz. All credits go to the originial creators. I am just happy if someone ha suse ot this. Disclaimer! I really did not lua before I started, but this works for me. VH.2 - Adapted by ZoRaC From @ hjemmeautomasjon.no to remove WU and OGIMET ]]-- -- Variables to customize ------------------------------------------------ local localhost = 'localhost' ---IF YOU ARE RUNNING THIS ON A RENOTE LOCATION FROM YOUR HS INSTALL, change localhost to your HS IP in the curl calls. local idxLux ='123' -- Your virtual Lux Device ID local idxSolarAzimuth ='321' -- Your virtual Azimuth Device ID local idxSolarAltitude ='234' -- Your virtual Solar Altitude Device ID local idxUserVarOcta='345' -- Your user variable ID , named octa local idxUserVarPressure='567' -- Your user variable ID , named pressure local idxUserVardirectRadiation='678' -- Your user variable ID , named Radiation, direct local idxUserVarscatteredRadiation='789' -- Your user variable ID , named Radiation, indirect local idxUserVartotalRadiation='987' -- Your user variable ID , named Radiation, total local latitude = 71.123 -- your home latitude local longitude = 11.123 -- your home longitude local altitude = 123 -- Your home altitude local DEBUG = 2 -- 0 , 1 for domoticz log , 2 for file log -- and customize the path to the helper scrip JSON.lua around line 59. -- Below , edit at your own risk ------------------------------------------ function leapYear(year) return year%4==0 and (year%100~=0 or year%400==0) end function split(s, delimiter) result = {}; for match in (s..delimiter):gmatch("(.-)"..delimiter) do table.insert(result, match); end return result; end function round(num, dec) if num == 0 then return 0 else local mult = 10^(dec or 0) return math.floor(num * mult + 0.5) / mult end end commandArray = {} time = os.date("*t") -- EDITED -- if ((time.min % 5)==0) then -- Run every 5 minutes. Check the wundergroud API limitation before changing this --- CHANGE THE path BELOW ACCORDING TO WHERE YOU HAVE PLACED JSOB.lua json = (loadfile "/usr/local/HomeSeer/scripts/JSON.lua")() -- Changed. For this install -- EDITED ---EDITED --- GETTING octa from HS using JSON decode to get only value local handle = io.popen("curl -s --insecure 'https://localhost/JSON?request=getstatus&ref="..idxUserVarOcta.."'") local octafull = handle:read("*a") handle:close() local jsonOctafull = json:decode(octafull) local octanest = jsonOctafull.Devices local octamainnest = octanest[1] local octa = octamainnest.value print('octa:'..octa) commandArray = {} -- Could remove this when moved below next command array uservariables = {["octa"] = tostring(octa)} print( uservariables["octa"] ) ---EDITING END local arbitraryTwilightLux=6.32 -- W/m² egal 800 Lux (the theoritical value is 4.74 but I have more accurate result with 6.32...) local constantSolarRadiation = 1361 -- Solar Constant W/m² if (uservariables['octa'] == nil) then print("Error : Did you create the Uservariable octa ?") end ---EDITED --- GETTING pressure from HS using JSON decode to get only value local handle = io.popen("curl -s --insecure 'https://localhost/JSON?request=getstatus&ref="..idxUserVarPressure.."'") local pressurefull = handle:read("*a") handle:close() local jsonPressurefull = json:decode(pressurefull) local pressurenest = jsonPressurefull.Devices local pressuremainnest = pressurenest[1] local pressure = pressuremainnest.value print('pressure:'..pressure) commandArray = {} -- Could remove this when moved below next command array uservariables = {["pressure"] = tostring(pressure)} print( uservariables["pressure"] ) relativePressure = pressure ---EDITING END ---------------------------------- local year = os.date("%Y") local numOfDay = os.date("%j") if leapYear(year) == true then nbDaysInYear = 366 -- How many days in the year ? else nbDaysInYear = 365 end angularSpeed = 360/365.25 local Declinaison = math.deg(math.asin(0.3978 * math.sin(math.rad(angularSpeed) *(numOfDay - (81 - 2 * math.sin((math.rad(angularSpeed) * (numOfDay - 2)))))))) timeDecimal = (os.date("!%H") + os.date("!%M") / 60) -- Coordinated Universal Time (UTC) solarHour = timeDecimal + (4 * longitude / 60 ) -- The solar Hour hourlyAngle = 15 * ( 12 - solarHour ) -- hourly Angle of the sun sunAltitude = math.deg(math.asin(math.sin(math.rad(latitude))* math.sin(math.rad(Declinaison)) + math.cos(math.rad(latitude)) * math.cos(math.rad(Declinaison)) * math.cos(math.rad(hourlyAngle))))-- the height of the sun in degree, compared with the horizon local azimuth = math.acos((math.sin(math.rad(Declinaison)) - math.sin(math.rad(latitude)) * math.sin(math.rad(sunAltitude))) / (math.cos(math.rad(latitude)) * math.cos(math.rad(sunAltitude) ))) * 180 / math.pi -- deviation of the sun from the North, in degree local sinAzimuth = (math.cos(math.rad(Declinaison)) * math.sin(math.rad(hourlyAngle))) / math.cos(math.rad(sunAltitude)) if(sinAzimuth<0) then azimuth=360-azimuth end sunstrokeDuration = math.deg(2/15 * math.acos(- math.tan(math.rad(latitude)) * math.tan(math.rad(Declinaison)))) -- duration of sunstroke in the day . Not used in this calculation. RadiationAtm = constantSolarRadiation * (1 +0.034 * math.cos( math.rad( 360 * numOfDay / nbDaysInYear ))) -- Sun radiation (in W/m²) in the entrance of atmosphere. -- Coefficient of mitigation M absolutePressure = relativePressure - round((altitude/ 8.3),1) -- hPa sinusSunAltitude = math.sin(math.rad(sunAltitude)) M0 = math.sqrt(1229 + math.pow(614 * sinusSunAltitude,2)) - 614 * sinusSunAltitude M = M0 * relativePressure/absolutePressure if (DEBUG == 1) then print('<b style="color:Blue"============== SUN LOG ==================</b>') print(os.date("%Y-%m-%d %H:%M:%S", os.time())) print(city .. ", latitude:" .. latitude .. ", longitude:" .. longitude) print("Home altitude = " .. tostring(altitude) .. " m") print("number Of Day = " .. numOfDay) if nbDaysInYear==366 then print(year .." is a leap year !") else print(year.." is not a leap year") end print("Angular Speed = " .. angularSpeed .. " per day") print("Declinaison = " .. Declinaison .. "°") print("Universel Coordinated Time (UTC)".. timeDecimal .." H.dd") print("Solar Hour ".. solarHour .." H.dd") print("Altitude of the sun = " .. sunAltitude .. "°") print("Angular hourly = ".. hourlyAngle .. "°") print("Azimuth of the sun = " .. azimuth .. "°") print("Duration of the sunstroke of the day = " .. round(sunstrokeDuration,2) .." H.dd") -- not used print("Radiation max in atmosphere = " .. round(RadiationAtm,2) .. " W/m²") print("Local relative pressure = " .. relativePressure .. " hPa") print("Absolute pressure in atmosphere = " .. absolutePressure .. " hPa") print("Coefficient of mitigation M = " .. M .." M0:"..M0) end Octa = octa -- Octa = string.sub(rslt[3], 1, 1) -- 3rd char is the cloud layer. 0=no cloud , 1-8= cloudy from 1 to 8 max , 9 =Fog , / = no data --os.execute('curl "http://127.0.0.1:8081/json.htm?type=command¶m=updateuservariable&idx='..idxUserVarOcta..'&vname=octa&vtype=0&vvalue='..tostring(Octa)..'"') commandArray[#commandArray + 1] = {['Variable:octa'] = tostring(Octa)} Kc=1-0.75*math.pow(Octa/8,3.4) -- Factor of mitigation for the cloud layer if sunAltitude > 1 then -- Below 1° of Altitude , the formulae reach their limit of precision. directRadiation = RadiationAtm * math.pow(0.6,M) * sinusSunAltitude scatteredRadiation = RadiationAtm * (0.271 - 0.294 * math.pow(0.6,M)) * sinusSunAltitude totalRadiation = scatteredRadiation + directRadiation Lux = totalRadiation / 0.0079 -- Radiation in Lux. 1 Lux = 0,0079 W/m² weightedLux = Lux * Kc -- radiation of the Sun with the cloud layer elseif sunAltitude <= 1 and sunAltitude >= -7 then -- apply theoretical Lux of twilight directRadiation = 0 scatteredRadiation = 0 arbitraryTwilightLux=arbitraryTwilightLux-(1-sunAltitude)/8*arbitraryTwilightLux totalRadiation = scatteredRadiation + directRadiation + arbitraryTwilightLux Lux = totalRadiation / 0.0079 -- Radiation in Lux. 1 Lux = 0,0079 W/m² weightedLux = Lux * Kc -- radiation of the Sun with the cloud layer elseif sunAltitude < -7 then -- no management of nautical and astronomical twilight... directRadiation = 0 scatteredRadiation = 0 totalRadiation = 0 Lux = 0 weightedLux = 0 -- should be around 3,2 Lux for the nautic twilight. Nevertheless. end if (DEBUG == 1) then print("Station SYNOP = " .. WMOID) print( Octa .. " Octa") print("Kc = " .. Kc) print("Direct Radiation = ".. round(directRadiation,2) .." W/m²") print("Scattered Radiation = ".. round(scatteredRadiation,2) .." W/m²") print("Total radiation = " .. round(totalRadiation,2) .." W/m²") print("Total Radiation in lux = ".. round(Lux,2).." Lux") print("and at last, Total weighted lux = ".. round(weightedLux,2).." Lux") end ---EDITED ---EDITED ---EDITED ---EDITED ---EDITED -- commandArray[#commandArray + 1] = {['UpdateDevice'] = idxSolarAzimuth..'|0|'..tostring(round(azimuth,0))} -- EDITED -- commandArray[#commandArray + 1] = {['UpdateDevice'] = idxSolarAltitude..'|0|'..tostring(round(sunAltitude,0))} -- EDITED ---EDITED Adding Adding curl calls to update HomeSeer VDs. os.execute ("curl --insecure 'https://localhost/JSON?request=controldevicebyvalue&ref="..idxLux.."&value="..weightedLux.."'") os.execute ("curl --insecure 'https://localhost/JSON?request=controldevicebyvalue&ref="..idxUserVardirectRadiation.."&value="..directRadiation.."'") os.execute ("curl --insecure 'https://localhost/JSON?request=controldevicebyvalue&ref="..idxUserVarscatteredRadiation.."&value="..scatteredRadiation.."'") os.execute ("curl --insecure 'https://localhost/JSON?request=controldevicebyvalue&ref="..idxUserVartotalRadiation.."&value="..totalRadiation.."'") if (DEBUG == 2) then logDebug=os.date("%Y-%m-%d %H:%M:%S",os.time()) logDebug=logDebug.." Azimuth:" .. azimuth .. " Height:" .. sunAltitude logDebug=logDebug.." Octa:" .. Octa.." KC:".. Kc logDebug=logDebug.." Direct:"..directRadiation.." inDirect:"..scatteredRadiation.." TotalRadiation:"..totalRadiation.." LuxCloud:".. round(weightedLux,2) os.execute('echo '..logDebug..' >>logSun.txt') -- compatible Linux & Windows end --end -- To remove time limit. -- EDITED return commandArray MERK: Hvis du ikke kjører HomeSeer på HTTPS, eller hvis du har aktivert at du må angi brukernavn og passord, så må du tilpasse curl-linjene over. 6. Så er det bare å endre litt på eventet: Ikke en veldig pen løsning/workaround, men det virker... 1 Siter
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.