› Forums › Serveur WES › Remarques et demandes d’évolutions › Données du Wes dans Domoticz
- Ce sujet contient 14 réponses, 3 participants et a été mis à jour pour la dernière fois par
cdlog2, le il y a 3 années et 9 mois.
- Post
-
Bonjour à tous ,je cherche une âme charitable pour m aider un peu .
Je ne parviens pas à faire communiqué le Wes avec domoticz pour pouvoir avoir les données.
Je ne trouve rien sur le net en ce sens.
Merci aux hommes de bonne volontés.
00
- Replies
-
-
Bonjour,
En préambule, Je n’utilise pas Domoticz, mais je sais qu’il y a un plugin domoticz qui existe afin de lire les infos du WES par envoie de requêtes http.
Le Wes implémente un fichier data.cgx et depuis la version WES V 0.83H B03 le fichier newdata.cgx qui se trouve à la racine de la microSD du WES.
Newdata.cgx est un Script WES qui permet de lire toutes les infos utiles du WES via l’envoie de requêtes sur ce fichier et dont la réponse du WES retourne un formulaire XML avec les identifiants et Valeurs de chaque données.
Vous pourvez envoyer la requête newdata.cgx via votre navigateur pour voir la réponse du WES :
http://login:password@no-ip-Wes/newdata.cgx — exemple : http://admin:wes@192.168.0.xx/newdata.cgx
login = login du WES
password = mot de passe du WES
no-ip-Wes = no IP de votre WES (192.168.0.xx)Le plugin Domoticz initiateur de la requête WES interprète ce formulaire reçu en retour et converti les champs ID du XML en Identifiants compatible Domoticz avec les valeurs associés.
Voila à peu prés la mécanique entre Domotics et le WES. Mais je ne sais pas ou trouver le plugin domoticz.
A priori c’est domoticz qui travaille sur ce plugin. Si vous connaissez un peu domoticz il doit être facile de réaliser ce plugin.Faites une recherche avec le mot clé domoticz sur ce forum, vous trouverez peut être des réponses à votre question.
Cdt00-
bonjour
mon wes ne contient pas de fichier Newdata.cgx .
les requêtes wes vers domoticz fonctionnent une fois ou deux et ensuite plus ou quand ça leurs chante……….
je vais voir du coté des appels par lua sur domoticz .mais les fichiers que vous avez gentiment mis en ligne ne fonctionne pas ……avec IDX du
dispositif que j’ai créé
je dois louper un truc ..
00
-
-
Re:
Voir ce lien sur le Blog, vous trouverez quelques réponses et exemple de requêtes en Domoticz et le WES.
https://www.cartelectronic.fr/blog/?action=bbp-search-request&bbp_search=domoticz&paged=3
voir les tutos de Floche et Sacres qui fourni une petite doc explicative pour réaliser les requêtes entre domoticz et le WES.
Cdt
00 -
bonsoir et merci pour les réponses rapide . je vais me pencher sur vos écrits.
;-))
00 -
Bonjour,
si vous me relisez : Le Wes implémente un fichier data.cgx et depuis la version WES V 0.83H B03 le fichier newdata.cgx.
Peut-être êtes vous dans une version WES antérieure à la V 0.3H. Si cela est le cas vous trouverez le fichier data.cgx à la place de newdata.cgx. Personnalisez et envoyez depuis votre navigateur la requête vers le WES : http://login:password@192.168.xx.xx/data.cgx
Le WES devrait vous restituez un formulaire Xml avec les clés ID et valeurs associées.
Donnez un exemple d’une de vos programmations qui est supposée envoyer une requête par le WES vers votre Domoticz et qui ne fonctionne pas correctement !.
Si vous simulez votre requête supposée être envoyé à Domoticz ( URL/?Data…) via votre navigateur, Est ce que votre Domoticz répond correctement à chaque réception ?
Cdt
00 -
V0.83H B03 c’est ma version
mon wes ne contient pas de fichier Newdata.cgx .
juste le data.cgx .mais là n’est pas la question .
les requêtes une à une fonctionnent bien est s’affichent dans le dispositif de domoticz sous l’IDX que je lui attribue .
mais dès que je fais plusieurs lignes de programmation de requêtes depuis le wes vers domoticz, le système se bloque et fait des erreurs dans le fichier de programmation , donne les valeurs aléatoirement et je suis obligé de replacer un fichier PROG.DAT de sauvegarde pour remettre de l’ordre et ça me plait moyennement de trafiquer le travail de Nicolas.
vu que je ne suis pas le seul dans ce cas ,alors je ne veux pas passer pas se cheminement mais plutôt par une requête en partance de domoticz vers le wes
00 -
Bonsoir,
Désolé, vous avez raison, dans le ZIP téléchargé de la mise à jour V0.83H B03 c’est bien Data.cgx qui est présent. J’ai du certainement le renommé le mien chez moi pour des tests ?. Bref Désolé.
Je comprend mieux Maintenant votre Pb. Il faudrait demander à Nicolas d’implémenter une file d’attente (FIfO) dans la gestion des envoies des requêtes HTTP vers un destinataire depuis la gestion des Scripts « programme » du WES ou bien de ne pas attendre la réponse du Distant, Ou autoriser des requêtes de type UDP.
Il se peut que deux requêtes doivent être envoyés au même moment, Il faudrait savoir comment ce comporte la tache qui gère la page programme dans ce cas de figure.
Dans l’autre sens le WES peut accepter des rafales en réception de requêtes de l’ordre des 200ms, si les requêtes Cgx ne sont pas trop importantes. Il est préférable de fractionner le fichier DATA.CGX en petit tronçons, selon la page consultée dans votre domoticz.
L’envoie en global du fichier DATA.CGX est assez important, il serait préférable d’avoir des cycle d’envois plus proche de 800ms.
Cdt
00 -
Bonjour.
j’ai essayer mais j’ai:
<span style= »color: #860016; font-family: ‘Courier New’, monospace; font-size: 11px; font-weight: 600; background-color: #fafafa; »>2021-12-18 03:19:00.291 Error: EventSystem: in wes: [string « … »]:441: attempt to concatenate a nil value (global ‘relais1’)</span>
le probleme c’est que la valeur relais1
est <span style= »background-color: #fafafa; color: #067676; font-family: ‘Courier New’, monospace; font-size: 11px; font-weight: 600; »>RELAIS1>ON</span>
alors que je pense qu’il ne faut que ON ou OFF.
j’essai de filtrer la valeur mais je sais pas faire…
00 -
Bonjour,
Vous déterrez un vieux sujet de discussion et vous donnez très peu d’information pour bien comprendre votre problème. Qu’elle est la version de votre WES ?
De ce que je peux comprendre de votre énoncé, c’est que vous n’arrivez pas à extraire correctement les états des Relais rendus par le WES suite à l’envoie de requêtes sur le Data.cgx depuis votre Script Domoticz.
Quel est votre Script Domoticz ? il existe deux versions, l’une écrite en Python et l’autre en Lua ? Pourriez vous nous transmettre votre script Domoticz utilisé sous forme d’archive ZIP ?
Concernant la réponse du WES à une requête sur Data.cgx, oui en effet, les états des Relais sont rendus par « On » ou « Off ».
Exemple : extrait réponse du data.cgx pour les relais du WES:
<relais>
<RELAIS1>ON</RELAIS1>
<RELAIS2>OFF</RELAIS2>
</relais>Si vous utilisez le Script Domoticz écrit en LUA, il existe une fonction qui extrait les valeurs du Data.cgx suivant un Mots Clé XML passé en argument et qui fait une analyse de la valeur lue relative à cette Clé en vérifiant s’il s’agit d’une réponse « ON ou OFF », soit une valeur rendue par une Clé type Switch ou Relais. Si la valeur lue est bien « ON ou OFF » alors la fonction retourne cette valeur sans la modifier et pour tous les autres cas, la valeur est convertie en valeur numérique.
Voici en exemple la fonction concernée accompagné d’un appel à cette fonction avec enregistrement dans Domoticz de la valeur associée à son n° Ident.
———————————————-
— function XML_Parse_Value(field, str)
—
— Récupère la Value d’un Tag <ID> d’un XML
— field : Tag <ID> de la Value XML à récupérer
— str : Fichier XML
— Return = Value Numérique ou « On »/ »Off » si value d’un Switch
— Return 0 si le Tag <ID> n’est pas trouvé
———————————————–
function XML_Parse_Value(field, str)local field_start = string.find(str,field)
if field_start == nil then
print (« XML error – TAG NOT found »)
return 0
end
local field_end = string.find(str, « </ », field_start)
str_field = string.sub(str, field_start+1, field_end-1)
if debug == true then
print(str_field)
end
if str_field == « ON » or str_field == « OFF » then
return str_field
else
return tonumber(str_field)
end
end————————————————————
— Implémente toutes les valeurs WES dans la Array commandArray
———————————————————-
idx_relais1 = 80 — n° Ident relais 1 Domoticzrelais1 = XML_Parse_Value(« <RELAIS1> »,XML_string) — demande l’état du Relais 1 rendu par le Data.cgx, soit « On ou OFF »
commandArray[idx_relais1] = {[‘UpdateDevice’] = idx_relais1..’|0|’..relais1} — enregistre la réponse au n° Ident dans DomoticzTrouvez en pièce jointe un exemple de Script LUA Domoticz dédié pour envoyer des requêtes data.cgx au WES.
Cdt
Attachments:
You must be logged in to view attached files.00 -
RE: Je m’aperçois qu’il y a un bug dans le Script LUA que j’ai fourni !
En effet la ligne local field_start = string.find(str, tagdeb) de la function XML_Parse_TAG(field, str) doit sécrire :
local deb, field_start = string.find(str, tagdeb)et la ligne local field_start = string.find(str,field) de la function XML_Parse_Value(field, str) doit s’écrire :
local deb, field_start = string.find(str,field)La fonction API str.find(s,…) LUA renvoie 2 valeurs, la 1ere valeur est l’index du début de l’occurrence recherché et la 2eme valeur l’index de fin de cette occurrence.
Je joins le Script corrigé.
Cdt
Attachments:
You must be logged in to view attached files.00 -
REBonjour.
J’ai reussit.
je posterais le programme modifier.
il n’y a pas grand chose a reprendre.
Merci beaucoup
00 -
Un premier jet marche très bien.
2 compteur eau a impulsion
4 pince ampérométrique
2 compteur EDF
-------------------------------------------------------------------- -- Script LUA DOMOTICZ compatible DATA.CGX version WES V 0.84A4 -- révision du Script LUA déposé par @sacres sur le BLog Carteletronic -- -- Personnalisez vos Identifiants Domoticz -- Personnalisez vos bloc Relais 1Wire en décomentant les Blocs Relais Présents -- Personnalisez vos Capteurs de Température et Humidité en décommentant les Blocs présents -- Ne pas oublier de Commenter les Références des Sondes DB18B20 de Températures en relatif -- Personnamiser l'URL de votre WES ci-dessous : Login : password et IP du WES commandArray = {} -- arrays des infos WES debug = false -- Affiche les Prints si true -------------------------------------------------------- -- Personnalisez l'URL de votre WES -- URL du WES sous la forme => login:password@ip-du-wes -------------------------------------------------------- WES_IP = "admin:wes@192.168.1.222" ---------------------------------------------------------- -- Personnalisez vos Identifiants Obj Domoticz -- Adaptez vos propres valeurs IDX Domoticz, définies par défaut ci-dessous ---------------------------------------------------------- --------------------------------------- -- Définition des 2 Identifiants Relais WES ---------------------------------------- idx_relais1 = 1 idx_relais2 = 2 ------------------------------------------------------ -- Définition des 6 Identifiants Compteurs d'impulsions ------------------------------------------------------ idx_impulsion1 = 12 idx_impulsion2 = 13 ----------------------------------------------------- -- Définition des 4 Identifiants Pinces ampèremétriques ------------------------------------------------------ idx_pince1 = 6 idx_pince2 = 7 idx_pince3 = 8 idx_pince4 = 9 -------------------------------------------- -- definition des 3 Compteurs TICs -------------------------------------------- idx_tica1 = 15 idx_tica2 = 16 idx_tica3 = 17 idx_ticab = 22 idx_ticaw = 24 idx_ticb1 = 18 idx_ticb2 = 19 idx_ticb3 = 20 idx_ticbb = 23 idx_ticbw = 25 -- Fin de la personnalisations des Identifiants IDX ----------------------------------------------------- -- function XML_Capture(cmd , flatten) -- -- cmd : commande système -> lecture d'une URL HTTP -- flatten : booléen, suppression des Char spéciaux si = 1 (true) ---------------------------------------------------- function XML_Capture(cmd,flatten) local f = assert(io.popen(cmd, 'r')) local s = assert(f:read('*a')) f:close() if flatten then s = string.gsub(s, '^%s+', "") s = string.gsub(s, '%s+$', "") s = string.gsub(s, '[\n\r\t]+', "") end return s end ---------------------------------------------- -- function XML_Parse_TAG(field, str) -- -- Récupère le bloc XML compris entre les Tags et d'un XML -- field : Tag ID du bloc XML à récupérer -- str : Fichier XML -- Return = le Bloc string Compris entre les deux TAGs ... -- Return "" si le TAG n'est pas trouvé ----------------------------------------------- function XML_Parse_TAG(field, str) local tagdeb = "<"..field..">" local tagend = "</"..field..">" local field_start = string.find(str, tagdeb) if field_start == nil then print ("XML error – TAG NOT found") return "" end local field_end = string.find(str, tagend, field_start) str_field = string.sub(str, field_start+0, field_end-1) if debug == true then print(str_field) end return str_field end ---------------------------------------------- -- function XML_Parse_Value(field, str) -- -- Récupère la Value d'un Tag d'un XML -- field : Tag de la Value XML à récupérer -- str : Fichier XML -- Return = Value Numérique ou "On"/"Off" si value d'un Switch -- Return 0 si le Tag n'est pas trouvé ----------------------------------------------- function XML_Parse_Value(field, str) local field_start = string.find(str ,field) if field_start == nil then print ("XML error – Value NOT found") return 0 end local field_end = string.find(str, "</" ,field_start) str_field = string.sub(str, field_start+0, field_end-1) if debug == true then print(str_field) end local field_e = string.find(str, ">" ,field_start) str_field = string.sub(str, field_e+1, field_end-1) if str_field == "ON" or str_field == "OFF" then return str_field else return tonumber(str_field) end end ------------------------------------------------------------------- -- Début du Script : -- Lecture du fichier Data.cgx du WES par envoie d'une requête HTTP ------------------------------------------------------------------- XML_string = XML_Capture("curl -s 'http://"..WES_IP.."/data.cgx'", 1) if debug == true then print(XML_string) -- Print du fichier XML si debut = True end ---------------------------------------- -- Vérif si la requête WES à réussi ? ---------------------------------------- valid = string.find(XML_string, "") -- check for a valid xml tag if valid == nil then print ("XML error – info NOT updated") else ------------------------------------------------------------ -- Implémente toutes les valeurs WES dans la Array commandArray ---------------------------------------------------------- --Time print('wes') tima = XML_Parse_TAG("info", XML_string) --print(tima) timee = XML_Parse_TAG("time", tima) print(timee) -- ---------------------- -- 2 Relais du WES ---------------------- --[[ print('V4') relaisa = XML_Parse_Value("",XML_string) relais1 = RELAISa print(relaisa) relais2 = XML_Parse_Value("",XML_string) print(relais1) print('_________') commandArray[idx_relais1] = {['UpdateDevice'] = idx_relais1..'|0|'} print(idx_relais1..'|0|') commandArray[idx_relais2] = {['UpdateDevice'] = idx_relais2..'|0|'} print(idx_relais2..'|0|') ]]-- ---------------------------- -- 6 Compteurs d'impulsions ----------------------------- --impulsion1 = XML_Parse_Value("",XML_string) index1 = XML_Parse_Value("",XML_string) -- --impulsion2 = XML_Parse_Value("",XML_string) index2 = XML_Parse_Value("",XML_string) -- commandArray[idx_impulsion1] = {['UpdateDevice'] = idx_impulsion1..'|0|'..index1} --print(idx_impulsion1..'|0|'..index1) commandArray[idx_impulsion2] = {['UpdateDevice'] = idx_impulsion2..'|0|'..index2} --print(idx_impulsion1..'|0|'..index1..';') ----------------------------- -- 4 Pinces ampèremétriques ------------------------------ pince1 = XML_Parse_Value("",XML_string) pince2 = XML_Parse_Value("",XML_string) --index2 = XML_Parse_Value("",XML_string) --inject2 = XML_Parse_Value("",XML_string) -- pince3 = XML_Parse_Value("",XML_string) --index3 = XML_Parse_Value("",XML_string) --inject3 = XML_Parse_Value("",XML_string) -- pince4 = XML_Parse_Value("",XML_string) --index4 = XML_Parse_Value("",XML_string) --inject4 = XML_Parse_Value("",XML_string) ----- commandArray[idx_pince1] = {['UpdateDevice'] = idx_pince1..'|0|'..pince1} commandArray[idx_pince2] = {['UpdateDevice'] = idx_pince2..'|0|'..pince2} commandArray[idx_pince3] = {['UpdateDevice'] = idx_pince3..'|0|'..pince3} commandArray[idx_pince4] = {['UpdateDevice'] = idx_pince4..'|0|'..pince4} ---------------------------- -- Recup Info TIC1 - TIC2 - TIC3 ---------------------------- XmlTic1 = XML_Parse_TAG("tic1", XML_string) -- Recup du Bloc TAG .... XmlTic2 = XML_Parse_TAG("tic2", XML_string) -- Recup du Bloc TAG .... -- papp1 = XML_Parse_Value("", XmlTic1) -- recup Puissance Apparente TIC1 iinsta1 = XML_Parse_Value("", XmlTic1) -- recup I Instantané TIC1 iinsta2 = XML_Parse_Value("", XmlTic1) -- recup I Instantané TIC1 iinsta3 = XML_Parse_Value("", XmlTic1) -- recup I Instantané TIC1 base1 = XML_Parse_Value("", XmlTic1) -- recup I Instantané TIC1 -- papp2 = XML_Parse_Value("", XmlTic2) -- recup Puissance Apparente TIC2 iinstb1 = XML_Parse_Value("", XmlTic2) -- recup I Instantané TIC2 iinstb2 = XML_Parse_Value("", XmlTic2) -- recup I Instantané TIC2 iinstb3 = XML_Parse_Value("", XmlTic2) -- recup I Instantané TIC2 base2 = XML_Parse_Value("", XmlTic2) -- recup I Instantané TIC2 ------- commandArray[idx_tica1] = {['UpdateDevice'] = idx_tica1..'|0|'..iinsta1} commandArray[idx_tica2] = {['UpdateDevice'] = idx_tica2..'|0|'..iinsta2} commandArray[idx_tica3] = {['UpdateDevice'] = idx_tica3..'|0|'..iinsta3} commandArray[idx_ticab] = {['UpdateDevice'] = idx_ticab..'|0|'..base1} commandArray[idx_ticaw] = {['UpdateDevice'] = idx_ticaw..'|0|'..papp1} commandArray[idx_ticb1] = {['UpdateDevice'] = idx_ticb1..'|0|'..iinstb1} commandArray[idx_ticb2] = {['UpdateDevice'] = idx_ticb2..'|0|'..iinstb2} commandArray[idx_ticb3] = {['UpdateDevice'] = idx_ticb3..'|0|'..iinstb3} commandArray[idx_ticbb] = {['UpdateDevice'] = idx_ticbb..'|0|'..base2} commandArray[idx_ticbw] = {['UpdateDevice'] = idx_ticbw..'|0|'..papp2} end return commandArray
00 -
Bonjour,
Vous avez trouvez un palliatif au BUG que j’ai laissé dans le Script Domoticz, pour récupérer les bonnes valeurs.
Mais vous pouvez retirer tout ce que vous avez rajouté car il suffit de rajouter une VAR Local ex: deb ou toto ou titi … associé à la VAR Local field_start existante car ils vont recevoir chacun en retour de l’appel au str.find(s,..) associé, l’index Début et l’index Fin du TAG recherché,
Local deb aura l’Index du début du TAG qui pointe sur « <« et Local field_start aura l’index fin du TAG qui pointe sur « > »
La ligne s’écrit : local deb , field_start = string.find(str ,field)
La fonction Api string.find (…. , ….) retourne 2 valeurs, soit index début + index fin de la chaîne string recherchée.
Voici votre fonction que vous avez modifié et ce que vous pouvez retirer car ne sert à rien si vous corrigé le BUG d’origine par l’ajout de la Var Local manquante
———————————————-
— function XML_Parse_Value(field, str)
—
— Récupère la Value d’un Tag d’un XML
— field : Tag de la Value XML à récupérer
— str : Fichier XML
— Return = Value Numérique ou « On »/ »Off » si value d’un Switch
— Return 0 si le Tag n’est pas trouvé
———————————————–
function XML_Parse_Value(field, str)— local field_start = string.find(str ,field) — ICI BUG, il faut 2 Var avant appel find(….) une 1ere Var<=index début, 2eme Var<=index fin
local deb , field_start = string.find(str ,field) — ICI Corrigé, la Var deb va pointer au début du TAG « < » et la Var field_start sur « > »if field_start == nil then
print (« XML error – Value NOT found »)
return 0
endlocal field_end = string.find(str, « </ » ,field_start)
—- str_field = string.sub(str, field_start+0, field_end-1) — ICI PAS bon la valeur se trouve à l’index field_start+1 et non + 0
str_field = string.sub(str, field_start+1, field_end-1) — LIGNE Corrigéeif debug == true then print(str_field) end
—– ICI vos RAJOUT ne Servent à rien si vous corrigez le BUG d’origine (bug manque var local deb sur le 1er find)
— local field_e = string.find(str, « > » ,field_start) — Doublon pour rien la VAR str_field intégre déjà la Valeur du TAG
— str_field = string.sub(str, field_e+1, field_end-1) — Doublon pour rienif str_field == « ON » or str_field == « OFF » then
return str_field
else
return tonumber(str_field)
endend
VOICI la Fonction qui fonctionne après correction du BUG suite Oubli de la VAR DEB sur le 1er str.find(s,…)
———————————————-
— function XML_Parse_Value(field, str)
—
— Récupère la Value d’un Tag d’un XML
— field : Tag de la Value XML à récupérer
— str : Fichier XML
— Return = Value Numérique ou « On »/ »Off » si value d’un Switch
— Return 0 si le Tag n’est pas trouvé
———————————————–
function XML_Parse_Value(field, str)—– ICI il faut mettre deux VAR en appel du Find(…)
local deb , field_start = string.find(str ,field) — Ligne Corrigée, deb va pointer au début Tag « < » et field_start sur la fin du TAG « > »if field_start == nil then
print (« XML error – Value NOT found »)
return 0
endlocal field_end = string.find(str, « </ » ,field_start)
str_field = string.sub(str , field_start+1 , field_end-1) — LIGNE Corrigée on est bien cadré <tag>+1 => valeur <= -1</tag>if debug == true then print(str_field) end
if str_field == « ON » or str_field == « OFF » then
return str_field
else
return tonumber(str_field)
end
endDe même il faut rajouter la VAR deb dans la function XML_Parse_TAG(field, str)
———————————————–
function XML_Parse_TAG(field, str)
local tagdeb = « <« ..field.. »> »
local tagend = « </ »..field.. »> »
local deb , field_start = string.find(str ,field) — ICI Corrigé, la Var deb va pointer au début du TAG « < » et la Var field_start sur « > »
…….
…….00 -
RE : Oubli, dans votre Script il faut aussi modifier la function XML_Parse_TAG(field, str)
str_field = string.sub(str , field_start+1 , field_end-1) — LIGNE Corrigée on est bien cadré <tag>+1 => valeur <= -1</tag>
Je vous joins les deux fonctions corrigés à recopier dans votre Script à la place de ceux existant qui ont les BUGS
Cdt
Attachments:
You must be logged in to view attached files.00
-
Étiqueté : Domoticz
- Vous devez être connecté pour répondre à ce sujet.