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.
    • CharlesC Offline
      Charles
      last edited by

      Bonjour à tous
      @Deennoo, Je suis en train de refondre l'interface de WifInfo pour y ajouter domoticz 😉

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

      1 Reply Last reply Reply Quote
      • 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