[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.
Vianncy
Messages : 27
Inscription : 16 janv. 2021, 18:30

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

Message par Vianncy »

Freddy69j a écrit : 20 janv. 2021, 18:25 J'avais bien vu le lien que tu m'as indiqué, mais je ne m'explique pas ces valeurs 0, 1, 2; 3, ou 4, qui semblent mettre en "dur" la valeur "pluie", "ensoleillées", ou autre... mais je me fourvoie sûrement :?
Je ne suis pas sûr d'avoir compris ta question mais si tu reprends la documentation:
Barometer forecast can be one of:
0 = No info
1 = Sunny
2 = Partly cloudy
3 = Cloudy
4 = Rain
Si tu mets ces valeurs (0, 1, 2...), ton Barometre sait comment l’interpréter (ou la partie barometre dans ton cas) selon la correspondance ci-dessus.
Il est pré-configurer ainsi, avec du code derrière "caché". Tu lui envoie 1, il comprends que c'est "Sunny" etc...
Freddy69j
Messages : 15
Inscription : 17 sept. 2019, 14:31

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

Message par Freddy69j »

Bon, je me suis peut-être mal exprimé. Pour ne pas avoir d'erreur dans la ligne de script, il me faut compléter la valeur ..pressionAtm.. par quelque chose. Ce quelque chose est, me semble-t-il, la valeur du BAR-FO (d'après ce je lis), qui peut prendre la valeur 0, 1, 2, 3, ou 4. Si cette info n'est pas présente, il n'y a pas de remonté d'erreur dans les logs mais l'information n'apparait pas dans le device (quand je dis n'apparait pas, je veux dire device présent mais vide). Pour avoir une information il me faut donc compléter ..pressionAtm.. par 'x;' (x pouvant prendre 0,1,2,3,4), dans ce cas la valeur hPa apparait mais avec une information incohérente du style : 1024hPa avec une prévision nuageux ou pluie suivant la valeur que l'on a mise. Ce qui me fait dire (comme tu le dis Keros) que cette valeur ne doit pas être inscrite en "dur" mais récupérée, puis traduite par du code cachée derrière (pour réutiliser ce que dit Vianncy). la difficulté est de savoir comment récupérer cette valeur. c'est là qu'est l'os... :?
Pour continuer sur ce que je constate, je vous parlais de "valeurs bizarres". en effet, en prenant l'image du device THB ci-dessous l'on voit par exemple que le point de rosé n'est pas à la bonne valeur puisqu'il affiche la température (pourtant présent dans les log) et une valeur d'humidité affichée à 0% alors qu'elle est présente et correct dans le log (voir ci-dessous).
en tout cas c'est loin d'être intuitif :(
Pièces jointes
log.JPG
log.JPG (53.47 Kio) Consulté 4981 fois
humidité.JPG
humidité.JPG (17.12 Kio) Consulté 4981 fois
THB.JPG
THB.JPG (21.65 Kio) Consulté 4981 fois
Vianncy
Messages : 27
Inscription : 16 janv. 2021, 18:30

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

Message par Vianncy »

Freddy69j a écrit : 21 janv. 2021, 11:19 Bon, je me suis peut-être mal exprimé. Pour ne pas avoir d'erreur dans la ligne de script, il me faut compléter la valeur ..pressionAtm.. par quelque chose. Ce quelque chose est, me semble-t-il, la valeur du BAR-FO (d'après ce je lis), qui peut prendre la valeur 0, 1, 2, 3, ou 4. Si cette info n'est pas présente, il n'y a pas de remonté d'erreur dans les logs mais l'information n'apparait pas dans le device (quand je dis n'apparait pas, je veux dire device présent mais vide). Pour avoir une information il me faut donc compléter ..pressionAtm.. par 'x;' (x pouvant prendre 0,1,2,3,4), dans ce cas la valeur hPa apparait mais avec une information incohérente du style : 1024hPa avec une prévision nuageux ou pluie suivant la valeur que l'on a mise. Ce qui me fait dire (comme tu le dis Keros) que cette valeur ne doit pas être inscrite en "dur" mais récupérée, puis traduite par du code cachée derrière (pour réutiliser ce que dit Vianncy). la difficulté est de savoir comment récupérer cette valeur. c'est là qu'est l'os... :?
Le tableau que j'ai mis précédemment te donne la correspondance. Là tu as comme prévision "nuageux" => c'est que la valeur entrée pour "BAR_FO" (le dernier argument) est 3 (entrée en dur si je comprends bien). La notation "..pressionAtm..';0'" ne signifie pas que pressionAtm = 0. Le ";" sépare les deux paramètres distincts. (pressionAtm représente BAR et "0" BAR_FOR si tu te rapporte à la documentation et au tableau que j'ai posté).

J'ai l'impression que tu confond "pressionAtm" et "BAR_FO" qui sont deux choses différentes (mais nécessaire dans al commande, l'un étant le 5ème argument et l'autre le 6ème).

Si tu souhaite avoir une valeur cohérante pour BAR_FO, je te renvoie à ce que j'ai: viewtopic.php?p=92568#p92568


Freddy69j a écrit : 21 janv. 2021, 11:19 Pour continuer sur ce que je constate, je vous parlais de "valeurs bizarres". en effet, en prenant l'image du device THB ci-dessous l'on voit par exemple que le point de rosé n'est pas à la bonne valeur puisqu'il affiche la température (pourtant présent dans les log) et une valeur d'humidité affichée à 0% alors qu'elle est présente et correct dans le log (voir ci-dessous).
en tout cas c'est loin d'être intuitif :(
Je n'ai jamais testé ce capteur. Mais à mon avis l'incohérance vient du "0" entrée en dur pour hum_stat. ;)
commandArray[THBDeviceIdx] = { ['UpdateDevice'] = THBDeviceIdx..'|0|'..temp..';'..humidity..';0;'..pressionAtm..';0' }
https://www.domoticz.com/wiki/Domoticz_ ... #Barometer
Freddy69j
Messages : 15
Inscription : 17 sept. 2019, 14:31

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

Message par Freddy69j »

Enfin, ça marche... :) J'obtiens maintenant les bons device avec les bonnes valeurs au bon endroit. j'ai bien cherché mais sans nos échanges Vianncy et Keros, je n'y serais pas arrivé, merci de votre aide. :D
Ce qui m' permis d'aboutir c'est le paramètre "..barometer_forcast.." avec les valeurs associées (le bout de code donné par Vianncy), mais aussi le paramètre ..humidity.. qu'il m'a fallu écrire comme suit ..humidity..';0' dans la ligne de code du script. Je pense que les valeurs bizarres que je trouvais étaient dues au mauvais codage de ces 2 paramètres me décalant ainsi les valeurs recupérées, entrainant de fait un affichage incohérent.
je vous donne pour info le script complet (ci-dessous) si cela intéresse quelqu'un, mais sachez que je n'ai aucun mérite car je me suis basé sur tout le travail et les recherches décrits dans ce forum. Donc sur ce point merci à tous. je n'ai d'ailleurs pas tout compris mais le résultat me convient.

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     = 266              -- EXEMPLE 3 - 1) Idx de votre dispositif Température
local tempFeelsDeviceIdx     = 273      -- EXEMPLE 3 - 1 bis) Idx de votre dispositif Température resentie
local vtrDeviceIdx      = 276                 -- EXEMPLE 3 - 2) Idx de votre dispositif Vent+Température+Refroidissement
local THBDeviceIdx      = 277               -- EXEMPLE 3 - 2) Idx de votre dispositif température+humidité+barometre
local rainDeviceIdx     = 271                 -- EXEMPLE 3 - 3) Idx de votre dispositif Précipitations
local uvDeviceIdx       = 272                -- EXEMPLE 3 - 4) Idx de votre dispositif UV
local atmDeviceIdx      = 269              -- EXEMPLE 3 - 5) Idx de votre dispositif Baromètre
--local humDeviceIdx      = 268         -- EXEMPLE 3 - 6) Idx de votre dispositif humidité (pourcentage)
local cloudDeviceIdx    = 267             -- EXEMPLE 3 - 6) Idx de votre dispositif couverture nuageuse (pourcentage)

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

