[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.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Tu peux nous copier ton script stp en masquant les cordonnées GPS et ta clé API (comme tu l'a déjà fait dans le lien).
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
Bribel
Messages : 8
Inscription : 13 juin 2019, 21:29

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

Message par Bribel »

Code : Tout sélectionner

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

local api = '79xxxxxxxxxxxxxxxxx75' -- Remplacer par votre clé API
local lat = '4x.xxxxxx' --  Remplacer par ici votre latittude
local long = '0.xxxxx' -- 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/xxxxxx/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 = {}

  -- 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')) -- Testé sans succès
-- config=assert(io.popen('usr/bin/curl https://api.openweathermap.org/data/2.5/onecall?lat=4x.xxxxx&lon=0.xxxxx&exclude=minutely,hourly,daily&appid=79xxxxxxxxxxxxxxxxx75&lang=fr&units=metric')) -- Testé sans succès
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')
  
  print(blocjson) -- pour Test
  config:close()
  jsonValeur = json:decode(blocjson)

--------------------------------------------
---- Code à modifier selon vos besoins -----
-------------------------------------------- 

    -- L'enregistrement des données souhaitées dans des variables (vous pouvez en ajouter autant que vous voulez)

    temp = jsonValeur.current.temp[1]
    rose = jsonValeur.current.dew_point[1]
    weather = jsonValeur.current.weather[1].description

    --  L'utilisation des données (ici j'écris un 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.'

    print(msg)

--------------------------------------------
--------- Fin code à modifier  -------------
--------------------------------------------

return commandArray
Dernière modification par Bribel le 25 nov. 2020, 14:20, modifié 2 fois.
Bribel
Messages : 8
Inscription : 13 juin 2019, 21:29

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

Message par Bribel »

Bonjour Keros,
Voila mon script avec les essais que j'ai effectués.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Ok merci pour le code. pour info, il y a des balise codes avec le bouton </> qui facilite la lecture.

Est-ce que tu peux essayer ceci :

Code : Tout sélectionner

lien = '/usr/bin/curl "https://api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'
print('Lien : '..lien)
config=assert(io.popen(lien))
L'idée est de vérifier que qu'il essaye d'envoyer. Tu peux nous coller la ligne Lien : qui devrait apparaitre dans les logs ?
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
Bribel
Messages : 8
Inscription : 13 juin 2019, 21:29

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

Message par Bribel »

1- désolé mais je ne sais pas faire avec les balises code. Edit : Je viens de trouver je pense.
2- Voici le lien qui apparait dans le log. J'ai copié la ligne complète en cachant mes ID
2020-11-25 14:08:00.342 Status: LUA: Lien : /usr/bin/curl "https://api.openweatherm ... s=metric".
3- https://... collé dans le navigateur ça fonctionne
En revanche print("bloc : ",blocjson) me donne 2020-11-25:14:08:00.409 Status: LUA: bloc : (c'est vide)
Bribel
Messages : 8
Inscription : 13 juin 2019, 21:29

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

Message par Bribel »

@Keros
Je viens de relancer mon script, plus exactement le tien et maintenant ça fonctionne.
Je n'ai rien fait de plus.
Bizarre vous avez dit bizarre
En tout cas merci encore pour ton investissement.
Bonne soirée.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Tant mieux que tu ai pu te débloquer :D
Bribel a écrit : 25 nov. 2020, 17:39 En tout cas merci encore pour ton investissement.
C'est avec plaisir ;)
Bonne continuation
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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

Dans la même idée du script de papoo sur wunderground, je souhaiterai intégrer la probabilité de pluie et de neige. Le script me remonte les N° dIDX au lieu des probabilités de neige et pluie ... Qui pourrait me dire comment rappatrier la valeur de pourcentage ?

Code : Tout sélectionner

--[[ script_time_meteo.lua

auteur = joebuz
modification : g@rycooper
mise a jour = 03/01/2021
creation = 03/05/2020


Cree depuis ce topic
auteur = Keros
https://easydomoticz.com/forum/viewtopic.php?f=17&t=9892
Date = 13/04/2020

Ce script necessite l'inscription prealable a l'API Openweathermap : https://openweathermap.org
liste des commandes : https://openweathermap.org/api/one-call-api
--]]

local function log(p_message)
  -- Decommenter 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.1'
local time              = os.date("*t")       	    -- Si vous souhaitez execute ce script toutes les X min
local start_hour        = '06:00'             	    -- Si vous souhaitez execute ce script tous les jours a 6h
local actual_hour       = os.date("%H:%M")
local statmetDeviceIdx  = 2		      	    -- EXEMPLE 3 - 1) Idx de votre dispositif Temperature+Humidite+Barometre
local vtDeviceIdx       = 3                    	    -- EXEMPLE 3 - 2) Idx de votre dispositif Vent
local rainDeviceIdx     = 4                         -- EXEMPLE 3 - 3) Idx de votre dispositif Precipitations
local uvDeviceIdx       = 5                         -- EXEMPLE 3 - 4) Idx de votre dispositif UV

                                                                  -- EXEMPLE 4 on rajoute les probabilités de pluie et neige
