Page 1 sur 2

Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 09 sept. 2024, 18:18
par jeanpaulliony
Bonjour à toutes et tous,
Je m'amuse depuis un petit moment avec Domoticz sur un rasberry Pi 3, j'ai un petit bagage info et indus.
Je fais un peu l'historique ci-dessous, car c'est un peu triste de demander QUE de l'aide, alors vous aurez une histoire en prime :-)

Pour le moment les seules fois où j'ai mis "les mains" dedans un peu plus que l'utilisateur lambda, c'est pour faire un petit script en Blocky qui prend une valeur de sonde solaire, en calcule une commande et la recopie sur des actionneurs, le tout en Zwave. ça marche bien, à raison d'une MàJ de mes valeurs chaque minute.
(j'ai fait ça en Blocky, - quelques grosses boucles elsif à l'arrache - je ne savais même pas que ce truc visuel existait, ça m'a évité de me pencher sur du LUA, ou pire devoir éditer un fichier en ligne de commande à l'aide d'un vi ou vim auxquels je n'ai jamais rien pipé...)

Mais il va falloir que je m'y mette : Car, autre sujet nouveau - j'ai une borne de recharge VE élec. ("SmartEVSE", juste un truc super) que je peux "manipuler" via des GET et POST json... L'idée est de moduler la charge VE en fonction de ma prod. solaire (la valeur de sonde décrite plus haut)

--> ça marche très bien "à la mano", un GET "http://192.168.5.115/settings" me renvoie un tripotée d'états et de valeurs bien rangées,
et un POST "http://192.168.5.115/currents?L1=-20&L2=-20&L3=-20" indique à la borne que le solaire produit 2A (par phase)
// cette dernière le prend bien en compte, et adapte la charge du VE connecté
[je ne rentre pas dans les détails techniques électriques, c'est pas le sujet ici, mais comme je l'ai dit SmartEVSE est un truc super, donc foin d'avoir ici des valeurs en ampères négatifs, c'est normal !]

Plusieurs problèmes à mon cas :
* J'ai découvert lors de mes tests que le SmartEVSE passe en défaut "timeout" lorsqu'il ne reçoit pas de requête "POST" durant 10 secondes - c'est logique du point de vue électrique/énergétique - ça stoppe la charge (mais c'est repris dès la prochaine requête POST) // Je me suis fait confirmer ceci : C'est un comportement voulu.

1) J'ai trouvé par hasard la fonctionnalité de Domoticz "D'envoi de données HTTP" qui semble exactement correspondre à mon besoin, mais : Apparemment pas possible de lancer ceci toutes les 5 secondes, on reste sur les constantes de temps des requêtes "inside Domoticz" donc sur événement et/ou au minimum à la minute, pas moins (j'ai cru comprendre que cette minute est dûe à un CRON qui est derrière, j'ai bon ?).
Donc ça ne me va pas. Je vais devoir me taper une requête tordue "out of Domoticz", l'angoisse...

2) Comme je suis une bille en prog, j'ai lu et vu les diverses façon d'aller "pêcher" des infos (ma lecture solaire) DANS Domoticz lorsqu'on "est" dans un script "extérieur" lançable toutes les 5 secondes puis d'éventuellement ne pas passer par Domoticz pour "pondre" une requête JSON en direct... et j'ai trouvé judicieux de d'abord essayer de parser "dans Domoticz" quelques infos récupérables via une lecture GET comme détaillée plus haut...

==> C'est ainsi que j'en suis venu à découvrir la fonctionnalité de "HTTP/HTTPS poller" qui "récupère" des infos dans un retour JSON pour les coller dans des variables virtuelles via un parser... écrit en LUA...

...Bon je vais devoir y passer quoi... Alors RTFM du parser LUA : Je comprends très bien le principe d'identification d'un champ dans une botte de foin JSON, et de récupération de sa valeur intrinsèque pour la coller dans une variable Domoticz. J'ai édité mon parser LUA et fait quelques essais, infructueux...
Mais alors que je pensais tomber sur un truc très didactique (remplacer X par "ladescription_duchamp", puis Y par [la_variable_domoticz]...) je prends l'exemple donné dans la doc officielle :

