Snyggt jobbat med IVT och domoticz.
Hur löste du så att alla ivt värden fick var sin tempgivare i domoticz?
Jag håller på att få in alla värden från node-red som ett mqtt sträng till domoticz. Skall jag splitta dem med hjälp av ett script och tilldela dem var sin virtuell tempgivare i domoticz?
Hälsningar,
Tommy
Hej!
Tack. Jag kan posta skripten senare. Just nu är det ett python-script som tar emot datan från pumpen och postar det via en URL GET (Domoticz API). Sen delar ett lua-script upp strängen i delar och placerar ut värdena på virtuella enheter i domoticz.
Hej igen,
Nu har jag lyckats få in värden till resp. virtuell enhet i Domoticz. Jag löste det med att splittra upp variabel dumpen i Node-red och skicka separata MMQ meddelande till resp. virtuell enhet.
Jag använde samma bild (planlösning) som du har vilket jag är nöjd med.
Nästa utmaning är att identifiera alla värden från dumpen. Det är några parametrar kvar som jag inte vet vad de står för och tänkte höra med dig om du har koll på dessa? Det är är parametrarna 20 -29 (ej 23) samt sista nr 37 som jag inte lyckats hitta någon förklaring om vad de betyder. Hoppas du kan hjälpa mig inför det sista finjusteringen 🙂
Hälsningar,
Tommy
Tyvärr så vet jag bara det ”alla andra” på nätet vet. Det som finns tillgängligt i diverse forum på nätet. Det saknas information.
Här är mitt Lua-script i Domoticz.
Det som börjar med ”pryl_” vet jag inte vad det är. 😉
pi_temp är temperaturen på den Raspberry Pi som sitter under fronten på pumpen som postar datan till Domoticz via wlan. Jag skickar med den i slutet på strängen som pajen postar till Domoticzpajen. Domoticz har en användarvariabel som heter ”IVTData” som innehåller den senaste strängen som postats från pumpen. Pythonscriptet finns längre ner.
commandArray = {}
if uservariablechanged['IVTData'] then
ivtdata = uservariables["IVTData"]
function split(str,sep)
local array = {}
local reg = string.format("([^%s]+)",sep)
for mem in string.gmatch(str,reg) do
table.insert(array, mem)
end
return array
end
-- A function in Lua similar to PHP's print_r, from http://luanet.net/lua/function/print_r
function print_r ( t )
local print_r_cache={}
local function sub_print_r(t,indent)
if (print_r_cache[tostring(t)]) then
print(indent.."*"..tostring(t))
else
print_r_cache[tostring(t)]=true
if (type(t)=="table") then
for pos,val in pairs(t) do
if (type(val)=="table") then
print(indent.."["..pos.."] => "..tostring(t).." {")
sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
print(indent..string.rep(" ",string.len(pos)+6).."}")
else
print(indent.."["..pos.."] => "..tostring(val))
end
end
else
print(indent..tostring(t))
end
end
end
sub_print_r(t," ")
end
if (kompressor_drift == '1' and otherdevices['VP kompressor'] == 'Off') then
commandArray[#commandArray+1]={['VP kompressor']='On'}
end
if (kompressor_drift == '0' and otherdevices['VP kompressor'] == 'On') then
commandArray[#commandArray+1]={['VP kompressor']='Off'}
end
if (larm == '0' and otherdevices['VP larm'] == 'On') then
commandArray[#commandArray+1]={['VP larm']='Off'}
end
if (larm ~= '0' and otherdevices['VP larm'] == 'Off') then
commandArray[#commandArray+1]={['VP larm']='On'}
end
if (cirkpump_P1 == '1' and otherdevices['VP cirkulationspump (P1)'] == 'Off') then
commandArray[#commandArray+1]={['VP cirkulationspump (P1)']='On'}
end
if (cirkpump_P1 == '0' and otherdevices['VP cirkulationspump (P1)'] == 'On') then
commandArray[#commandArray+1]={['VP cirkulationspump (P1)']='Off'}
end
if (schunt_oppna_SV1 == '1' and otherdevices['VP schunt öppnar (SV1)'] == 'Off') then
commandArray[#commandArray+1]={['VP schunt öppnar (SV1)']='On'}
end
if (schunt_oppna_SV1 == '0' and otherdevices['VP schunt öppnar (SV1)'] == 'On') then
commandArray[#commandArray+1]={['VP schunt öppnar (SV1)']='Off'}
end
if (schunt_stang_SV1 == '1' and otherdevices['VP schunt stänger (SV1)'] == 'Off') then
commandArray[#commandArray+1]={['VP schunt stänger (SV1)']='On'}
end
if (schunt_stang_SV1 == '0' and otherdevices['VP schunt stänger (SV1)'] == 'On') then
commandArray[#commandArray+1]={['VP schunt stänger (SV1)']='Off'}
end
if (tryckvakt_avfrost_GP3 == '1' and otherdevices['VP tryckvakt avfrostning (GP3)'] == 'Off') then
commandArray[#commandArray+1]={['VP tryckvakt avfrostning (GP3)']='On'}
end
if (tryckvakt_avfrost_GP3 == '0' and otherdevices['VP tryckvakt avfrostning (GP3)'] == 'On') then
commandArray[#commandArray+1]={['VP tryckvakt avfrostning (GP3)']='Off'}
end
if (tryckvakt_hogtryck_HP == '1' and otherdevices['VP tryckvakt högtryck (GP3)'] == 'Off') then
commandArray[#commandArray+1]={['VP tryckvakt högtryck (GP3)']='On'}
end
if (tryckvakt_hogtryck_HP == '0' and otherdevices['VP tryckvakt högtryck (GP3)'] == 'On') then
commandArray[#commandArray+1]={['VP tryckvakt högtryck (GP3)']='Off'}
end
if (tryckvakt_logtryck_LP == '1' and otherdevices['VP tryckvakt lågtryck (GP1)'] == 'Off') then
commandArray[#commandArray+1]={['VP tryckvakt lågtryck (GP1)']='On'}
end
if (tryckvakt_logtryck_LP == '0' and otherdevices['VP tryckvakt lågtryck (GP1)'] == 'On') then
commandArray[#commandArray+1]={['VP tryckvakt lågtryck (GP1)']='Off'}
end
if (elpatron1 ~= '0' and otherdevices['VP elpatron 1'] == 'Off') then
commandArray[#commandArray+1]={['VP elpatron 1']='On'}
end
if (elpatron1 == '0' and otherdevices['VP elpatron 1'] == 'On') then
commandArray[#commandArray+1]={['VP elpatron 1']='Off'}
end
if (elpatron2 ~= '0' and otherdevices['VP elpatron 2'] == 'Off') then
commandArray[#commandArray+1]={['VP elpatron 2']='On'}
end
if (elpatron2 == '0' and otherdevices['VP elpatron 2'] == 'On') then
commandArray[#commandArray+1]={['VP elpatron 2']='Off'}
end
end
return commandArray
Pythonscriptet som körs på pajen:
import requests
import serial
import re
import time
import os
requests.packages.urllib3.disable_warnings()
pattern = re.compile(r'\s+')
# Return CPU temperature as a character string
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
def readlineCR(port):
rv = ""
while True:
ch = port.read()
rv += ch
if ch == '\r' or ch == '':
return rv
#print(r.url)
#print(r.text)
except Exception as e:
print "Oops! unable to post result!",e.__doc__,e.message
port = serial.Serial("/dev/ttyUSB0", baudrate = 9600, timeout = 60)
while True:
rcv=''
try :
rcv = readlineCR(port)
except Exception as e:
print "Oops! problems reading from USB!"
print e.__doc__
print e.message
rcv = re.sub(pattern, '',rcv)
print(rcv)
if rcv :
get(rcv)
else :
print "Empty data..."
Pythonscriptet körs genom /etc/rc.local och startsträngen ser ut så här: sudo su - pi -c "screen -dm -S IVTSerialMonitor python ~/IVTSerialMonitor.py"
Då har jag en screen som jag kan återvända till när som helst i terminalen via ”screen -r” och sen CTRL+a följt av d för att ”detatcha” från screenen.
På Domoticzpajen har jag också följande Lua-script: t1 = os.time()
s = uservariables_lastupdate['IVTData']
-- returns a date time like 2013-07-11 17:23:12
if (difference > 300) then
commandArray['SendNotification']='IVTData!#IVTData saknas sen mer än 5 minuter!'
end
return commandArray
Det meddelar mig så fort datan är äldre än 5 minuter vilket betyder att något har hänt. Oftast så räcker det med att starta om pajen. Jag har också en notifiering på den virtuella enheten som aktiveras vid larm så att jag får ett meddelande om pumpen larmar av någon anledning. ”Motorskydd uppstart” tex…….
Snyggt jobbat med IVT och domoticz.
Hur löste du så att alla ivt värden fick var sin tempgivare i domoticz?
Jag håller på att få in alla värden från node-red som ett mqtt sträng till domoticz. Skall jag splitta dem med hjälp av ett script och tilldela dem var sin virtuell tempgivare i domoticz?
Hälsningar,
Tommy
Hej!
Tack. Jag kan posta skripten senare. Just nu är det ett python-script som tar emot datan från pumpen och postar det via en URL GET (Domoticz API). Sen delar ett lua-script upp strängen i delar och placerar ut värdena på virtuella enheter i domoticz.
Hej igen,
Nu har jag lyckats få in värden till resp. virtuell enhet i Domoticz. Jag löste det med att splittra upp variabel dumpen i Node-red och skicka separata MMQ meddelande till resp. virtuell enhet.
Jag använde samma bild (planlösning) som du har vilket jag är nöjd med.
Nästa utmaning är att identifiera alla värden från dumpen. Det är några parametrar kvar som jag inte vet vad de står för och tänkte höra med dig om du har koll på dessa? Det är är parametrarna 20 -29 (ej 23) samt sista nr 37 som jag inte lyckats hitta någon förklaring om vad de betyder. Hoppas du kan hjälpa mig inför det sista finjusteringen 🙂
Hälsningar,
Tommy
Tyvärr så vet jag bara det ”alla andra” på nätet vet. Det som finns tillgängligt i diverse forum på nätet. Det saknas information.
Här är mitt Lua-script i Domoticz.
Det som börjar med ”pryl_” vet jag inte vad det är. 😉
pi_temp är temperaturen på den Raspberry Pi som sitter under fronten på pumpen som postar datan till Domoticz via wlan. Jag skickar med den i slutet på strängen som pajen postar till Domoticzpajen. Domoticz har en användarvariabel som heter ”IVTData” som innehåller den senaste strängen som postats från pumpen. Pythonscriptet finns längre ner.
commandArray = {}
if uservariablechanged['IVTData'] then
ivtdata = uservariables["IVTData"]
function split(str,sep)
local array = {}
local reg = string.format("([^%s]+)",sep)
for mem in string.gmatch(str,reg) do
table.insert(array, mem)
end
return array
end
-- A function in Lua similar to PHP's print_r, from http://luanet.net/lua/function/print_r
function print_r ( t )
local print_r_cache={}
local function sub_print_r(t,indent)
if (print_r_cache[tostring(t)]) then
print(indent.."*"..tostring(t))
else
print_r_cache[tostring(t)]=true
if (type(t)=="table") then
for pos,val in pairs(t) do
if (type(val)=="table") then
print(indent.."["..pos.."] => "..tostring(t).." {")
sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
print(indent..string.rep(" ",string.len(pos)+6).."}")
else
print(indent.."["..pos.."] => "..tostring(val))
end
end
else
print(indent..tostring(t))
end
end
end
sub_print_r(t," ")
end
local array = split(ivtdata,";")
lopnr = array[1]
framled_GT1 = array[2]
ute_GT2 = array[3]
tappvarmvatten_GT3_1 = array[4]
varmvatten_GT3_2 = array[5]
varmevatten_GT3_3 = array[6]
rumstemp_GT5 = array[7]
hetgastemperatur_GT6 = array[8]
externgivare_temp_GT3_4 = array[9]
tryckvakt_avfrost_GP3 = array[10]
tryckvakt_hogtryck_HP = array[11]
tryckvakt_logtryck_LP = array[12]
externgivare_semester = array[13]
kompressor_drift = array[14]
schunt_oppna_SV1 = array[15]
schunt_stang_SV1 = array[16]
cirkpump_P1 = array[17]
pryl_18 = array[18]
larm = array[19]
pryl_20 = array[20]
pryl_21 = array[21]
pryl_22 = array[22]
borvarde_framledning_GT3_1 = array[23]
pryl_24 = array[24]
pryl_25 = array[25]
pryl_26 = array[26]
pryl_27 = array[27]
pryl_28 = array[28]
pryl_29 = array[29]
extra_varmvatten1 = array[30]
extra_varmvatten2 = array[31]
extra_varmvatten3 = array[32]
pryl_33 = array[33]
elpatron1 = array[34]
pryl_35 = array[35]
elpatron2 = array[36]
pryl_37 = array[37]
pi_temp = array[38]
--print_r(array)
commandArray[#commandArray+1] = {['UpdateDevice'] = 436 .. '|0|' .. hetgastemperatur_GT6/10}
commandArray[#commandArray+1] = {['UpdateDevice'] = 437 .. '|0|' .. ute_GT2/10}
commandArray[#commandArray+1] = {['UpdateDevice'] = 440 .. '|0|' .. tappvarmvatten_GT3_1/10}
commandArray[#commandArray+1] = {['UpdateDevice'] = 441 .. '|0|' .. varmvatten_GT3_2/10}
commandArray[#commandArray+1] = {['UpdateDevice'] = 442 .. '|0|' .. varmevatten_GT3_3/10}
commandArray[#commandArray+1] = {['UpdateDevice'] = 443 .. '|0|' .. framled_GT1/10}
commandArray[#commandArray+1] = {['UpdateDevice'] = 444 .. '|0|' .. pi_temp}
commandArray[#commandArray+1] = {['UpdateDevice'] = 815 .. '|0|' .. lopnr}
--commandArray[#commandArray+1] = {['UpdateDevice'] = 450 .. '|0|' .. ivtdata}
commandArray[#commandArray+1] = {['UpdateDevice'] = 451 .. '|0|' .. borvarde_framledning_GT3_1/10}
--commandArray[#commandArray+1] = {['Variable:IVTDataTimestamp'] = tostring(os.time())}
if (kompressor_drift == '1' and otherdevices['VP kompressor'] == 'Off') then
commandArray[#commandArray+1]={['VP kompressor']='On'}
end
if (kompressor_drift == '0' and otherdevices['VP kompressor'] == 'On') then
commandArray[#commandArray+1]={['VP kompressor']='Off'}
end
if (larm == '0' and otherdevices['VP larm'] == 'On') then
commandArray[#commandArray+1]={['VP larm']='Off'}
end
if (larm ~= '0' and otherdevices['VP larm'] == 'Off') then
commandArray[#commandArray+1]={['VP larm']='On'}
end
if (cirkpump_P1 == '1' and otherdevices['VP cirkulationspump (P1)'] == 'Off') then
commandArray[#commandArray+1]={['VP cirkulationspump (P1)']='On'}
end
if (cirkpump_P1 == '0' and otherdevices['VP cirkulationspump (P1)'] == 'On') then
commandArray[#commandArray+1]={['VP cirkulationspump (P1)']='Off'}
end
if (schunt_oppna_SV1 == '1' and otherdevices['VP schunt öppnar (SV1)'] == 'Off') then
commandArray[#commandArray+1]={['VP schunt öppnar (SV1)']='On'}
end
if (schunt_oppna_SV1 == '0' and otherdevices['VP schunt öppnar (SV1)'] == 'On') then
commandArray[#commandArray+1]={['VP schunt öppnar (SV1)']='Off'}
end
if (schunt_stang_SV1 == '1' and otherdevices['VP schunt stänger (SV1)'] == 'Off') then
commandArray[#commandArray+1]={['VP schunt stänger (SV1)']='On'}
end
if (schunt_stang_SV1 == '0' and otherdevices['VP schunt stänger (SV1)'] == 'On') then
commandArray[#commandArray+1]={['VP schunt stänger (SV1)']='Off'}
end
if (tryckvakt_avfrost_GP3 == '1' and otherdevices['VP tryckvakt avfrostning (GP3)'] == 'Off') then
commandArray[#commandArray+1]={['VP tryckvakt avfrostning (GP3)']='On'}
end
if (tryckvakt_avfrost_GP3 == '0' and otherdevices['VP tryckvakt avfrostning (GP3)'] == 'On') then
commandArray[#commandArray+1]={['VP tryckvakt avfrostning (GP3)']='Off'}
end
if (tryckvakt_hogtryck_HP == '1' and otherdevices['VP tryckvakt högtryck (GP3)'] == 'Off') then
commandArray[#commandArray+1]={['VP tryckvakt högtryck (GP3)']='On'}
end
if (tryckvakt_hogtryck_HP == '0' and otherdevices['VP tryckvakt högtryck (GP3)'] == 'On') then
commandArray[#commandArray+1]={['VP tryckvakt högtryck (GP3)']='Off'}
end
if (tryckvakt_logtryck_LP == '1' and otherdevices['VP tryckvakt lågtryck (GP1)'] == 'Off') then
commandArray[#commandArray+1]={['VP tryckvakt lågtryck (GP1)']='On'}
end
if (tryckvakt_logtryck_LP == '0' and otherdevices['VP tryckvakt lågtryck (GP1)'] == 'On') then
commandArray[#commandArray+1]={['VP tryckvakt lågtryck (GP1)']='Off'}
end
if (elpatron1 ~= '0' and otherdevices['VP elpatron 1'] == 'Off') then
commandArray[#commandArray+1]={['VP elpatron 1']='On'}
end
if (elpatron1 == '0' and otherdevices['VP elpatron 1'] == 'On') then
commandArray[#commandArray+1]={['VP elpatron 1']='Off'}
end
if (elpatron2 ~= '0' and otherdevices['VP elpatron 2'] == 'Off') then
commandArray[#commandArray+1]={['VP elpatron 2']='On'}
end
if (elpatron2 == '0' and otherdevices['VP elpatron 2'] == 'On') then
commandArray[#commandArray+1]={['VP elpatron 2']='Off'}
end
end
return commandArray
Pythonscriptet som körs på pajen:
import requests
import serial
import re
import time
import os
requests.packages.urllib3.disable_warnings()
pattern = re.compile(r'\s+')
# Return CPU temperature as a character string
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
def readlineCR(port):
rv = ""
while True:
ch = port.read()
rv += ch
if ch == '\r' or ch == '':
return rv
CPU_temp = getCPUtemperature()
def get(data) :
payload = {'type': 'command', 'param': 'updateuservariable', 'idx': '18', 'vname': 'IVTData', 'vtype': '2', 'vvalue': data+';'+CPU_temp}
try :
r = requests.get("http://192.168.1.xx:xxxx/json.htm", params=payload)
#print(r.url)
#print(r.text)
except Exception as e:
print "Oops! unable to post result!",e.__doc__,e.message
port = serial.Serial("/dev/ttyUSB0", baudrate = 9600, timeout = 60)
while True:
rcv=''
try :
rcv = readlineCR(port)
except Exception as e:
print "Oops! problems reading from USB!"
print e.__doc__
print e.message
rcv = re.sub(pattern, '',rcv)
print(rcv)
if rcv :
get(rcv)
else :
print "Empty data..."
Pythonscriptet körs genom /etc/rc.local och startsträngen ser ut så här:
sudo su - pi -c "screen -dm -S IVTSerialMonitor python ~/IVTSerialMonitor.py"
Då har jag en screen som jag kan återvända till när som helst i terminalen via ”screen -r” och sen CTRL+a följt av d för att ”detatcha” från screenen.
På Domoticzpajen har jag också följande Lua-script:
t1 = os.time()
s = uservariables_lastupdate['IVTData']
-- returns a date time like 2013-07-11 17:23:12
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)
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = (os.difftime (t1, t2))
print("IVTData last updated: " .. s .. " (" .. difference .. " seconds)." )
textDeviceIdx = 461
commandArray[textDeviceIdx] = {['UpdateDevice'] = textDeviceIdx..'|0|'.. difference}
if (difference > 300) then
commandArray['SendNotification']='IVTData!#IVTData saknas sen mer än 5 minuter!'
end
return commandArray
Det meddelar mig så fort datan är äldre än 5 minuter vilket betyder att något har hänt. Oftast så räcker det med att starta om pajen. Jag har också en notifiering på den virtuella enheten som aktiveras vid larm så att jag får ett meddelande om pumpen larmar av någon anledning. ”Motorskydd uppstart” tex…….