[LUA-DzVents] Données Météo avec API Openweathermap

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Gilles_
Messages : 3
Inscription : 01 avr. 2023, 09:22

[LUA] Données Météo avec API Openweathermap

Message par Gilles_ »

Ma petite contribution pour les nouveaux inscrits sur Open Weather Map (mon code dzVents)

Code : Tout sélectionner

--[[ ~/home/pi/domoticz/scripts/dzVents/scripts/OpenWeatherMap.lua

author : gso
MAJ : 31/03/2023
création : 24/03/2023
Principe :
https://api.openweathermap.org/data/3.0/onecall?lat=48.0&lon=2.0&appid=[api_key]&units=metric&lang=fr&exclude=minutely,hourly
{"dt":1680069600,"temp":9.57,"feels_like":7.96,"pressure":1017,"humidity":79,"dew_point":5.89,"uvi":0,"clouds":100,"visibility":10000,"wind_speed":3.06,"wind_deg":204,"wind_gust":9.91
    ,"weather":[{"id":500,"main":"Rain","description":"légère pluie","icon":"10d"}],"pop":0.26
    ,"rain":{"1h":0.48}}]
    ,"alerts":[{"sender_name":"METEO-FRANCE","event":"Moderate thunderstorm warning","start":1680321640,"end":1680386400,"description":"Moderate damages may occur, especially in vulnerable or in exposed areas and to people who carry out weather-related activities.","tags":["Thunderstorm"]}]}	
}
apiKey = to get on https://openweathermap.org/api and set in domoticz.variables with name "apikey_openweathermap" or set it in the code
]]--

-- local 
local scriptName = 'OpenWeatherMap'
local scriptVersion = '1.0'
local uri = 'https://api.openweathermap.org/data/3.0/onecall'
local units = 'metric'
local lang = 'fr'
local exclude = 'minutely,hourly' --minutely,hourly,daily,alerts

