[DzVents] Données Météo Weather Visual Crossing

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.
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Doudy »

Effectivement, c'était bien les widgets DarkSky.
;)
Dernière modification par Keros le 24 août 2023, 09:22, modifié 1 fois.
Raison : Citation supprimée.MErci de ne pas citer le message précédent lors dune réponse directe
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Keros »

Je pense que le souci vient de là : Les dispositifs créés par le plugin DarkSky ne sont pas mofifiables via les commandes API. Il faut que ce soit des dispositifs créés via le plugin Dummy devices.

Tu dois néanmoins pouvoir garder l'historique en remplaçant le dispositif DarkSky par celui que tu as créé pour le script.
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
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Doudy »

OK merci
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Doudy »

Hello,
Me revoilà,
Je n'ai rien qui s'affiche après

Code : Tout sélectionner

print('Réception de WeatherVisualCrossing')

Code : Tout sélectionner

        if triggerItem.isHTTPResponse then
            if triggerItem.ok and triggerItem.isJSON then
                local resultsTable = triggerItem.json
                print('Réception de WeatherVisualCrossing')
                if resultsTable ~= nil and resultsTable.currentConditions ~= nil then
                    for k, d in ipairs(StMeteo) do
                        if d['idx'] ~= 0 then --0
                            d.cde(dz, d['idx'], resultsTable) 
                        end
                    end
                end
            else
                errorMessage("Problème avec la réponse de WeatherVisualCrossing", false)
            end
        end
 
                
Je suppose que cela affiche les différentes valeurs trouvées !
;)
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Keros »

Les widgets se mettent à jour ou pas ?
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
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Doudy »

Oui mais pas tous :
Pas le 690 et 700, 701, 702
Capture5.PNG
Capture5.PNG (91.46 Kio) Consulté 1443 fois
;)
Dernière modification par Keros le 25 août 2023, 08:38, modifié 1 fois.
Raison : Citation supprimée.Merci de ne pas citer le message précédent lors dune réponse directe
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Keros »

On est à l'aveugle et je n'ai pas de boule de cristal :roll:

Mets nous ton script entier et les logs de son exécution.
Sans ça impossible pour nous de faire une quelconque analyse.
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
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Doudy »

Le script :

Code : Tout sélectionner

--[[
Dans mon cas j'utilise un raspberry pi 3, mais domoticz est installable sur d'autres matériels comme des systèmes android, nas synology ou autres... Donc l'emplacement du fichier peut varier selon la distrib(version de du système d'exploitation sous linux).
Attention il faudra changer user par votre nom d'utilisateur.(pi d'origine sur un raspberry, sauf si vous l'avez modifié.)
il faut le placer dans : /home/user/domoticz/scripts/dzVents/scripts/weathervisualcrossing.lua
Donc avec le user d'origine qui s'appelle pi : --home/pi/domoticz/scripts/dzVents/scripts/weathervisualcrossing.lua

author : gso
       : modifié pour weathervisualcrossing par BernardC
MAJ : 10/06/2023
création : 24/03/2023
Adaptation perso : 20/08/2023
Principe :
lien pour inscription à  weather visual crossing:
https://www.visualcrossing.com/sign-up
lien pour récupérer la clé:
https://www.visualcrossing.com/account
requête type pour remplacer DarkSky API pour La localitée "Le Mans" dans Sarthe
https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/Le%20Mans/today?unitGroup=metric&include=fcst%2Ccurrent&key=<votre cle API>&options=nonulls&contentType=json
}

]]--

local scriptName = 'weather.visualcrossing'
local scriptVersion = '1.21'

