récupérer température IPX800V4 dans domoticz

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
mmikee02
Messages : 13
Inscription : 03 juin 2018, 17:04

Re: récupérer température IPX800V4 dans domoticz

Message par mmikee02 »

Bonjour, :)

j'ai souvent consulté vos forums afin de m'aider avec l'usage de domoticz avec succès, mais aujourd'hui, je suis bloqué...
C'est pourquoi je relance le sujet car j'ai un souci avec le script.
Je tiens d'abord à préciser que je suis débutant avec LUA & les scripts en général. :?

Le contexte :
domoticz qui tourne sur 1 Rpi B3
1 ipx 800 V3
1 ipx 800 V4 + X8R

Ce que j'aimerais faire :

Récupérer la valeur analogique n°3 (capteur de température) de l'ipx800 V3 et la reporter dans un wiget virtuel que j'ai créé à cet effet, afin d'obtenir 1 log sur plusieurs jours.

Ce que j'ai fait :
j'ai utilisé le script fourni par bahia34 dans ce thread, et je l'ai adapté à mon IPX.
j'ai changé l'IDX par celui de mon widget température

Image

j'ai adapté l'IP de mon IPX V3 pour la requête JSON (cela fonctionne lorsque je rentre l'IP modifiée en manuel dans un navigateur internet)

Image

j'ai créé 1 scénario qui lance le script manuellement pour le tester, mais rien ne se passe lorsque je le lance. (il est bien lancé d'après le log de domoticz)
Image Image Image

Code : Tout sélectionner

-- Fonction capture température IPX800
-- script_time_tempipx.lua
-- recup sonde temp de l'ipx

time=os.date("*t")

IDX=90

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
 
local config=assert(io.popen('/usr/bin/curl "http://192.168.1.26:85/api/xdevices.json?cmd=30"')) 

local blocjson = config:read('*all')
 config:close()
 -- print (blocjson)
 local jsonValeur = json:decode(blocjson)

