Modbus Daten lesen von Alfen Wallbox

Begonnen von Henson05, 05 Februar 2021, 21:23:34

Vorheriges Thema - Nächstes Thema

Henson05

Hallo zusammen,

Ich versuche mit Modbus Daten aus der Alfen Wallbox auszulesen.

Leider verstehe ich nicht wie ich die Modbus Adressen lesen kann. Kann mir da jemand ein Beispiel geben? Ich bin schon ewig dran an dem Thema, komme aber keinen Schritt weiter. Als Einstieg möchte ich einfach den Namen oder den Hersteller auslesen (PDF S. 10)

Hier ist die Modbus Dokumentation zu finden:
https://seither.me:8888/sharing/DeivPQrzu

Das Device habe ich in Moment wie folgt angelegt:

Internals:
   CFGFN     
   DEF        1 30 192.168.178.114 TCP
   DeviceName 192.168.178.114:502
   EXPECT     idle
   FD         71
   FUUID      601da672-f33f-0b03-5718-2251fd8858cc9cfb
   IODev      Wallbox
   Interval   30
   LASTOPEN   1612555890.46388
   MODBUSID   1
   MODE       master
   MODULEVERSION Modbus 4.3.11 - 2.1.2021
   NAME       Wallbox
   NOTIFYDEV  global
   NR         7867
   NTFY_ORDER 50-Wallbox
   PARTIAL   
   PROTOCOL   TCP
   STATE      opened
   TCPConn    1
   TYPE       ModbusAttr
   devioLoglevel 3
   nextOpenDelay 60
   QUEUE:
   READ:
     BUFFER     
   READINGS:
     2021-02-05 21:11:30   state           opened
   REMEMBER:
     lid        1
     lname      Wallbox
     lrecv      1612555950.69264
     lsend      1612555950.57012
   defptr:
     Wallbox    1
   lastRead:
Attributes:
   alias      Wallbox
   dev-h-defExpr ScanFormat($hash, $val)
   dev-h-defLen 1
   dev-h-defPoll 1
   dev-h-defShowGet 1
   dev-h-defUnpack a2
   event-on-change-reading .*
   obj-h40099-len 17
   obj-h40099-reading Name
   obj-h40099-unpack A>
   room       Wallbox
   verbose    5

Bei GET bekomme ich folgendes LOG:
2021.02.05 21:15:49 5: Wallbox: GetUpdate called from Fhem internal timer
2021.02.05 21:15:49 4: Wallbox: UpdateTimer called from GetUpdate with cmd next sets timer to call update function in 30.0 sec at 21:16:19.388, interval 30
2021.02.05 21:15:49 5: Wallbox: GetUpdate objects from attributes: h40099
2021.02.05 21:15:49 5: Wallbox: GetUpdate full object list: h40099
2021.02.05 21:15:49 5: Wallbox: GetUpdate check h40099 => Name, poll = 1, polldelay = 0.5, last = 0
2021.02.05 21:15:49 4: Wallbox: GetUpdate will request Name
2021.02.05 21:15:49 5: Wallbox: GetUpdate tries to combine read commands
2021.02.05 21:15:49 4: Wallbox: GetUpdate readList = h40099
2021.02.05 21:15:49 4: Wallbox: DoRequest called from GetUpdate created new request, read buffer empty,
request: id 1, read fc 3 h40099, len 17, tid 180, master device Wallbox, reading Name (getUpdate),
response: id , fc
2021.02.05 21:15:49 5: Wallbox: QueueRequest called from DoRequest with h40099, qlen 0 from master Wallbox through io device Wallbox
2021.02.05 21:15:49 5: Wallbox: StartQueueTimer called from QueueRequest sets internal timer to process queue in 0.000 seconds
2021.02.05 21:15:49 5: Wallbox: ProcessRequestQueue called from Fhem internal timer as queue:Wallbox, qlen 1, request: request: id 1, read fc 3 h40099, len 17, tid 180, master device Wallbox, reading Name (getUpdate), queued 0.07 secs ago
2021.02.05 21:15:49 5: Wallbox: checkDelays sendDelay, last send to same device was 2.868 secs ago, required delay is 0.1
2021.02.05 21:15:49 5: Wallbox: checkDelays clientSwitchDelay is not relevant
2021.02.05 21:15:49 5: Wallbox: checkDelays commDelay, last communication with same device was 2.752 secs ago, required delay is 0.1
2021.02.05 21:15:49 5: Wallbox: checkDelays busDelayRead, last activity on bus  was 2.752 secs ago, required delay is 0
2021.02.05 21:15:49 4: Wallbox: ProcessRequestQueue (V4.3.11 - 2.1.2021) qlen 1, sending 00b40000000601039ca30011 via 192.168.178.114:502, read buffer empty,
request: id 1, read fc 3 h40099, len 17, tid 180, master device Wallbox, reading Name (getUpdate), queued 0.07 secs ago,
response: id , fc
2021.02.05 21:15:49 5: Wallbox: Send called from ProcessRequestQueue
2021.02.05 21:15:49 5: SW: 00b40000000601039ca30011
2021.02.05 21:15:49 5: Wallbox: read buffer: 00b400000003018302
2021.02.05 21:15:49 5: Wallbox: ParseFrameStart called from ReadFn
2021.02.05 21:15:49 4: Wallbox: ParseFrameStart (TCP) extracted id 1, fCode 131, tid 180, dlen 3 and data 02
2021.02.05 21:15:49 5: Wallbox: HandleResponse called from ReadFn
2021.02.05 21:15:49 5: Wallbox: ParseResponse called from HandleResponse
2021.02.05 21:15:49 4: Wallbox: HandleResponse got response with error code 83 / 02, illegal data address
2021.02.05 21:15:49 4: Wallbox: HandleResponse done, current frame / read buffer: 00b400000003018302, id 1, fCode 131, tid 180,
request: id 1, read fc 3 h40099, len 17, tid 180, master device Wallbox, reading Name (getUpdate), queued 0.21 secs ago, sent 0.14 secs ago,
response: id 1, fc 131 error code 02, len 17
2021.02.05 21:15:49 5: Wallbox: ResetExpect for HandleResponse from response to idle
2021.02.05 21:15:49 5: Wallbox: DropFrame called from ReadFn - drop 00b400000003018302
Hue Bridge / CUL / ZWave / Alexa / Dimplex Wärmepumpe - Modbus TCP / LaCrosse / Sonoff S20 / Sonoff 4CH / HM-SEC-SC-2 / Synology / INSTAR / Shelly PLUG S / Shelly 2.5