local prefix = 'OWM'
local devices = { -- devices idx (to be changed accordingly), dz update device function
    -- Temperature (°C if metric)
    -- {idx = 0, cde = function (dz, idx, v) dz.devices(idx).updateTempHum(v.current.temp, v.current.humidity, dz.HUM_COMPUTE) end },
    -- Dew Point (°C)
    -- {idx = 0,   cde = function (dz, idx, v) dz.devices(idx).updateTemperature(v.current.dew_point) end },
    
    -- Pressure
    {idx = 986, cde = function (dz, idx, v) dz.devices(idx).updatePressure(v.current.pressure) end }, -- pressure
    
    --THB
    {idx = 982, cde = function (dz, idx, v) 
        local pop = v.daily[2].pop -- probability of precipitation for tomorrow
        local clouds = v.daily[2].clouds
        local baro = dz.BARO_NOINFO
        if pop >= 0.3 then baro = dz.BARO_RAIN
        elseif clouds >= 75 then baro = dz.BARO_CLOUDY
        elseif clouds >= 25 then baro = dz.BARO_PARTLY_CLOUDY
        else baro = dz.BARO_SUNNY
        end
        dz.devices(idx).updateTempHumBaro(v.current.temp, v.current.humidity, dz.HUM_COMPUTE, v.current.pressure, baro) 
    end },
    
    -- UV
    {idx = 981, cde = function (dz, idx, v) dz.devices(idx).updateUV(v.current.uvi) end },
    
    -- Clouds (%)
    {idx = 977, cde = function (dz, idx, v) dz.devices(idx).updatePercentage(v.current.clouds) end },
    
    -- Visibility (km)
    {idx = 983, cde = function (dz, idx, v) dz.devices(idx).updateVisibility(v.current.visibility/1000) end },
    
    -- Wind
    {idx = 984, cde = function (dz, idx, v)
        if v.current.wind_gust == nil then v.current.wind_gust = v.current.wind_speed end
        degrees = v.current.wind_deg
        local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
        local quad = 'N'
        if degrees <= 348.75 and degrees > 11.25 then quad = quadrants[tonumber(math.floor((degrees - 11.25) / 22.5)+1)] end
        dz.devices(idx).updateWind(degrees, quad, v.current.wind_speed, v.current.wind_gust, v.current.temp, v.current.feels_like)-- bearing(°), direction(N S NNW..), speed(m/s), gust(m/s), temperature(°C), chill(°C)
    end },
    
    -- Rain (rate in mm * 100 per hour, counter is total in mm)
    {idx = 985,  cde = function (dz, idx, v)
        if v.current.rain ~= nil then dz.devices(idx).updateRain(v.current.rain['1h']*100, v.daily[1].rain)
        elseif v.daily[1] ~= nil then dz.devices(idx).updateRain(0, v.daily[1].rain) 
        else dz.devices(idx).updateRain(0, 0) end
    end }, 
    
    -- Snow
    {idx = 0,    cde = function (dz, idx, v) 
        if v.current.snow ~= nil  then dz.devices(idx).updateRain(v.current.snow['1h']*100, v.daily[1].snow)
        elseif v.daily[1] ~= nil then dz.devices(idx).updateRain(0, v.daily[1].snow) 
        else dz.devices(idx).updateRain(0, 0) end
    end }, --rate in mm * 100 per hour, counter is total in mm)
    
    -- Meteo
    {idx = 979,  cde = function (dz, idx, v)
        local txt = v.current.weather[1].description..' ('..v.current.weather[1].main..' - '..v.current.weather[1].id..')'
        dz.devices(idx).updateText(txt)
    end },
    
    -- Moon
    {idx = 989,  cde = function (dz, idx, v)
        -- local dt  = os.date("%a %d %b à %X", v.daily[1].dt) -- UTC
        local moonrise  = os.date("%Hh%M", v.daily[1].moonrise) -- UTC
        local moonset   = os.date("%Hh%M", v.daily[1].moonset) -- UTC
        local p = v.daily[1].moon_phase*100 -- 0 and 1 are 'new moon', 0.25 is 'first quarter moon', 0.5 is 'full moon' and 0.75 is 'last quarter moon'.
        if p==0 or p==100 then phase = "Nouvelle Lune ➚"
        elseif p<25     then phase = "Premier Croissant ➚"
        elseif p==25    then phase = "Premier Quartier ➚"
        elseif p<50     then phase = "Gibeuse Croissante ➚"
        elseif p==50    then phase = "Pleine Lune  ➘"
        elseif p<75     then phase = "Gibeuse Décroissante  ➘"
        elseif p==75    then phase = "Dernier Quartier  ➘"
        elseif p<100    then phase = "Dernier Croissant  ➘"
        end
        -- luminosity
        p = 2*p 
        if p>100 then p = 200-p end
        local txt = "Lever à "..moonrise.."\nCoucher à  "..moonset.."\nPhase : "..phase.."  ("..p.."%)"
        dz.devices(idx).updateText(txt)
    end },
    
    -- Moon Phase (%)
    {idx = 988,  cde = function (dz, idx, v)
        dz.devices(idx).updatePercentage(v.daily[1].moon_phase*100)
    end },
    
    -- Alerts
    {idx = 987, cde = function (dz, idx, v)
        if v.alerts ~= nil then
            local txt = ''
            for k, alert in ipairs(v.alerts) do
                local from  = os.date("%a %d %b à %X", alert['start'])
                local to    = os.date("%a %d %b à %X", alert['end'])
                txt = txt..k..'. '..alert.event.."\n"
                txt = txt..'   du '..from.."\n"
                txt = txt..'   au '..to.."\n"
                txt = txt..alert.description.."\n"
                -- txt = txt..alert.sender_name -- Meteo France
                txt = txt..'  tags : '..table.concat(alert.tags, ', ')..'\n\n'
            end
            -- updateAlertSensor(level, text): Function. Level can be domoticz.ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_YELLOW, ALERTLEVEL_ORANGE, ALERTLEVEL_RED. Supports command options.
            dz.devices(idx).updateAlertSensor(dz.ALERTLEVEL_RED, txt)
            dz.notify('Alerte Météo', txt, dz.PRIORITY_HIGH) -- notify(subject, message, priority, sound) domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY
        else
            dz.devices(idx).updateAlertSensor(dz.ALERTLEVEL_GREEN, "Pas d'alerte")
        end 
    end },
}