commandArray = {}

 if time.min%2==0 then --[j'ai mit 2min pour tester]--

temp=(tonumber(jsonValeur.AN3)*0.323)-50

commandArray['UpdateDevice'] = IDX .. '|0|' .. tostring(temp)

end

return commandArray
mais, lorsque je le lance manuellement, j'obtiens 2 erreurs

Image

Pourriez-vous aider un novice à régler ce problème?.. de syntaxe, à 1ère vue...???
marsflow
Messages : 83
Inscription : 25 mai 2017, 20:42
Localisation : Landes

Re: récupérer température IPX800V4 dans domoticz

Message par marsflow »

Salut

les scripts lua se lance automatiquement par le biais de domoticz, il suffit de simplement les mettre dans le dossier /home/pi/domoticz/scripts/lua/

il y'a toujours des solutions pour les lancer par un interrupteur, par exemple tu fais un script lua non pas en time mais en device.

Marsflow
marsflow
Messages : 83
Inscription : 25 mai 2017, 20:42
Localisation : Landes

Re: récupérer température IPX800V4 dans domoticz

Message par marsflow »

à mon tour je reviens ici parce que j'ai un problème pour récupérer une valeur en json (puissance de panneau solaire)

Code : Tout sélectionner

-- Fonction capture température IPX800
-- script_time_tempipx.lua
-- recup sonde temp de l'ipx


IDX1=636
IDX2=634
IDX3=36 
IDX4=633
IDX5=637
 
commandArray = {}
if (devicechanged['sec'] == 'Off') then
commandArray['sec']='On'

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
 
local config=assert(io.popen('/usr/bin/curl "http://192.168.1.36:83/api/xdevices.json?key=apikey&Get=S"')) --[ l'emplacement sur la V4 n'est pas la même j'ai donc mis à jour cette partie, j'ai suivi l'emplacement de curl je crois qu'il n'est pas installé sur les nas asustor le problème pourrait venir de là]--

local blocjson = config:read('*all')
 config:close()
 local jsonValeur = json:decode(blocjson)

 
 function round(num, dec)
  local mult = 10^(dec or 1)
  return math.floor(num * mult + 0.5) / mult
end
 
P1=(tonumber(jsonValeur.INSTANT_POSTE1))
P2=(tonumber(jsonValeur.INSTANT_POSTE2))
P3=(tonumber(jsonValeur.P1_SSP1)/230)
P4=(tonumber(jsonValeur.P1_SSP2)/230)
P5=(tonumber(jsonValeur.P1_SSP3)/230)




commandArray[IDX3] = { ['UpdateDevice'] = IDX3..'|0|'.. P3 .. ';'.. P4 .. ';'.. P5 }

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
 
local config=assert(io.popen('/usr/bin/curl "http://192.168.1.36:83/api/xdevices.json?key=apikey&Index=S"')) --[ l'emplacement sur la V4 n'est pas la même j'ai donc mis à jour cette partie, j'ai suivi l'emplacement de curl je crois qu'il n'est pas installé sur les nas asustor le problème pourrait venir de là]--

local blocjson = config:read('*all')
 config:close()
 local jsonValeur = json:decode(blocjson)

P6=(tonumber(jsonValeur.P1_SSP1)+(jsonValeur.P1_SSP2)+(jsonValeur.P1_SSP3))
P7=(tonumber(jsonValeur.INDEX_POSTE2))

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
 
local config=assert(io.popen('/usr/bin/curl "http://192.168.1.34:9982/json.htm?type=devices&rid=626"')) --[ l'emplacement sur la V4 n'est pas la même j'ai donc mis à jour cette partie, j'ai suivi l'emplacement de curl je crois qu'il n'est pas installé sur les nas asustor le problème pourrait venir de là]--

local blocjson = config:read('*all')
 config:close()
 local jsonValeur = json:decode(blocjson)

 
P8=(tonumber(jsonValeur.Usage))
 
 
 
print ('Puissance POSTE1 : ' .. P1)
print ('Puissance POSTE2 : ' .. P2)
print ('compteur POSTE1 : ' .. P6)
print ('compteur POSTE2 : ' .. P7)
print ('Puissance panneau : ' .. P8)


commandArray[IDX4] = { ['UpdateDevice'] = IDX4..'|0|'.. P1 .. ';'.. P6 }
commandArray[IDX2] = { ['UpdateDevice'] = IDX2..'|0|'.. P2 .. ';'.. P7 }
commandArray[IDX1] = { ['UpdateDevice'] = IDX1..'|0|'..P1 }
commandArray[IDX5] = { ['UpdateDevice'] = IDX5..'|0|'..P8 }
end
 

return commandArray
j'aimerai récupérer "Usage" : "413 Watt",

Code : Tout sélectionner

{
   "ActTime" : 1532882455,
   "AstrTwilightEnd" : "23:38",
   "AstrTwilightStart" : "04:44",
   "CivTwilightEnd" : "22:07",
   "CivTwilightStart" : "06:15",
   "DayLength" : "14:45",
   "NautTwilightEnd" : "22:49",
   "NautTwilightStart" : "05:33",
   "ServerTime" : "2018-07-29 18:40:55",
   "SunAtSouth" : "14:05",
   "Sunrise" : "06:49",
   "Sunset" : "21:33",
   "app_version" : "4.9700",
   "result" : [
      {
         "AddjMulti" : 1.0,
         "AddjMulti2" : 1.0,
         "AddjValue" : 0.0,
         "AddjValue2" : 0.0,
         "BatteryLevel" : 255,
         "CounterToday" : "19.193 kWh",
         "CustomImage" : 0,
         "Data" : "151.844 kWh",
         "Description" : "",
         "Favorite" : 1,
         "HardwareID" : 11,
         "HardwareName" : "solaire",
         "HardwareType" : "SolarEdge via Web API",
         "HardwareTypeVal" : 64,
         "HaveTimeout" : false,
         "ID" : "00000001",
         "LastUpdate" : "2018-07-29 18:40:24",
         "Name" : "ConsosolaireEDGE",
         "Notifications" : "false",
         "Options" : "0",
         "PlanID" : "10",
         "PlanIDs" : [ 10 ],
         "Protected" : false,
         "ShowNotifications" : true,
         "SignalLevel" : "-",
         "SubType" : "kWh",
         "SwitchTypeVal" : 0,
         "Timers" : "false",
         "Type" : "General",
         "TypeImg" : "current",
         "Unit" : 1,
         "Usage" : "413 Watt",    <<<<<<<<<<<<<<<<<<<<<< celui là comment faire ?
         "Used" : 1,
         "XOffset" : "193",
         "YOffset" : "595",
         "idx" : "626"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}
mon code erreur
2018-07-30 01:21:36.349 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_recup_compteur.lua: ...pi/domoticz/scripts/lua/script_device_recup_compteur.lua:69: attempt to concatenate global 'P8' (a nil value)
marsflow
Messages : 83
Inscription : 25 mai 2017, 20:42
Localisation : Landes

Re: récupérer température IPX800V4 dans domoticz

Message par marsflow »

marsflow a écrit :à mon tour je reviens ici parce que j'ai un problème pour récupérer une valeur en json (puissance de panneau solaire)

Code : Tout sélectionner

-- Fonction capture température IPX800
-- script_time_tempipx.lua
-- recup sonde temp de l'ipx


IDX1=636
IDX2=634
IDX3=36 
IDX4=633
IDX5=637
 
commandArray = {}
if (devicechanged['sec'] == 'Off') then
commandArray['sec']='On'

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
 
local config=assert(io.popen('/usr/bin/curl "http://192.168.1.36:83/api/xdevices.json?key=apikey&Get=S"')) --[ l'emplacement sur la V4 n'est pas la même j'ai donc mis à jour cette partie, j'ai suivi l'emplacement de curl je crois qu'il n'est pas installé sur les nas asustor le problème pourrait venir de là]--

local blocjson = config:read('*all')
 config:close()
 local jsonValeur = json:decode(blocjson)

 
 function round(num, dec)
  local mult = 10^(dec or 1)
  return math.floor(num * mult + 0.5) / mult
end
 
P1=(tonumber(jsonValeur.INSTANT_POSTE1))
P2=(tonumber(jsonValeur.INSTANT_POSTE2))
P3=(tonumber(jsonValeur.P1_SSP1)/230)
P4=(tonumber(jsonValeur.P1_SSP2)/230)
P5=(tonumber(jsonValeur.P1_SSP3)/230)




commandArray[IDX3] = { ['UpdateDevice'] = IDX3..'|0|'.. P3 .. ';'.. P4 .. ';'.. P5 }

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
 
local config=assert(io.popen('/usr/bin/curl "http://192.168.1.36:83/api/xdevices.json?key=apikey&Index=S"')) --[ l'emplacement sur la V4 n'est pas la même j'ai donc mis à jour cette partie, j'ai suivi l'emplacement de curl je crois qu'il n'est pas installé sur les nas asustor le problème pourrait venir de là]--

local blocjson = config:read('*all')
 config:close()
 local jsonValeur = json:decode(blocjson)

P6=(tonumber(jsonValeur.P1_SSP1)+(jsonValeur.P1_SSP2)+(jsonValeur.P1_SSP3))
P7=(tonumber(jsonValeur.INDEX_POSTE2))

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
 
local config=assert(io.popen('/usr/bin/curl "http://192.168.1.34:9982/json.htm?type=devices&rid=626"')) --[ l'emplacement sur la V4 n'est pas la même j'ai donc mis à jour cette partie, j'ai suivi l'emplacement de curl je crois qu'il n'est pas installé sur les nas asustor le problème pourrait venir de là]--

local blocjson = config:read('*all')
 config:close()
 local jsonValeur = json:decode(blocjson)

 
P8=(tonumber(jsonValeur.Usage))
 
 
 
print ('Puissance POSTE1 : ' .. P1)
print ('Puissance POSTE2 : ' .. P2)
print ('compteur POSTE1 : ' .. P6)
print ('compteur POSTE2 : ' .. P7)
print ('Puissance panneau : ' .. P8)


commandArray[IDX4] = { ['UpdateDevice'] = IDX4..'|0|'.. P1 .. ';'.. P6 }
commandArray[IDX2] = { ['UpdateDevice'] = IDX2..'|0|'.. P2 .. ';'.. P7 }
commandArray[IDX1] = { ['UpdateDevice'] = IDX1..'|0|'..P1 }
commandArray[IDX5] = { ['UpdateDevice'] = IDX5..'|0|'..P8 }
end
 

return commandArray
j'aimerai récupérer "Usage" : "413 Watt",

Code : Tout sélectionner

{
   "ActTime" : 1532882455,
   "AstrTwilightEnd" : "23:38",
   "AstrTwilightStart" : "04:44",
   "CivTwilightEnd" : "22:07",
   "CivTwilightStart" : "06:15",
   "DayLength" : "14:45",
   "NautTwilightEnd" : "22:49",
   "NautTwilightStart" : "05:33",
   "ServerTime" : "2018-07-29 18:40:55",
   "SunAtSouth" : "14:05",
   "Sunrise" : "06:49",
   "Sunset" : "21:33",
   "app_version" : "4.9700",
   "result" : [
      {
         "AddjMulti" : 1.0,
         "AddjMulti2" : 1.0,
         "AddjValue" : 0.0,
         "AddjValue2" : 0.0,
         "BatteryLevel" : 255,
         "CounterToday" : "19.193 kWh",
         "CustomImage" : 0,
         "Data" : "151.844 kWh",
         "Description" : "",
         "Favorite" : 1,
         "HardwareID" : 11,
         "HardwareName" : "solaire",
         "HardwareType" : "SolarEdge via Web API",
         "HardwareTypeVal" : 64,
         "HaveTimeout" : false,
         "ID" : "00000001",
         "LastUpdate" : "2018-07-29 18:40:24",
         "Name" : "ConsosolaireEDGE",
         "Notifications" : "false",
         "Options" : "0",
         "PlanID" : "10",
         "PlanIDs" : [ 10 ],
         "Protected" : false,
         "ShowNotifications" : true,
         "SignalLevel" : "-",
         "SubType" : "kWh",
         "SwitchTypeVal" : 0,
         "Timers" : "false",
         "Type" : "General",
         "TypeImg" : "current",
         "Unit" : 1,
         "Usage" : "413 Watt",    <<<<<<<<<<<<<<<<<<<<<< celui là comment faire ?
         "Used" : 1,
         "XOffset" : "193",
         "YOffset" : "595",
         "idx" : "626"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}
mon code erreur
2018-07-30 01:21:36.349 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_recup_compteur.lua: ...pi/domoticz/scripts/lua/script_device_recup_compteur.lua:69: attempt to concatenate global 'P8' (a nil value)

Je crois que je dois utiliser une pattern mais je ne sais pas comment faire je vois une pattern comme ça
P8 = tonumber(string.sub(jsonValeur.Usage, 1,-6))
Mais ça ne marche pas non plus.

018-07-30 15:09:22.920 (IPX800) Light/Switch (sec)
2018-07-30 15:09:22.880 Status: EventSystem: Script event triggered: /home/pi/domoticz/scripts/lua/script_device_recup_compteur2.lua
2018-07-30 15:09:22.877 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_recup_compteur2.lua: ...i/domoticz/scripts/lua/script_device_recup_compteur2.lua:61: bad argument #1 to 'sub' (string expected, got nil)
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: récupérer température IPX800V4 dans domoticz

Message par lmet »

Bonsoir,
marsflow a écrit :Je crois que je dois utiliser une pattern mais je ne sais pas comment faire je vois une pattern comme ça
P8 = tonumber(string.sub(jsonValeur.Usage, 1,-6))
Mais ça ne marche pas non plus.
Si ta chaine est "Usage" : "413 Watt" alors c'est le "W" de Watt qui marque la fin de la valeur renvoyée :

Code : Tout sélectionner

local début = 1
local fin = string.find(jsonValeur.Usage, "W")
P8 =  tonumber(string.sub(jsonValeur.Usage,début,fin-1))
Pas testé mais cela devrait marcher. Sinon "fin-2" s'il y a un espace après la valeur.
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
Répondre