torte

Hallo Henson,


hasste das hier Dir schon angeguckt?
https://haus-automatisierung.com/software/iobroker/2020/10/21/alfen-wallbox-iobroker-modbus.html

Hast Du das Lastmanagment freigeschaltet?

Grüße
Torte

torte

#2
Hallo,

falls es mal jemand brauch. Sind bei mir zwei Devices einmal für Slave Adresse 200 und einmal Slave Adresse 1 für den Socket(Stecker).

Als RAW

defmod alfen ModbusAttr 200 60 192.168.1.xxx:502 TCP
attr alfen dev-h-defPoll 1
attr alfen dev-type-FLOAT32-len 2
attr alfen dev-type-FLOAT32-unpack f>
attr alfen dev-type-SIGNED16-len 1
attr alfen dev-type-SIGNED16-unpack n!
attr alfen dev-type-STRING17-len 17
attr alfen dev-type-STRING17-unpack Z*
attr alfen dev-type-STRING5-len 5
attr alfen dev-type-STRING5-unpack Z*
attr alfen dev-type-UNSIGNED64-len 4
attr alfen dev-type-UNSIGNED64-unpack Q>
attr alfen event-min-interval Temperature:3600
attr alfen event-on-change-reading Temperature:1
attr alfen obj-h100-reading Name
attr alfen obj-h100-type STRING17
attr alfen obj-h1100-reading ActiveMaxCurrent
attr alfen obj-h1100-type FLOAT32
attr alfen obj-h1102-reading Temperature
attr alfen obj-h1102-type FLOAT32
attr alfen obj-h117-reading Manufacturer
attr alfen obj-h117-type STRING5
attr alfen obj-h123-reading FirmwareVersion
attr alfen obj-h123-type STRING17
attr alfen obj-h168-reading DateYear
attr alfen obj-h168-type SIGNED16
attr alfen obj-h169-reading DateMonth
attr alfen obj-h169-type SIGNED16
attr alfen obj-h174-reading Uptime
attr alfen obj-h174-type UNSIGNED64



defmod alfenVolt ModbusAttr 1 60 192.168.1.xxx:502 TCP
attr alfenVolt dev-h-defPoll 1
attr alfenVolt dev-type-FLOAT32-len 2
attr alfenVolt dev-type-FLOAT32-unpack f>
attr alfenVolt dev-type-SIGNED16-len 1
attr alfenVolt dev-type-SIGNED16-unpack n!
attr alfenVolt dev-type-STRING17-len 17
attr alfenVolt dev-type-STRING17-unpack Z*
attr alfenVolt dev-type-STRING5-len 5
attr alfenVolt dev-type-STRING5-unpack Z*
attr alfenVolt dev-type-UNSIGNED16-len 1
attr alfenVolt dev-type-UNSIGNED16-unpack S>
attr alfenVolt dev-type-UNSIGNED64-len 4
attr alfenVolt dev-type-UNSIGNED64-unpack Q>
attr alfenVolt event-min-interval CurrentPhaseL1:3600,CurrentPhaseL2:3600,CurrentPhaseL3:3600,CurrentSum:3600
attr alfenVolt event-on-change-reading Current.*
attr alfenVolt obj-h1201-reading Mode3State
attr alfenVolt obj-h1201-type STRING5
attr alfenVolt obj-h306-reading VoltPhase1
attr alfenVolt obj-h306-type FLOAT32
attr alfenVolt obj-h308-reading VoltPhase2
attr alfenVolt obj-h308-type FLOAT32
attr alfenVolt obj-h310-reading VoltPhase3
attr alfenVolt obj-h310-type FLOAT32
attr alfenVolt obj-h312-reading Volt_L1-L2
attr alfenVolt obj-h312-type FLOAT32
attr alfenVolt obj-h320-reading CurrentPhaseL1
attr alfenVolt obj-h320-type FLOAT32
attr alfenVolt obj-h322-reading CurrentPhaseL2
attr alfenVolt obj-h322-type FLOAT32
attr alfenVolt obj-h324-reading CurrentPhaseL3
attr alfenVolt obj-h324-type FLOAT32
attr alfenVolt obj-h326-reading CurrentSum
attr alfenVolt obj-h326-type FLOAT32


