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
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 :
Oups, c'est quoi ce truc??
Par exemple, juste au début de mon retour JSON, j'ai ça :
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 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
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¶m=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)
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,
..........
Je ne comprends pas ce code d'exemple : Les double tirets -- passent bien la ligne en commentaire ? Donc
Code : Tout sélectionner
-- "id": 13,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