[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.
marc_bzh
Messages : 96
Inscription : 16 déc. 2017, 09:44
Localisation : Pornic (Dpt 44)

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

Message par marc_bzh »

Apres détection j'obtiens ça :
2020-04-24 06_52_58-Domoticz.png
2020-04-24 06_52_58-Domoticz.png (21.97 Kio) Consulté 8457 fois
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Les informations données par Marc sont pour utiliser le plugin OpenWeatherMap de DomoticZ.

Le tuto permet de récupérer les informations d'OpenWeatherMapvia un script LUA, ce qui n'est pas la même chose.
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
joebuz
Messages : 29
Inscription : 13 mars 2019, 23:52

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

Message par joebuz »

Bonjour à tous et merci Keros pour ces infos.
Pour les débutants comme moi et pour tester un peu les fonctionnalités d'Openweather j'ai fait ce script :

Code : Tout sélectionner

--[[ script_time_meteo.lua tested on domoticz 2020.2

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 scriptName        = 'Meteo'
local scriptVersion     = 'V1.0'
local time              = os.date("*t")       -- Si vous souhaitez exécuté ce script toutes les X min
local start_hour        = '06:00'             -- Si vous souhaitez exécuté ce script tous les jours à 6h
local actual_hour       = os.date("%H:%M")
local tempDeviceIdx     = 178                 -- EXEMPLE 3 - 1) Idx de votre disositif Température
local vtrDeviceIdx      = 179                 -- EXEMPLE 3 - 2) Idx de votre dispositif Vent+Température+Refroidissement
local rainDeviceIdx     = 180                 -- EXEMPLE 3 - 3) Idx de votre dispositif Précipitations
local uvDeviceIdx       = 181                 -- EXEMPLE 3 - 4) Idx de votre dispositif UV
local atmDeviceIdx      = 182                 -- EXEMPLE 3 - 5) Idx de votre dispositif Baromètre
local humDeviceIdx      = 183                 -- EXEMPLE 3 - 6) Idx de votre dispositif humidité (pourcentage)
local cloudDeviceIdx    = 184                 -- EXEMPLE 3 - 6) Idx de votre dispositif couverture nuageuse (pourcentage)

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

local api = 'MonAPI' -- Remplacer par votre clé API
local lat = 'MaLatitude' --  Remplacer par ici votre latittude
local long = 'MaLongitude' -- 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 = {}
  log(scriptName.." "..scriptVersion.." - "..actual_hour)
  -- 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
  -- A modifier si vous souhaitez toutes les 5, 10, 30, ... minutes (ici 20 minutes)

  if (time.min % 20)==0 then                 -- pour exécuter le script toutes les X min
  --if actual_hour==start_hour then        -- pour exécuter le script à heure fixe

    -- 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/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'))
    blocjson = config:read('*all')
    config:close()
    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"
    -- 4) 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"
    --    Créer un capteur virtuel Pourcentage et renseignez en haut de ce script pour "local cloudDeviceIdx"

    temp          = jsonValeur.current.temp
    tempFeels     = jsonValeur.current.feels_like
    windSpeed     = jsonValeur.current.wind_speed 
    windSpeed2    = windSpeed*10 -- je ne sais pas pourquoi Domoticz divise la valeur de winSpeed par 10 !?
    --windGust      = jsonValeur.current.wind_gust -- Ne fonctionne pas ??
    windGust      = windSpeed
    windGust2     = windGust*10
    windDirection = jsonValeur.current.wind_deg
    --rain          = jsonValeur.current.rain -- Ne fonctionne pas ??
    rain          = jsonValeur.daily[1].rain
    UVIndex       = jsonValeur.current.uvi
    pressionAtm   = jsonValeur.current.pressure
    humidity      = jsonValeur.current.humidity
    clouds        = jsonValeur.current.clouds

    -- 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
    local function quadrants(degrees)
      local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
            
          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 direction = quadrants(windDirection)

    commandArray[vtrDeviceIdx] = { ['UpdateDevice'] = vtrDeviceIdx..'|0|'..windDirection..';'..tostring(direction)..';'..windSpeed2..';'..windGust2..';'..temp..';'..tempFeels }
    log('MAJ vtrDevice '..vtrDeviceIdx..' : '..temp..'|'..tempFeels..'°C ; '..windSpeed..'|'..windGust..'m/s '..direction)

    -- 3) MAJ du capteur de pluie
    commandArray[rainDeviceIdx] = { ['UpdateDevice'] = rainDeviceIdx..'|1|0;'..rain }
    log('MAJ rainDevice '..rainDeviceIdx..' : '..rain..'mm')

    -- 4) MAJ du capteur d'UV
    commandArray[uvDeviceIdx] = { ['UpdateDevice'] = uvDeviceIdx..'|1|'..UVIndex..';0' }
    log('MAJ uvDevice '..uvDeviceIdx..' : '..UVIndex)

    -- 5) MAJ du capteur baromètre
    commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm }
    log('MAJ atmDevice '..atmDeviceIdx..' : '..pressionAtm)

    -- 6) MAJ du capteur humidité et du capteur couverture nuageuse
    commandArray[humDeviceIdx] = { ['UpdateDevice'] = humDeviceIdx..'|0|'..humidity }
    log('MAJ humDevice '..humDeviceIdx..' : '..humidity)
    commandArray[cloudDeviceIdx] = { ['UpdateDevice'] = cloudDeviceIdx..'|0|'..clouds }
    log('MAJ cloudDevice '..cloudDeviceIdx..' : '..clouds)

    --------------------------------------------
    --------- Fin code à modifier  -------------
    --------------------------------------------
  end
