DZVents : Altitude et azimut du soleil sans API

Bonjour,
pour tenter d’automatiser un éventuel store banne ou des volets roulants en fonction du soleil, la position du soleil semble requise.
voici un script qui permet le calcul de l’altitude et de l’azimut du soleil sans aucune API.


le script s’appuie sur les données de géolocalisation inscrites dans les paramètres mais vous pouvez les inscrire en dur afin de calculer la position du soleil pour un autre lieu que celui configuré. les formules sont issues de stackoverflow.
Vous pouvez comparer les résultats de ce script avec le site suncalc.org

le script complet

--[[ sunAzimuth.lua for [ dzVents >= 2.4.14 (domoticz >= V4.10444)]

author/auteur = papoo
update/mise à jour = 04/08/2019
creation = 04/08/2019

place this DZvents script in /domoticz/scripts/dzVents/scripts/ directory
script dzvents à placer dans le répertoire /domoticz/scripts/dzVents/scripts/
DZVents : Altitude et azimut du soleil sans API
https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/sunAzimuth.lua https://easydomoticz.com/forum/viewtopic.php?f=17&t=8787 --]] local scriptName = 'sun azimuth' local scriptVersion = '1.0' local solarAltitude = 'Altitude du soleil' -- name or idx without '' of the sun altitude device, nil if not used local solarAzimuth = 'Azimut du soleil' -- name or idx without '' of the sun azimuth device, nil if not used return { active = true, on = { timer = {'every minute'}}, logging = { level = domoticz.LOG_DEBUG, -- level = domoticz.LOG_INFO, -- Seulement un niveau peut être actif; commenter les autres -- level = domoticz.LOG_ERROR, -- Only one level can be active; comment others -- level = domoticz.LOG_MODULE_EXEC_INFO, marker = scriptName..' v'..scriptVersion }, execute = function(domoticz) local function logWrite(str,level) -- Support function for shorthand debug log statements domoticz.log(tostring(str),level or domoticz.LOG_DEBUG) end local latitude = domoticz.settings.location.latitude --local latitude = '45.83' logWrite('latitude : '..latitude) local longitude = domoticz.settings.location.longitude --local longitude = '1.26' logWrite('longitude : '..longitude) local function sunposition(latitude, longitude, time)-- solar altitude, azimuth (degrees) --source https://stackoverflow.com/questions/35467309/position-of-the-sun-azimuth-in-lua time = time or os.time() if type(time) == 'table' then time = os.time(time) end local date = os.date('*t', time) local timezone = (os.time(date) - os.time(os.date('!*t', time))) / 3600 if date.isdst then timezone = timezone + 1 end local utcdate = os.date('*t', time - timezone * 3600) local latrad = math.rad(latitude) local fd = (utcdate.hour + utcdate.min / 60 + utcdate.sec / 3600) / 24 local g = (2 * math.pi / 365.25) * (utcdate.yday + fd) local d = math.rad(0.396372 - 22.91327 * math.cos(g) + 4.02543 * math.sin(g) - 0.387205 * math.cos(2 * g) + 0.051967 * math.sin(2 * g) - 0.154527 * math.cos(3 * g) + 0.084798 * math.sin(3 * g)) local t = math.rad(0.004297 + 0.107029 * math.cos(g) - 1.837877 * math.sin(g) - 0.837378 * math.cos(2 * g) - 2.340475 * math.sin(2 * g)) local sha = 2 * math.pi * (fd - 0.5) + t + math.rad(longitude) local sza = math.acos(math.sin(latrad) * math.sin(d) + math.cos(latrad) * math.cos(d) * math.cos(sha)) local saa = math.acos((math.sin(d) - math.sin(latrad) * math.cos(sza)) / (math.cos(latrad) * math.sin(sza))) return 90 - math.deg(sza), math.deg(saa) end local function getSunPos(lat, long, time) findTime = {} findTime.hour, findTime.min = time.hour, time.min fixedAzimuthLast, fixedAzimuth = 0, 0 for i=0,23 do for j=0,59 do time.hour, time.min = i, j local altitude, azimuth = sunposition(lat, long, time) -- fix azimuth if fixedAzimuthLast < azimuth then fixedAzimuthLast = azimuth fixedAzimuth = fixedAzimuthLast else fixedAzimuth = fixedAzimuthLast + (180 - azimuth) end -- find azimuth at target time if findTime.hour == i and findTime.min == j then -- final result return altitude, fixedAzimuth end end end end altitude, azimuth = getSunPos(latitude, longitude, os.date('*t', os.time())) logWrite('solar altitude : '..domoticz.utils.round(altitude),2) logWrite('solar azimut : '..domoticz.utils.round(azimuth),2) if (solarAltitude) and (altitude) then domoticz.devices(solarAltitude).updateCustomSensor(altitude) end if (solarAzimuth) and (azimuth) then domoticz.devices(solarAzimuth).updateCustomSensor(azimuth) end end -- execute function }

retrouver la dernière version de ce script sur



 Site Officiel :   github.com

et deux icônes pour personnaliser vos custom devices



 Site Officiel :   github.com

Laisser un commentaire