Page 1 sur 1

Scénario pluie blockly lua avec Weather Underground

Publié : 18 févr. 2022, 22:47
par Johndalar
Bonjour,

Je souhaite créér un scénario très simple d'arrosage conditionnel en fonction des précipitations du type :
SI il a plu
ALORS annuler arrosage

J'arrive à récupérer les données de précipitations depuis Weather Underground (WU) mais pas à les exploiter avec Domoticz dans un scénario blockly et là est mon problème.

Ces données en millimètre sont récupérées selon le format WU "PluieParHeure,PluieParJour". Par exemple "0;1.7" signifie 0mm dans l'heure et 1.7mm dans la journée. Ce qui m'intéresse c'est la pluie dans la journée et non dans l'heure.

La widget Météo de Domoticz est associée à la variable "Pluie_WU". Cette widget affiche 1,7 mm (voir Pluie_WU.jpg).

Mais Pluie_WU dans blockly est associé à la valeur de PluieParHeure.

Alors j'ai créé un scénario lua afin d'isoler les deux variables locales "PluieParHeure,PluieParJour" selon le script suivant qui fonctionne bien et renvoie les deux valeurs dans le log :

Script lua :
commandArray = {}
PluieParHeure, PluieParJour = otherdevices_svalues['Pluie_WU']:match("([^;]+);([^;]+)")
PluieParHeure = tonumber(PluieParHeure)
PluieParJour = tonumber(PluieParJour)
print("Pluie par heure " .. PluieParHeure)
print("Pluie par jour " .. PluieParJour)
return commandArray

Print dans le log :
2022-02-18 22:38:00.014 Status: LUA: Pluie par heure 0
2022-02-18 22:38:00.015 Status: LUA: Pluie par jour 1.7
2022-02-18 22:39:00.031 Status: LUA: Pluie par heure 0
2022-02-18 22:39:00.032 Status: LUA: Pluie par jour 1.7

Et là je suis sec car je ne sais pas comment exploiter dans un scénario bockly ces deux variables qui sont locales à lua.
Il doit bien y avoir une possibilité de passerelle entre lua et blockly ?

Merci pour vos conseils.

Re: Scénario pluie blockly lua avec Weather Underground

Publié : 18 févr. 2022, 23:16
par Keros
Bonjour Johndalar et bienvenu sur le forum ;)

Je viens de déplacer ton sujet dans la section dédiée aux scripts.

Le langage Blocky est vite limité. Si tu arrives à utiliser le LUA pour récupérer les infos que tu souhaites, pourquoi ne continus tu pas en LUA ?
Si tu as besoin d'infos supplémentaire sur le LUA, tu peux regarder le lien Débuter en programmation que j'ai dans ma signature.

Re: Scénario pluie blockly lua avec Weather Underground

Publié : 18 févr. 2022, 23:32
par Johndalar
Bonjour Keros :P ,

En fait ce n'est pas pour moi. ;)

Un scénario intégralement en lua sera difficile à maintenir pour une personne qui n'y connait rien en programmation alors que blockly elle y arriverait car très didactique.

Et c'est dommage que blockly/Domoticz soit si limité dans la gestion des variables externes.

Bon, je vais passer du temps sur lua mais si j'arrive à un script intégralement en lua je sais que ce ne sera pas jouable pour la personne qui l'utilisera.

Merci quand même.

Re: Scénario pluie blockly lua avec Weather Underground

Publié : 19 févr. 2022, 19:05
par Keros
Peut-être que tu peux le couper en deux parties : tu récupères l'info souhaitée en LUA et tu la pousses dans une variable utilisateur. Dans un deuxième temps, le blocky peut récupérer la variable utilisateur et traiter la partie "programme" sans se soucier de la récupération des données.

Re: Scénario pluie blockly lua avec Weather Underground

Publié : 01 mars 2022, 00:00
par Johndalar
Bonsoir Keros,

Merci.
C'est ce que j'ai tenté mais ça ne marche pas. J'ai déclaré la variable utilisateur "PluieParJourVariable" depuis Domoticz.
Ensuite, dans le code lua je lui donne la valeur récupérée depuis Pluie_WU (voir tous les artifices pour y arriver, il y a probablement plus simple ...), je la vois évoluer en log mais elle ne bouge pas dans Domoticz et donc inexploitable dans blockly.

Voilà le code que j'ai écrit en lua :

Code : Tout sélectionner

-- SCRIPT LUA Pluie
-- Ce script fonctionne avec Weather Underground (WU)
-- en recuperant les valeurs pluie par jour (en mm) 
-- et permet de stopper un arrosage si il y a eu des precipitations.
-- Sur Domoticz le capteur meteo (widget) est declare par Pluie_WU.
-- Pluie_WU se décompose en PluieParHeure et PluieParJour.
-- Deux capteurs virtuels PluieParHeureVirtual et PluieParJourVirtual sont egalement declares en tant que Precipitations.
-- Cela permet de visualiser en direct sur Domoticz les deux valeurs de Pluie_WU.
-- PluieParJourVirtual se decompose en deux variables PluieParJourVirtual1 et PluieParJourVirtual2.
-- C'est PluieParJourVirtual2 qui nous intéresse et qui est copiee dans PluieParJourVariable.
-- La variable utilisateur PluieParJourVariable est egalement déclaree sur Domoticz.
-- Elle est utilisee dans blockly en test et stoppe un arrosage en cas de precipitations.

