Page 1 sur 1

Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 26 févr. 2019, 03:25
par Gaetan10
Bonjour, je suis nouveau sur le forum et également très novice dans domoticz. Je viens de faire un Rflink branché sur un raspberry sous raspbian. J'ai installer domoticz et je capte plusieurs sondes de température. Mon installation domotique principale est un IPX 800 V4, j'aimerais envoyer les données de mes sondes sans fils sur mon IPX 800 sur les entrées virtuelles analogiques. J'ai fait des essais avec le lien http, mais je n'arrive a envoyer la valeur que d'une seule sonde en entrant l'adresse http complète dans le lien http, car si elle n'est pas complète en précisant le numéro d'entrée analogique ça ne fonctionne pas. Je remercierai une âme charitable qui s'y connait de m'aider à résoudre mon problème.

Re: Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 03 mars 2019, 10:17
par papoo
Bonjour Gaetan
bienvenue sur ce forum.
je ne dispose pas de cette automate chez moi, il il existe pas ma de ressources sur le sujet ici et ailleurs
voici un script qui t'aidera peut etre

Code : Tout sélectionner

function Round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end

commandArray = {}

json = (loadfile “/home/pi/domoticz/scripts/lua/JSON.lua”)() – For Linux
package.path = package.path … ‘;’ … '/home/pi/domoticz/scripts/lua/?.lua’
DeviceLuaMstr = uservariables[“LUA_MasterSW”]	– LUA_MasterSW
if (otherdevices[DeviceLuaMstr]) == ‘On’ then
local util=‘xxx’ – utilisateur ipx
local mdp=‘xxx’ – passwd ipx
local url_ipx800=‘192.168.x.x’ – ip ipx800
local url_domoticz = ‘192.168.x.x’ – ip domoticz

   --  API IPX800
   local config=assert(io.popen('curl http://'..util..':'..mdp..'@'..url_ipx800..'/api/xdevices.json?cmd=30'))
   local analog = config:read('*all')
   config:close()
   local jsonAnalog = json:decode(analog)
   
   --maj chamb parents enfants bb ami

   Analog1 = Round((jsonAnalog.AN1* 0.323) - 50, 2)
   commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=50&nvalue=0&svalue='.. Analog1 }
   
   Analog2 = Round(((jsonAnalog.AN2/308.998)-0.25)/0.028,2)
   commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=726&nvalue=0&svalue='.. Analog2 }
   
   Analog3 =  Round(((jsonAnalog.AN3/308.998)-0.25)/0.028,2)
   commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=54&nvalue=0&svalue='.. Analog3}
   
   Analog4 =  Round(((jsonAnalog.AN4/308.998)-0.25)/0.028,2)
   commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=53&nvalue=0&svalue='.. Analog4}
   
   Analog5 = Round((((jsonAnalog.AN5* 0.00323 /3.3)-0.1515)) / 0.00636 , 2)
   --commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=406&nvalue=0&svalue='.. Analog5} --humsalon2
   
   Analog6 = Round(((jsonAnalog.AN6* 0.00323) - 1.63) / 0.0326, 2)
   --commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=404&nvalue=0&svalue='.. Analog6} --temp salon2
   
   Analog7 = Round(jsonAnalog.AN7, 0)
   commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=405&nvalue=0&svalue='.. Analog7} --lux salon2
   
   --MAJ temp/hum salon2
   
    if Analog5<40 then --permet de definir l humidité
    humstatus=2 
    end
    if Analog5>=40 and Analog5<70 then
    humstatus=1 
    end
    if Analog5>=70 then
    humstatus=3 
    end
   commandArray[#commandArray+1] = {['OpenURL']=url_domoticz..'/json.htm?type=command&param=udevice&idx=750&nvalue=0&svalue='.. Analog6 ..';'.. Analog5..';'..humstatus}
 --/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;HUM;HUM_STAT
 end
   return commandArray
trouvé ici
il y a un topo ici

Re: Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 03 mars 2019, 15:40
par Gaetan10
Bonjour,
Merci Papoo pour cette réponse mais ce script n'est pas du tout fait pour ce que je veux faire, car ce dernier est fait pour envoyer les données analogiques de l'IPX800 V3 vers Domoticz.

Cette commande par exemple:" http://'..util..':'..mdp..'@'..url_ipx800..'/api/xdevices.json?cmd=30" servait à extraire les données analogiques de l'IPX v3 et n'est plus compatible avec la version V4.

Les liens que tu me donnes je les avais déjà vu car j'ai parcouru plus d'une centaine de pages de forums d'ici et là. Mais comme tous les forums que j'ai vu ils font tous sans exception l'inverse de ce que je veux faire, ils transmettent les données analogique de l'IPX800 vers Domoticz.
Le problème c'est que moi je veux exporter mes données de température de Domoticz vers les entrées Analogiques virtuelles de l'IPX800 V4 afin de les utiliser dans mes scénarios.

Par exemple pour envoyer une donnée vers une entrée analogique Virtuelle de l'IPX V4 je peux taper dans la barre d'adresse:
http://192.168.1.20:80/api/xdevices.json?key=(mot de passe)&SetVA01=19 --ça met l'entrée analogique virtuelle 1 à 19°
http://192.168.1.20:80/api/xdevices.json?key=(mot de passe)&SetVA02=21 --ça met l'entrée analogique virtuelle 2 à 21°
et je peux faire ça pour les 32 entrées virtuelles analogiques de l'IPX800 V4 afin de pouvoir utiliser les températures dans mes scénarios et mes thermostats qui sont assez bien fait sur l'IPX ( inexistant dans Domoticz il faut faire des scripts).
j'ai essayé de regarder avec ton script lua d’exportation de données vers emoncs mais n'y connaissant rien en lua je n'arrive pas trop à faire grand chose.
Et pour compliquer les choses si j'arrive à exporter mes températures il faudrait que je les multiplie par 10 afin de pouvoir récupérer mes températures avec la première décimale dans mon IPX car en entrée Analogique virtuelle il ne conserve pas les décimales reçue, mais si je fait la conversion avec mon IPX je peux afficher la première décimale.
Par exemple si j'envoi 18.7 il ne conserve que 18, mais si j'envoi 187 et que dans la formule de mon IPX je met formule personnalisée /*0.1 j'obtiens bien mes 18.7
Je sais que cela fait beaucoup de demandes mais je suis quasiment certain que ça n'a pas été traité ailleurs car comme je l'ai vu partout tout le monde fait l'inverse de ce je veux faire.
Donc merci à ceux qui m'aiderons à résoudre mon problème.

Re: Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 03 mars 2019, 16:18
par papoo
reste à définir si tu souhaite un rafraîchissement cyclique (tout les combien de minutes) ou à chaque update des sondes (si tu remonte 21 sondes cela peut faire beaucoup d’exécution du code par minute).

Re: Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 03 mars 2019, 16:40
par Gaetan10
Je pense remonter les températures toutes les 2 minutes car si c'est à chaque update ce qui ferai toutes les minutes mais ça encombrerais beaucoup ma bande passante car les sondes n’émettent pas en même temps et ça ferai tourner le script sans cesse. Pour le nombre de remonté de sondes je compte me limiter à 6 ou 8 avec une exécution cyclique toutes les 2 minutes, ce qui me parait être raisonnable.

Re: Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 03 mars 2019, 21:16
par papoo
si tu veux bien tester

Code : Tout sélectionner

--[[script_time_export_IPX800.lua
auteur : papoo

maj : 03/03/2019
date : 03/03/2019

https://easydomoticz.com/forum/viewtopic.php?f=8&t=8120

--]]

--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 
local debugging = true  	-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local script_actif = true   -- true pour activer l'execution du script ou false pour le désactiver
local ip_IPX800 = '192.168.1.20' 
local port_IPX800 = '80'
local mdp_IPX800 = 'mot2passe'
local api_IPX800 = '/api/xdevices.json?key='
local multiplicateur = 10
local les_devices = {}; -- pas plus de 11 devices
-- si vous souhaitez remonter les valeurs d'un device qui en comporte plusieurs (ex: température et hygrometrie extérieure) 
--renseigner le nom de la valeur à remonter (à partir de la deuxieme valeur) ainsi que le numero d'ordre dans canal (voir exemples ci dessous les_devices[9] et les_devices[21] )
-- les_devices[#les_devices+1] = {device="Temperature 1", VA_IPX="01", multiplicateur = 10, canal=""} 
-- les_devices[#les_devices+1] = {device="Temperature 2", VA_IPX="02", multiplicateur = 10, canal=""} 
-- les_devices[#les_devices+1] = {device="Temperature 3", VA_IPX="03", multiplicateur = 10, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 4", VA_IPX="04", multiplicateur = 10, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 5", VA_IPX="05", multiplicateur = 10, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 6", VA_IPX="06", multiplicateur = 10, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 7", VA_IPX="07", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Temperature exterieure", VA_IPX="08", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Temperature exterieure", VA_IPX="09", multiplicateur = 1, canal=2}
les_devices[#les_devices+1] = {device="Temperature Salon", VA_IPX="10", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Point de givrage", VA_IPX="11", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Point de rosée", VA_IPX="12", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Temperature Refrigerateur", VA_IPX="13", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Temperature Congelateur", VA_IPX="14", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Temperature départ chauffage", VA_IPX="15", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Temperature retour chauffage", VA_IPX="16", multiplicateur = 10, canal=""}
les_devices[#les_devices+1] = {device="Temperature Parents", VA_IPX="17", multiplicateur = 10, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 18", VA_IPX="18", multiplicateur = 1, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 19", VA_IPX="19", multiplicateur = 10, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 20", VA_IPX="20", multiplicateur = 10, canal=""}
-- les_devices[#les_devices+1] = {device="Temperature 21", VA_IPX="21", multiplicateur = 10, canal=2}



--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local nom_script = "export IPX800"
local version = "0.01"
--------------------------------------------
---------------- Fonctions -----------------
------------------------------------------
package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua"   -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script
require('fonctions_perso')                                                      -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script

-- ci-dessous les lignes à décommenter en cas d'utilisation des fonctions directement dans ce script( supprimer --[[ et --]])
--[[ function voir_les_logs (s, debugging) -- nécessite la variable local debugging
    if (debugging) then 
		if s ~= nil then
        print (s)
		else
		print ("aucune valeur affichable")
		end
    end
end	-- usage voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)

--------------------------------------------
function split(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end -- usage : valeurs = split(variable,";")
--]]
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

commandArray = {}
time=os.date("*t")
--if ((time.min-1) % 2) == 0 and script_actif == true then  -- export des données toutes les 2 minutes
if time.min % 1 == 0 then 
voir_les_logs("=========== ".. nom_script .." (v".. version ..") ===========",debugging)
voir_les_logs("--- --- --- Export vers IPX800  : "..time.hour.. ":" ..time.min,debugging)
local API_key = uservariables[api_IPX800] 
    for i,d in ipairs(les_devices) do
        v=otherdevices[d.device]
        va= d.VA_IPX
        multi = tonumber(d.multiplicateur)
        c=tonumber(d.canal)
        voir_les_logs("--- --- --- ".. d.device .." = "..tostring(v),debugging)
        voir_les_logs("--- --- --- canal = "..tostring(c),debugging)
        if v~= nil then v,nbCommas=string.gsub(v,";",";") end-- vérification de la présence d'un ou plusieurs point virgule => valeurs multiples
        if nbCommas >= 1 then
            voir_les_logs("--- --- --- valeurs multiples dans ".. d.device .." = ".. v,debugging)
            voir_les_logs("--- --- ---  Nb de point virgule = "..(nbCommas or "nil"),debugging) 
            local valeurs = split(v,";")
            voir_les_logs("--- --- ---  valeur 1 = "..tostring(valeurs[1]),debugging)
            voir_les_logs("--- --- ---  valeur 2 = "..tostring(valeurs[2]),debugging)
            voir_les_logs("--- --- ---  valeur 3 = "..tostring(valeurs[3]),debugging)
            voir_les_logs("--- --- ---  valeur 4 = "..tostring(valeurs[4]),debugging)
            if c == nil then c = 1 end
            valeur = tonumber(valeurs[c]) * multi
        elseif v ~= nil and multi ~= nil then
            voir_les_logs("--- --- ---  valeur V = "..tostring(v),debugging)
            valeur =  tonumber(v) * multi

        end
        voir_les_logs("--- --- --- ".. ip_IPX800 ..':'.. port_IPX800 .. api_IPX800 .. mdp_IPX800 .. "&SetVA" .. va .. "=" .. tostring(valeur)  ,debugging)
    os.execute('curl -m5 "'.. ip_IPX800 ..':'.. port_IPX800 .. api_IPX800 .. mdp_IPX800 .. "&SetVA" .. va .. "=" .. tostring(valeur) .. '"')
    voir_les_logs('curl -m5 "'.. ip_IPX800 ..':'.. port_IPX800 .. api_IPX800 .. mdp_IPX800 .. "&SetVA" .. va .. "=" .. tostring(valeur) ..'"',debugging)
        valeur = nil
	end


		voir_les_logs("=========== Fin ".. nom_script .." (v".. version ..") =========",debugging)
end -- if time
--------------------------------------------====
return commandArray

Re: Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 05 mars 2019, 21:46
par Gaetan10
Bonjour,
Merci Papoo pour ce code qui fonctionne très bien après avoir mis les noms de mes sondes.
j'ai du également commenter ces deux lignes:

Code : Tout sélectionner

package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua"   -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script
require('fonctions_perso')                                                      -- ligne à commenter en cas d'utilisation des fonctions directement dans ce script
qui je pense renvoient aux fonctions dans un autre script lua séparé.
Et ensuite j'ai dé commenté la partie fonctions du script.
Ensuite tout a bien fonctionné et pour l'instant j'actualise 3 de mes entrées analogiques virtuelles sans problème.
Encore merci pour ce code qui m'a fait gagner des semaines le temps de comprendre le langage lua.

Re: Domoticz envoyer données sondes rflink vers IPX800 V4

Publié : 05 mars 2019, 21:51
par papoo
heureux que cela fonctionne pour toi