[LUA-DzVents] Données Météo avec API Openweathermap
Re: [LUA] Données Météo avec API Openweathermap
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
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Re: [LUA] Données Météo avec API Openweathermap
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.
Re: [LUA] Données Météo avec API Openweathermap
Bonjour Keros,
Voila mon script avec les essais que j'ai effectués.
Voila mon script avec les essais que j'ai effectués.
Re: [LUA] Données Météo avec API Openweathermap
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 :
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 ?
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))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
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Re: [LUA] Données Météo avec API Openweathermap
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)
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)
Re: [LUA] Données Météo avec API Openweathermap
@Keros
Je viens de relancer mon script, plus exactement le tien et maintenant ça fonctionne.
Je n'ai rien fait de plus.
Bonne soirée.
Je viens de relancer mon script, plus exactement le tien et maintenant ça fonctionne.
Je n'ai rien fait de plus.
En tout cas merci encore pour ton investissement.Bizarre vous avez dit bizarre
Bonne soirée.
Re: [LUA] Données Météo avec API Openweathermap
Tant mieux que tu ai pu te débloquer
Bonne continuation
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
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
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
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
Tu utilise un tableau identique pour l'affectation de tes devices
et pour tes valeurs que tu n'a pas indexé
Code : Tout sélectionner
proba_pluie_h = jsonValeur.hourly[i].rain
proba_neige_h = jsonValeur.hourly[i].snowCode : 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 Code : Tout sélectionner
proba_pluie_h = jsonValeur.hourly[i].rainPi3 + 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
Merci pour ton retour mais j'avoue que je ne vois pas comment m'y prendre...