-- LOOP
return {

    active =  true, -- false,
    on = {
        timer           = { "every 10 minutes" },
        httpResponses   = { "OWMcallback" }, -- matches callback wildcard
    },

    logging = {   
        level  =   domoticz.LOG_ERROR, domoticz.LOG_INFO, --, domoticz.LOG_DEBUG, domoticz.LOG_MODULE_EXEC_INFO
        marker = '-- '..scriptName..' v'..scriptVersion
    },

    -- LOOP
    execute = function(dz, triggerItem)
        
        local apiKey = dz.variables('apikey_openweathermap').value
        
        local function errorMessage(message,notify)   -- Add entry to log and notify to all subsystems
            dz.log(message, dz.LOG_ERROR)
            if notify then
                -- dz.notify(message) -- notify(subject, message, priority, sound): Fonction. Envoi d’une notification (Prowl). La priorité sera choisie entre  domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY
            end
         end

        -- MAIN
        if triggerItem.isTimer then
            local pos = 'lat=' .. dz.settings.location.latitude .. "&lon=" .. dz.settings.location.longitude
            local url = uri .."?"..pos..'&appid='..apiKey..'&units='..units..'&lang='..lang..'&exclude='..exclude
            -- errorMessage("DBG URL="..url)
            dz.openURL({
                url     = url,
                method  = "GET",
                callback= 'OWMcallback'
            }).afterSec(1)
        end

        if triggerItem.isHTTPResponse then
            if triggerItem.ok and triggerItem.isJSON then
                local resultsTable = triggerItem.json
                if resultsTable ~= nil and resultsTable.current ~= nil then
                    for k, d in ipairs(devices) do
                        if d['idx'] ~= 0 then d.cde(dz, d['idx'], resultsTable) end
                    end
                end
            else
                errorMessage("Problem with response from OWM", false)
            end
        end
    
    end --execute
}

Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA] Données Météo avec API Openweathermap

Message par Keros »

Bonjour Gilles_ et bienvenu sur le forum :)

Merci pour ton script, je viens de le déplacer dans le tuto dédié à OpenWeatherMap.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Bibi49
Messages : 367
Inscription : 11 mars 2018, 12:42
Localisation : 49

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par Bibi49 »

Bonjour,

Avec le script de Gilles_, comment l'utilisé ?

Je l'ai copier dans Configuration/plus d'options/evenements/lua/All (commented) et renommé Script#1 en OpenWeatherMap.lua

Je suppose qu'il faut modifier la clef API ainsi que la localisation mais quelles sont les bonnes ligne a éditer ?

En vous remerciant d'avance pour vos précisions.
RPI 2 -> Bullseye Lite
DomoticZ -> 2024.7
RFXCom 433E -> Pro1 1041
DongleP - Z-Stack 3.30+ (build 20240710) /Z4D 7.1.025 [7.489]
CC1101 433Mhz "Itron EverBlue Cyble"
PiTInfo v1.4
USB->ùSD = Rpi-clones
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par Keros »

C'est un script DzVents, pas LUA.

Pour fonctionner, il faut vérifier que les infos entre les lignes 17 et 22 correspondent à ton cas.
Il faut créer une uservariable pour l'APIKey qui sera appelée à la ligne 154.
La localisation est récupérée des paramètres de DomoticZ (ligne 165).
Il faut créer tous les widgets et renseigner les idx correspondant pour les lignes 32, 35, 48, 51, 54, 57, 67, 74, 81, 87, 109, 114.

Et déboguer...
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Bibi49
Messages : 367
Inscription : 11 mars 2018, 12:42
Localisation : 49

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par Bibi49 »

Merci Keros pour ces précisions. :D

ça risque d'être long et laborieux mais je vais m'y accroché.
RPI 2 -> Bullseye Lite
DomoticZ -> 2024.7
RFXCom 433E -> Pro1 1041
DongleP - Z-Stack 3.30+ (build 20240710) /Z4D 7.1.025 [7.489]
CC1101 433Mhz "Itron EverBlue Cyble"
PiTInfo v1.4
USB->ùSD = Rpi-clones
EMqA
Messages : 38
Inscription : 14 déc. 2019, 14:27

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par EMqA »

Question probablement idiote mais quels avantages offre ce script vis à vis de l’intégration déjà prévue dans domoticz (au delà de la gestion des alertes et des phases de la lune) ?
Bibi49
Messages : 367
Inscription : 11 mars 2018, 12:42
Localisation : 49

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par Bibi49 »

Domoticz n'est pas (encore) compatible avec la derniere API d'OWM.

Donc pour les "nouveaux" utilisateurs, il semblerait qu'a l'heure actuel, seul le script permettrait de récupérer les infos...