--****************************************************************************************************************************************************************************************
--      les 2 variables à renseigner, /!\ les deux variables à renseigner vont être inséré dans une adresse url, 
--      donc il faut remplacer tout les caractères spéciaux par leur équivalent web, évitez tout ce qui a des accente etc : exemple : un espace sera remplacé par %20
--      Comme vous pouvez voir dans mon cas j'ai testé : "ANZIN 59410 France"
--****************************************************************************************************************************************************************************************
local Localite = 'XXXXXX' --Remplacez ANZIN%2059410%20France par Votre ville Code postal, etc et laissez bien les %20 car ce sont des espace en Url UTF-8.
local apiKey = 'XXXX' --Remplacez Clé_de_l_API par Votre clé de l'API.
local uri = 'https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/'..Localite..'?unitGroup=metric&include=days%2Ccurrent%2Chours&key='..apiKey..'&contentType=json'
local prefix = 'WVC'  --Abréviation de Weather Virtual Crossing
--=================================================================================================================================================================
--                        FONCTIONS
--=================================================================================================================================================================

--============================================Températures ====================================================
local function lectTemp(duree,v)
    local Time = require('Time')
    local now = Time()
    local Heure = now.hour+1 -- heure de debut + 1 pour index
    local J = 1 --init jour
    H=Heure + duree
    if H > 23 then 
            J = math.floor(H/24)+1
            H = math.fmod(H,24) 
    end
    Temp= v.days[J].hours[H].temp
    return (Temp)
    
end

--============================================Probabilité Pluie====================================================
local function lectPluie(duree,v)
    local Time = require('Time')
    local now = Time()
    local Heure = now.hour+1 -- heure de debut + 1 pour index
    local J = 1 --init jour
    H=Heure + duree
    if H > 23 then 
            J = math.floor(H/24)+1
            H = math.fmod(H,24) 
    end
    Pluie= v.days[J].hours[H].precipprob
    return (Pluie)
    
end

--=================================================================================================================================================================
--=                  /!\ ATTENTION : surtout ne pas mettre les devices idx mais mettre les noms des devices.
--=                                  Par exemple, le premier capteur juste en dessous a le nom : "Barometre" et il est de type TempHumBarro (Température+Humidité+Baromètre).
--=                   
--=                  Le script a été modifié à l'origine par BernardC pour fonctionner avec les devices de Darksky.
--=                   
--=                   
--=                   
--=                  Si vous n'avez pas installé le matériel Darksky, 
--=                  Vous pouvez simplement créer de nouveaux capteurs virtuels en respectant le nom du capteur et le type de capteur.
--=                  Pour créer ce device : Configuration --> Matériel --> Créer un capteur virtuel --> Le nom et le type.
--=                  Si vous ne trouver pas de bouton : "Créer un capteur virtuel", il faudra créer un matériel "Dummy".
--=                  Pour celà : 
--=                  Configuration --> Matériel --> Sous le tableau --> Nom : Météo --> Type:Dummy (Does nothing, use for virtual switches only) --> Délai d'inactivité: Désactivé --> Ajouter
--=                   
--=                   
--=================================================================================================================================================================