Code : Tout sélectionner

-- Example of JSON parser handling data with the following structure
--{
--  "id": 13,
--  "name": "outside",
--  "temperature": 12.50,
--  "tags": ["France", "winter"]
--}

-- A test with curl would be : curl -X POST -d "@test.json" 'http://192.168.1.17:8080/json.htm?type=command&param=udevices&script=example_json.lua'

-- Retrieve the request content
s = request['content'];

-- Update some devices (index are here for this example)
local id = domoticz_applyJsonPath(s,'.id')
local s = domoticz_applyJsonPath(s,'.temperature')
domoticz_updateDevice(id,'',s)
Oups, c'est quoi ce truc??

Par exemple, juste au début de mon retour JSON, j'ai ça :

Code : Tout sélectionner

{
  "version": "v3.6.7",
  "serialnr": 7414,
  "mode": "NORMAL",
  "mode_id": 1,
  "car_connected": false,
  "wifi": {
    "status": "WL_CONNECTED",
    "ssid": "littlecarpediem",
    "rssi": -90,
    "bssid": "58:D9:D5:EB:E4:16"
  },
  "evse": {
    "temp": 24,
    "temp_max": 65,
    "connected": false,
    "access": true,
..........
Supposons que je veuille récupérer le N° de série "serialnr" ci-dessus dans une variable virtuelle créée pour l'occasion "serial" [idx77] du type numérique (j'ai mis des volts car on s'en fout) : Je n'y vois goutte dans ce script d'exemple de parsing où mets-je "serialnr" et "77" ??

Je ne comprends pas ce code d'exemple : Les double tirets -- passent bien la ligne en commentaire ? Donc

Code : Tout sélectionner

--  "id": 13,
n'a aucun effet... ? Dans ce cas, à quel endroit du code l'index 13 est précisé ?

Je comprends pas... ? [et je n'en suis qu'au début de ce qui n'est pas encore une solution :-) ]

Merci de vos réactions, aide, avis, et d'avoir pris le temps de cerner (mes) problèmes !

Jean

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 09 sept. 2024, 20:08
par fcBourgogne
Bonjour jeanpaulliony ,

Sans connaitre Domoticz, Lua Dzvents, tu ne choisis pas la facilité.
En langage Blocky tu vas vite être bloqué pour tes actionneurs.

Puisque tu possèdes un SmartEVSE, je vois que le site de ce produit propose déjà la solution avec la box Sensorbox et un capteur, la box intègre la production solaire.

Pourquoi faire compliqué?

J'utilise Domoticz depuis 2016, et j'en suis satisfait, mais quand il s'agit de gérer des systèmes un peu élaborés surtout si c'est pour une orientation machine , j'utilise de l'arduino de l'ESP32 etc...

Mais à toi de voir, je ne voudrais pas te décourager.
Cdt, A+

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 09 sept. 2024, 21:42
par Flying Domotic
Quelques remarques en vrac :
1) Le polling n'est pas forcement la meilleure façon de faire. En principe, on réagit plutôt à des changements pour modifier en retour un état ou une commande.
2) Du coup, il est préférable d'utiliser un protocole comme zWave, ZigBee ou MQTT plutôt que http.
3) Il y a une discussion sur SmartEVSE sur le forum Domoticz.com (https://www.domoticz.com/forum/viewtopic.php?t=30551). Là, en l’occurrence, ça parle MQTT.
4) Id= 13 est bien en commentaire. Il est chargé par la ligne "local id = domoticz_applyJsonPath(s,'.id')", tout comme temperature est chargé par "local s = domoticz_applyJsonPath(s,'.temperature')" (ce quiest moyennement judicieux, car la varaible contient déjà la requête, qui sera donc écrasée.

En espérant que ça aide ...

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 10 sept. 2024, 10:57
par jeanpaulliony
Bonjour fcBourgogne,

Merci de votre retour. Oui : SmartEVSE gère ceci "en natif", connecté à son propre comptage électrique, ou en interfaçage avec des compteurs communicants.
Mais dans mon cas, je suis à 600m de mon arrivée EDF, avec impossibilité de passer du câble (sinon je l'aurais fait en RS485)... Voilà pourquoi du http en liaison wifi (que le SmartEVSE chope en client).

Ayant déjà un Domoticz sur place, ce choix était plutôt logique. Quand j'ai ensuite appris que SmartEVSE avait une API accessible, j'ai opté pour ça.

Après, je suis d'accord avec l'idée qu'un "supervision" n'est pas l'idéal en régulation, que l'on devrait effectivement passer sur du "dur". Dans mon cas précis, si mon solaire ne produit pas (ou que l'info ne suit pas), la seule chose que je risque c'est de ne pas charger mon VE, ou de le faire avec une électricité trop chère. Donc aucun risque "physique" dans mon cas.

Mais en régul', "en vrai" on fait jamais ça , je suis bien d'accord.

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 10 sept. 2024, 11:22
par Flying Domotic
Je n'utilise pas de SmartEVSE, ce qui m'autorise à dire des bêtises, mais il me semble que si on peut lui causer HTTP, il doit être connecté au réseau d'une façon ou d'une autre, et du coup on devrait pouvoir lui causer MQTT, non ?

Modération

Publié : 10 sept. 2024, 12:33
par Keros
Sujet déplacé dans la section dédiée aux scripts.

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 10 sept. 2024, 13:01
par jeanpaulliony
Bonjour Flying Domotic,
Merci de tes réactions :-)

Oui, idéalement une mise à jour de valeur, donc lancement de script serait événementiel, avec un lancement "garanti" toutes les x minutes, ce serait idéal. // Mais le timeout à 10s du smartEVSE me force à faire plus rapide.

Ceci dit, ce timeout apparaît sur l'API, je ne sais pas s'il survient en MQTT. Je vais me renseigner.

Si j'ai bien saisi le MQTT de ce que j'en ai déjà lu, il a l'avantage de proposer des champs/valeur préétablies et accessibles nativement dans Domoticz, j'ai bon ? // là où j'ai lâché le morceau du MQTT c'était de me fader l'install d'un brooker sur Domoticz (mosquitto non ?)... De réapprendre/installer ce truc "juste" pour ça.
Typiquement, en lisant "en diagonale" l'autre Forum cité (merci du lien Flying), l'autodiscover MQTT ne fonctionne pas avec SmartEVSE semble t'il, avec un passage par mqttmapper, bon on est pas dans le juste simple quoi...

Oui, je comprends votre réaction par rapport à ce que je viens d'écrire : On a rien sans rien :-) Mais d'avoir lu qu'en fonction des Maj de Domoticz le brooker devait suivre, ou pas.. ou en changer, bref à l'image d'un greffon non inclus dans la solution "de base" (y'a certainement des bonnes raisons, hein, je ne juge pas !) je ne suis pas allé plus loin coté MQTT.

Après, si c'est finalement plus "propre" et accessible pour moi que le parssage JSON en POST/GET... pourquoi pas remettre le couvert...

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 10 sept. 2024, 13:29
par fcBourgogne
Bonjour jeanpaulliony,
Mais dans mon cas, je suis à 600m de mon arrivée EDF
Qu'est ce qui est à 600m, le compteur EDF, le tableau général de la maison?
La prise pour la charge VE est dans un garage à 600m de la maison?

A+

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 10 sept. 2024, 14:27
par jeanpaulliony
fcBourgogne a écrit : 10 sept. 2024, 13:29 Bonjour jeanpaulliony,
Mais dans mon cas, je suis à 600m de mon arrivée EDF
Qu'est ce qui est à 600m, le compteur EDF, le tableau général de la maison?
La prise pour la charge VE est dans un garage à 600m de la maison?

A+
Hello fcBourgogne,
Hé Hé :-) (bien vu, sur ces distances la chute de tension aurait nécessité des câbles en or :-) j'ai été pessimiste, le point de chargement (SmartEVSE) est à 160m de mon arrivée électrique, mais rigoureusement impossible de tirer du câble... par contre j'ai du wifi partout.
// Je pourrais effectivement passer par du pont ethernet/wifi RS485 entre la charge VE et un compteur communicant en tête... je ne m'étais pas posé la question en ce sens...