Enfin ça, si uniquement si j'ai bien compris :mrgreen:
RPI 2 -> Bullseye Lite
DomoticZ -> 2024.7
RFXCom 433E -> Pro1 1041
DongleP - Z-Stack 3.30+ (build 20240710) /Z4D 7.1.025 [7.489]
CC1101 433Mhz "Itron EverBlue Cyble"
PiTInfo v1.4
USB->ùSD = Rpi-clones
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par Keros »

Bibi49 a écrit : 02 avr. 2023, 14:16 Merci Keros pour ces précisions. :D

ça risque d'être long et laborieux mais je vais m'y accroché.
C'est aussi pour ça que je ne suis pas allé plus loin dans mon tuto : adapter un script quand on est débutant et qu'il y a 2-3 données à modifier, ça peut se faire. Ce script-là est complexe.
EMqA a écrit : 02 avr. 2023, 15:02 Question probablement idiote mais quels avantages offre ce script vis à vis de l’intégration déjà prévue dans domoticz (au delà de la gestion des alertes et des phases de la lune) ?
Comme le dit Bibi49, il semblerait que le plugin ne soit pas compatible avec les dernières API que tu as si tu t'inscris aujourd'hui. Les anciennes API sont toujours fonctionnelles pour ceux qui se sont inscrits il y a plusieurs années.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
EMqA
Messages : 38
Inscription : 14 déc. 2019, 14:27

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par EMqA »

Merci à vous pour la réponse. Effectivement, chez moi c'est fonctionnel depuis un moment ; à voir si c'est pertinent de passer au script pour éviter de futures incompatibilités .
jackyhi
Messages : 97
Inscription : 09 mai 2016, 23:49

Re: [LUA-DzVents] Données Météo avec API Openweathermap

Message par jackyhi »

Bonjour je viens de migrer ma météo locale de darsky vers openweathermap.
J’ai donc contracté une inscription gratuite pour obtenir ma clef auprès de openweathermap. Cette clef me donne accès aux API suivantes :
Météo actuelle > https://api.openweathermap.org/data/2.5/weather?....
Prévision 3 heures 5 jours > https://api.openweathermap.org/data/2.5/forecast?....
Cartes météorologiques de base
Tableau de bord météo
API sur la pollution de l'air
API de géocodage
Widget météo

Mais pas à la nouvelle API v3 Onecall qui devient payante si utilisation prolongée dans le temps.


Contrairement à ce que j’ai lu il y a bien des données de précipitation rain.1h dans Météo actuelle mais seulement en cas de pluie cette donnée est donc présente par intermittence !
Pour les données de précipitation rain3h, elles sont disponibles dans les Prévision 3 heures 5 jours, avec le même principe si pas de pluie annoncée pas de données rain.3h.
Cela complique le script car il faut tester la présence de cette donnée dans le bloc JSON reçu avant de l’exploiter.
C’est ce que je fais dans le script suivant que j'ai adapté à partir de la version de joebuz et de Keros que je remercie très chaleureusement pour leur travail, ce script exploite uniquement la « Météo actuelle ».

Par contre il n'y a pas de données UV!

J’ai rencontré un problème de syntaxe avec le paramètre rain.’1h’ qui provoquait une erreur lors de l’extraction de la donnée en effet le script lua n’accepte pas qu’un nom de variable commence par un chiffre

Code : Tout sélectionner

jsonValeur.rain.1h
, après beaucoup de recherche en modifiant la syntaxe par

Code : Tout sélectionner

jsonValeur["rain"]["1h"]
, l’interpréteur lua accepte cette dernière sans générer d'erreur.

Code : Tout sélectionner

--[[ script_time_meteo.lua  tested on domoticz 2023.1
    **************************************
    modifié par jackyhi 09/04/2023
    raspberry Pi 3B  raspbian bullseyes 64bits domoticz 2023.1
    abonnement gratuit standard à openweathermap qui donne accès seulement  à :
    
    Météo actuelle
    Prévision 3 heures 5 jours
    Cartes météorologiques de base
    Tableau de bord météo
    API sur la pollution de l'air
    API de géocodage
    Widget météo
    
    donc utilisation dans ce script :
    https://api.openweathermap.org/data/2.5/weather?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric
    
    ****************************************
    author/auteur = joebuz
    update/mise à jour = 03/05/2020
    creation = 03/05/2020
    
    Created from this topic
    author/auteur = Keros
    https://easydomoticz.com/forum/viewtopic.php?f=17&t=9892
    Date = 13/04/2020
    Ce script nécessite l'inscription préalable à l'API Openweathermap : https://openweathermap.org
    liste des commandes : https://openweathermap.org/api/one-call-api
--]]