local StMeteo = { 

    --Barométre sensor de type TempHumBarro. = IDX 691
    {idx = 'WVC-Barometre', cde = function (dz, idx, v) 
        local clouds = v.currentConditions.cloudcover
        local baro = dz.BARO_NOINFO
        if v.currentConditions.precipprob >= 0.3 then baro = dz.BARO_RAIN-- probability of precipitation for tomorrow
            elseif clouds >= 75 then baro = dz.BARO_CLOUDY
            elseif clouds >= 25 then baro = dz.BARO_PARTLYCLOUDY   -- et pas  BARO_PARTLY_CLOUDY comme dans le wiki ??
            else baro = dz.BARO_SUNNY
        end
        dz.devices(idx).updateTempHumBaro(v.currentConditions.temp,v.currentConditions.humidity,dz.HUM_COMPUTE,v.currentConditions.pressure,baro)
    end },
   
    -- UV sensor de type UV. = IDX 692
    {idx = 'WVC-UV', cde = function (dz, idx, v) dz.devices(idx).updateUV(v.currentConditions.uvindex) end }, 
    
    -- Couverture nuageuse    ajout d'un capteur virtuel "Poucentage" = IDX 693
    {idx = 'WVC-Rain', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(v.currentConditions.cloudcover) end },
    
    -- Visibilité sensor de type Visibility = IDX 694
    {idx = 'WVC-Visibilite', cde = function (dz, idx, v) dz.devices(idx).updateVisibility(v.currentConditions.visibility) end }, 
    --{idx = '669', cde = function (dz, idx, v) dz.devices(idx).updateVisibility(v.currentConditions.visibility) end }, 

     -- Pluie sensor de type Rain = IDX 695
    {idx = 'WVC-Pluie',  cde = function (dz, idx, v)
        --lecture des dernieres valeurs rainRate et compteur rain à partir de sValue
        --devices(idx).rain fournit la pluie réelle d'aujourd'hui (pas le compteur ) 
        local f_rainValTable = dz.utils.stringSplit(dz.devices(idx).sValue,';')
        local rain = f_rainValTable[2]
        if v.currentConditions.precip == nil then v.currentConditions.precip = f_rainValTable[1]/100 end 
        local Time = require('Time')
        local  now = Time()
        if dz.devices(idx).lastUpdate.secondsAgo <= now.secondsSinceMidnight then --incrémentation compteur pluie
            rain = rain + ( v.currentConditions.precip * dz.devices(idx).lastUpdate.secondsAgo / 3600 )
        else -- la dernière mise à jour date d'hier
            rain =  v.currentConditions.precip * dz.devices(idx).lastUpdate.secondsAgo/ 3600  
        end
        --(hauteur en mm * 100 par heure, le compteur est total en mm) 
        dz.devices(idx).updateRain(v.currentConditions.precip*100, rain)   
    end }, 

   
    -- Vent sensor de type Wind. = IDX 696
    {idx = 'WVC-Vent', cde = function (dz, idx, v)   
        if v.currentConditions.windgust == nil then v.currentConditions.windgust = v.days[1].windgust end
        degrees = v.currentConditions.winddir
        local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"}
        local quad = 'N'
        if degrees <= 348.75 and degrees > 11.25 then quad = quadrants[tonumber(math.floor((degrees - 11.25) / 22.5)+1)] end
        dz.devices(idx).updateWind(degrees, quad, v.currentConditions.windspeed/3.6, v.currentConditions.windgust/3.6, v.currentConditions.temp, v.currentConditions.feelslike)
        -- bearing(°), direction(N S NNW..), speed(m/s), gust(m/s), temperature(°C), chill(°C) 287.00;WNW;78;135;10.5;9.8
        -- vitesse vent/3,6 pour adapter l'affichage, les données reçu sont en Km/H
    end },
    
    --quantité d'énergie solaire reçue  en W/m²  sensor de type  "rayonnement solaire" = IDX 689
    {idx = 'WVC-Soleil',   cde = function (dz, idx, v) dz.devices(idx).updateRadiation(v.currentConditions.solarradiation) end }, 
  
    --Temp dans 1 H  sensor de type Temperature. = IDX 697
    {idx = 'WVC-Temp dans 1H', cde = function (dz, idx, v) dz.devices(idx).updateTemperature(lectTemp(1,v)) end },

    --Temp dans 2 H  sensor de type Temperature. = IDX 698
    {idx = 'WVC-Temp dans 2H', cde = function (dz, idx, v) dz.devices(idx).updateTemperature(lectTemp(2,v)) end },
	
    --Temp dans 3 H  sensor de type Temperature. = IDX 699
    {idx = 'WVC-Temp dans 3H', cde = function (dz, idx, v) dz.devices(idx).updateTemperature(lectTemp(3,v)) end },
	
    --Proba Pluie 1 H sensor de type "Poucentage".= IDX 84
    {idx = 'Proba Pluie 1h', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(1,v)) end },   

    --Proba Pluie 2 H  sensor de type "Poucentage". = IDX 85
    {idx = 'Proba Pluie 2h', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(2,v)) end },   

    --Proba Pluie 3 H  sensor de type "Poucentage". = IDX 86
    {idx = 'Proba Pluie 3h', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(3,v)) end },   

    --Proba Pluie 6 H  sensor de type "Poucentage". = IDX 87
    {idx = 'Proba Pluie 6h', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(6,v)) end },   

    --Proba Pluie 12 H  sensor de type "Poucentage". = IDX 88
    {idx = 'Proba Pluie 12h', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(12,v)) end },   

    --Proba Pluie 24 H  sensor de type "Poucentage". = IDX 89
    {idx = 'Proba Pluie 24h', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(24,v)) end },   

