Modbus TCP

Hallo
Es ist eine Solar anlage und ich möchte den verbrauch auslesen so das man mit den Daten einiges anstellen kan.
ich hoffe sehr das man mir da weiter helfen kann
Mein Code im WD schaut so aus.


local device = fibaro:getSelfId();

sendbuffer=string.char(0,4,0,0,0,6,1,3,0,43,0,2);

for c in sendbuffer:gmatch(".") do
   		fibaro:debug("  "..string.byte(c))
end

tcpSocket = Net.FTcpSocket("192.168.11.55", 502)
--tcpSocket:disconnect()
tcpSocket:setReadTimeout(250);
  bytes, errorCode = tcpSocket:write(sendbuffer)
		fibaro:debug("--Bytes     : "..bytes)
		fibaro:debug("--ErrorCode : "..errorCode)
if errorCode == 0
  then
  fibaro:debug("Done. Buffer send")
else
  fibaro:debug("Error")
end
 
  fibaro:sleep(250)
 local result,err = tcpSocket:read()
  fibaro:sleep(250)
  fibaro:debug("Result : "..result)
  fibaro:debug("Err    : "..err) 

Im Debug schreibt er das raus.


[DEBUG] 20:13:34: 0
[DEBUG] 20:13:34: 4
[DEBUG] 20:13:34: 0
[DEBUG] 20:13:34: 0
[DEBUG] 20:13:34: 0
[DEBUG] 20:13:34: 6
[DEBUG] 20:13:34: 1
[DEBUG] 20:13:34: 3
[DEBUG] 20:13:34: 0
[DEBUG] 20:13:34: 43
[DEBUG] 20:13:34: 0
[DEBUG] 20:13:34: 2
[DEBUG] 20:13:34: --Bytes : 12
[DEBUG] 20:13:34: --ErrorCode : 0
[DEBUG] 20:13:34: Done. Buffer send
[DEBUG] 20:13:34: Result : 
[DEBUG] 20:13:34: Err : 0 

Result bleibt leer.

Mit einem SimplyModbusTCPclient1.4 Programm kann ich die Daten sauber auslesen auslesen, das sieht mann in einem bild und die entsprechenden Einstellungen.
Ich quäle mich schon seit Wochen jeden tag ein bisschen.

E3DC-StromSpeicher.jpg

SimpliModbus.jpg

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.

Solar.png

Hallo erstmal, finde ich richtig toll was du hier geschafft hast. Ich bin auch gerade am überlegen wie ich Information vom Modbus in das HC2 bekomme um damit arbeiten zu können. An welcher stelle hast Du Informationen gefunden? Und wie werden die Werte im HC2 angezeigt?

Hallo
Die Infos habe ich durch lesen und wieder lesen in verschiedene Foren. Da ich kein Programmierer bin kann ich nur Beispiel Code da reinstecken um sich daran zu orientieren. Infos über meine Solar Anlage habe ich nur die Bestätigung das sie den Modbus implementiert haben. Da es aber ein Standart ist solltest du vom herstellen zumindest die Register Belegung wie in einem der Bilder von mir weiter oben.

Mir konte keiner helfen deswegen habe ich das reingestellt. Ich kann dir nur sagen was mein Code da macht aber fachlich von deinem System must Du mit dem Code experimentieren.

Ich habe in einem Virtual Modul alles eingerichtet und lasse mir die Daten in Vareablen reinschreiben.

Gruß

Hier
ich wollt mein Virtuelles Modul hochladen weis aber nicht wie.
So schaut es aus.

E3-DC_Solar.png

Hallo Parip69 ,

Dein Beitrag ist sehr gut!!! Da du es ja geschafft hast die E3DC auszulesen ,wirst Du es doch bitte noch schaffen das virtuelle Modul hoch zuladen .
Da ich auch eine E3DC habe hätte ich grosses Interesse. Vielen Dank für deinen Script !

U.S

Hi,

zippe mal das VD und versuche das gezippte File hier hochzuladen.

VG Hoggle

Hallo
Mit dem hochladen des vd habe hatte ich mich nicht bemüht das ich nicht wußte ob es jemand braucht. Mir ging es nur darum dar modbus tcp als Beispiel zu bringe.

Habe auch ein Icon mit reingelegt. Im Debug vom Buton kannst Du dir alle Register anzeigen lassen. In der Hauptschleife sind nur die für mich wichtigen Daten dargestellt.

Bitte schön.

Hallo Parip69 ,

na das ging aber schnell .Vielen Dank !!

U.S

Hallo Parip69 ,