local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre clé API
local lat = 'zzzzzzzzzzzzz' --  Remplacer par ici votre latittude
local long = 'yyyyyyyyyyyy' -- 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')

     -- 1 bis) MAJ du capteur Virtuel de Température ressentie
    commandArray[tempFeelsDeviceIdx] = { ['UpdateDevice'] = tempFeelsDeviceIdx..'|0|'..tempFeels }
    log('MAJ tempFeelsDevice '..tempFeelsDeviceIdx..' : '..tempFeels..'°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..';'..tem$
   log('MAJ vtrDevice '..vtrDeviceIdx..' : '..temp..'°C'..tempFeels..';'..windSpeed2..'m/s'..windGust2..'m/s '..direction..'|'..windDirection)

   --2bis) MAJ capteur virtuel temperatue humidité et barometre
       --variables de prévision

   local BAROMETER_UNKNOWN = 5
   local BAROMETER_THUNDERSTORM = 4
   local BAROMETER_UNSTABLE = 3
   local BAROMETER_CLOUDY_RAIN = 2
   local BAROMETER_SUNNY = 1
   local BAROMETER_STABLE = 0

   local barometer_forecast

    -- On réutilise pressionAtm

   if pressionAtm < 1006 then
        barometer_forecast = BAROMETER_THUNDERSTORM
   elseif pressionAtm <=1013 then
        barometer_forecast = BAROMETER_UNSTABLE
   elseif pressionAtm <= 1016 then
        barometer_forecast = BAROMETER_CLOUDY_RAIN
   elseif pressionAtm <= 1030 then
        barometer_forecast = BAROMETER_SUNNY
   elseif pressionAtm > 1036 then
        barometer_forecast = BAROMETER_STABLE
   end

      commandArray[THBDeviceIdx] = { ['UpdateDevice'] = THBDeviceIdx..'|0|'..temp..';'..humidity..';0;'..pressionAtm.. ';' ..barometer_forecast }
   log('MAJ THBDevice '..THBDeviceIdx..' : '..temp..'°C;'..humidity..'%; '..pressionAtm..'Hpa')

    -- 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.. ';' ..barometer_forecast }
    -- 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