--[[  -- devices à modifier pour l'ajout 
   
    -- Snow
    {idx = 0,    cde = function (dz, idx, v) 
        if v.current.snow ~= nil  then dz.devices(idx).updateRain(v.current.snow['1h']*100, v.daily[1].snow)
        elseif v.daily[1] ~= nil then dz.devices(idx).updateRain(0, v.daily[1].snow) 
        else dz.devices(idx).updateRain(0, 0) end
    end }, --rate in mm * 100 per hour, counter is total in mm)
 ]]--   
--[[
    -- Meteo
    {idx = 700,  cde = function (dz, idx, v)
        local txt = v.current.weather[1].description..' ('..v.current.weather[1].main..' - '..v.current.weather[1].id..')'
        dz.devices(idx).updateText(txt)
    end },
  
   -- Moon
    {idx = 701,  cde = function (dz, idx, v)
        -- local dt  = os.date("%a %d %b à %X", v.daily[1].dt) -- UTC
        local moonrise  = os.date("%Hh%M", v.daily[1].moonrise) -- UTC
        local moonset   = os.date("%Hh%M", v.daily[1].moonset) -- UTC
        local p = v.daily[1].moon_phase*100 -- 0 and 1 are 'new moon', 0.25 is 'first quarter moon', 0.5 is 'full moon' and 0.75 is 'last quarter moon'.
        if p==0 or p==100 then phase = "Nouvelle Lune ?"
        elseif p<25     then phase = "Premier Croissant ?"
        elseif p==25    then phase = "Premier Quartier ?"
        elseif p<50     then phase = "Gibeuse Croissante ?"
        elseif p==50    then phase = "Pleine Lune  ?"
        elseif p<75     then phase = "Gibeuse Décroissante  ?"
        elseif p==75    then phase = "Dernier Quartier  ?"
        elseif p<100    then phase = "Dernier Croissant  ?"
        end
        -- luminosity
        p = 2*p 
        if p>100 then p = 200-p end
        local txt = "Lever à "..moonrise.."\nCoucher à  "..moonset.."\nPhase : "..phase.."  ("..p.."%)"
        dz.devices(idx).updateText(txt)
    end },
    

    -- Moon Phase (%)
    {idx = 702,  cde = function (dz, idx, v)
        dz.devices(idx).updatePercentage(v.daily[1].moon_phase*100)
    end },
]]--
--[[     
    -- Alerts
    --,"alerts":[{"sender_name":"METEO-FRANCE","event":"Moderate thunderstorm warning","start":1680321640,"end":1680386400,"description":"Moderate damages may occur, especially in vulnerable or in exposed areas and to people who carry out weather-related activities.","tags":["Thunderstorm"]}]}	

    {idx = 987, cde = function (dz, idx, v)
        if v.alerts ~= nil then
            local txt = ''
            for k, alert in ipairs(v.alerts) do
                local from  = os.date("%a %d %b à %X", alert['start'])
                local to    = os.date("%a %d %b à %X", alert['end'])
                txt = txt..k..'. '..alert.event.."\n"
                txt = txt..'   du '..from.."\n"
                txt = txt..'   au '..to.."\n"
                txt = txt..alert.description.."\n"
                -- txt = txt..alert.sender_name -- Meteo France
                txt = txt..'  tags : '..table.concat(alert.tags, ', ')..'\n\n'
            end
            -- updateAlertSensor(level, text): Function. Level can be domoticz.ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_YELLOW, ALERTLEVEL_ORANGE, ALERTLEVEL_RED. Supports command options.
            dz.devices(idx).updateAlertSensor(dz.ALERTLEVEL_RED, txt)
            dz.notify('Alerte Météo', txt, dz.PRIORITY_HIGH) -- notify(subject, message, priority, sound) domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY
        else
            dz.devices(idx).updateAlertSensor(dz.ALERTLEVEL_GREEN, "Pas d'alerte")
        end 
    end },
]]--
}--==============================================================Fin de déclaration des devices météo =====================================================================