Re: Polling http pour récupérer des info en JSON via un script pour parser... et charger un VE :-)

Publié : 10 sept. 2024, 15:05
par Flying Domotic
Alors là, on va rentrer dans la philosophie plutôt que la technique : (dans mon cas à minima) le choix de MQTT est plus architectural qu'opportuniste.

En dehors d'avoir un gestion par évènement plutôt que par timer (dont le pas avec Domoticz est limité à une minute au minimum). MQTT permet d'avoir une gestion centralisée (collecte et distribution d'évènements de/vers plusieurs dispositifs/outils/scripts), de mémoriser le dernier état, de savoir si le dispositif est en ligne ou pas, de limiter le nombre de connexions (une seule connexion par dispositifs/outil/script), de permettre l'utilisation de plusieurs outils en parallèle (utile pour les tests, ou les bascules d'un outil sur un autre), d'utiliser des outils de visualisation/modification des sujets (topics), de garantir (ou pas, avec différents niveaux) la distribution des messages, de s'abonner à des messages individuels, avec des jokers, à partir d'un point de l'arborescence, ...

C'est un vrai outil pensé pour l'échange de messages adapté à (conçu pour) la domotique. Beaucoup d'outils domotiques savent communiquer avec MQTT, certains (comme Home Assistant) d'ailleurs quasiment uniquement.

Il faut effectivement installer un broker (5 minutes montre en main), qu'on oublie ensuite (pas de souci en 15+ ans).

Pour répondre à la question "Si j'ai bien saisi ...", les messages sont structurés sur une arborescence, leur contenu est libre. On utilise souvent le formatage JSON, mais ce n'est pas obligatoire. C'est le dispositif qui écrit qui décide de ce qu'il envoie, ceux qui écoutent le reçoivent tel quel.

Il existe un procédé qui vient d'Home Assistant qui est l'auto discovery, qui permet, lorsque le dispositif écrit les bonnes choses au bon endroit, d'intégrer automatiquement des données dans Domoticz.

Si ces choses n'existent pas, il faut passer par un outil qui fera l'extraction des données. Ça peut être Node-RED (le marteau pilon), du script, des plugins, ...

Pour Domoticz, il existe MqttMapper, qui permet de créer des dispositifs Domoticz, et de les lier avec des topics MQTT, en utilisant un fichier de configuration. C'est ce qui a été utilisé dans le forum domoticz.com. A priori, on peut compter sur l'aide du concepteur en cas de besoin :D

Une fois tout ça posé, si on est plus à l'aise avec HTTP, où qu'on ne se soucie pas trop de l'architecture tant que ça marche, on peut toujours utiliser HTTP.

Reste le souci des 10 secondes. De base, les timers Domoticz ne savent pas faire mieux que 60 secondes. On peut quand même s'en sortir, par exemple:
- en sortant complètement la gestion du SmartEVSE de Domoticz par un script tournant en permanence, avec des "sleep" pour limiter un peu la charge de la machine
- ruser en écrivant un petit script qui modifie un dispositif virtuel toutes les 5/10 secondes, et lier le script Domoticz qui réalise la gestion du SmartEVSE aux modifications de ce dispositif virtuel
- trouver un dispositif utile dans la boucle (par exemple un dispositif de mesure du courant) mis à jour régulièrement, et lier la gestion dessus

Par curiosité, qu'est ce qui justifie ce délai aussi court ?