[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.
Micmacx
Messages : 21
Inscription : 18 oct. 2017, 17:32

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

Message par Micmacx »

Bonjour,
Après pas mal de galères, j'ai enfin réussi à avoir quelque chose de fonctionnel.

J'explique un peu mes galères si ça peut en aider d'autres :
Chez moi je tourne sur un raspberry avec lequel je partage la connexion de mon smartphone.
Le raspberry me sert de box domotique et de box internet avec un switch branché derrière et quelques répéteurs wifi, cela me suffit amplement pour mes besoin.
Hier en testant j'ai eu quelques problèmes qui faisaient de gros freezes sur mon réseau, donc j'ai vachement galéré avec les histoire de bon et mauvais liens du json de l'API expliqués tout au long des post de ce sujet, finalement j'ai abandonné.
Ce matin j'ai fait une grosse analyse du pc (malwarebyte, antivirus, spybot, Ccleaner), tout s'est bien passé à part quelques erreurs de base de registre et finalement ça s'est mis à fonctionner. Donc est-ce L'API ou chez moi je sais pas, mais ça fonctionne.
Ensuite comme écrit dans le script, j'ai modifié les noms des devices en mettant les idx mais ça n'a pas fonctionné du tout, donc il faut laisser les noms de devices.
Puis la fonction lectProb posait problème en mettant des messages d'erreur, je l'ai désactivé, puis à la fin supprimé car j'avais trouvé d'autre choses qui m'allaient.

J'ai modifier un peu en prenant du code par ci par là de chacun, et j'ai enfin réussi à faire quelque chose qui fonctionne.
Autre petite modif, le script met à jour les données tout les 15 minutes (d'origine c'est 5mn), ce qui est largement suffisant pour la météo. ;-)
Domoticz.png
Domoticz.png (272.3 Kio) Consulté 1680 fois
Donc Voici le code, tout est expliqué dedans :
weathervisualcrossing.zip
(4.84 Kio) Téléchargé 108 fois

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
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 = 'ANZIN%2059410%20France' --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 = 'Clé_de_l_API' --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'
--=================================================================================================================================================================
--                        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 = 'Barometre', cde = function (dz, idx, v) --idx665
        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 = 'UV', cde = function (dz, idx, v) dz.devices(idx).updateUV(v.currentConditions.uvindex) end }, --idx667
    
    -- Couverture nuageuse    ajout d'un capteur virtuel "Poucentage"
    {idx = 'Couverture nuageuse', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(v.currentConditions.cloudcover) end },
    
    -- Visibilité sensor de type Visibility
    {idx = '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 = '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 = '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","SSW","SW","WSW","W","WNW","NW","NNW"}
        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 = 'Soleil',   cde = function (dz, idx, v) dz.devices(idx).updateRadiation(v.currentConditions.solarradiation) end }, 
  
    --Temp dans 1 H  sensor de type Temperature.
    {idx = '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 = '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 = '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 = 'Pluie dans 1H', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(1,v)) end },   

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

    --Proba Pluie 3 H  sensor de type "Poucentage".
    {idx = 'Pluie dans 3H', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(3,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 = 979,  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 = 989,  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 = 988,  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)
        
        
        
        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('reception 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("Probleme avec la reponse de weathervisualcrossing", false)
            end
        end
    
    end --execute
}
En espérant que ça puisse aider d'autres personnes.

Certains devices sont en double avec le même idx (créé par darksky), je les ai laissé volontairement car je suis en phase de test donc je préfère tout voir.

La raison de mon post :
D'ailleurs, si quelqu'un sait comment regrouper les autres capteurs dans la partie météo, je suis preneur, parce que là c'est pas top d'avoir tout de dispersé comme ça.
Je viens de voir qu'il y a un problème sur le device : "Pluie", c'est pas encore la mousson dans le nord de la france. :-)
Je vais attendre un peu de temps avant de chercher à régler ça, comme j'ai utilisé l'Api avec le lien métrique et nom métrique, ça va peut être se régler tout seul. ;-)

A+++. :-) :-) :-)
Dernière modification par Micmacx le 25 juil. 2023, 00:07, modifié 1 fois.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

Merci pour ton retour.

Normalement, tu dois pouvoir mettre ton code directement dans le corps du message. Le mettre entre les balises code pour plus de lisibilité.

Pour tes images, peux-tu s'il te plait les redimensionner avant de les envoyer sur le forum ? Pour charger ton message, il faut télécharger 3 Mo d'image : c'est beaucoup :o Une image de 200 Ko suffit largement et ceux qui n'ont pas de fibre 100 Mo/s pourront continuer de profiter d'une navigation fluide. Sans parler des sauvegardes du forum qui vont exploser à ce rythme :roll: Ce serait sympa si tu pouvais éditer ton post et recharger une image plus légère. Merci

