Ajout protocole Domoticz
-
Bonjour à tous
@Deennoo, Je suis en train de refondre l'interface de WifInfo pour y ajouter domoticzJe ne retrouve plus la syntaxe d'appel pour DomoticZ quelqu'un pourrait-il me donner la syntaxe exacte de l'appel via HTTP sur domoticz ?
J'ai trouvé çà mais je ne suis sûr de rien
http://ipdomoticz/json.htm?type=command¶m=udevice&idx=NUMEROIDXDEVOTRECOMPTEUR&nvalue=0&svalue=$HCHP;$HCHC;0;0;$PAPP;0
type=command => Obligatoire à chaque appel ?
param=udevice => Quesako ?
idx=ADCO => ça je pense avoir compris
Et ensuite les etiquettes/valeur sous quel format ?Merci pour votre aide
-
Bonjour Charles.
Actuellement : Pour avoir le retour de Wifinfo dans Domoticz, Il cree un "Dummy" Electricity P1 smart meter : c'est un compteur inteligent qui accepte : consommation sur 2 tarif, production sur 2 tarif, conso actuel + production actuel
Plus d'info sur l'API Json de Domoticz pour ce type de compteur :
https://www.domoticz.com/wiki/Domoticz_API/JSON_URL's#Electricity_P1_smart_meter
Idx n'est pas l'ACDO, mais le numero de Device dans la base de Domoticz.
Ci dessous le script que j'utilise :
var http = require("http"); function handleWifInfo(d) { console.log("handle d : " + d); var obj = JSON.parse(d); var opt = buildGetObject("127.0.0.1", "/json.htm", 8080); opt.path += "?type=command¶m=udevice&idx=41&nvalue=0"; opt.path += "&svalue=" + obj.HCHP + ";"; opt.path += obj.HCHC + ";0;0;"; opt.path += obj.PAPP + ";0"; console.log("path to call : " + opt.path); httpGet(opt); } function buildGetObject(hostname, path, port) { var obj = { }; obj.hostname = hostname; obj.port = (port == undefined) ? 80 : port; obj.path = path; obj.method = "GET"; return obj; } function httpGet(opt, func) { var datas = ""; var req = http.request(opt, function(res) { // Gère les morceaux de réponse. res.on("data", function(buffer) { console.log("data received"); datas += buffer; }); // Gère le traitement final si besoin. res.on("end", function() { console.log("end of http request"); console.log("func is " + ((func == undefined) ? "undefined" : "defined")); if (func != undefined) func(datas); }); res.on("error", function(e) { console.log("Error : " + e.message); }); }); req.end(); } var opt = buildGetObject("192.168.0.35", "/json"); httpGet(opt, handleWifInfo);
Ou idx=41 : 41 = le numero de device dans ma base Domoticz.
192.168.0.35 = ip de Wifinfo
127.0.0.1:8080 : l'adresse de mon domoticz, ce script etant executer toutes les 5 minutes de mon serveur
IL faut penser au fait que beaucoup on des nom d'utilisateurs et des mots de passe associé :
du coup l'url pour mettre a jour le compteur va etre : http://username:password@domoticz-ip<:port>/json.htm?type=command¶m=udevice&idx=IDX&nvalue=0&svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD
Comme tu le vois dans le code du parser, si pas de production d'elec : mettre les valeurs a 0
Si dessous le Json de mon Wifinfo HP/HC :
{ _UPTIME: 16674, ADCO: 29922105039, OPTARIF: "HC..", HCHC: 34245564, HCHP: 76018836, PTEC: "HC..", IINST: 5, IMAX: 43, PAPP: 1160, HHPHC: "A", MOTDETAT: 0, ISOUPAPP: 580, ISOUSC: "45PAPP" }``` esperant avoir aidé.
-
Super merci,
idx peut aller de combien à combien ? c'est une valeur 8 bits/16bits ou plus ?
Tu pourrais me mettre 1/2 exemple de requête complète qu'envoi ton script pour être sûr ?
Merci à toi
-
la requete :
Va mettre a jour mon compteur qui porte le numero de device : 41,
en specifiant Usage 1 : Heure Pleine index = 76018836,
Usage 2 = index heure creuse : 34245564,
Pas d'index de production ni en tarif 1 ni en tarif 2 donc : ;0;0
Mon PAPP : 1160w a l'instant
Pas de production donc : 0Je ne peux pas te répondre quand a idx...il commence a 1 pour le premier "objet" trouvé/cree dans la base jusqu a l'infini et au dela !
-
Ok super merci, en fait c'est figé c'est ça que j'avais pas capté (pas lu la doc), c'est impek maintenant.
Sinon, mode parano, pas de mot de passe, pas d'API key, c'est chaud qd même , n'importe quel prog peu balancer ce qu'il veut ?
-
Arff j'ai encore lu trop vite, ok je viens de voir pour le login/password
-
bah j'ai hâte moi maintenant, je me suis trouver une antenne wifi + son cable et le connecteur qui va bien (ensemble piquer a une alicebox) pour le brancher sur ESP 07 de ma carte Wifinfo, un petit trou dans le boitier pour la fixer, et j'ai gagné énormément en émission/réception.
-
Bonjour Charles
as tu progressé pour l'ajout de domoticz ? si ce n'est pas le cas, peut on t'aider sur le sujet ? il faudra me passer quelques indications , mais j'arrive vers mes congés donc aurais un peu de temps à consacrer à cela....
merci de ton retour
Laurent -
Bonjour,
Je débute avec Domoticz, et j’utilise un petit script maison pour faire apparaitre dans Domoticz ma conso instantanée et ma couleur du jour (option "Tempo").
Si ça peut servir de base pour d'autre, c'est cadeau.J'ai créé 2 "dummy" : Un type "texte" pour la couleur du jour, et un type "P1 Smart Meter" pour la conso.
Mon wifinfo est une adaptation perso, il intègre un capteur température/humidité, d'où les lignes supplémentaires dans le script et le "sensorIdx"
Je débute en Lua, donc pas forcement optimisé, mais ça me convient. Le script est appelé par une tache cron.-- index des dispositifs (colonne IDX de domoticz) ---- capteur temp/hum local sensorIdx = 217 ---- P1 smart meter local teleinfoIdx = 154 ---- text local colorIdx = 249 ---- Domoticz local domoURL = "http://127.0.0.1:8080/json.htm?" local urlParams = "type=command¶m=udevice&idx=" -- inclure les bibliothèques Lua json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux -- json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")() -- For Windows -- récupération des données json local config=assert(io.popen('/usr/bin/curl -s http://192.168.5.229/json')) local blocjson = config:read('*all') config:close() -- debug print (blocjson) -- décodage des données local jsonValeur = json:decode(blocjson) -- affectation dans des variables papp = jsonValeur.PAPP iinst = jsonValeur.IINST temp = jsonValeur._TEMPERATURE hum = jsonValeur._HUMIDITY coulJ = jsonValeur.PTEC coulD = jsonValeur.DEMAIN BBRHCJB = jsonValeur.BBRHCJB BBRHPJB = jsonValeur.BBRHPJB BBRHCJW = jsonValeur.BBRHCJW BBRHPJW = jsonValeur.BBRHPJW BBRHCJR = jsonValeur.BBRHCJR BBRHPJR = jsonValeur.BBRHPJR CPlein = BBRHPJB + BBRHPJW + BBRHPJR CCreux = BBRHCJB + BBRHCJW + BBRHCJR -- un peu de modification de texte pour faciliter la lecture coulJ = string.gsub(coulJ, "HPJB", "Plein%%20Bleu"); coulJ = string.gsub(coulJ, "HCJB", "Creux%%20Bleu"); coulJ = string.gsub(coulJ, "HPJW", "Plein%%20Blanc"); coulJ = string.gsub(coulJ, "HCJW", "Creux%%20Blanc"); coulJ = string.gsub(coulJ, "HPJR", "Plein%%20Rouge"); coulJ = string.gsub(coulJ, "HCJR", "Creux%%20Rouge"); -- construction des url url1 = domoURL .. urlParams .. sensorIdx .. '&nvalue=0&svalue=' .. temp .. ';' .. hum .. ';0' url2 = domoURL .. urlParams .. teleinfoIdx .. '&nvalue=0&svalue=' .. CPlein .. ';' .. CCreux .. ';0;0;' .. papp .. ';0;' url3 = domoURL .. urlParams .. colorIdx .. '&nvalue=0&svalue=' .. coulJ .. '%20%2F%20Demain%20' .. coulD -- debug print(url1); print(url2); print(url3); -- appel successif des url local doIt=assert(io.popen('/usr/bin/curl -s "' .. url1 .. '"')) doIt:read('*all') doIt:close() doIt=assert(io.popen('/usr/bin/curl -s "' .. url2 .. '"')) doIt:read('*all') doIt:close() doIt=assert(io.popen('/usr/bin/curl -s "' .. url3 .. '"')) doIt:read('*all') doIt:close()
L'ip de mon wifinfo est 192.168.5.229, adaptez selon votre config.
J'utilise l'option "tempo", j'ai donc 6 tarifs et non 2, ça complique un peu la conso, adaptez à vos besoins.Au final, ça me donne ça:
-
Bonjour,
Je me suis inspiré du script précédent (merci pour la contribution !) et je l'ai adapté ainsi :
- Utilisation directement depuis Domoticz (pas besoin de tâche cron) : Setup > More Options > Events > LUA au lieu de Blockly > Time
- Mise à jour en utilisant les fonctions lua de Domoticz sans passer par json (ça évite de gérer les utilisateurs)
- N'ayant pas la valeur de PAPP remontée, je fais un calcul de puissance basé sur la comparaison entre deux valeurs d'index total.
- J'utilise trois objets "dummy" : Text sensor, Electricity (instant and counter) nommé "Compteur_EDF", Ampere (1 phase)
Il y a un exemple intéressant ici que j'ai troué un peu (trop) vers la fin : https://www.domoticz.com/wiki/Capturing_Energy_Usage_with_Lua_Scripts
Voilà, je vous livre le script ci-dessous si ça peut aider quelqu'un. A noter que c'est pour un compteur tempo. A adapter selon votre configuration et vos besoins.
---- Script pour récupérer les informations sur un Wifinfo. A mettre dans Domoticz dans "Events" en tant que script LUA / Time ---------------------------------------------------------------------------------------------------------- -- Paramètres ---------------------------------------------------------------------------------------------------------- debug = "yes" -- Turn debugging on ("yes") or off ("no") frequence = 2 -- toutes les x minutes -- adresse du fichier JSON de Wifinfo local wifinfoURL = "http://192.168.1.210:80/json" -- index des dispositifs (colonne IDX de domoticz) -- Text sensor device1 = "Tarif_EDF" local colorIdx = otherdevices_idx[device1] -- Electricity (instant and counter) device2 = "Compteur_EDF" local compteurIdx = otherdevices_idx[device2] -- Ampere (1 phase) device3 = "Intensité_EDF" local intensiteIdx = otherdevices_idx[device3] if debug=="yes" then print(device1 .. " : idx " .. colorIdx) print(device2 .. " : idx " .. compteurIdx) print(device3 .. " : idx " .. intensiteIdx) end -- Domoticz (mise à jour de Domoticz par json, non utilisé) --local domoURL = "http://127.0.0.1:8080/json.htm?" --local urlParams = "type=command¶m=udevice&idx=" ---------------------------------------------------------------------------------------------------------- -- Fonctions ---------------------------------------------------------------------------------------------------------- -- arrondi function round2(num, numDecimalPlaces) return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)) end -- écart de temps function timedifference (s) year = string.sub(s, 1, 4) month = string.sub(s, 6, 7) day = string.sub(s, 9, 10) hour = string.sub(s, 12, 13) minutes = string.sub(s, 15, 16) seconds = string.sub(s, 18, 19) t1 = os.time() print("t1 = " .. t1) t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds} print("t2 = " .. t2) difference = os.difftime (t1, t2) return difference end ---------------------------------------------------------------------------------------------------------- -- CommandArray ---------------------------------------------------------------------------------------------------------- commandArray = {} if ( ( os.time() / 60 ) % frequence ) == 0 then -- inclure les bibliothèques Lua json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux -- json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")() -- For Windows -- récupération des données json local config=assert(io.popen('/usr/bin/curl -s ' .. wifinfoURL)) local blocjson = config:read('*all') config:close() if debug=="yes" then print ("Fichier JSON : " .. blocjson) end -- décodage des données local jsonValeur = json:decode(blocjson) -- affectation dans des variables local papp = jsonValeur.PAPP local iinst = jsonValeur.IINST local coulJ = jsonValeur.PTEC local coulD = jsonValeur.DEMAIN local BBRHCJB = jsonValeur.BBRHCJB local BBRHPJB = jsonValeur.BBRHPJB local BBRHCJW = jsonValeur.BBRHCJW local BBRHPJW = jsonValeur.BBRHPJW local BBRHCJR = jsonValeur.BBRHCJR local BBRHPJR = jsonValeur.BBRHPJR local CPlein = BBRHPJB + BBRHPJW + BBRHPJR local CCreux = BBRHCJB + BBRHCJW + BBRHCJR local CTotal = CPlein + CCreux -- un peu de modification de texte pour faciliter la lecture coulJ = string.gsub(coulJ, "HPJB", "BLEU HP"); coulJ = string.gsub(coulJ, "HCJB", "BLEU HC"); coulJ = string.gsub(coulJ, "HPJW", "BLANC HP"); coulJ = string.gsub(coulJ, "HCJW", "BLANC HC"); coulJ = string.gsub(coulJ, "HPJR", "! ROUGE ! HP"); coulJ = string.gsub(coulJ, "HCJR", "! ROUGE ! HC"); -- obsolète - utilisation de deux variables utilisateur pour calculer les écarts et compenser l'absence de variable papp de certains compteurs --local CTotal_old = uservariables["Index_temp"] -- on récupère l'index stocké dans la variable utilisateur Index_temp --local time_old = uservariables["Time_temp"] -- on récupère l'heure stockée dans la variable utilisateur Time_temp --local time_now = os.time() --local ecart_index = CTotal - CTotal_old --local ecart_sec = time_now - time_old --commandArray['Variable:Index_temp']= tostring(CTotal) -- on met à jour la variable utilisateur avec le nouvel index --commandArray['Variable:Time_temp']= tostring(time_now) -- on met à jour la variable utilisateur avec la nouvelle heure -- on calcule l'écart de temps et d'index pour compenser l'absence de variable papp de certains compteurs puissance_old, CTotal_old = string.match(otherdevices_svalues[device2], "(%d+%.*%d*);(%d+%.*%d*)") -- on récupère les valeurs stockées - inspiré de https://www.domoticz.com/wiki/Capturing_Energy_Usage_with_Lua_Scripts puissance_old = tonumber(puissance_old) CTotal_old = tonumber(CTotal_old) local ecart_sec = timedifference(otherdevices_lastupdate[device2]) local ecart_index = CTotal - CTotal_old -- si PAPP n'est pas disponible, on calcule avec les écarts if (papp == nil) then -- obsolète - puissance = iinst * 230 -- pas bien précis puissance = ecart_index / ecart_sec * 3600 else puissance = papp * 0.9 -- en prenant un facteur de puissance à 0.9 end puissance = round2(puissance,0) if debug=="yes" then print("Index total (nouveau): " .. CTotal .. " Wh") print("Index total (ancien): " .. CTotal_old .. " Wh") print("Ecart index : " .. ecart_index .. " Wh") print("Ecart de temps : " .. ecart_sec .. " s") print ("Puissance : " .. puissance .. " W") end -- construction des paramètres -- voir https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s pour la syntaxe de nvalue|svalue local param1 = colorIdx ..'|0|' .. coulJ .. ' / Demain : ' .. coulD local param2 = compteurIdx ..'|0|' .. puissance .. ';' .. CTotal local param3 = intensiteIdx ..'|0|' .. iinst -- construction des url (mise à jour de Domoticz par json, non utilisé) --url1 = domoURL .. urlParams .. teleinfoIdx .. '&nvalue=0&svalue=' .. CPlein .. ';' .. CCreux .. ';0;0;' .. papp .. ';0;' --url2 = domoURL .. urlParams .. colorIdx .. '&nvalue=0&svalue=' .. coulJ .. '%20%2F%20Demain%20' .. coulD if debug=="yes" then print("Paramètre 1 : " .. param1) print("Paramètre 2 : " .. param2) print("Paramètre 3 : " .. param3) end -- mise à jour des objets -- commandArray['UpdateDevice']='idx|nValue|sValue' -- for updating Dummy devices e.g. '96|0|Hello World' -- http://www.domoticz.com/wiki/LUA_commands table.insert (commandArray, { ['UpdateDevice'] = param1 } ) table.insert (commandArray, { ['UpdateDevice'] = param2 } ) table.insert (commandArray, { ['UpdateDevice'] = param3 } ) -- appel successif des url (mise à jour de Domoticz par json, non utilisé) --local doIt=assert(io.popen('/usr/bin/curl -s "' .. url1 .. '"')) --doIt:read('*all') --doIt:close() --doIt=assert(io.popen('/usr/bin/curl -s "' .. url2 .. '"')) --doIt:read('*all') --doIt:close() end return commandArray
Sébastien
-
Bonjour,
Je viens relancer le sujet car celà m'intéresse.
J'utilise Domoticz.
PS: pour le moment, j'essaye de récupérer en python à partir de Domoticz mais j'ai un pb : voir un autre post