return commandArray
Plusieurs points à relever :
Pour la valeur win_speed dans les logs (et dans le JSON) on a par exemple 5m/s et dans le dispositif domoticz enregistre 0.5, je ne sais pas pourquoi il y a une division par 10 ...??
Du coup dans le script je multiplie la valeur par 10 pour corriger le problème, mais c'est peut-être une fausse correction si le problème vient de mon script, je ne sais pas.

contrairement aux commandes indiquées dans la doc : https://openweathermap.org/api/one-call-api
certaines fonctions ne sont pas disponibles, il faut regarder ce qui est affichée dans le JSON : https://api.openweathermap.org/data/2.5 ... its=metric
ainsi les commandes jsonValeur.current.wind_gust et jsonValeur.current.rain ne fonctionnent pas
Je n'ai pas réussi à récupérer les infos courantes des rafales de vent et de pluie.
pour la pluie on peut utiliser la commande pour le jour en cours jsonValeur.daily[1].rain

Autre chose, pour la pression atmosphérique, j'ai créé un capteur virtuel Baromètre pour essayer, la valeur est bien mise à jour quand je regarde dans les dipositifs mais dans l'onglet Meteo de Domoticz cela ne m'affiche aucune valeure et je n'ai plus l'icône du baromètre
Capture.PNG
Capture.PNG (4.89 Kio) Consulté 8330 fois
Si qqn a une idée du pourquoi ?

Voilà, encore une fois je précise que je débute et ce script et un script d'essai non optimisé, soyez indulgent :D
Dernière modification par joebuz le 04 mai 2020, 18:11, modifié 1 fois.
RPI3 (Buster) + AEOTEC Z-Stick Gen5
Version: 2020.2 Build Hash: b63341bc0
Compile Date: 2020-04-26 13:47:55
dzVents Version: 3.0.2
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Merci Joebuz pour ton script.
Dernière modification par Keros le 04 mai 2020, 21:49, modifié 1 fois.
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
joebuz
Messages : 29
Inscription : 13 mars 2019, 23:52

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

Message par joebuz »

Bien vu. FAIT clef API retirée
RPI3 (Buster) + AEOTEC Z-Stick Gen5
Version: 2020.2 Build Hash: b63341bc0
Compile Date: 2020-04-26 13:47:55
dzVents Version: 3.0.2
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

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

Message par e111111 »

joebuz a écrit : 04 mai 2020, 15:04
Autre chose, pour la pression atmosphérique, j'ai créé un capteur virtuel Baromètre pour essayer, la valeur est bien mise à jour quand je regarde dans les dipositifs mais dans l'onglet Meteo de Domoticz cela ne m'affiche aucune valeure et je n'ai plus l'icône du baromètre
Image
Capture.PNG
Si qqn a une idée du pourquoi ?

Voilà, encore une fois je précise que je débute et ce script et un script d'essai non optimisé, soyez indulgent :D
Salut,
quand le widget reçoit les datas sous un mauvais format, il n'affiche pas l’icône ni les valeurs, vérifie le format de tes données dans "dispositifs" soit trop de décimales, soit une virgule à la place d'un point virgule ...
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
joebuz
Messages : 29
Inscription : 13 mars 2019, 23:52

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

Message par joebuz »

Cela m'affiche 1012 hPa ....
Capture.PNG
Capture.PNG (26.78 Kio) Consulté 8305 fois
Si qqn trouve une solution pour wind_gust je suis preneur, actuellement j'utilise Darksky pour remonter un de mes volets roulants en cas de forte rafales de vent (suite à une casse, il est exposé au vent dominant).
ça m'embête un peu de ne plus avoir cette info
RPI3 (Buster) + AEOTEC Z-Stick Gen5
Version: 2020.2 Build Hash: b63341bc0
Compile Date: 2020-04-26 13:47:55
dzVents Version: 3.0.2
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

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

Message par e111111 »

Je ne connais pas le format de tous les capteurs, mais pour le baro, quand je suis passé de Darksky à ma station météo, j'ai dû me conformer au format qui était employé pour Darksky:
Image2.jpg
Image2.jpg (34.17 Kio) Consulté 8302 fois
Image4.jpg
Image4.jpg (19.95 Kio) Consulté 8302 fois
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

joebuz ;)
Il semblerait qu'il n'y ait que le wind_speed qui soit disponible. Et même avec l'API Curent-weather.

Concernant l'envoi des infos pour ton capteur, tu renseignes bien l'info BAR_FO avec 0 = No info 1 = Sunny 2 = Partly cloudy 3 = Cloudy 4 = Rain ? (https://www.domoticz.com/wiki/Domoticz_ ... #Barometer)
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
joebuz
Messages : 29
Inscription : 13 mars 2019, 23:52

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

Message par joebuz »

Merci Keros, effectivement il manquait ce paramètre
remplacer la ligne :

Code : Tout sélectionner

commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm}
par :

Code : Tout sélectionner

commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm..';0' }
il reste à rajouter un bout de script pour définir la valeur de BAR_FO
RPI3 (Buster) + AEOTEC Z-Stick Gen5
Version: 2020.2 Build Hash: b63341bc0
Compile Date: 2020-04-26 13:47:55
dzVents Version: 3.0.2
Répondre