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

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
jeje
Messages : 32
Inscription : 13 août 2021, 01:17
Localisation : nord

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

Message 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.
Dernière modification par jeje le 10 janv. 2025, 13:48, modifié 3 fois.
domoticz sur VM sur freebox delta
Dreamer
Messages : 43
Inscription : 03 mars 2020, 16:18

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

Message 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 :? .
Raspberry Pi 1 + RFXcom + modules volets Somfy + modules DIO (chauffage/poele/lumiere)
jeje
Messages : 32
Inscription : 13 août 2021, 01:17
Localisation : nord

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

Message 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.
domoticz sur VM sur freebox delta
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

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

Message 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 ?
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

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

Message 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
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
jeje
Messages : 32
Inscription : 13 août 2021, 01:17
Localisation : nord

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

Message par jeje »

Quel boulet :roll: je fait ,c'est corriger merci Denis_Brasseur .Mais pourquoi ça fonctionne dans les logs?
domoticz sur VM sur freebox delta
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

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

Message 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.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
jeje
Messages : 32
Inscription : 13 août 2021, 01:17
Localisation : nord

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

Message par jeje »

OK Denis_Brasseur, merci pour cet info .Je fais de mon mieux avec mes maigres connaissances, avez vous essayer le script?
domoticz sur VM sur freebox delta
Dreamer
Messages : 43
Inscription : 03 mars 2020, 16:18

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

Message 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? :)
Raspberry Pi 1 + RFXcom + modules volets Somfy + modules DIO (chauffage/poele/lumiere)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message 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.
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
Répondre