et j'ajoute qqes copies ecran des device obtenus dans chacun des onglets de Domoticz (mesures meteo et temperature) ainsi que le log.
Pièces jointes
Device onglet Mesures.JPG
Device onglet Mesures.JPG (18.58 Kio) Consulté 4958 fois
Device Onglet Météo.JPG
Device Onglet Météo.JPG (45.13 Kio) Consulté 4958 fois
Devices onglet température.JPG
Devices onglet température.JPG (34.55 Kio) Consulté 4958 fois
Log obtenu.JPG
Log obtenu.JPG (47.23 Kio) Consulté 4958 fois
Vianncy
Messages : 27
Inscription : 16 janv. 2021, 18:30

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

Message par Vianncy »

Tant mieux si ça marche et que tu obtiens ce que tu voulais. ;)

Par contre :
mais aussi le paramètre ..humidity.. qu'il m'a fallu écrire comme suit ..humidity..';0' dans la ligne de code du script.
NON, non.. et non :mrgreen:
Ce que tu modifies là ce n'est pas humidity (qui correspond à HUM dans cette documentation https://www.domoticz.com/wiki/Domoticz_ ... Fbarometer ) mais HUM_STAT.
humidity est la valeur d'humidité récupérée du JSON. Plus précisement c'est une variable qui contient une valeur et cette valeur c'est celle de l'humidité extraite du JSON (dans ton cas, humidity = 76% et tu le vérifie dans les logs).

Si l'on se basse sur le JSON, l'enchainement des valeurs pour mettre à jour notre capteur est : TEMP;HUM;HUM_STAT;BAR;BAR_FOR

Dans ce que tu as fait (commandArray[THBDeviceIdx] = { ['UpdateDevice'] = THBDeviceIdx..'|0|'..temp..';'..humidity..';0;'..pressionAtm.. ';' ..barometer_forecast }):
  • Temp =>..temp.. = 12.22°C
  • HUM => ..humidity.. = 76%
  • HUM_STAT =>... Voilà un cas particulier où l'on ne récupere pas de valeur pour ce parametre. On lui affecte donc la valeur 0 (arbitraire) '0;'
  • BAR =>pressionAtm = 1001 hPa
  • BAR_FOR => barometer_forecast
J'espère que c'est plus clair mais visiblement tu n'as pas encore tout saisie sur les commandes et les variables.
En tout cas en n'aucun cas, dans ce que tu as fait, humidity est modifié. Cette valeur 0 va pour HUM_STAT.
cyrille
Messages : 8
Inscription : 24 janv. 2021, 09:44

Re: Partie 2

Message par cyrille »

Keros a écrit : 13 avr. 2020, 10:52 2 - Script Lua

[...]


2.1 - Principe avec la météo actuelle
[...]
  • Spécifier le chemin vers le fichier JSON.lua (différent selon votre système d'exploitation)

Code : Tout sélectionner

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

local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre clé API
local lat = '48.8566969' --  Remplacer par ici votre latittude
local long = '2.3514616' -- Remplacer par votre longitude

--Sélectionner le chemin vers votre fichier JSON.lua en enlevant les 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

[...]
return commandArray
[...]
Perso je met ça pour Linux :

Code : Tout sélectionner

json = (loadfile "scripts/lua/JSON.lua")() -- For Linux
Je suppose fortement que ce marche aussi pour le PI.
Je récupère bien les infos.

Merci pour le partage !
RFXCOM - RFXtrx433E USB 433.92MHz Transceiver - Version: Ext/1044
Domoticz - Version: 2021.1
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Bonjour Cyrille et bienvenue sur le forum ;)

Le chemin en relatif fonctionne également, Je mets à jour le script. Merci pour l'info :)
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
cyrille
Messages : 8
Inscription : 24 janv. 2021, 09:44

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

Message par cyrille »

Mon Widget Temp + Humidity + Baro