local function log(p_message)
    -- Décommenter la ligne du dessous pour afficher les logs / Commenter pour ne pas afficher les logs
    print("[Meteo] " .. p_message)
end
local function quadrants(degrees)
    local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
    --print("degress :"..degrees)
    if degrees > 348.75 or degrees <= 11.25 then
        return "N"
        else 
        local index = tonumber(math.floor((degrees - 11.25) / 22.5)+1)
        return quadrants[index]
    end
end

local function fordomo(id)
    local idfor = -1
    if id>=200 and id <= 211 then idfor = 4 end
    if id>=212 and id <= 232 then idfor = 3 end
    if id>=300 and id <= 311 then idfor = 5 end
    if id>=312 and id <= 321 then idfor = 3 end
    if id>=500 and id <= 503 then idfor = 6 end
    if id>=504 and id <= 531 then idfor = 3 end
    if id>=600 and id <= 601 then idfor = 6 end
    if id>=602 and id <= 611 then idfor = 3 end
    if id>=612 and id <= 622 then idfor = 6 end
    if id>=700 and id <= 762 then idfor = 5 end
    if id>=763 and id <= 781 then idfor = 3 end
    if id==800 then idfor = 1 end
    if id>=801 and id <= 804 then idfor = 2 end
    if idfor == -1  then idfor = 5 end -- 5 = Inconnu	Unknown
    return idfor
end

local scriptName        = 'script_time_meteo.lua'
local scriptVersion     = 'V2.0'
local time              = os.date("*t")       -- Si vous souhaitez exécuté ce script toutes les X min
local minutesT          = tonumber ( time.min) --os.date('%M',time))
local start_hour        = '06:00'             -- Si vous souhaitez exécuté ce script tous les jours à 6h
local periode            = 30                 -- A modifier si vous souhaitez toutes les 5, 10, 30, ..modifier variable periode. minutes (ici 30 minutes) 
local actual_hour       = os.date("%H:%M")
local tempDeviceIdx     = 4458               -- EXEMPLE 3 - 1) Idx de votre disositif Température
local vtrDeviceIdx      = 4460               -- EXEMPLE 3 - 2) Idx de votre dispositif Vent+Température+Refroidissement
--local uvDeviceIdx       = 181              -- !! pas disponible  X) Idx de votre dispositif UV
local atmDeviceIdx      = 4470               -- EXEMPLE 3 - 3) Idx de votre dispositif Baromètre
local humDeviceIdx      = 4463               -- EXEMPLE 3 - 4) Idx de votre dispositif humidité (pourcentage)
local cloudDeviceIdx    = 4464               -- EXEMPLE 3 - 5) Idx de votre dispositif couverture nuageuse (pourcentage)
local visibDeviceIdx    = 4473               -- EXEMPLE 3 - 6) Idx de votre dispositif visibilite (mètres)
local pluie1hDeviceIdx     = 4461            -- EXEMPLE 3 - 7) Idx de votre dispositif Précipitations
-- local pluie3hDeviceIdx     = 4561          -- 8)!! disponible seulement dans API forcast previsions à 5 jours Idx de votre dispositif Précipitations

--------------------------------------------
----------- Variables à éditer -------------
-------------------------------------------- 

local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre clé API
local lat = 'xx.xxx' --  Remplacer par ici votre latittude
local long = 'xx.xxx-- Remplacer par votre longitude


--Sélectionner le chemin vers votre fichier JSON.lua en décommentant  la ligne pour votre système d'exploitation
--json = (loadfile "/home/votrenomutilisé/domoticz/scripts/lua/JSON.lua")() -- For Linux
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI
--json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Syno


--------------------------------------------
---------- Fin variables à éditer ----------
-------------------------------------------- 