L'IDX est un numéro de Widget : il doit être unique. Tu peux avoir des noms identiques, mais attention si tu utilises des scripts.
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
Micmacx
Messages : 21
Inscription : 18 oct. 2017, 17:32

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

Message par Micmacx »

Re,
Keros a écrit : 24 juil. 2023, 19:25 Normalement, tu dois pouvoir mettre ton code directement dans le corps du message. Le mettre entre les balises code pour plus de lisibilité.
Perso je sais plus me passer des "syntax highlighting" des éditeurs et de certains forums, donc j'ai un avis autre que le tien.
Mais je vais quand même éditer mon post pour y inclure le code, ainsi il y aura les deux solutions.

Keros a écrit : 24 juil. 2023, 19:25 L'IDX est un numéro de Widget : il doit être unique. Tu peux avoir des noms identiques, mais attention si tu utilises des scripts.
BernardC a écrit : 10 avr. 2023, 12:51 Ligne 55 du code :

Code : Tout sélectionner

--=                  -- devices idx (à modifier en conséquence), fonction de maj donnée devices domoticz 
Ligne 60 du code :

Code : Tout sélectionner

{idx = 'Barometre', cde = function (dz, idx, v) 
Oui je sais que c'est un numéro qui est unique mais le script ne fonctionne pas en y mettant les numéros idx(unique), il faut y placer les noms des devices, je l'ai précisé dans mon précédent post pour éviter à d'autres d'être invité en erreur et de perdre du temps pour rien. ;-)

J'ai avancé dans ma recherche, j'ai pas vraiment réussi à faire ce que je voulais mais je suis arrivé à un résultat acceptable :
Domoticz2.png
Domoticz2.png (58.66 Kio) Consulté 1683 fois
Pour y arriver j'ai fait une modif :
  1. J'ai enlevé tout les titres des sections de la page d'Accueil de domoticz, j'ai simplement mis des "//" devant la ligne de code. Je n'affiche pas le script sur le forum car il y a presque 4000 lignes de code dans ce fichier.
    Attention, avant d'envoyer ce fichier sur votre raspberry, renommez votre fichier original afin de garder une copie de secours en cas de problème.
    Fichier à placer dans :

    Code : Tout sélectionner

    /home/pi/domoticz/www/app/
    DashboardController.zip
    (23.5 Kio) Téléchargé 105 fois
  2. J'ai activé la fonction drag and drop sur la page d'accueil : Configuration --> Paramètres --> Cocher Autoriser le réagencement des Widgets --> Mobile: Accueil -->Appliquer les paramètres.
  3. J'ai modifié sur la page d'Accueil les emplacement des devices en cliquant sur un device et en le lachant sur un autre device.
  4. Je me suis débrouillé pour mettre les favoris des devices par multiples de 3 car les sections sont bien encores présentes même si elles ne se voient pas.
Attention, ça ne fonctionne pas avec tous les thèmes, certains ne sont pas compatibles.
Le fichier de domoticz fournis est pour la dernière version en date de domoticz pour raspberry : Version: 2023.2 Build Hash: 19efd039c


Je vais certainement modifier un peu demain et mettre les données dans des capteurs texte comme "Chauffage Aqua/Jour" et tout réorganiser comme j'ai envie, de toute façon je n'utilise quasiment pas les logs des devices, dans le pire des cas je peux toujours garder les devices d'origine pour les logs et créer des capteurs texte pour la page d'Accueil. :-)

EDIT : Attention, pour que la modif s'affiche dans votre navigateur, il faut vider le cache de votre navigateur internet, comme quand vous faites les mises à jour. ;-)

A+++. :-) :-) :-)
Micmacx
Messages : 21
Inscription : 18 oct. 2017, 17:32

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

Message par Micmacx »

Bonjour,
J'ai encore avancé dans ce que je recherchais, j'ai encore modifié le script DzVents et les fichiers d'origine de Domoticz, voilà ce que ça donne :
Domoticz3.png
Domoticz3.png (387.62 Kio) Consulté 1638 fois
Les fichiers :
Ce fichier contient le script DzVents avec de nouvelle fonctions, le fichier javascript modifié et une sauvegarde du fichier javascript original :
DashboardController&weathervisualcrossing.zip
(52.32 Kio) Téléchargé 89 fois
Le code Dzvent :

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
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 = 'ANZIN%2059410%20France'
local apiKey = 'ZPS87HBCY73DVQTSX3U8EYGP5' 
local uri = 'https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/'..Localite..'?unitGroup=metric&include=days%2Ccurrent%2Chours&key='..apiKey..'&contentType=json'
local prefix = 'WVC'
--=================================================================================================================================================================
--                        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

