Page 2 sur 4

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 23 nov. 2024, 00:29
par jeje
Bonjour donc voici ce que j'arrive à récupérer :

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 
si vous vouler des renseignements n'hesiter pas je ne suis pas souvent connecter mais je ferais de mon mieux.

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 10 janv. 2025, 10:35
par Dreamer
Merci pour ce script.

Il présente toutefois un soucis chez moi (Domoticz sur PI), les différents idx ne se mettent pas à jour malgré la bonne récupération des donnes sur Visual Crossing (données bien présentes ds les log) et je ne vois pas comment faire :? .

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 10 janv. 2025, 13:15
par jeje
Bonjour Dreamer les numéro des idx sont bien ceux qui corresponde aux votre si ces bon dans les log ça doit se mettre a jour.

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 10 janv. 2025, 13:18
par denis_brasseur
Tu as bien adapté le script avec les idx de tes devices ?
Aucun ne se met à jour ?
Présence de message d'erreur dans les log ?

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 10 janv. 2025, 13:21
par denis_brasseur
jeje a écrit : 23 nov. 2024, 00:29 Bonjour donc voici ce que j'arrive à récupérer :

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 :
liste des commandes : 
--]]
 
Attention, il manque [[-- en début de script

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 10 janv. 2025, 13:39
par jeje
Quel boulet :roll: je fait ,c'est corriger merci Denis_Brasseur .Mais pourquoi ça fonctionne dans les logs?

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 10 janv. 2025, 20:09
par denis_brasseur
Cela s'affiche dans les logs parce l'affichage porte sur des valeurs récupérées par le script et destinées à mettre à jour des devices, et non pas de valeur issues de devices inexistants.

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 10 janv. 2025, 21:42
par jeje
OK Denis_Brasseur, merci pour cet info .Je fais de mon mieux avec mes maigres connaissances, avez vous essayer le script?

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 20 janv. 2025, 15:45
par Dreamer
Bonjour et merci pour le partage du dernier script.
J'aimerai récupérer les prévisions des couverture nuageuse (clouds)+ rafale de vente (windGust) 4 heures après avoir lancé le script à 10h00 (par exemple) tous les jours. Je pensais bidouiller la requête ainsi :
"clouds4h = jsonValeur.hours[4].cloudcover" mais cela ne fonctionne pas :P

Avez vous une idée de la requête? :)

Re: Meilleur méthode pour récupérer valeur visual crossing?

Publié : 20 janv. 2025, 20:48
par Keros
Les API peuvent changer avec le temps. Le plus facile serait que tu nous partages le résultat JSON de ton appel à l'API.