Quantcast
Channel: Domotique – pon.fr
Viewing all articles
Browse latest Browse all 66

DZVents : Altitude et azimut du soleil sans API

$
0
0

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/
https://pon.fr/dzvents-altitude-et-azimut-du-soleil-sans-api/
https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/sunAzimuth.lua
--]]


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

Viewing all articles
Browse latest Browse all 66

Trending Articles