Es gibt nochmehr Holdingregister laut Alfen Doku, hatte aber noch keinen Bedarf für mehr.  ;D
Damit das mit der ALFEN EVE Single PRO funktioniert braucht mal das "LBA Software Upgrade für Eve Pro-line Dynamisches Lastmanagement" ist ein Lizenz
kann zb. über Voltus bezogen werden.
Damit könnte man auch die Phasensteuern wenn man mit PV Überschussladen möchte.

Grüße
Torte

Henson05

Hallo Torte,

habe mir das Lastmanagement freischalten lassen. Mit deinem Code funktioniert es nun wunderbar, und auf dieser Basis kann ich den Code auch erweitern mit weiteren Holding Registers. Vielen Dank für deine Unterstützung und den Code!!

Grüße,
Hue Bridge / CUL / ZWave / Alexa / Dimplex Wärmepumpe - Modbus TCP / LaCrosse / Sonoff S20 / Sonoff 4CH / HM-SEC-SC-2 / Synology / INSTAR / Shelly PLUG S / Shelly 2.5

Henson05

Hallo Torte,

doch noch eine weitere Frage in diesem Zusammenhang: wie kann ich in eine Register-Adresse schreiben? Konkret möchte ich die Ladeleistung einstellen durch Schreiben in die Adresse 1417, 1419 sowie 1421 ("SCN Max Current per Phase"). Dadurch möchte ich das Auto nur Laden lassen, wenn die Sonne scheint  8)

Viele Grüße,
Hue Bridge / CUL / ZWave / Alexa / Dimplex Wärmepumpe - Modbus TCP / LaCrosse / Sonoff S20 / Sonoff 4CH / HM-SEC-SC-2 / Synology / INSTAR / Shelly PLUG S / Shelly 2.5

torte

Hi Henson,

ich denke das geht :-D, weiß aber auch nicht wie, brauch ich bei mir aber (noch) nicht mangels Solaranlage.
Ich weiß nur das man bei der AlfenWallbox wohl mindestens alle 60 Sekunden den wert neu schreiben muss sonst stellt die Wallbox wieder den default ein.
Das ist mal in einem YT Video von https://haus-automatisierung.com/ erklärt worden.

Grüße
Torte


torte

Hi nochmal,

hab bei mir noch ein paar Userreadings angelegt.


RealEnergyDeliveredSum_last:Mode3State:.* {if (ReadingsVal("alfenVolt","Mode3State",0) eq "B2")
{ ReadingsVal("alfenVolt","RealEnergyDeliveredSum_current",0) } else {}},
RealEnergyDeliveredSum_old:Mode3State:.* {if (ReadingsVal("alfenVolt","Mode3State",0) eq "C2")
{ ReadingsVal("alfenVolt","RealEnergyDeliveredSum",0) } else {}},
RealEnergyDeliveredSum_current:Mode3State:.* {if (ReadingsVal("alfenVolt","Mode3State",0) eq "A")
{ sprintf("%.1f",(ReadingsVal("alfenVolt","RealEnergyDeliveredSum",0) - ReadingsVal("alfenVolt","RealEnergyDeliveredSum",0))) } else {}},
RealEnergyDeliveredSum_current:RealEnergyDeliveredSum:.* {if (ReadingsVal("alfenVolt","Mode3State",0) eq "C2")
{ sprintf("%.1f",(ReadingsVal("alfenVolt","RealEnergyDeliveredSum",0) - ReadingsVal("alfenVolt","RealEnergyDeliveredSum_old",0))/1000)} else {}}


Ist noch nicht ganz rund, ich meine wenn man während des Ladens den Stecker zieht ist noch nicht abgefangen, wegen Zeitmangel aber noch nicht weiter gemacht.
Da hängt bei mir noch ein DOIF dran was mir per Telegram ne Meldung schickt usw..

Grüße
Torte