commandArray = {}
--if(otherdevices['testscript'] == 'On')then  -- bouton permettant pendant le debug de déclencher le script
if ( (minutesT-2 >= 0 ) and ((minutesT-2) % periode == 0  )) then -- pour exécuter toutes les périodes en minutes avec décalage de 2min pour eviter l'heur de la sauvegarde automatiqe de la base de données Domoticz
    -- if (time.min % 1)==0 then                 -- pour exécuter le script toutes les X min
    --if actual_hour==start_hour then        -- pour exécuter le script à heure fixe
    -- Les script_time sont exécutés toute les 1 minute par Domoticz
    -- Limite de l'API : 1000 appels/jour !!!, il y a 1440 minutes/jour

    log(scriptName.." "..scriptVersion.." - "..actual_hour)
    -- L'appel et l'enregistrement des prévisions dans la variable jsonValeur
    config=assert(io.popen('/usr/bin/curl "https://api.openweathermap.org/data/2.5/weather?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'))
    blocjson = config:read('*all')
    config:close()
    --print(blocjson) -- décommenter pour voir dans le log la réception du bloc JSOn reçu avant décodage
    jsonValeur = json:decode(blocjson)
    --------------------------------------------
    ---- Code à modifier selon vos besoins -----
    -------------------------------------------- 
    --[[
        -- EXEMPLE  1 - Temps Actuel
        -- L'enregistrement des données souhaitées dans des variables (vous pouvez en ajouter autant que vous voulez)  
        temp = jsonValeur.current.temp
        rose = jsonValeur.current.dew_point
        weather = jsonValeur.current.weather[1].description
        
        --  L'utilisation des données (ici j'écris une ligne dans le LOG de DomoticZ)
        msg = 'Il fait '..temp..' degres et la météo indique '..weather..' avec un point de rosé à '..rose..' degres.'
        log(msg)
        ---------------------------------------------
        -- EXEMPLE 2 - Temps dans X heures
        -- le [11] signifie dans 11h à modifier selon l'heure d'appel du script
        temp_demain = jsonValeur.hourly[11].temp
        weather_demain = jsonValeur.hourly[11].weather[1].description
        
        -- Code pour afficher et convertir la date et l'heure de la prévision
        time_prevision = jsonValeur.hourly[11].dt
        heure_prevision = (os.date("%x à %X", time_prevision))
        
        msg = 'Le '..heure_prevision..', il fera '..temp_demain..' degrés et la météo prévoit '.. weather_demain..'.'
        log(msg)
    --]]
    --------------------------------------------
    -- EXEMPLE 3  
    -- dans Matériel créé un capteur virtuel Dummy que vous appelez comme vous voulez
    -- 1) Puis créer un capteur virtuel de température à partir du Dummy que vous venez de créé
    --    Dans dispositif, notez l'IDX du capteur température que vous venez de créer et renseignez en haut de ce script pour "local tempDeviceIdx"
    -- 2) Créer un capteur virtuel Vent+Température+Refroidissement et renseignez en haut de ce script pour "local vtrDeviceIdx"
    -- 3) Créer un capteur virtuel Précipitations et renseignez en haut de ce script pour "local rainDeviceIdx"
    --   ??Créer un capteur virtuel UV et renseignez en haut de ce script pour "local uvDeviceIdx"
    -- 5) Créer un capteur virtuel Baromètre et renseignez en haut de ce script pour "local atmDeviceIdx"
    -- 6) Créer un capteur virtuel Pourcentage et renseignez en haut de ce script pour "local humDeviceIdx"
    -- 7)  Créer un capteur virtuel Pourcentage et renseignez en haut de ce script pour "local cloudDeviceIdx"
    --[[ 
        Barometer forecast id code: 
        "id": 500,  "main": "Rain",  "description": "légère pluie", "icon": "10d"
        "id": 804, "main": "Clouds", "description": "couvert", "icon": "04n"
        "id": 803, "main": "Clouds", "description": "nuageux", "icon": "04n"
        "id": 802, "main": "Clouds", "description": "partiellement nuageux", "icon": "03n"
        "id": 801, "main": "Clouds", "description": "peu nuageux", "icon": "02d"
        "id": 800, "main": "Clear", "description": "ciel dégagé", "icon": "01d"
        
        Domoticz JSON Barometer forecast parameter BAR_FOR 
        0 = Stable	Stable
        1 = Ensoleillé	Sunny
        2 = Nuageux	Cloudy
        3 = Instable	Unstable
        4 = Orage	Thunderstorm
        5 = Inconnu	Unknown
        6 = Nuageux/Pluie  Cloudy/Rain
        
        4 = Orage equivalent domoticz BAR_FOR
        weather.[1].id Category		weather.[1].description
        200	Thunderstorm	thunderstorm with light rain
        201	Thunderstorm	thunderstorm with rain
        202	Thunderstorm	thunderstorm with heavy rain
        210	Thunderstorm	light thunderstorm
        211	Thunderstorm	thunderstorm
        3 = Instable 
        212	Thunderstorm	heavy thunderstorm
        221	Thunderstorm	ragged thunderstorm
        230	Thunderstorm	thunderstorm with light drizzle
        231	Thunderstorm	thunderstorm with drizzle
        232	Thunderstorm	thunderstorm with heavy drizzle       
        5 = Inconnu        
        300	Drizzle	light intensity drizzle
        301	Drizzle	drizzle
        302	Drizzle	heavy intensity drizzle
        310	Drizzle	light intensity drizzle rain
        311	Drizzle	drizzle rain
        3 = Instable
        312	Drizzle	heavy intensity drizzle rain
        313	Drizzle	shower rain and drizzle
        314	Drizzle	heavy shower rain and drizzle
        321	Drizzle	shower drizzle
        6 = Nuageux/pluie        
        500	Rain	light rain
        501	Rain	moderate rain
        502	Rain	heavy intensity rain
        503	Rain	very heavy rain
        3 = Instable
        504	Rain	extreme rain
        511	Rain	freezing rain
        520	Rain	light intensity shower rain
        521	Rain	shower rain
        522	Rain	heavy intensity shower rain
        531	Rain	ragged shower rain
        6 = Nuageux/pluie        
        600	Snow	light snow
        601	Snow	snow
        3 = Instable
        602	Snow	heavy snow
        611	Snow	sleet
        6 = Nuageux/pluie
        612	Snow	light shower sleet
        613	Snow	shower sleet
        615	Snow	light rain and snow
        616	Snow	rain and snow
        620	Snow	light shower snow
        621	Snow	shower snow
        622	Snow	heavy shower snow
        5 = Inconnu        
        701	Mist	mist
        711	Smoke	smoke
        721	Haze	haze
        731	Dust	sand/dust whirls
        741	Fog	fog
        751	Sand	sand
        761	Dust	dust
        762	Ash	volcanic ash
        3 = Instable
        771	Squall	squalls
        781	Tornado	tornado       
        1 = Ensoleillé
        800	Clear	clear sky
        2 = Nuageux        
        801	Clouds	few clouds: 11-25%
        802	Clouds	scattered clouds: 25-50%
        803	Clouds	broken clouds: 51-84%
        804	Clouds	overcast clouds: 85-100%
    --]]
    
    local weather = jsonValeur.weather[1].description
    local weatherid     = jsonValeur.weather[1].id
    print("weather :"..weather.."  id :"..weatherid)
    local temp          = jsonValeur.main.temp
    local temp_min      = jsonValeur.main.temp_min
    local temp_max      = jsonValeur.main.temp_max
    local tempFeels     = jsonValeur.main.feels_like
    local windSpeed     = jsonValeur.wind.speed * 3.6   -- pour affichage en km/h
    local visibility    = jsonValeur.visibility / 1000   -- pour affichage en km
    --windSpeed2    = windSpeed*10 -- je ne sais pas pourquoi Domoticz divise la valeur de winSpeed par 10 !?
    --windGust      = jsonValeur.current.wind_gust -- Ne fonctionne pas ??
    local windGust      = jsonValeur.wind.gust * 3.6  -- pour affichage en km/h
    --windGust2     = windGust*10
    local windDirection = jsonValeur.wind.deg
    -- En cas de pluie 
    local rain1h -- , rain3h
    if jsonValeur.rain ~= nil then  --(disponible seulement en cas de pluie)Volume de pluie pour la dernière heure, mm
        if jsonValeur["rain"]["1h"] then --(si disponible) Volume de pluie de la dernières heures, mm
            rain1h  = jsonValeur["rain"]["1h"] 
            else
            rain1h = 0
        end
       --if jsonValeur["rain"]["3h"] then --( disponible seulement en cas de pluie et dans l'API forcast à 5jours) Volume de pluie des 3 dernières heures, mm
        --    rain3h = jsonValeur["rain"]["3h"]
        --    rain3h = jsonValeur["rain"]["3h"]
        --    else
        --    rain3h = 0
        --end
        else
        rain1h = 0
       -- rain3h = 0
    end
    
    --print("rain1h : "..rain1h)
    --print("rain3h : "..rain3h)    
    -- En cas de neige
    --snow1h          = jsonValeur["snow"]["1h"] --(si disponible)  Volume de neige de la dernière heure, mm
    --snow3h          = jsonValeur["snow"]["3h"] --(si disponible)  Volume de neige des 3 dernières heures, mm
    --UVIndex       = jsonValeur.current.uvi
    local pressionAtm   = jsonValeur.main.pressure 
    print("pressionAtm :"..pressionAtm)
    local humidity      = jsonValeur.main.humidity
    local clouds        = jsonValeur.clouds.all
    local direction = quadrants(tonumber(windDirection))
    local bar_for = fordomo(weatherid)  -- calcul id prevision forcast de domoticz
    
    -- 1) MAJ du capteur Virtuel de Température
    commandArray[tempDeviceIdx] = { ['UpdateDevice'] = tempDeviceIdx..'|0|'..temp }
    log('MAJ tempDevice '..tempDeviceIdx..' : '..temp..' °C')
    
    -- 2) MAJ du capteur Virtuel de Vent+Température+Refroidissement
    commandArray[vtrDeviceIdx] = { ['UpdateDevice'] = vtrDeviceIdx..'|0|'..windDirection..';'..tostring(direction)..';'..windSpeed..';'..windGust..';'..temp..';'..tempFeels }
    log('MAJ vtrDevice '..vtrDeviceIdx..' : '..temp..'|'..tempFeels..' °C ; '..windSpeed..'|'..windGust..' km/h '..direction)
    
    -- x) MAJ du capteur d'UV
    -- commandArray[uvDeviceIdx] = { ['UpdateDevice'] = uvDeviceIdx..'|1|'..UVIndex..';0' }
    --log('MAJ uvDevice '..uvDeviceIdx..' : '..UVIndex)
    
    -- 4) MAJ du capteur baromètre
    commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm..';'..bar_for }
    log('MAJ atmDevice '..atmDeviceIdx..' : '..tonumber(pressionAtm)..' hPa  BAR_FOR :'..bar_for)
    
    -- 5) MAJ du capteur humidité et du capteur couverture nuageuse
    commandArray[humDeviceIdx] = { ['UpdateDevice'] = humDeviceIdx..'|'..humidity..'|0|'} -- attention format spécial pour paramètres humidity
    log('MAJ humDevice '..humDeviceIdx..' : '..humidity..' %')
    
    commandArray[cloudDeviceIdx] = { ['UpdateDevice'] = cloudDeviceIdx..'|0|'..clouds }
    log('MAJ cloudDevice '..cloudDeviceIdx..' : '..clouds..' %')
    
    -- 6) MAJ du capteur visibilité
    commandArray[visibDeviceIdx] = { ['UpdateDevice'] = visibDeviceIdx..'|0|'..visibility }
    log('MAJ visibilityDevice '..visibDeviceIdx..' : '..visibility..' km')
    
    -- 7)  MAJ du capteur pluie 1h
    commandArray[pluie1hDeviceIdx] = { ['UpdateDevice'] = pluie1hDeviceIdx..'|1|0;'..rain1h }
    log('MAJ pluie1hDevice '..pluie1hDeviceIdx..' : '..rain1h..' mm/h')
    
    -- 8)  MAJ du capteur pluie 3h
    --commandArray[pluie3hDeviceIdx] = { ['UpdateDevice'] = pluie3hDeviceIdx..'|1|0;'..rain3h }
    --log('MAJ pluie3hDevice '..pluie3hDeviceIdx..' : '..rain3h..' mm/h')
    
    --------------------------------------------
    --------- Fin code à modifier  -------------
    --------------------------------------------
    -- commandArray[#commandArray+1]={['testscript'] = 'Off AFTER 10'} --RAZ du bouton déclencheur
end
--end
return commandArray
Raspberry Pi2 VPN, Pi 3, Pi4 ,RFXCom, 6 volets BLYSS, sondes Temp_humid Attiny85, zigbee, Mysensors, RFLINK , Zwave capteurs portes Prises, Alarme avec 2 sirènes maison esp8266, Thermostat NETAMO vannes thermostatiques
Répondre