Open patrickbohren opened 7 months ago
This is for heating circuit 2? Could you read the value? If this HC was configured without booting the controller it could maybe not be written.
Reading back the operating mode register, both circuits show the values I have written periodically every minute. The lambda controller has been rebooted a couple of times since commissioning. Changing the mode from the GUI is the only way I have found so far to change the mode of heating circuit 2.
Hi there, Thanks to all of you for your work. I was able to integrate my EU20L to Home Assistant and read all sensor. Writing values to the e-Manger also works fine.
But I've got the same issue like @patrickbohren. I can write values to the operating state of the heat circuits, with no error response. In HA shows the change after some seconds, but in the lambda GUI there is no change in the operation mode of the circuit. It is the same behaviour for all of my 4 heat circuits. (Modbus 5006 - 5306) Only the value accepted bei the EU20L is 0 fur circuit 3 (5206)
Normally the transfered operation state is "-1".
SW-Version V1.0.2 Apr 10 2024 09:32:23 Konfig-Version: V0x11 Parameter-Version: V0x1
Hello,
as far as I am correctly informed, this is a problem that was caused by an update some time ago. I can write the operating mode of my heating ciruits via Modbus, but it jumps back to the original value in Home Assistant after a while. The value does not change at all in the GUI of the heat pump. The heat pump does not accept the new operating mode either.
I have similar behavior with the setpoint flow line temperature. I write the value. The new value is displayed in Home Assistant, but only partially on the GUI (e.g. flow line setpoint) of the heat pump. After a few minutes, the value jumps back to the GUI value. Do I have to write the values every X minutes?
Datapoints between 00-49 have to be written regularly (timeout after 5 minutes), otherwise they fall to an assigned one Default value returned.
Datapoints between 00-49 have to be written regularly (timeout after 5 minutes), otherwise they fall to an assigned one Default value returned.
Was meinst du damit? Sind das die letzten Stellen der Modbus-Adresse? Und wenn ja: Wie löst du das dann? Über eine Automation, die immer wieder den neuen Wert reinschreibt?
The Datapoint number 00-49 are the two last digit of the register address. An automation with regularly send values is overwriting the UI values. The UI values will not in every case represent the sender Information. This is a kind of fail safe mechanism to prevent no control if there is a connection loss time greater than the timeout.
It’s a pitty!!! All values are there, the control values, the compressor values, but lambda is not giving us theses values, via Modbus!
Only 3h of work within the sigmatek lasal software, if I could have access to, I would do it for them/us!
So @thecem when I get your comment correct, I have to send the e.g. operation mode for a heat circuit every 5min to get the lambda doing what I want. But the GUI won’t display it at all. Am I correct?
Yes, I would recommend to send the value every 31-59(without 35,40,45,50,55) second (example: /33) of a minute with HA and every value in a different second. So no automations send at the same time! Then there will be no issues and alarms in lambda. Not every values will be shown in the HP UI! But some icons changes or temps will be shown. They are working on a full Modbus Stack, that every value could read ( even compressor values, what is the most importent and useful) and write values that interact with the UI.
Yes, I would recommend to send the value every 31-59(without 35,40,45,50,55) second (example: /33) of a minute with HA and every value in a different second. So no automations send at the same time! Then there will be no issues and alarms in lambda. Not every values will be shown in the HP UI! But some icons changes or temps will be shown. They are working on a full Modbus Stack, that every value could read ( even compressor values, what is the most importent and useful) and write values that interact with the UI.
Können wir nicht einfach hier mal die entsprechenden Automationen sammeln und zur Verfügung stellen? Wäre doch wahrscheinlich für alle Seiten viel besser. Ich fange mal an mit meiner bisher einzigen Lambda-Automation, mit der ich dem Energiemanager meine Ist-Leistungswerte mitteile:
alias: Leistungsdaten => Wärmepumpe
description: ""
trigger:
- platform: state
entity_id:
- sensor.leistung_ha_total_active_power
- platform: time_pattern
seconds: "30"
condition: []
action:
- data:
address: 102
hub: EU13L
value:
- >-
{{states('sensor.leistung_ha_total_active_power') | int |
bitwise_and(65535)}}
action: modbus.write_register
mode: single
Homeassistant Automation to set Roomtemp for Heating Circuit 2:
alias: Heating Circuit Room Temp -> EU08L
description: ""
trigger:
- platform: state
entity_id:
- sensor.average_temperature_dg
- platform: time_pattern
seconds: /37
condition: []
action:
- data:
hub: EU08L
value:
- >-
{{ ((states('sensor.average_temperature_dg') |float) | round(1) * 10)
| int | bitwise_and(65535) }}
address: 5104
action: modbus.write_register
mode: single
Genau das habe ich ausgewählt, dann kommen die beiden Hochkommata, dazwischen habe ich meinen Code kopiert. Hat leider nicht funktioniert. Da scheint mind. ein Zeichen dabei zu sein, mit dem sich die Code-Formatierung schwer tut...
Activate a light, switch or a heat cable on defrost status:
Nice fog!
alias: EU08L -> Defrosting light
description: ""
trigger:
- platform: state
entity_id:
- sensor.eu08l_heat_pump_1_state_map
condition: []
action:
- choose:
- conditions:
- condition: state
entity_id: sensor.eu08l_heat_pump_1_state_map
state: DEFROSTING
sequence:
- type: turn_on
device_id: 7dca0101cd516b1d22b610f871ac6cbc
entity_id: 39198a77aed900a2289f6f571e5d4723
domain: light
flash: short
mode: single
Heat Cable:
alias: EU08L -> Heat Cable
description: Heizkabel zur Entwässerung auf dem Garagen Dach bei Frost
trigger:
- platform: state
entity_id:
- sensor.eu08l_heat_pump_1_state_map
to: DEFROSTING
condition: []
action:
- type: turn_on
device_id: 41bb4f8cc2684ca12d91a55884ae875c
entity_id: e69fdc243ef4bfa50ddea45d999d21fb
domain: switch
- delay:
hours: 0
minutes: 30
seconds: 0
milliseconds: 0
- type: turn_off
device_id: 41bb4f8cc2684ca12d91a55884ae875c
entity_id: e69fdc243ef4bfa50ddea45d999d21fb
domain: switch
mode: single
Ja, sie steht bei mir auf dem Garagen Dach und nein, das war nicht dauerhaft mit dem Heizkabel.
Und wer Angst vor Vibrationen hat, machts hiermit:
Alarm:
alias: EU08L -> Notify EU08L Alarm
description: ""
trigger:
- platform: numeric_state
entity_id:
- sensor.eu08l_heat_pump_1_error_state
above: 0
condition: []
action:
- action: notify.persistent_notification
metadata: {}
data:
title: ⚠️ Alarm Lambda EU08L
message: "Error State: {{states('sensor.eu08l_heat_pump_1_error_state_map')}}"
data:
notification_id: eu08l_error
- action: notify.mobile_app_iphone
metadata: {}
data:
title: ⚠️ Alarm Lambda EU08L
message: "Error State: {{states('sensor.eu08l_heat_pump_1_error_state_map')}}"
data:
notification_id: eu08l_error
mode: single
Fail Save Heating Circiut 1 Room Temp:
alias: EU08L <- EG Temp
description: ""
trigger:
- platform: state
entity_id:
- sensor.average_temperature_eg
- platform: time_pattern
seconds: /31
condition: []
action:
- data:
hub: EU08L
address: 5004
value:
- >-
{% if states('sensor.average_temperature_eg') != "unknown" and
states('sensor.average_temperature_eg')!= "unavailable" %}
{{ ((states('sensor.average_temperature_eg') |float) | round(1) * 10)|
int | bitwise_and(65535) }} {% else %} {{ (17.7 * 10)| int |
bitwise_and(65535) }} {% endif %}
action: modbus.write_register
mode: single
where 17.7°C in heat pump UI info you, something is wrong with your sensors, but not with automation ;-).
Wenn die Werte unknown
oder unavailable
sind wird 17.7°C Grad geschrieben, somit wird es nicht kalt in der Wohnung wenn der Sensor ausfällt. Brauch ich nicht aber schöne Spielerrei! Hintergrund war am Anfang zu verstehen was, wie mit der Lambda geht und was nicht.
Genau das habe ich ausgewählt, dann kommen die beiden Hochkommata, dazwischen habe ich meinen Code kopiert. Hat leider nicht funktioniert. Da scheint mind. ein Zeichen dabei zu sein, mit dem sich die Code-Formatierung schwer tut...
So mache ich es:
Ändere es oben, das hilft den Anderen.
Zähler für den Abtau-Vorgang. In der configuration.yaml anzugelegen. Dazu habe ich noch einen Helfer angelegt, der mir den Wert für den jeweiligen Kalendertag anzeigt und immer um Mitternacht auf 0 gesetzt wird
- platform: history_stats
name: Abtauen
entity_id: sensor.eu13l_hp1_operating_state_txt
unique_id: 1dc1114c-c3be-4727-85ce-98b0f32dd7cb
state: "Defrost"
type: count
start: "{{ now().replace(hour=0, minute=0, second=0) }}"
end: "{{ now() }}"
Genau das habe ich ausgewählt, dann kommen die beiden Hochkommata, dazwischen habe ich meinen Code kopiert. Hat leider nicht funktioniert. Da scheint mind. ein Zeichen dabei zu sein, mit dem sich die Code-Formatierung schwer tut...
So mache ich es:
- Copy&Paste den YAML Code
- Makiere den YAML Code
- Drück auf <>
- Done!
Ändere es oben, das hilft den Anderen.
Oh mann, die Reihenfolge war falsch... Mit reinkopieren, markieren, dann auf Code klicken, ging es problemlos. Danke! Habs auch oben geändert
Zähler für den Abtau-Vorgang. In der configuration.yaml anzugelegen. Dazu habe ich noch einen Helfer angelegt, der mir den Wert für den jeweiligen Kalendertag anzeigt und immer um Mitternacht auf 0 gesetzt wird
- platform: history_stats name: Abtauen entity_id: sensor.eu13l_hp1_operating_state_txt unique_id: 1dc1114c-c3be-4727-85ce-98b0f32dd7cb state: "Defrost" type: count start: "{{ now().replace(hour=0, minute=0, second=0) }}" end: "{{ now() }}"
Wie zählst Du? WMZ oder Werte aus der Lambda? Ich habe WMZ´s verbaut und lese die mit wmbusmeters, hier kommen starke abweichungen zum tragen, gerade im unteren bereich der Kompressionsrate. Insgesamt stimmen die Werte aber sehr gut.
Fail Save Heating Circiut 1 Room Temp: ... where 17.7°C in heat pump UI info you, something is wrong with your sensors, but not with automation ;-).
Sorry, habe nicht ganz verstanden, wofür die Automation gut ist und was es mit den 17,7° auf sich hat. Etwas mehr Erklärung/Kontext wäre gut.
Neue Modbus Beschreibung: https://lambda-wp.at/wp-content/uploads/2024/09/Modbus-Protokoll-und-Beschreibung.pdf
Neue Modbus Beschreibung: https://lambda-wp.at/wp-content/uploads/2024/09/Modbus-Protokoll-und-Beschreibung.pdf
Interessant. Kurzer Vergleich zur letzten Version:
Hi there,
Since last weekend I've managed to control the heating circuits via NodeRed flow. The update interval is 3 min and up to now it works fine for me. I although try the "Modbus flex write" but I couldn't find an advantage compare the "modbus write" so I'm using the "easier" one.
Here you find the flow I'm using.
[ { "id": "b02b092f4d42b049", "type": "group", "z": "ee317ce86fef7a67", "name": "Steuerung Heizkreis FBH EG&UG (Heating circuit 3)", "style": { "label": true }, "nodes": [ "0f014586e7381b07", "e94d0b6dbd20bb78", "c660fe2c6fa3641b", "84659a08cf773b89", "49464dd03fb9275f", "eaba7477c071e4f8", "6f12fda0f70decb3", "773d3a1c944f74fa", "13c99bc60b6b4e35", "6db53d81cdfbc311", "3a03e6649eb1a9cd", "88ff8a97d25a6735", "b2cee62aa425ba68", "afcdd285a219d676", "a2725d6d49318353" ], "x": 24, "y": 59, "w": 1982, "h": 222 }, { "id": "0f014586e7381b07", "type": "poll-state", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "", "server": "8ed9d0bf.24f6b", "version": 3, "exposeAsEntityConfig": "", "updateInterval": "3", "updateIntervalType": "num", "updateIntervalUnits": "minutes", "outputInitially": true, "outputOnChanged": true, "entityId": "switch.fussbodenverteiler_status", "stateType": "habool", "ifState": "", "ifStateType": "str", "ifStateOperator": "is", "outputs": 1, "outputProperties": [ { "property": "valve", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 500, "y": 180, "wires": [ [ "e94d0b6dbd20bb78" ] ] }, { "id": "e94d0b6dbd20bb78", "type": "switch", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "true / false", "property": "valve", "propertyType": "msg", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 760, "y": 180, "wires": [ [ "a2725d6d49318353" ], [ "afcdd285a219d676" ] ] }, { "id": "c660fe2c6fa3641b", "type": "change", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "3 = AUTO-HEATING(RW)", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "3", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1280, "y": 160, "wires": [ [ "88ff8a97d25a6735" ] ] }, { "id": "84659a08cf773b89", "type": "change", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "5 = FROST(RW)", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "5", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1230, "y": 240, "wires": [ [ "88ff8a97d25a6735" ] ] }, { "id": "49464dd03fb9275f", "type": "change", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "6 = SUMMER(RW)", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "6", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1240, "y": 200, "wires": [ [ "88ff8a97d25a6735" ] ] }, { "id": "eaba7477c071e4f8", "type": "modbus-write", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "Write EU20L_Hc3_Operating_mode", "showStatusActivities": true, "showErrors": true, "showWarnings": true, "unitid": "EU20L", "dataType": "MHoldingRegisters", "adr": "5206", "quantity": "1", "server": "576c70af86fd1bed", "emptyMsgOnFail": true, "keepMsgProperties": true, "delayOnStart": false, "startDelayTime": "", "x": 1710, "y": 180, "wires": [ [ "6f12fda0f70decb3" ], [ "6f12fda0f70decb3" ] ] }, { "id": "6f12fda0f70decb3", "type": "debug", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "debug 47", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1900, "y": 180, "wires": [] }, { "id": "773d3a1c944f74fa", "type": "debug", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "debug 48", "active": false, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1540, "y": 120, "wires": [] }, { "id": "13c99bc60b6b4e35", "type": "inject", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 120, "y": 240, "wires": [ [ "6db53d81cdfbc311" ] ] }, { "id": "6db53d81cdfbc311", "type": "api-current-state", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "", "server": "8ed9d0bf.24f6b", "version": 3, "outputs": 1, "halt_if": "", "halt_if_type": "str", "halt_if_compare": "is", "entity_id": "switch.fussbodenverteiler_status", "state_type": "habool", "blockInputOverrides": false, "outputProperties": [ { "property": "valve", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "for": "0", "forType": "num", "forUnits": "minutes", "override_topic": false, "state_location": "payload", "override_payload": "msg", "entity_location": "data", "override_data": "msg", "x": 540, "y": 240, "wires": [ [ "e94d0b6dbd20bb78" ] ] }, { "id": "3a03e6649eb1a9cd", "type": "change", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "4 = AUTO-COOLING(RW)", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "4", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1280, "y": 120, "wires": [ [ "88ff8a97d25a6735" ] ] }, { "id": "88ff8a97d25a6735", "type": "junction", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "x": 1410, "y": 180, "wires": [ [ "773d3a1c944f74fa", "eaba7477c071e4f8" ] ] }, { "id": "b2cee62aa425ba68", "type": "comment", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "Steuerung Heizkreis FBH EG&UG (Heating circuit 3)", "info": "", "x": 380, "y": 100, "wires": [] }, { "id": "afcdd285a219d676", "type": "ha-switch", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "nodered_cooling", "version": 0, "debugenabled": false, "inputs": 1, "outputs": 2, "entityConfig": "d11a3526b091f5a4", "enableInput": true, "outputOnStateChange": false, "outputProperties": [ { "property": "outputType", "propertyType": "msg", "value": "state change", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 980, "y": 220, "wires": [ [ "49464dd03fb9275f" ], [ "84659a08cf773b89" ] ] }, { "id": "a2725d6d49318353", "type": "ha-switch", "z": "ee317ce86fef7a67", "g": "b02b092f4d42b049", "name": "nodered_cooling", "version": 0, "debugenabled": false, "inputs": 1, "outputs": 2, "entityConfig": "d11a3526b091f5a4", "enableInput": true, "outputOnStateChange": false, "outputProperties": [ { "property": "outputType", "propertyType": "msg", "value": "state change", "valueType": "str" }, { "property": "payload", "propertyType": "msg", "value": "", "valueType": "entityState" } ], "x": 980, "y": 140, "wires": [ [ "3a03e6649eb1a9cd" ], [ "c660fe2c6fa3641b" ] ] }, { "id": "8ed9d0bf.24f6b", "type": "server", "name": "Home Assistant", "addon": true, "rejectUnauthorizedCerts": true, "ha_boolean": "", "connectionDelay": false, "cacheJson": false, "heartbeat": false, "heartbeatInterval": "", "statusSeparator": "", "enableGlobalContextStore": false }, { "id": "576c70af86fd1bed", "type": "modbus-client", "name": "lambda", "clienttype": "tcp", "bufferCommands": true, "stateLogEnabled": true, "queueLogEnabled": true, "failureLogEnabled": true, "tcpHost": "xxx.xxx.xxx.xxx", "tcpPort": "502", "tcpType": "DEFAULT", "serialPort": "/dev/ttyUSB", "serialType": "RTU-BUFFERD", "serialBaudrate": "9600", "serialDatabits": "8", "serialStopbits": "1", "serialParity": "none", "serialConnectionDelay": "100", "serialAsciiResponseStartDelimiter": "0x3A", "unit_id": "1", "commandDelay": "1", "clientTimeout": "1000", "reconnectOnTimeout": true, "reconnectTimeout": "2000", "parallelUnitIdsAllowed": true, "showErrors": true, "showWarnings": true, "showLogs": true }, { "id": "d11a3526b091f5a4", "type": "ha-entity-config", "server": "8ed9d0bf.24f6b", "deviceConfig": "423ef37fa4ec5601", "name": "nodered-switch_cooling", "version": "6", "entityType": "switch", "haConfig": [ { "property": "name", "value": "nodered-switch_cooling" }, { "property": "icon", "value": "" }, { "property": "entity_picture", "value": "" }, { "property": "entity_category", "value": "" }, { "property": "device_class", "value": "switch" } ], "resend": false, "debugEnabled": false }, { "id": "423ef37fa4ec5601", "type": "ha-device-config", "name": "nodered-input", "hwVersion": "", "manufacturer": "Node-RED", "model": "", "swVersion": "" } ]
Hey guys,
I would like to start the hot water preparation with a button. I had thought that this should work
action: modbus.write_register
data:
value:
- 4
hub: EU13L
address: 1015
According to the documentation, the address is writable.
Do you have any ideas on this one?
What ist the problem? Does it not work at all? Does it only work for a short period? Optional question: what is your use case for this?
Unfortunately, it doesn't work at all. No response from the heat pump.
I have the water heated up every morning, as we usually shower in the morning. If we ever shower in the evening, we would simply press the button a few minutes beforehand...
I guess you set the boiler to "normal operation" in the morning and the rest of the day it is at "frost" in the scheduler. I don't know the internal operating rules of the system but this may prevent the heating of the domestic hot water when just setting the modbus value.
Did you verify that value 4 is actually written into register 1015?
Hey @RalfWinter ,
thank you for your help. I am going to try it this evening. If I send the modbus write command, the log files show this
`
2024-11-02 08:54:49.864 ERROR (MainThread) [homeassistant.components.modbus.modbus] Pymodbus: EU13L: Error: device: 0 address: 3005 -> pymodbus returned isError True 2024-11-02 08:55:00.115 ERROR (MainThread) [homeassistant.components.hassio.handler] Client error on /ingress/validate_session request 401, message='Attempt to decode JSON with unexpected mimetype: text/plain; charset=utf-8', url='http://172.30.32.2/ingress/validate_session' 2024-11-02 08:55:00.115 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /ingress/validate_session -
`
This Json-Format works with other addresses...
3005 ist the buffer request type. This goes to max 3, no 4 for DHW.
Has anyone managed to control the operating mode register 5106 for heating circuit 2 via Modbus? Sending values such as OFF (0) to register 5006 (heating circuit 1) is accepted correctly, but sending the same value to register 5106 is ignored by the Lambda controller. Lambda SW Version: V0.0.4-3K Apr 24 2023