-- LOOP
return {
		
    active =  true, -- false,
    on = {
        timer           = { "every 15 minutes" },
        httpResponses   = { "OWMcallback" }, -- correspond au caractère générique de rappel
    },

    logging = {   
        level  =   domoticz.LOG_ERROR, domoticz.LOG_INFO, --, domoticz.LOG_DEBUG, domoticz.LOG_MODULE_EXEC_INFO
        marker = '-- '..scriptName..' v'..scriptVersion
    },

    -- LOOP
    execute = function(dz, triggerItem)
        
        
 		print("======================================================================================================== > START Weather Visual Crossing.lua ")
       
        local function errorMessage(message,notify)   -- Ajouter une entrée au journal et notifier à tous les sous-systèmes
            dz.log(message, dz.LOG_ERROR)
            if notify then
                -- dz.notify(message) -- notify(subject, message, priority, sound): Fonction. Envoi d’une notification (Prowl). La priorité sera choisie entre  domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY
            end
         end

        -- MAIN
        if triggerItem.isTimer then
            local url = uri
            dz.openURL({
                url     = url,
                method  = "GET",
                callback= 'OWMcallback'
            }).afterSec(1)
        end

        if triggerItem.isHTTPResponse then
            if triggerItem.ok and triggerItem.isJSON then
                local resultsTable = triggerItem.json
                print('Réception de WeatherVisualCrossing')
                if resultsTable ~= nil and resultsTable.currentConditions ~= nil then
                    for k, d in ipairs(StMeteo) do
                        if d['idx'] ~= 0 then --0
                            d.cde(dz, d['idx'], resultsTable) 
                        end
                    end
                end
            else
                errorMessage("Problème avec la réponse de WeatherVisualCrossing", false)
            end
        end
 		print("======================================================================================================== > STOP Weather Visual Crossing.lua ")
    
    end --execute
}
Le log :

Code : Tout sélectionner

2023-08-25 09:01:21.016  Status: dzVents: ======================================================================================================== > START Weather Visual Crossing.lua 
2023-08-25 09:01:21.016  Status: dzVents: Réception de WeatherVisualCrossing
2023-08-25 09:01:21.066  Status: dzVents: ======================================================================================================== > STOP Weather Visual Crossing.lua 
;)
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Keros »

Je te donne une piste : les devices qui ne sont pas mis à jour sont tous au même endroit dans ton code. Regarde autour et tu devrais voir pouquoi cette partie là n'est pas exécutée comme les autres device qui sont avant ;)
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
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: [DzVents] Données Météo Weather Visual Crossing

Message par Doudy »

Hello,

Pour l'IDX 690, c'est normal, il n'est pas dans le script ! :oops:

En enlevant les --[[remarque]]-- pour les IDX 700, 701 et 702, j'ai le message suivant :

Code : Tout sélectionner

 2023-08-25 13:36:11.642 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: An error occurred when calling event handler WeatherVirtualCrossing
2023-08-25 13:36:11.642 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: ...oticz/scripts/dzVents/scripts/WeatherVirtualCrossing.lua:186: attempt to index a nil value (field 'current') 

Code : Tout sélectionner

 2023-08-25 13:38:12.619 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: An error occurred when calling event handler WeatherVirtualCrossing
2023-08-25 13:38:12.620 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: ...oticz/scripts/dzVents/scripts/WeatherVirtualCrossing.lua:193: attempt to index a nil value (field 'daily') 

Code : Tout sélectionner

 2023-08-25 13:39:12.244 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: An error occurred when calling event handler WeatherVirtualCrossing
2023-08-25 13:39:12.244 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: ...oticz/scripts/dzVents/scripts/WeatherVirtualCrossing.lua:215: attempt to index a nil value (field 'daily') 
:arrow: Mais au départ ma question était :
Je n'ai rien qui s'affiche après la ligne 'Réception de WeatherVisualCrossing' dans le fichier Log !

:cry:
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
Répondre