Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Real-time solar data without any hardware sensor


Anbefalte innlegg

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

Lenke til kommentar
Del på andre sider

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.

Lenke til kommentar
Del på andre sider

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?

  • Like 1
Lenke til kommentar
Del på andre sider

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. :) 

Lenke til kommentar
Del på andre sider

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. :D 

Lenke til kommentar
Del på andre sider

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! :D?

https://forums.homeseer.com/forum/developer-support/scripts-plug-ins-development-and-libraries/script-plug-in-library/1286064-solar-position-script

Lenke til kommentar
Del på andre sider

35 minutter siden, ZoRaC 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..

Lenke til kommentar
Del på andre sider

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?

Lenke til kommentar
Del på andre sider

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 av Rogerbl
  • Like 1
Lenke til kommentar
Del på andre sider

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 av Rogerbl
Lenke til kommentar
Del på andre sider

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?

Lenke til kommentar
Del på andre sider

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 av Rogerbl
Lenke til kommentar
Del på andre sider

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. :) 

  • Like 1
Lenke til kommentar
Del på andre sider

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. 

Lenke til kommentar
Del på andre sider

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... ;) 

  • Like 1
Lenke til kommentar
Del på andre sider

6 minutter siden, ZoRaC skrev:

Da ser det ut til at det virker igjen! ;)

image.png.874a1a04373439c73d90b45f3082cd31.png

Mener du at det opprinnelige scriptet mot weather underground er oppe igjen?
Eller har du gjort en jobb med de dataene selv?

Endret av Rogerbl
Lenke til kommentar
Del på andre sider

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. :)

  • Like 1
Lenke til kommentar
Del på andre sider

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&param=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:

image.png.d6e108cd1525f479134da4191611e81d.png

 

 

Ikke en veldig pen løsning/workaround, men det virker... :P 

  • Like 1
Lenke til kommentar
Del på andre sider

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.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.