Re: Meilleur méthode pour récupérer valeur visual crossing?
Publié : 23 nov. 2024, 00:29
Bonjour donc voici ce que j'arrive à récupérer :
si vous vouler des renseignements n'hesiter pas je ne suis pas souvent connecter mais je ferais de mon mieux.
Code : Tout sélectionner
--[[
update /mis à jour = 30/10/2024
author/auteur = jeje
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 visualcrossing :https://www.visualcrossing.com/sign-up
liste des commandes : https://www.visualcrossing.com/resources/documentation/weather-api/timeline-weather-api/
--]]
local actual_hour = os.date("%H:%M")
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
local function log(p_message)
-- Décommenter la ligne du dessous pour afficher les logs / Commenter pour ne pas afficher les logs
print("[visualcrossing] " .. p_message)
end
local scriptName = 'Meteo visual'
local scriptVersion = 'V1.0'
local time = os.date("*t") -- Si vous souhaitez exécuté ce script toutes les X min
local start_hour = '19:25' -- Si vous souhaitez exécuté ce script tous les jours à 6h
local actual_hour = os.date("%H:%M")
local THBDeviceIdx = 201 -- EXEMPLE 3 - 2) Idx de votre dispositif température+humidité+barometre
local THBDevicedemainIdx = 872 -- EXEMPLE 3 - 2) Idx de votre dispositif température+humidité+barometre
local tempDeviceIdx = 198 -- EXEMPLE 3 - 1) Idx de votre disositif Température
local vtrDeviceIdx = 202 -- EXEMPLE 3 - 2) Idx de votre dispositif Vent+Température+Refroidissement
local rainDeviceIdx = 196 -- EXEMPLE 3 - 3) Idx de votre dispositif Précipitations
local RainRateDeviceIdx = 196
local uvDeviceIdx = 197 -- EXEMPLE 3 - 4) Idx de votre dispositif UV
--local atmDeviceIdx = 735 -- EXEMPLE 3 - 5) Idx de votre dispositif Baromètre
--local demain_atmDeviceIdx = 872
local humDeviceIdx = 199 -- EXEMPLE 3 - 6) Idx de votre dispositif humidité (pourcentage)
local cloudDeviceIdx = 200 -- EXEMPLE 3 - 7) Idx de votre dispositif couverture nuageuse (pourcentage)
local weatherDeviceIdx = 206
local weatherdemainDeviceIdx =871
local temp_minDeviceIdx = 203
local temp_maxDeviceIdx = 870
local rosedemainDeviceIdx = 665
local roseDeviceIdx = 666
local AlertedeviceIdx = 678
local AlertedemaindeviceIdx = 677
--------------------------------------------
----------- Variables à éditer -------------
--------------------------------------------
local api = 'votre api' -- Remplacer par votre clé API de visualcrossing
local lat = 'votre latitude' -- Remplacer par ici votre latittude
local long = 'votre longitude' -- Remplacer par votre longitude
local localisation = 'gard'
--local ville = ' '
--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 = {}
-- 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 % 30)==0 then -- pour exécuter le script toutes les X min
--if actual_hour==start_hour then -- pour exécuter le script à heure fixe
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://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/'..lat..','..long..'/next7days?unitGroup=metric&lang=fr&key='..api..'&contentType=json"'))
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.currentConditions.temp
rose = jsonValeur.currentConditions.dew
weather = jsonValeur.currentConditions.conditions
-- L'utilisation des données (ici j'écris une ligne dans le LOG de DomoticZ)
-- log(msg)
-------------------------------------------
-- EXEMPLE 2 - Temps dans X heures
-- le [11] signifie dans 11h à modifier selon l'heure d'appel du script
temp_demain = jsonValeur.days[2].temp
weather_demain = jsonValeur.days[2].conditions --[1].description
pression_demain= jsonValeur.days[2].pressure
rosedemain = jsonValeur.days[2].dew
temp_min = jsonValeur.days[2].tempmin
temp_max = jsonValeur.days[2].tempmax
-- Code pour afficher et convertir la date et l'heure de la prévision
--time_prevision = jsonValeur.hours[13].dt
-- heure_prevision = (os.date(" à %X", time_prevision))
humidity_demain = jsonValeur.days[2].humidity
--------------------------------------------
-- 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.currentConditions.temp
temp_min = jsonValeur.days[1].tempmin
temp_max = jsonValeur.days[1].tempmax
tempFeels = jsonValeur.currentConditions.feelslike
windSpeed = jsonValeur.currentConditions.windspeed
windSpeed2 = windSpeed*3
windGust = jsonValeur.currentConditions.windgust
windGust2 = windGust*2.85
windDirection = jsonValeur.currentConditions.winddir
rain = jsonValeur.days[1].precipcover
--rain-Rate = jsonValeur.days[1].precip
UVIndex = jsonValeur.currentConditions.uvindex
pressionAtm = jsonValeur.currentConditions.pressure
humidity = jsonValeur.currentConditions.humidity
clouds = jsonValeur.currentConditions.cloudcover
alerte = jsonValeur.alerts[1]
--alertedemain = jsonValeur.alerts
-- 1) MAJ des capteurs Virtuel de Température
commandArray[tempDeviceIdx] = { ['UpdateDevice'] = tempDeviceIdx..'|0|'..temp }
log('MAJ tempactuelle '..tempDeviceIdx ..' : '..temp..'°C')
commandArray[temp_minDeviceIdx] = { ['UpdateDevice'] = temp_minDeviceIdx..'|0|'..temp_min }
log('MAJ temperature min '..temp_minDeviceIdx..' : '..temp_min..'°C')
commandArray[temp_maxDeviceIdx] = { ['UpdateDevice'] = temp_maxDeviceIdx..'|0|'..temp_max }
log('MAJ temperature max '..temp_maxDeviceIdx..' : '..temp_max..'°C')
-- 2) MAJ du capteur Virtuel de Vent+Température+Refroidissement
commandArray[roseDeviceIdx] = { ['UpdateDevice'] = roseDeviceIdx..'|0|'..rose}
log('MAJ rosé ' ..roseDeviceIdx..' : ' ..rose.. '°C')
commandArray[rosedemainDeviceIdx] = {['UpdateDevice'] = rosedemainDeviceIdx.. '|0|'..rosedemain }
log('MAJ rosé demain ' ..rosedemainDeviceIdx..' : ' ..rosedemain.. '°C')
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)
if (jsonValeur.currentConditions.windgust) then
windGust = jsonValeur.currentConditions.windgust
else
windGust = 0
end
commandArray[vtrDeviceIdx] = { ['UpdateDevice'] = vtrDeviceIdx..'|0|'..windDirection..';'..tostring(direction)..';'..windSpeed2..';'..windGust2..';'..temp..';'..tempFeels }
log('MAJ vtrDevice '..vtrDeviceIdx..' : '..temp..'|'..tempFeels..'°C ; '..windSpeed..' km/h |'..windGust..' km/h '..direction)
-- end
-- 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..'|0|0;'..rain }
log('MAJ quantité pluie '..rainDeviceIdx..' : '..rain..' mm')
--commandArray[RainRateDeviceIdx] = { ['UpdateDevice'] = RainRateDeviceIdx..'|2|0;'.. rainRate }
--log('MAJ quantité pluie '..RainRateDeviceIdx..' : '.. rainRate..' mm/h')
-- 4) MAJ du capteur d'UV
commandArray[uvDeviceIdx] = { ['UpdateDevice'] = uvDeviceIdx..'|1|'..UVIndex..';0' }
log('MAJ quantité uv '..uvDeviceIdx..' : '..UVIndex)
-- 5) MAJ du capteur baromètre
-- On réutilise pressionAtm
local BAROMETER_CLOUDY_RAIN = 6
local BAROMETER_UNKNOWN = 5
local BAROMETER_THUNDERSTORM = 4
local BAROMETER_UNSTABLE = 3
local BAROMETER_CLOUDY = 2
local BAROMETER_SUNNY = 1
local BAROMETER_STABLE = 0
local barometer_forecast
-- On réutilise pressionAtm
if pressionAtm <= 980 then
barometer_forecast = BAROMETER_THUNDERSTORM
elseif pressionAtm <=990 then
barometer_forecast = BAROMETER_CLOUDY_RAIN
elseif pressionAtm <= 1008 then
barometer_forecast = BAROMETER_UNSTABLE
elseif pressionAtm <= 1020 then
barometer_forecast = BAROMETER_CLOUDY
elseif pressionAtm <= 1036 then
barometer_forecast = BAROMETER_SUNNY
elseif pressionAtm > 1036 then
barometer_forecast = BAROMETER_STABLE
end
--commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm.. ';' ..barometer_forecast }
commandArray[THBDeviceIdx] = { ['UpdateDevice'] = THBDeviceIdx..'|0|'..temp..';'..humidity..';0;'..pressionAtm.. ';' ..barometer_forecast }
log('MAJ pressionAtm :'..THBDeviceIdx..' : '..pressionAtm)
commandArray[THBDevicedemainIdx] = { ['UpdateDevice'] = THBDevicedemainIdx..'|0|'..temp_demain..';'..humidity_demain..';0;'..pression_demain.. ';' ..barometer_forecast }
log('MAJ pressionAtmodemain :'..THBDevicedemainIdx..' : '..pression_demain)
-- 6) MAJ du capteur humidité et du capteur couverture nuageuse
commandArray[humDeviceIdx] = { ['UpdateDevice'] = humDeviceIdx..'|0|'..humidity }
log('MAJ humidité '..humDeviceIdx..' : '..humidity.. ' %')
commandArray[cloudDeviceIdx] = { ['UpdateDevice'] = cloudDeviceIdx..'|0|'..clouds }
log('MAJ couverture nuageuse :'..cloudDeviceIdx..' : '..clouds.. ' %')
commandArray[weatherDeviceIdx]= { ['UpdateDevice'] = weatherDeviceIdx..'|0|'..weather }
log('MAJ temps actuel :' ..weatherDeviceIdx..' : ' ..weather )
commandArray[weatherdemainDeviceIdx]= { ['UpdateDevice'] = weatherdemainDeviceIdx..'|0|'..weather_demain }
log('MAJ temps pour demain :' ..weatherdemainDeviceIdx..' : ' ..weather_demain )
--//Code pour afficher et convertir la date et l'heure de l'alerte
if (jsonValeur.alerts[1]) == nil then
alerte = 'aucune alerte météo'
commandArray[AlertedeviceIdx] = { ['UpdateDevice'] = AlertedeviceIdx ..'|1|'..alerte}
log('MAJ Alerte ' .. AlertedeviceIdx ..' : ' ..alerte.. ' pour aujourdhui')
alertedemain = 'aucune alerte pour demain'
commandArray[AlertedemaindeviceIdx] = { ['UpdateDevice'] = AlertedemaindeviceIdx ..'|1|'..alertedemain}
log('MAJ Alerte Météo pour demain ' .. AlertedemaindeviceIdx .. ':' ..alertedemain)
else if (jsonValeur.alerts[1]) ~= nil then
--alerte =(jsonValeur.alerts[1])
alerte = " Alerte météo pour aujourd'hui "
--alertdescr =jsonValeur.alerts[1].event
--//Code pour afficher et convertir la date et l'heure de la prévision
time_start = jsonValeur.alerts[1].onsetEpoch
heure_depart = (os.date("à %H:%M", time_start))
date_dujour = jsonValeur.alerts[1].onsetEpoch
date_dujour =(os.date(" %d ; %m", date_dujour))
time_end = jsonValeur.alerts[1].endsEpoch
heure_fin = (os.date("à %H:%M", time_end))
date_defin = jsonValeur.alerts[2].endsEpoch
date_defin = (os.date("le %d ; %m", date_defin))
if (jsonValeur.alerts[1].event) then --== 'Vigilance jaune pluie-inondation' --je travail la dessus
alertdescr = jsonValeur.alerts[1].event
-- if (alertdescr) == 'Vigilance jaune .. ' then
commandArray[AlertedeviceIdx] = { ['UpdateDevice'] = AlertedeviceIdx ..'|2|' .. date_dujour .. ' ' ..heure_depart.. ' ; ' ..alertdescr.. ' qui prendra fin ' .. date_defin ..' ' ..heure_fin}
log('MAJ Alerte Météo ' .. AlertedeviceIdx ..' : ' ..alerte.. ' : ' .. date_dujour .. ' ' ..heure_depart.. ',' ..alertdescr.. ' prendra fin ' .. date_defin ..' ' ..heure_fin)
--log('MAJ Alerte Météo ' .. AlertedeviceIdx..' : ' ..alertdescr )
--end
end
end
--end
if (jsonValeur.alerts[2]) == nil then
alertedemain = 'aucune alerte météo pour demain'
commandArray[AlertedemaindeviceIdx] = { ['UpdateDevice'] = AlertedemaindeviceIdx ..'|1|'..alertedemain }
log('MAJ Alerte Météo pour demain ' .. AlertedemaindeviceIdx .. ':' ..alertedemain)
else if (jsonValeur.alerts[2])~= nil then
alertedemain = " Alerte météo pour demain:"
if (jsonValeur.alerts[2]) then
alertdemaindescr = jsonValeur.alerts[2].event
commandArray[AlertedemaindeviceIdx] = { ['UpdateDevice'] = AlertedemaindeviceIdx ..'|2|'..alertdemaindescr }
log('MAJ Alerte Météo pour demain ' .. AlertedemaindeviceIdx .. ' : '..alertedemain.. ':' ..alertdemaindescr)
end
end
end
end
end
return commandArray