Merci pour le sujet fort utile pour une alternative ouverte a darkSky.
Petite particularité, je n'utilise pas les IDX des capteurs, je préfère leurs noms ;-)
Pensez a créer, au préalable, le capteur virtuel "Temperature + Humidite + Barometre" dans configuration/materiel et à le nommer comme dans le script ("openMeteo").
Chez moi ça fonctionne comme script LUA avec un trigger de type TIME, soit un appel toutes les 60 secondes, seul un appel sur 5 aboutit par programme, soit 288 appels / jours, largement en deçà des préco. pour un compte gratuit openWeatherMap.

Encore merci a tous les contributeurs pour les infos de ce sujet.

Code : Tout sélectionner

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

local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre clé API
local lat = '00.000000' --  Remplacer par ici votre latittude
local long = '-0.00000' -- Remplacer par votre longitude
local exclude = 'minutely,hourly,daily,alerts' -- current,minutely,hourly,daily,alerts
local deviceMeteo = 'openMeteo' -- nom du Temp + Humidity + Baro virtuel
local openCurlUrl= '/usr/bin/curl "https://api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&exclude='..exclude..'&appid='..api..'&lang=fr&units=metric"'
local dbg = false -- pour activer le debug, pour mise au point

--Sélection du chemin vers votre fichier JSON.lua
json = (loadfile "scripts/lua/JSON.lua")() -- Relative path for most systems

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

commandArray = {}

-- renvoi le barometer_forecast compatible Domoticz
function barometer_forecast(pressure)	
    --variables de prévision
    local BAROMETER_UNKNOWN = 5
    local BAROMETER_THUNDERSTORM = 4 
    local BAROMETER_UNSTABLE = 3 
    local BAROMETER_CLOUDY_RAIN = 2 
    local BAROMETER_SUNNY = 1 
    local BAROMETER_STABLE = 0 
    local barometer_forecast
    
    if pressure < 980 then
    	barometer_forecast = BAROMETER_UNKNOWN
    elseif pressure <=990 then
    	barometer_forecast = BAROMETER_THUNDERSTORM
    elseif pressure <= 1008 then
    	barometer_forecast = BAROMETER_UNSTABLE
    elseif pressure <= 1020 then
    	barometer_forecast = BAROMETER_CLOUDY_RAIN
    elseif pressure <= 1036 then
    	barometer_forecast = BAROMETER_SUNNY
    elseif pressure > 1036 then
    	barometer_forecast = BAROMETER_STABLE
    end

	return barometer_forecast
end


-- un appel toutes les 5 minutes, soit 288 appels / jour (dans les autorisation d'un compte openWeather Free < 1000/jour)
local min=os.date("%M")
if (min % 5 == 0) then
    if (dbg) then  print ("Recup. openWeather") end
    
    -- L'appel et l'enregistrement des prévisions dans la variable jsonValeur
    if (dbg) then print(openCurlUrl) end
    config=assert(io.popen(openCurlUrl))
    blocjson = config:read('*all')
    config:close()
    jsonValeur = json:decode(blocjson)
    if (dbg) then print(blocjson) end
    
    --------------------------------------------
    ---- Code à modifier selon vos besoins -----
    -------------------------------------------- 
    
    if (jsonValeur ~=nil and jsonValeur.current ~= nil) then
        -- récupération de infos du json
        temp        = jsonValeur.current.temp
        humidity    = jsonValeur.current.humidity
        pressure    = jsonValeur.current.pressure

        -- affectation des valeurs aux devices virtuelles
        theValue    = string.format("%d|0|%s", otherdevices_idx[deviceMeteo], ''..temp..';'..humidity..';0;'..pressure..';'..barometer_forecast(pressure)) 
        if (dbg) then print('NewValue:'..theValue) end
        commandArray[otherdevices_idx[deviceMeteo]] = { ['UpdateDevice'] = theValue }
    else
        print("ERR : récupération des infos du webservice openWeather !")
        print(blocjson)
    end
end

return commandArray
Refs :
- https://www.domoticz.com/wiki/LUA_commands
- https://www.domoticz.com/wiki/Domoticz_ ... Fbarometer
Dernière modification par cyrille le 17 févr. 2021, 18:49, modifié 5 fois.
RFXCOM - RFXtrx433E USB 433.92MHz Transceiver - Version: Ext/1044
Domoticz - Version: 2021.1
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Pourquoi fais-tu une boucle sur tous les device pour trouver celui de ta météo ? Tu n'en n'as pas de besoin car ton script est en Time.
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
cyrille
Messages : 8
Inscription : 24 janv. 2021, 09:44

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

Message par cyrille »

bien vu ! je corrige.
Dernière modification par Keros le 25 janv. 2021, 19:02, modifié 1 fois.
Raison : Merci de ne pas citer le message précédent lors d'une réponse directe
RFXCOM - RFXtrx433E USB 433.92MHz Transceiver - Version: Ext/1044
Domoticz - Version: 2021.1
Répondre