großer Respekt !!! Modul geladen ,IP-Adressen geändert ,Modbus an E3DC aktiviert und die Werte waren da ! Das ist wirklich eine Meisterleistung !
Dein Programm ist wirklich die Basis für weitere sinnvolle Steuerungen im Zusammenhang E3DC und Fibaro .
Ich hätte noch eine Frage bezüglich dem Wert “Autarkie und Eigenverbrauch”. Sind das noch “Roh-Werte”(UInt8+UInt8 )? .Bei mir erscheinen da Werte von z.B 25244 % .
Der Wert ist zwar für Fibaro relativ uninteressant , ich würde es aber gern verstehen .

Vielen Dank nochmals !

U.S

Hallo
Ich glaube, ja das sind Rohdaten kann sie nicht interpretieren. Ich wolte mich in Verbindung setzen mit der Firma, hatte Ihnen meine Arbeit zugeschickt und gebeten das weiter zu geben an andere Interessenten. Zu meiner Zeit habe ich nur die Register belegung bekommen und einen link zu modbus. Leider Konten sie keine Beispiele zuschicken egal in welcher Programmierer Sprache.
Es gibt noch einen Fehler in einem Register der immer einen negativen wert anzeigt das habe ich Ihnen auch mitgeteilt. Für mich haben ich das Problem aber gelöst.

Das mit der Autarkie müssen roh Daten sein konte aber durch verschiedene Methoden die Lösung (Rätsel) nicht lösen.
Wenn jemand von hier die (UInt8+UInt8) bißchen aufklären kann dan mache ich weiter. Werde mich aber telefonisch mit der Firma in Verbindung setzen.

Grus

Hallo Parip69 ,

vermutlich ist dir das folgende klar …,trotzdem mal eine Anmerkung .Ich habe mir auch mal den Simple Modbus Client installiert .Wenn ich das Register 40082 der E3DC in 2x UINT8 auflöse ,bekomme ich die wahrscheinlich die richtigen Werte (einen für Autarkie 99 und einen für Eigenverbrauch 98 im Simple Modbus-Client angezeigt. Ich kann das jetzt natürlich in der kürze der Zeit nicht umsetzen.

Viele Grüße
U.S

Hallo Comptec
die ersten 2 Bytes sind die Autarkie die ich auch im Portal überprüfen kann, die letzten 2 Bytes sollen den Eigenverbrauch darstellen die aber im Portal nicht übereinstimmen bei mir zumindest nicht, da ich auch noch eine externe Quelle besitze. Entweder zeigt es bei mir im Portal nicht richtig an da mann die ext. Quelle nicht berücksichtigt oder…???
Hast Du auch eine ext. Quelle???

Hallo Comptec

Habe alles umgesetzt.
Will aber trotz allem nachfragen wegen den letzten 2 Bytes … Eigenverbrauch.

Hallo
Es passt jetzt ich konnte alles überprüfen vor allem die werte nachvollziehen. Jetzt kann man durch den Eigenverbrauch sauber erkenne wie viel Energie noch zur Verfügung steht z.b. wenn 10% Eigenverbrauch ist dann hat man noch 90% Energie zur Verfügung für andere sachen…

Hallo Parip69 ,

vielen Dank. Die Werte passen jetzt . Eine Frage hätte ich noch ! Die Werte beziehen sich dann auf den Tag ,oder ? (Autarkie und Eigenverbrauch)
Das hat jetzt nichts mit deinem Programm zu tun . Ich frage deshalb ,wenn ich mir im Portal die aktuellen Werte ansehe ,sind das Andere. Auf jeden Fall werden die Werte vom Register 40082 sauber angezeigt .

Zu deiner Frage von heute früh , nein ich habe keine externe Einspeisung .

Vielen Dank nochmals und halt mich bitte auf dem Laufenden.

U.S

Hallo
Ich glaube das die Werte in Echtzeit angezeigt werden. Eigenverbrauch ist wenn ich richtig verstanden habe, der Anteil von der aktuellen Gesamtproduktion, so wie ich in meinem letzten Beitrag geschrieben habe. Wenn du eine aktuelle Produktion von 4000 Watt hast und das Haus hat eine aktuellen verbrau von 1000 Watt dann verbrauchst du 25% und Autarkies müßte 100% anzeigen da du alles aus deiner eigene Produktion verbrauchst. Im Portal sind das die Werte aus der Mitte mit dem Balken diagram.

Hoffe das ich richtig liege da ich heute lange mit der Umsetzung beschäftigt war und nur flüchtig mit dem Portal gearbeitet habe.

Hallo Parip69 ,

musstest Du nach dem letzten Softwareupdate der E3DC die Werte in Deinem geschriebenen VD anpassen ?
U.S

Ja, ich habe angepaßt und etwas aufgeräumt. Habe noch zusätzliche register aufgenommen. Wenn Interesse besteht kann ich erst morgen Früh dir das VD zur Verfügung stellen.

@parip69

ja ich hätte großes Interesse an dem VD . Vielen Dank für Deine Mühe…

U.S