Community Forum
    • Blog
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Ajout protocole Domoticz

    Scheduled Pinned Locked Moved WifInfo
    apidomoticzhttpwifinfo
    11 Posts 6 Posters 8.7k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D Offline
      Deennoo
      last edited by Deennoo

      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&param=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&param=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é.
      1 Reply Last reply Reply Quote
      • CharlesC Offline
        Charles
        last edited by

        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

        1 Reply Last reply Reply Quote
        • D Offline
          Deennoo
          last edited by

          la requete :

          http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx=41&nvalue=0&svalue=76018836;34245564;0;0;1160;0

          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 : 0

          Je 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 !

          1 Reply Last reply Reply Quote
          • CharlesC Offline
            Charles
            last edited by

            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 ?

            1 Reply Last reply Reply Quote
            • CharlesC Offline
              Charles
              last edited by

              Arff j'ai encore lu trop vite, ok je viens de voir pour le login/password 😉

              1 Reply Last reply Reply Quote
              • D Offline
                Deennoo
                last edited by

                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.

                1 Reply Last reply Reply Quote
                • L Offline
                  laurent
                  last edited by

                  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

                  1 Reply Last reply Reply Quote
                  • M Offline
                    mjeanne
                    last edited by mjeanne

                    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&param=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:
                    0_1485894956298_domoticz.jpg

                    1 Reply Last reply Reply Quote
                    • S Offline
                      seb82
                      last edited by seb82

                      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&param=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

                      1 Reply Last reply Reply Quote
                      • T Offline
                        TamaloU
                        last edited by

                        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 😉

                        1 Reply Last reply Reply Quote
                        • First post
                          Last post

                        7

                        Online

                        5.7k

                        Users

                        534

                        Topics

                        5.0k

                        Posts

                        Top Topics

                        • Denky 4 - Domoticz - Triphasé -
                          Nicolas BernaertsN
                          Nicolas Bernaerts
                          0
                          7
                          241

                        • Denky D4 et Linky Standard TInfo Rx Non Configuré
                          CharlesC
                          Charles
                          0
                          5
                          280

                        • CC1101
                          CharlesC
                          Charles
                          0
                          2
                          116

                        Popular Tags

                        teleinfo
                        24 topics
                        arduino
                        19 topics
                        remora
                        16 topics
                        esp8266
                        10 topics
                        arduipi
                        10 topics
                        wifinfo
                        7 topics
                        raspberry
                        7 topics
                        broadcast
                        7 topics
                        Copyright © 2022 Charles-Henri Hallard | Return to blog page | Powered by NodeBB