commandArray = {}
--  Declaration des deux varirables PluieParHeureVirtual et PluieParJourVirtual selon index
    local idx_PluieParHeureVirtual = 21
    local idx_PluieParJourVirtual = 22
--  Extraction de PluieParHeure et PluieParJour de Pluie_WU
    PluieParHeure, PluieParJour = otherdevices_svalues['Pluie_WU']:match("([^;]+);([^;]+)")
--  Conversion en number
    PluieParHeure = tonumber(PluieParHeure)
    PluieParJour = tonumber(PluieParJour)
--  Tracage log
    print("Pluie par heure " .. PluieParHeure)
    print("Pluie par jour " .. PluieParJour)
--  Copies de PluieParHeure et PluieParJour dans respectivement PluieParHeureVirtual et PluieParJourVirtual
    commandArray[idx_PluieParHeureVirtual] = { ['UpdateDevice'] = idx_PluieParHeureVirtual..'|1|0;'..PluieParHeure+2 }
    commandArray[idx_PluieParJourVirtual] = { ['UpdateDevice'] = idx_PluieParJourVirtual..'|1|0;'..PluieParJour+3 }
--  Extraction des deux valeurs de PluieParJourVirtual dans PluieParJourVirtual1 et PluieParJourVirtual2 
    PluieParJourVirtual1, PluieParJourVirtual2 = otherdevices_svalues['PluieParJourVirtual']:match("([^;]+);([^;]+)")
--  Conversion en number
    PluieParJourVirtual1 = tonumber(PluieParJourVirtual1)
    PluieParJourVirtual2 = tonumber(PluieParJourVirtual2)
--    commandArray['variable:PluieParJourVariable']= tostring(uservariables["PluieParJourVariable"])
--  Tracage log    
    print("Pluie par jour virtuel1 " .. PluieParJourVirtual1)
    print("Pluie par jour virtuel2 " .. PluieParJourVirtual2)
--  Recuperation de PluieParJourVirtual2 dans la variable utilisateur PluieParJourVariable
    PluieParJourVariable = PluieParJourVirtual2
--  Tracage log  
    print("Pluie par jour variable " .. PluieParJourVariable)
return commandArray 
Et voilà le blockly tout simple qui devrait exploiter cette variable "PluieParJourVariable" :

Image

J'ai tout essayé en vain, conversion en tostring, des curl, etc.

Si tu as une idée, je suis preneur.

A+

Re: Scénario pluie blockly lua avec Weather Underground

Publié : 01 mars 2022, 12:33
par Keros
As tu vérifié que ton script s'exécutait ? Tu as mis quoi comme trigger ?

Re: Scénario pluie blockly lua avec Weather Underground

Publié : 02 mars 2022, 16:21
par Johndalar
Oui et toutes les minutes, voici extract du log car j'ai mis des traces dans tous les coins :

Code : Tout sélectionner

2022-03-02 16:13:00.331 Status: LUA: Pluie par heure 0
2022-03-02 16:13:00.331 Status: LUA: Pluie par jour 0.0
2022-03-02 16:13:00.331 Status: LUA: Pluie par jour virtuel1 0
2022-03-02 16:13:00.331 Status: LUA: Pluie par jour virtuel2 3.0
2022-03-02 16:13:00.332 Status: LUA: Pluie par jour variable 3.0
2022-03-02 16:13:00.380 Status: EventSystem: Script event triggered: Script lua Pluie
2022-03-02 16:14:00.352 Status: LUA: Pluie par heure 0
2022-03-02 16:14:00.352 Status: LUA: Pluie par jour 0.0
2022-03-02 16:14:00.352 Status: LUA: Pluie par jour virtuel1 0
2022-03-02 16:14:00.352 Status: LUA: Pluie par jour virtuel2 3.0
2022-03-02 16:14:00.353 Status: LUA: Pluie par jour variable 3.0
2022-03-02 16:14:00.402 Status: EventSystem: Script event triggered: Script lua Pluie 
En trigger : All

Re: Scénario pluie blockly lua avec Weather Underground

Publié : 06 mars 2022, 22:55
par Keros
Tu remplis ta variable avec :

Code : Tout sélectionner

commandArray['variable:PluieParJourVariable']= tostring(uservariables["PluieParJourVariable"])
La valeur est une chaine avec le formatage tostring().

Et dans ton blocky, tu essayes de faire une comparaison mathématique. Ta uservariable est de quel type ?