Hallo
wer es braucht…bitteschön.
Das war eine harte Nuss dieses “Modbus tcp ip”. Hatte kaum was gefunden im netz deswegen stelle ich das rein.
Vieleicht kann jemand was gebrauchen.
Nach mehreren Wochen lesen und lernen beherrsche ich zumindest meine Solaranlage “E3/DC”. Das auslesen klappt wunderbar, jetzt kann man sehen wie stark die Sonne scheint und braucht keine Sensoren draußen aufzustellen oder irgend wo an den Fenstern. Ich habe im Osten Süden uns Westen Paneele auf dem Dach.
Jetzt kann man die Rollos und Verbraucher anhand der tatsächlichen Energieproduktion steuren.
Ich stelle nur einen teil des codes rein das wichtigste davon.
local device = fibaro:getSelfId();
tcpSocket = Net.FTcpSocket("192.168.11.55", 502);
-- tring from response
local function DumpString(str,spacer)
return (
string.gsub(str,"(.)",
function (c)
return string.format("%02X%s",string.byte(c), spacer or "");
end)
)
end
---### negativ wert to positiv ##############
local function negativ_to_positiv(wert)
local wert = tonumber(wert)
if (wert<0) then
wert = wert *-1;
end
return wert
end
---### String Hex32 to decimal conversion ############
local function hex32_to_dec (someNumber)
local someNumber = tonumber(someNumber)
if someNumber < 2147483647 then
return someNumber
end
if someNumber > 2147483647 then
someNumber = (someNumber - 4294967295)--4294967295
return someNumber
end
end
--- ### String Hex to characters ###########################
local function hexStringToString(hexString)
local function hexToDecimal(ascii)
if not ascii then
return 0
end
ascii=ascii-48
if ascii > 9 then
return ascii-7
end
return ascii
end
local accumulator={}
for i = 1, hexString:len(), 4 do
local a=hexToDecimal(hexString:byte(i))
local b=hexToDecimal(hexString:byte(i+1))
local c=hexToDecimal(hexString:byte(i+2))
local d=hexToDecimal(hexString:byte(i+3))
local t = c*16+d
local u = a*16+b
if t <32 then t=32 end
if u <32 then u=32 end
table.insert(accumulator, string.char(u))
table.insert(accumulator, string.char(t))
end
return table.concat(accumulator)
end
----------------------------------------------------------------------------------------
---#### Magicbyte – S10 ModBus ID (Immer 0xE3DC) #######################################################
---------------------------------------------------------------------------------------
tcpSocket = Net.FTcpSocket("192.168.11.55", 502)
sendbuffer=string.char(0,0,0,0,0,6,1,3,0,0,0,1);
--tcpSocket:setReadTimeout(250);
bytes, errorCode = tcpSocket:write(sendbuffer)
fibaro:sleep(200)
local result, err = tcpSocket:read()
if err == 0
then
SolarH = string.sub((DumpString(result)), 19);
SolarNr = tonumber(SolarH, 16)
Solar = (hex32_to_dec(SolarNr))
fibaro:debug("Magicbyte – S10 ModBus ID (Immer 0xE3DC) = "..Solar)
else
fibaro:debug(err)
fibaro:debug("Error UPS Output Current")
end
tcpSocket:disconnect();
fibaro:sleep(200)
----------------------------------------------------------------------------------------
---#### S10 ModBus-Firmware-Version #######################################################
---------------------------------------------------------------------------------------
tcpSocket = Net.FTcpSocket("192.168.11.55", 502)
sendbuffer=string.char(0,0,0,0,0,6,1,3,0,1,0,1);
--tcpSocket:setReadTimeout(250);
bytes, errorCode = tcpSocket:write(sendbuffer)
fibaro:sleep(200)
local result, err = tcpSocket:read()
if err == 0
then
SolarH = string.sub((DumpString(result)), 19);
SolarNr = tonumber(SolarH, 16)
Solar = (hex32_to_dec(SolarNr))
fibaro:debug("S10 ModBus-Firmware-Version = "..Solar)
else
fibaro:debug(err)
fibaro:debug("Error UPS Output Current")
end
tcpSocket:disconnect();
fibaro:sleep(200)
Ein Debug von dem VD.
Wenn etwas verbessern kann oder etwas falsch ist dann bitte verbessern.