--============================================Couverture Nuageuse ====================================================
local function lectCloudCover(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
    CloudCover= v.days[J].hours[H].cloudcover
    return (CloudCover)
    
end

--============================================Vent Direction ====================================================
local function lectWinDir(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
    WinDir= v.days[J].hours[H].winddir
    return (WinDir)
    
end

--============================================Probabilité ====================================================
local function lectWindSpeed(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
    WindSpeed= v.days[J].hours[H].windspeed
    return (WindSpeed)
    
end

--============================================Probabilité ====================================================
local function lectWindGust(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
    WindGust= v.days[J].hours[H].windgust
    return (WindGust)
    
end

--============================================Probabilité ====================================================
local function lectFeelsLike(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
    FeelsLike= v.days[J].hours[H].feelslike
    return (FeelsLike)
    
end

--============================================Probabilité ====================================================
local function lectHumidity(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
    Humidity= v.days[J].hours[H].humidity
    return (Humidity)
    
end

--============================================Probabilité ====================================================
local function lectPressure(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
    Pressure= v.days[J].hours[H].pressure
    return (Pressure)
    
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 = 'Barometre', cde = function (dz, idx, v) --idx665
        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 },
   
    --Barométre sensor de type TempHumBarro.
    {idx = 'Barometre dans 1H', cde = function (dz, idx, v)
        local clouds = lectCloudCover(1,v)
        local baro = dz.BARO_NOINFO
        if lectPluie(1,v) >= 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(lectTemp(1,v),lectHumidity(1,v),dz.HUM_COMPUTE,lectPressure(1,v),baro)
    end },
   
    --Barométre sensor de type TempHumBarro.
    {idx = 'Barometre dans 2H', cde = function (dz, idx, v)
        local clouds = lectCloudCover(2,v)
        local baro = dz.BARO_NOINFO
        if lectPluie(2,v) >= 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(lectTemp(2,v),lectHumidity(2,v),dz.HUM_COMPUTE,lectPressure(2,v),baro)
    end },
   
    --Barométre sensor de type TempHumBarro.
    {idx = 'Barometre dans 3H', cde = function (dz, idx, v)
        local clouds = lectCloudCover(3,v)
        local baro = dz.BARO_NOINFO
        if lectPluie(3,v) >= 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(lectTemp(3,v),lectHumidity(3,v),dz.HUM_COMPUTE,lectPressure(3,v),baro)
    end },
   
    -- UV sensor de type UV.
    {idx = 'UV', cde = function (dz, idx, v) dz.devices(idx).updateUV(v.currentConditions.uvindex) end }, --idx667
    
    -- Couverture nuageuse    ajout d'un capteur virtuel "Poucentage"
    {idx = 'Couverture nuageuse', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(v.currentConditions.cloudcover) end },
    
    -- Visibilité sensor de type Visibility
    {idx = '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 = '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 Vent + Temperature + Ressenti.
    {idx = '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","SSW","SW","WSW","W","WNW","NW","NNW"}
        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 },
    
    -- Vent sensor de type Vent + Temperature + Ressenti.
    {idx = 'Vent dans 1H', cde = function (dz, idx, v)   
        degrees = lectWinDir(1,v)
        local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
        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, lectWindSpeed(1,v)/3.6, lectWindGust(1,v)/3.6, lectTemp(1,v), lectFeelsLike(1,v))
    end },

    -- Vent sensor de type Vent + Temperature + Ressenti.
    {idx = 'Vent dans 2H', cde = function (dz, idx, v)   
        degrees = lectWinDir(2,v)
        local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
        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, lectWindSpeed(2,v)/3.6, lectWindGust(2,v)/3.6, lectTemp(2,v), lectFeelsLike(2,v))
    end },

    -- Vent sensor de type Vent + Temperature + Ressenti.
    {idx = 'Vent dans 3H', cde = function (dz, idx, v)   
        degrees = lectWinDir(3,v)
        local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
        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, lectWindSpeed(3,v)/3.6, lectWindGust(3,v)/3.6, lectTemp(3,v), lectFeelsLike(3,v))
    end },

    --quantité d'énergie solaire reçue  en W/m²  sensor de type  "rayonnement solaire"
    {idx = 'Soleil',   cde = function (dz, idx, v) dz.devices(idx).updateRadiation(v.currentConditions.solarradiation) end }, 
  
    --Temp dans 1 H  sensor de type Temperature.
    {idx = '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 = '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 = '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 = 'Probabilité Pluie', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(0,v)) end },   
	
    --Proba Pluie 1 H sensor de type "Poucentage".
    {idx = 'Probabilité Pluie dans 1H', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectPluie(1,v)) end },   

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

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

    --Couverture Nuageuse 1 H sensor de type "Poucentage".
    {idx = 'Couverture Nuageuse dans 1H', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectCloudCover(1,v)) end },   

    --Couverture Nuageuse 2 H  sensor de type "Poucentage".
    {idx = 'Couverture Nuageuse dans 2H', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectCloudCover(2,v)) end },   

    --Couverture Nuageuse 3 H  sensor de type "Poucentage".
    {idx = 'Couverture Nuageuse dans 3H', cde = function (dz, idx, v) dz.devices(idx).updatePercentage(lectCloudCover(3,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 = 'Meteo Actuelle',  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 = 989,  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 = 988,  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 3 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)
        
        
        
        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('reception 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("Probleme avec la reponse de weathervisualcrossing", false)
            end
        end
    
    end --execute
}
Les étapes :
  1. Il suffit de tout faire comme dans mon précédent post pour commencer.
  2. Puis il faut éditer le fichier /home/pi/domoticz/www/app/DashboardController.js et à la ligne 2538 :

    Code : Tout sélectionner

    (((typeof item.Temp != 'undefined') || (typeof item.Humidity != 'undefined') || (typeof item.Chill != 'undefined')) && item.idx != '999')
    il faut remplacer l'idx 999 par un appareil que vous ne voulez pas afficher dans les température sur la page d'accueil.
    Puis recopiez cette partie de code :

    Code : Tout sélectionner

     && item.idx != '999'
    juste après le guillemet avant la fermeture de la parenthèse autant de fois que nécessaire (une fois par appareil que vois ne voulez pas afficher).
    Voici cette ligne avec mes idx pour exemple :

    Code : Tout sélectionner

    (((typeof item.Temp != 'undefined') || (typeof item.Humidity != 'undefined') || (typeof item.Chill != 'undefined')) && item.idx != '665' && item.idx != '959' && item.idx != '960' && item.idx != '961' && item.idx != '956' && item.idx != '957' && item.idx != '958' && item.idx != '666')
    Dans mon cas je cache 8 appareils.
  3. N'oubliez pas d'effacer le cache de votre navigateur, sinon vous ne pourrez pas voir la modif.
C'est fini.

A+++. :-) :-) :-)
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

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

Message par Doudy »

Hello,

J'ai repris le script WVC et j'ai la même erreur que MAidEN91 :

Code : Tout sélectionner

2023-08-21 13:30:10.621 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: There is no device with that name or id: Barometre
2023-08-21 13:30:10.621 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: An error occurred when calling event handler WeatherVirtualCrossing
2023-08-21 13:30:10.621 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: ...oticz/scripts/dzVents/scripts/WeatherVirtualCrossing.lua:99: attempt to index a nil value
En relisant toutes les interventions, je n'ai pas trouvé la solution afin de régler ce problème !

J'ai bien un widget "Barometre" de type Temp+Humidity+Baro

Une idée ?
Pièces jointes
Capture2.PNG
Capture2.PNG (80.93 Kio) Consulté 1481 fois
Capture1.PNG
Capture1.PNG (87.75 Kio) Consulté 1481 fois
Capture.PNG
Capture.PNG (7.27 Kio) Consulté 1481 fois
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 »

Il me semble avoir déjà lu un problème similaire avec le baromètre. Il y a le "même" script pour OpenWeatherMAp, c'était peut-être dans ce sujet là :roll:

Autre idée :
  • Tu n'aurais pas un autre widget avec le même nom ?
  • Tu as essayé le numéro d'IDX à la place du nom ?
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,

Non pas d'autre widget avec le même nom :
Capture3.PNG
Capture3.PNG (41.61 Kio) Consulté 1471 fois
Je n'ai pas essayé le numéro de l'IDX. Je vais essayer.
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 »

Testé avec {idx = 124, cde = function (dz, idx, v)

résultat :

Code : Tout sélectionner

2023-08-21 17:45:17.541 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: There is no device with that name or id: 124
2023-08-21 17:45:17.542 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: An error occurred when calling event handler WeatherVirtualCrossing
2023-08-21 17:45:17.542 Error: dzVents: Error: (3.1.8) -- weather.visualcrossing v1.21: ...oticz/scripts/dzVents/scripts/WeatherVirtualCrossing.lua:99: attempt to index a nil value
;)
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,

Solution : Créer un nouveau widget Barometre et ça passe.
Ça bloque sur le suivant : UV !
Je vais donc créer des nouveaux widgets pour chaque sensor
;)
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 viens de revoir ton screenshot au dessus > Ton widget Barometre était celui du plugin DarkSky ?

C'est pareil avec UV ? Tu essayais de réutiliser les anciens widgets ?
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