Ajout protocole Domoticz


  • Staff

    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



  • 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é.

  • Staff

    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 :

    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 !


  • Staff

    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 ?


  • Staff

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



  • 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


Log in to reply
 

Looks like your connection to hallard.me's community was lost, please wait while we try to reconnect.