local proba_pluie_h = {}                            -- Ajoutez, modifiez ou supprimez les variables proba_pluie_h[] 
                                                    -- en changeant le N° entre [] correspondant à l'heure souhaitée pour l'associer au device concerné dans dz
proba_pluie_h[1]=27                                 -- renseigner l'idx du device % probabilité pluie à 1 heure associé, nil si non utilisé 
proba_pluie_h[2]=28                                 -- renseigner l'idx du device % probabilité pluie à 2 heures associé, nil si non utilisé
proba_pluie_h[4]=29                                 -- renseigner l'idx du device % probabilité pluie à 4 heures associé, nil si non utilisé
proba_pluie_h[6]=30                                 -- renseigner l'idx du device % probabilité pluie à 6 heures associé, nil si non utilisé
proba_pluie_h[12]=31                                -- renseigner l'idx du device % probabilité pluie à 12 heures associé, nil si non utilisé
proba_pluie_h[24]=32                                -- renseigner l'idx du device % probabilité pluie à 24 heures associé, nil si non utilisé

                                                    -- L'api fournie 36 probabilités de neige, 1 par heure.
local proba_neige_h={}                              -- comme pour la pluie Ajoutez, modifiez ou supprimez les variables proba_neige_h[] 
                                                    -- en changeant le N° entre [] correspondant à l'heure souhaitée pour l'associer au device concerné dans dz 
proba_neige_h[1]=33                                 -- renseigner l'idx du device % probabilité neige à 1 heure associé, nil si non utilisé 
proba_neige_h[2]=34                                 -- renseigner l'idx du device % probabilité neige à 2 heures associé, nil si non utilisé
proba_neige_h[4]=35                                 -- renseigner l'idx du device % probabilité neige à 4 heures associé, nil si non utilisé
proba_neige_h[6]=36                                -- renseigner l'idx du device % probabilité neige à 6 heures associé, nil si non utilisé
proba_neige_h[12]=37                                -- renseigner l'idx du device % probabilité neige à 12 heures associé, nil si non utilisé
proba_neige_h[24]=38                                -- renseigner l'idx du device % probabilité neige à 24 heures associé, nil si non utilisé

local seuil_notification= nil                       -- pourcentage au delà duquel vous souhaitez être notifié, nil si non utilisé

--------------------------------------------
----------- Variables a editer -------------
-------------------------------------------- 

local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx' 	    -- Remplacer par votre cle API
local lat = 'xxxxxxxxxxxx' 				    --  Remplacer par ici votre latittude
local long = 'xxxxxxxxxxxxx' 			    -- Remplacer par votre longitude

--Selectionner le chemin vers votre fichier JSON.lua en decommentant  la ligne pour votre systeme d'exploitation

--json = (loadfile "/home/votrenomutilise/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 a editer ----------
-------------------------------------------- 

commandArray = {}
  log(scriptName.." "..scriptVersion.." - "..actual_hour)
  -- Les script_time sont executes 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 executer le script toutes les X min
  -- if actual_hour==start_hour then        -- pour executer le script a heure fixe

    -- L'appel et l'enregistrement des previsions 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 a modifier selon vos besoins -----
    -------------------------------------------- 

    -- EXEMPLE  1 - Temps Actuel
    -- L'enregistrement des donnees souhaitees 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 donnees (ici j'ecris une ligne dans le LOG de DomoticZ)
    msg = 'Il fait '..temp..' degres et la meteo indique '..weather..' avec un point de rose a '..rose..' degres.'
    log(msg)

    ---------------------------------------------
    -- EXEMPLE 2 - Temps dans X heures
    -- le [12] signifie dans 12h e modifier selon l'heure d'appel du script
    temp_demain = jsonValeur.hourly[12].temp
    weather_demain = jsonValeur.hourly[12].weather[1].description
       
    -- Code pour afficher et convertir la date et l'heure de la prevision
    time_prevision = jsonValeur.hourly[12].dt
    heure_prevision = (os.date("%x a %X", time_prevision))
      
    msg = 'Le '..heure_prevision..', il fera '..temp_demain..' degres et la meteo prevoit '.. weather_demain..'.'
    log(msg)

    --------------------------------------------
    -- EXEMPLE 3  - 
    -- dans Materiel cree un capteur virtuel Dummy que vous appelez comme vous voulez
    -- 1) Creer un capteur virtuel Temp + humidite + barometre et renseignez en haut de ce script pour "statmetDeviceIdx"
    -- 2) Creer un capteur virtuel Vent+Temperature+Refroidissement et renseignez en haut de ce script pour "local vtrDeviceIdx"
    -- 3) Creer un capteur virtuel Precipitations et renseignez en haut de ce script pour "local rainDeviceIdx"
    -- 4) Creer un capteur virtuel UV et renseignez en haut de ce script pour "local uvDeviceIdx"


    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
    proba_pluie_h = jsonValeur.hourly[i].rain
    proba_neige_h = jsonValeur.hourly[i].snow


    -- 1) MAJ du capteur station meteo
    commandArray[statmetDeviceIdx] = {['UpdateDevice'] = statmetDeviceIdx..'|0|'..temp..';'..humidity..';0;'..pressionAtm..';0'}
    log('MAJ capteur station meteo '..statmetDeviceIdx..' : '..temp..' C |'..humidity..' % |'..pressionAtm..' hPa')

    -- 2) MAJ du capteur Virtuel de Vent

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[vtDeviceIdx] = { ['UpdateDevice'] = vtDeviceIdx..'|0|'..windDirection..';'..tostring(direction)..';'..windSpeed2..';'..windGust2..';'..temp..';'..tempFeels }
    log('MAJ capteur vent '..vtDeviceIdx..' : '..temp..'|'..tempFeels..' C ; '..windSpeed..'|'..windGust..' m/s '..direction)

    -- 3) MAJ du capteur de pluie
	if (jsonValeur.daily[1].rain) then 
		rain = jsonValeur.daily[1].rain
	else
		rain = 0
	end
    commandArray[rainDeviceIdx] = { ['UpdateDevice'] = rainDeviceIdx..'|1|0;'..rain }
    log('MAJ capteur pluie '..rainDeviceIdx..' : '..rain..' mm')

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

 end
    --------------------------------------------
    -- EXEMPLE 4  - 
    -- Probabilité pluie et neige

            for i in pairs(proba_pluie_h) do 
                    if proba_pluie_h[i] ~= nil then 
                        pluie = tonumber(proba_pluie_h[i])
                        commandArray[#commandArray+1] = {['UpdateDevice'] = proba_pluie_h[i]..'|0|'.. pluie}
                        if seuil_notification ~= nil and pluie > seuil_notification then
                        commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte : '.. pluie ..' % de probabilité de pluie dans '.. i ..'heure(s)'}
                        
                        end
                    end
                    if proba_neige_h[i] ~=nil then
                        neige = tonumber(proba_neige_h[i])
                        commandArray[#commandArray+1] = {['UpdateDevice'] = proba_neige_h[i]..'|0|'.. neige}
                        if seuil_notification ~= nil and neige > seuil_notification then
                        commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte : '.. neige ..' % de probabilite de neige dans '.. i ..'heure(s)'}
                        end
                    end
	      end
    --------------------------------------------
    --------- Fin code a modifier  -------------
    --------------------------------------------
 
return commandArray
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

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

Message par denis_brasseur »

Lors de la récupération des probabilités pluie et neige, tu as indexé tes valeurs avec {i] que tu n'a pas défini

Code : Tout sélectionner

    proba_pluie_h = jsonValeur.hourly[i].rain
    proba_neige_h = jsonValeur.hourly[i].snow
Tu utilise un tableau identique pour l'affectation de tes devices

Code : Tout sélectionner

proba_pluie_h[1]=27                                 -- renseigner l'idx du device % probabilité pluie à 1 heure associé, nil si non utilisé 
proba_pluie_h[2]=28                                 -- renseigner l'idx du device % probabilité pluie à 2 heures associé, nil si non utilisé
proba_pluie_h[4]=29                                 -- renseigner l'idx du device % probabilité pluie à 4 heures associé, nil si non utilisé
proba_pluie_h[6]=30                                 -- renseigner l'idx du device % probabilité pluie à 6 heures associé, nil si non utilisé
proba_pluie_h[12]=31                                -- renseigner l'idx du device % probabilité pluie à 12 heures associé, nil si non utilisé
proba_pluie_h[24]=32 
et pour tes valeurs que tu n'a pas indexé

Code : Tout sélectionner

proba_pluie_h = jsonValeur.hourly[i].rain
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

Merci pour ton retour mais j'avoue que je ne vois pas comment m'y prendre...
Répondre