[gelöst] ModbusAttr: Fehler beim Schreiben. function code 0x10 als Ursache?

Begonnen von FhemPiUser, 19 Oktober 2023, 10:24:58

Vorheriges Thema - Nächstes Thema

FhemPiUser

Hallo Zusammen,

ich bin dabei meine Lambda-Wärmepumpe per Modbus an fhem anzubinden. Lesen der Holdingregister funktioniert bereits, aber beim Schreiben mit dem u.g. Code für h0102 bekomme ich immer ein Fehler "ungültiger Wert" von der Wärmepumpe.

defmod Lambda_EU13L ModbusAttr 1 55 192.168.x.x:502 TCP
attr Lambda_EU13L closeAfterResponse 0
attr Lambda_EU13L dev-i-combine 16
attr Lambda_EU13L dev-type-S16-len 1
attr Lambda_EU13L dev-type-S16-unpack s>
attr Lambda_EU13L dev-type-S32-len 2
attr Lambda_EU13L dev-type-S32-revRegs 0
attr Lambda_EU13L dev-type-S32-unpack l>
attr Lambda_EU13L dev-type-SL_R2-len 2
attr Lambda_EU13L dev-type-SL_R2-unpack l
attr Lambda_EU13L dev-type-U16-len 1
attr Lambda_EU13L dev-type-U16-revRegs 0
attr Lambda_EU13L dev-type-U16-unpack S>
attr Lambda_EU13L dev-type-U32-len 2
attr Lambda_EU13L dev-type-U32-revRegs 0
attr Lambda_EU13L dev-type-U32-unpack N
attr Lambda_EU13L dev-type-UL_R2-len 2
attr Lambda_EU13L dev-type-UL_R2-revRegs 1
attr Lambda_EU13L dev-type-UL_R2-unpack N
attr Lambda_EU13L event-on-change-reading .*
...
attr Lambda_EU13L obj-h0102-poll 1
attr Lambda_EU13L obj-h0102-reading General_E-Manager_Actual_power
attr Lambda_EU13L obj-h0102-set 1
attr Lambda_EU13L obj-h0102-type S16
...

Laut Lambda Modbusprotokollbeschreibung muss beim Schreiben "function code 0x10 (write multiple holding registers)" verwendet werden. Ist dies bei ModbusAttr mit dem o.g. Code der Fall oder muss ich noch irgendetws einstellen?

FhemPiUser

Log mit verbose 5 ist anbei

2023.10.19 11:13:03.036 4: Lambda_EU13L: set called with General_E-Manager_Actual_power (h0102) setVal = 500
2023.10.19 11:13:03.038 5: Lambda_EU13L: GetSetChecks with force
2023.10.19 11:13:03.039 5: Lambda_EU13L: GetSetChecks returns success
2023.10.19 11:13:03.041 5: Lambda_EU13L: set packed hex 353030 with S> to hex 01f4
2023.10.19 11:13:03.044 4: Lambda_EU13L: DoRequest called from SetLDFn created new request, read buffer empty,
request: id 1, write fc 6 h0102, len 1, value 01f4, tid 182, master device Lambda_EU13L, reading General_E-Manager_Actual_power (set General_E-Manager_Actual_power)
2023.10.19 11:13:03.044 5: Lambda_EU13L: QueueRequest called from DoRequest with h0102, qlen 0 from master Lambda_EU13L through io device Lambda_EU13L
2023.10.19 11:13:03.045 5: Lambda_EU13L: ProcessRequestQueue called from QueueRequest as direct:Lambda_EU13L, qlen 1, force, request: request: id 1, write fc 6 h0102, len 1, value 01f4, tid 182, master device Lambda_EU13L, reading General_E-Manager_Actual_power (set General_E-Manager_Actual_power), queued 0.00 secs ago
2023.10.19 11:13:03.046 5: Lambda_EU13L: checkDelays busDelayRead is not required
2023.10.19 11:13:03.046 5: Lambda_EU13L: checkDelays clientSwitchDelay is not relevant
2023.10.19 11:13:03.047 5: Lambda_EU13L: checkDelays sendDelay, last send to same device was 32.118 secs ago, required delay is 0.1
2023.10.19 11:13:03.047 5: Lambda_EU13L: checkDelays commDelay, last communication with same device was 32.104 secs ago, required delay is 0.1
2023.10.19 11:13:03.050 4: Lambda_EU13L: ProcessRequestQueue (V4.5.5 - 9.5.2023) qlen 1, sending 00b6000000060106006601f4 via 192.168.x.x:502, read buffer empty,
request: id 1, write fc 6 h0102, len 1, value 01f4, tid 182, master device Lambda_EU13L, reading General_E-Manager_Actual_power (set General_E-Manager_Actual_power), queued 0.00 secs ago
2023.10.19 11:13:03.050 5: Lambda_EU13L: Send called from ProcessRequestQueue
2023.10.19 11:13:03.051 5: DevIo_SimpleWrite Lambda_EU13L: 00b6000000060106006601f4
2023.10.19 11:13:03.054 5: Lambda_EU13L: ReadAnswer called from SetLDFn
2023.10.19 11:13:03.056 5: Lambda_EU13L: ReadAnswer remaining timeout is 1.98857092857361
2023.10.19 11:13:03.082 5: Lambda_EU13L: ReadAnswer got: 00b600000003018601
2023.10.19 11:13:03.083 5: Lambda_EU13L: ParseFrameStart called from ReadAnswer protocol TCP expecting id 1
2023.10.19 11:13:03.083 4: Lambda_EU13L: ParseFrameStart (TCP, master) extracted id 1, fCode 134, tid 182, dlen 3 and potential data 01
2023.10.19 11:13:03.084 5: Lambda_EU13L: HandleResponse called from ReadAnswer
2023.10.19 11:13:03.084 5: Lambda_EU13L: HandleResponse is now creating response hash, masterHash is HASH(0x85e6ed0)
2023.10.19 11:13:03.085 5: Lambda_EU13L: HandleResponse is now calling ParseResponse, masterHash is HASH(0x85e6ed0)
2023.10.19 11:13:03.085 5: Lambda_EU13L: createDevInfoCache fc 134 called
2023.10.19 11:13:03.086 5: Lambda_EU13L: ParseResponse called from HandleResponse, fc 134
2023.10.19 11:13:03.086 4: Lambda_EU13L: HandleResponse got response with error code 86 / 01, illegal function
2023.10.19 11:13:03.087 4: Lambda_EU13L: HandleResponse done, current frame / read buffer: 00b600000003018601, id 1, fCode 134, tid 182,
request: id 1, write fc 6 h0102, len 1, value 01f4, tid 182, master device Lambda_EU13L, reading General_E-Manager_Actual_power (set General_E-Manager_Actual_power), queued 0.04 secs ago, sent 0.04 secs ago,
response: id 1, fc 134, error code 01, h0102, len 1
2023.10.19 11:13:03.088 5: Lambda_EU13L: ResetExpect for HandleResponse from response to idle
2023.10.19 11:13:03.091 5: Lambda_EU13L: DropFrame called from ReadAnswer - drop 00b600000003018601
2023.10.19 11:13:18.301 4: Lambda_EU13L: GetUpdate (V4.5.5 - 9.5.2023) called from Fhem internal timer
2023.10.19 11:13:18.302 4: Lambda_EU13L: UpdateTimer called from GetUpdate with cmd next sets timer to call update function in 55.0 sec at 11:14:13.301, interval 55
2023.10.19 11:13:18.307 5: Lambda_EU13L: CreateUpdateHash full object list: h0000 h0001 h0002 h0003 h0004 h0101 h0102 h0103 h0104 h1000 h1001 h1002 h1003 h1004 h1005 h1006 h1007 h1008 h1009 h1010 h1011 h1012 h1013 h1014 h1015 h1016 h1017 h1018 h1019 h1020 h1022 h2000 h2001 h2002 h2003 h2004 h3000 h3001 h3002 h3003 h3004 h5000 h5001 h5002 h5003 h5004 h5005 h5006 h5050 h5051 h5052
2023.10.19 11:13:18.309 5: Lambda_EU13L: CreateUpdateHash will request h0000 len 1 General_Ambient_Error_number
2023.10.19 11:13:18.310 5: Lambda_EU13L: CreateUpdateHash will request h0001 len 1 General_Ambient_Operating_state
...

FhemPiUser

Ahh, habe gerade in der Referenz die Option gefunden

dev-h-write 16
funktioniert es!

Tobias

Hi
In Kürze bekomme ich auch meine Lambda WP.
Könntest du hier deine aktuelle und vollständige Definition hier posten?
Ich habe bisher keine fertige Vorlage gefunden :(
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

FhemPiUser

Hi,

ja, hier meine ModbusAttr Definition meiner Lambda EU13L:

defmod Lambda_EU13L ModbusAttr 1 55 192.168.x.x:502 TCP
attr Lambda_EU13L closeAfterResponse 0
attr Lambda_EU13L dev-h-combine 40
attr Lambda_EU13L dev-h-read 3
attr Lambda_EU13L dev-h-write 16
attr Lambda_EU13L dev-timing-timeout 15
attr Lambda_EU13L dev-type-S16-len 1
attr Lambda_EU13L dev-type-S16-unpack s>
attr Lambda_EU13L dev-type-S32-len 2
attr Lambda_EU13L dev-type-S32-revRegs 0
attr Lambda_EU13L dev-type-S32-unpack l>
attr Lambda_EU13L dev-type-SL_R2-len 2
attr Lambda_EU13L dev-type-SL_R2-unpack l
attr Lambda_EU13L dev-type-U16-len 1
attr Lambda_EU13L dev-type-U16-revRegs 0
attr Lambda_EU13L dev-type-U16-unpack S>
attr Lambda_EU13L dev-type-U32-len 2
attr Lambda_EU13L dev-type-U32-revRegs 0
attr Lambda_EU13L dev-type-U32-unpack N
attr Lambda_EU13L dev-type-UL_R2-len 2
attr Lambda_EU13L dev-type-UL_R2-revRegs 1
attr Lambda_EU13L dev-type-UL_R2-unpack N
attr Lambda_EU13L disable 0
attr Lambda_EU13L event-on-change-reading .*
attr Lambda_EU13L obj-h0000-poll 1
attr Lambda_EU13L obj-h0000-reading General_Ambient_Error_number
attr Lambda_EU13L obj-h0000-type S16
attr Lambda_EU13L obj-h0001-poll 1
attr Lambda_EU13L obj-h0001-reading General_Ambient_Operating_state
attr Lambda_EU13L obj-h0001-type U16
attr Lambda_EU13L obj-h0002-expr $val/10
attr Lambda_EU13L obj-h0002-poll 1
attr Lambda_EU13L obj-h0002-reading General_Ambient_Actual_ambient_temp
attr Lambda_EU13L obj-h0002-type S16
attr Lambda_EU13L obj-h0003-expr $val/10
attr Lambda_EU13L obj-h0003-poll 1
attr Lambda_EU13L obj-h0003-reading General_Ambient_Actual_ambient_temp_1h
attr Lambda_EU13L obj-h0003-type S16
attr Lambda_EU13L obj-h0004-expr $val/10
attr Lambda_EU13L obj-h0004-poll 1
attr Lambda_EU13L obj-h0004-reading General_Ambient_Calculated_ambient_temp
attr Lambda_EU13L obj-h0004-type S16
attr Lambda_EU13L obj-h0100-poll 1
attr Lambda_EU13L obj-h0100-reading General_E-Manager_Error_number
attr Lambda_EU13L obj-h0100-type S16
attr Lambda_EU13L obj-h0101-poll 1
attr Lambda_EU13L obj-h0101-reading General_E-Manager_Operating_state
attr Lambda_EU13L obj-h0101-type U16
attr Lambda_EU13L obj-h0102-poll 1
attr Lambda_EU13L obj-h0102-reading General_E-Manager_Actual_power
attr Lambda_EU13L obj-h0102-set 1
attr Lambda_EU13L obj-h0102-type S16
attr Lambda_EU13L obj-h0103-poll 1
attr Lambda_EU13L obj-h0103-reading General_E-Manager_Actual_power_consumption
attr Lambda_EU13L obj-h0103-type S16
attr Lambda_EU13L obj-h0104-poll 1
attr Lambda_EU13L obj-h0104-reading General_E-Manager_Power_consumption_setpoint
attr Lambda_EU13L obj-h0104-type S16
attr Lambda_EU13L obj-h0200-poll 1
attr Lambda_EU13L obj-h0200-reading General_System_Settings_Display_serial_number
attr Lambda_EU13L obj-h0200-type U32
attr Lambda_EU13L obj-h0206-poll 1
attr Lambda_EU13L obj-h0206-reading General_System_Settings_Application_software_version_1
attr Lambda_EU13L obj-h0206-type U16
attr Lambda_EU13L obj-h0207-poll 1
attr Lambda_EU13L obj-h0207-reading General_System_Settings_Application_software_version_2
attr Lambda_EU13L obj-h0207-type U16
attr Lambda_EU13L obj-h0208-poll 1
attr Lambda_EU13L obj-h0208-reading General_System_Settings_Application_software_version_3
attr Lambda_EU13L obj-h0208-type U16
attr Lambda_EU13L obj-h0209-poll 1
attr Lambda_EU13L obj-h0209-reading General_System_Settings_Application_software_version_4
attr Lambda_EU13L obj-h0209-type U16
attr Lambda_EU13L obj-h0210-poll 1
attr Lambda_EU13L obj-h0210-reading General_System_Settings_Application_software_version_5
attr Lambda_EU13L obj-h0210-type U16
attr Lambda_EU13L obj-h1000-poll 1
attr Lambda_EU13L obj-h1000-reading Hp_Error_state
attr Lambda_EU13L obj-h1000-type U16
attr Lambda_EU13L obj-h1001-poll 1
attr Lambda_EU13L obj-h1001-reading Hp_Error_number
attr Lambda_EU13L obj-h1001-type S16
attr Lambda_EU13L obj-h1002-poll 1
attr Lambda_EU13L obj-h1002-reading Hp_State
attr Lambda_EU13L obj-h1002-type U16
attr Lambda_EU13L obj-h1003-poll 1
attr Lambda_EU13L obj-h1003-reading Hp_Operating_state
attr Lambda_EU13L obj-h1003-type U16
attr Lambda_EU13L obj-h1004-expr $val/100
attr Lambda_EU13L obj-h1004-poll 1
attr Lambda_EU13L obj-h1004-reading Hp_T-flow
attr Lambda_EU13L obj-h1004-type S16
attr Lambda_EU13L obj-h1005-expr $val/100
attr Lambda_EU13L obj-h1005-poll 1
attr Lambda_EU13L obj-h1005-reading Hp_T-return
attr Lambda_EU13L obj-h1005-type S16
attr Lambda_EU13L obj-h1006-expr $val/100
attr Lambda_EU13L obj-h1006-poll 1
attr Lambda_EU13L obj-h1006-reading Hp_Vol_sink
attr Lambda_EU13L obj-h1006-type S16
attr Lambda_EU13L obj-h1007-expr $val/100
attr Lambda_EU13L obj-h1007-poll 1
attr Lambda_EU13L obj-h1007-reading Hp_T-EQin
attr Lambda_EU13L obj-h1007-type S16
attr Lambda_EU13L obj-h1008-expr $val/100
attr Lambda_EU13L obj-h1008-poll 1
attr Lambda_EU13L obj-h1008-reading Hp_T-EQout
attr Lambda_EU13L obj-h1008-type S16
attr Lambda_EU13L obj-h1009-expr $val/100
attr Lambda_EU13L obj-h1009-poll 1
attr Lambda_EU13L obj-h1009-reading Hp_Vol-source
attr Lambda_EU13L obj-h1009-type S16
attr Lambda_EU13L obj-h1010-expr $val/100
attr Lambda_EU13L obj-h1010-poll 1
attr Lambda_EU13L obj-h1010-reading Hp_Compressor-Rating
attr Lambda_EU13L obj-h1010-type U16
attr Lambda_EU13L obj-h1011-expr $val/10
attr Lambda_EU13L obj-h1011-poll 1
attr Lambda_EU13L obj-h1011-reading Hp_QP_heating
attr Lambda_EU13L obj-h1011-type S16
attr Lambda_EU13L obj-h1012-poll 1
attr Lambda_EU13L obj-h1012-reading Hp_FI_power_consumption
attr Lambda_EU13L obj-h1012-type S16
attr Lambda_EU13L obj-h1013-expr $val/100
attr Lambda_EU13L obj-h1013-poll 1
attr Lambda_EU13L obj-h1013-reading COP
attr Lambda_EU13L obj-h1013-type S16
attr Lambda_EU13L obj-h1014-poll 1
attr Lambda_EU13L obj-h1014-reading Hp_Modbus_request_release_password
attr Lambda_EU13L obj-h1014-set 1
attr Lambda_EU13L obj-h1014-type U16
attr Lambda_EU13L obj-h1015-hint 0,1,2,3,4
attr Lambda_EU13L obj-h1015-poll 1
attr Lambda_EU13L obj-h1015-reading Hp_request_type
attr Lambda_EU13L obj-h1015-set 1
attr Lambda_EU13L obj-h1015-type S16
attr Lambda_EU13L obj-h1016-expr $val/10
attr Lambda_EU13L obj-h1016-poll 1
attr Lambda_EU13L obj-h1016-reading Hp_request_flow_line_temp
attr Lambda_EU13L obj-h1016-set 1
attr Lambda_EU13L obj-h1016-setexpr $val*10
attr Lambda_EU13L obj-h1016-type S16
attr Lambda_EU13L obj-h1017-expr $val/10
attr Lambda_EU13L obj-h1017-poll 1
attr Lambda_EU13L obj-h1017-reading Hp_request_return_line_temp
attr Lambda_EU13L obj-h1017-set 1
attr Lambda_EU13L obj-h1017-setexpr $val*10
attr Lambda_EU13L obj-h1017-type S16
attr Lambda_EU13L obj-h1018-expr $val/10
attr Lambda_EU13L obj-h1018-poll 1
attr Lambda_EU13L obj-h1018-reading Hp_request_heat_sink_temp_diff
attr Lambda_EU13L obj-h1018-set 1
attr Lambda_EU13L obj-h1018-setexpr $val*10
attr Lambda_EU13L obj-h1018-type S16
attr Lambda_EU13L obj-h1019-poll 1
attr Lambda_EU13L obj-h1019-reading Hp_relay_state_for_2nd_heating_stage
attr Lambda_EU13L obj-h1019-type S16
attr Lambda_EU13L obj-h1020-poll 1
attr Lambda_EU13L obj-h1020-reading Hp_Statistics_VdA_E_since_last_reset
attr Lambda_EU13L obj-h1020-type S32
attr Lambda_EU13L obj-h1022-poll 1
attr Lambda_EU13L obj-h1022-reading Hp_Statistics_VdA_Q_since_last_reset
attr Lambda_EU13L obj-h1022-type S32
attr Lambda_EU13L obj-h1025-poll 1
attr Lambda_EU13L obj-h1025-reading Hp_VdA_Rating
attr Lambda_EU13L obj-h1025-type U16
attr Lambda_EU13L obj-h1026-expr $val/100
attr Lambda_EU13L obj-h1026-poll 1
attr Lambda_EU13L obj-h1026-reading Hp_Hot_Gas_Temperature
attr Lambda_EU13L obj-h1026-type U16
attr Lambda_EU13L obj-h1027-expr $val/100
attr Lambda_EU13L obj-h1027-poll 1
attr Lambda_EU13L obj-h1027-reading Hp_Subcooling_Temperature
attr Lambda_EU13L obj-h1027-type U16
attr Lambda_EU13L obj-h1028-expr $val/100
attr Lambda_EU13L obj-h1028-poll 1
attr Lambda_EU13L obj-h1028-reading Hp_Suction_Gas_Temperature
attr Lambda_EU13L obj-h1028-type S16
attr Lambda_EU13L obj-h1029-expr $val/100
attr Lambda_EU13L obj-h1029-poll 1
attr Lambda_EU13L obj-h1029-reading Hp_Condensation_Temperature
attr Lambda_EU13L obj-h1029-type U16
attr Lambda_EU13L obj-h1030-expr $val/100
attr Lambda_EU13L obj-h1030-poll 1
attr Lambda_EU13L obj-h1030-reading Hp_Evaporation_Temperature
attr Lambda_EU13L obj-h1030-type S16
attr Lambda_EU13L obj-h1031-poll 1
attr Lambda_EU13L obj-h1031-reading Hp_EqM_Rating
attr Lambda_EU13L obj-h1031-type U16
attr Lambda_EU13L obj-h1032-expr $val/100
attr Lambda_EU13L obj-h1032-poll 1
attr Lambda_EU13L obj-h1032-reading Hp_Expansion_Valve_Opening_Angle
attr Lambda_EU13L obj-h1032-type U16
attr Lambda_EU13L obj-h1051-expr $val/10
attr Lambda_EU13L obj-h1051-poll 1
attr Lambda_EU13L obj-h1051-reading Hp_DHW_Output_Power_at_15C
attr Lambda_EU13L obj-h1051-set 1
attr Lambda_EU13L obj-h1051-setexpr $val*10
attr Lambda_EU13L obj-h1051-type u16
attr Lambda_EU13L obj-h1052-expr $val/10
attr Lambda_EU13L obj-h1052-poll 1
attr Lambda_EU13L obj-h1052-reading Hp_Heating_Min_Output_Power_at_15C
attr Lambda_EU13L obj-h1052-set 1
attr Lambda_EU13L obj-h1052-setexpr $val*10
attr Lambda_EU13L obj-h1052-type u16
attr Lambda_EU13L obj-h1053-expr $val/10
attr Lambda_EU13L obj-h1053-poll 1
attr Lambda_EU13L obj-h1053-reading Hp_Heating_Max_Output_Power_at_15C
attr Lambda_EU13L obj-h1053-set 1
attr Lambda_EU13L obj-h1053-setexpr $val*10
attr Lambda_EU13L obj-h1053-type u16
attr Lambda_EU13L obj-h1054-expr $val/10
attr Lambda_EU13L obj-h1054-poll 1
attr Lambda_EU13L obj-h1054-reading Hp_Heating_Min_Output_Power_at_0C
attr Lambda_EU13L obj-h1054-set 1
attr Lambda_EU13L obj-h1054-setexpr $val*10
attr Lambda_EU13L obj-h1054-type u16
attr Lambda_EU13L obj-h1055-expr $val/10
attr Lambda_EU13L obj-h1055-poll 1
attr Lambda_EU13L obj-h1055-reading Hp_Heating_Max_Output_Power_at_0C
attr Lambda_EU13L obj-h1055-set 1
attr Lambda_EU13L obj-h1055-setexpr $val*10
attr Lambda_EU13L obj-h1055-type u16
attr Lambda_EU13L obj-h1056-expr $val/10
attr Lambda_EU13L obj-h1056-poll 1
attr Lambda_EU13L obj-h1056-reading Hp_Heating_Min_Output_Power_at_-15C
attr Lambda_EU13L obj-h1056-set 1
attr Lambda_EU13L obj-h1056-setexpr $val*10
attr Lambda_EU13L obj-h1056-type u16
attr Lambda_EU13L obj-h1057-expr $val/10
attr Lambda_EU13L obj-h1057-poll 1
attr Lambda_EU13L obj-h1057-reading Hp_Heating_Max_Output_Power_at_-15C
attr Lambda_EU13L obj-h1057-set 1
attr Lambda_EU13L obj-h1057-setexpr $val*10
attr Lambda_EU13L obj-h1057-type u16
attr Lambda_EU13L obj-h2000-poll 1
attr Lambda_EU13L obj-h2000-reading Boiler_Error_number
attr Lambda_EU13L obj-h2000-type S16
attr Lambda_EU13L obj-h2001-poll 1
attr Lambda_EU13L obj-h2001-reading Boiler_Operating_state
attr Lambda_EU13L obj-h2001-type U16
attr Lambda_EU13L obj-h2002-expr $val/10
attr Lambda_EU13L obj-h2002-poll 1
attr Lambda_EU13L obj-h2002-reading Boiler_Actual_high_temp
attr Lambda_EU13L obj-h2002-type S16
attr Lambda_EU13L obj-h2003-expr $val/10
attr Lambda_EU13L obj-h2003-poll 1
attr Lambda_EU13L obj-h2003-reading Boiler_Actual_low_temp
attr Lambda_EU13L obj-h2003-type S16
attr Lambda_EU13L obj-h2050-expr $val/10
attr Lambda_EU13L obj-h2050-poll 1
attr Lambda_EU13L obj-h2050-reading Boiler_Maximum_boiler_temp
attr Lambda_EU13L obj-h2050-set 1
attr Lambda_EU13L obj-h2050-setexpr $val*10
attr Lambda_EU13L obj-h2050-type S16
attr Lambda_EU13L obj-h3000-poll 1
attr Lambda_EU13L obj-h3000-reading Buffer_Error_number
attr Lambda_EU13L obj-h3000-type S16
attr Lambda_EU13L obj-h3001-poll 1
attr Lambda_EU13L obj-h3001-reading Buffer_Operating_state
attr Lambda_EU13L obj-h3001-type U16
attr Lambda_EU13L obj-h3002-expr $val/10
attr Lambda_EU13L obj-h3002-poll 1
attr Lambda_EU13L obj-h3002-reading Buffer_Actual_high_temp
attr Lambda_EU13L obj-h3002-type S16
attr Lambda_EU13L obj-h3003-expr $val/10
attr Lambda_EU13L obj-h3003-poll 1
attr Lambda_EU13L obj-h3003-reading Buffer_Actual_low_temp
attr Lambda_EU13L obj-h3003-type S16
attr Lambda_EU13L obj-h3050-expr $val/10
attr Lambda_EU13L obj-h3050-poll 1
attr Lambda_EU13L obj-h3050-reading Buffer_Maximum_buffer_temp
attr Lambda_EU13L obj-h3050-set 1
attr Lambda_EU13L obj-h3050-setexpr $val*10
attr Lambda_EU13L obj-h3050-type S16
attr Lambda_EU13L obj-h5000-poll 1
attr Lambda_EU13L obj-h5000-reading Heating_circuit_Error_number
attr Lambda_EU13L obj-h5000-type S16
attr Lambda_EU13L obj-h5001-poll 1
attr Lambda_EU13L obj-h5001-reading Heating_circuit_Operating_state
attr Lambda_EU13L obj-h5001-type U16
attr Lambda_EU13L obj-h5002-expr $val/10
attr Lambda_EU13L obj-h5002-poll 1
attr Lambda_EU13L obj-h5002-reading Heating_circuit_Flow_line_temp
attr Lambda_EU13L obj-h5002-type S16
attr Lambda_EU13L obj-h5003-expr $val/10
attr Lambda_EU13L obj-h5003-poll 1
attr Lambda_EU13L obj-h5003-reading Heating_circuit_Return_line_temp
attr Lambda_EU13L obj-h5003-type S16
attr Lambda_EU13L obj-h5004-expr $val/10
attr Lambda_EU13L obj-h5004-poll 1
attr Lambda_EU13L obj-h5004-reading Heating_circuit_Room_device_temp
attr Lambda_EU13L obj-h5004-set 1
attr Lambda_EU13L obj-h5004-setexpr $val*10
attr Lambda_EU13L obj-h5004-type S16
attr Lambda_EU13L obj-h5005-expr $val/10
attr Lambda_EU13L obj-h5005-poll 1
attr Lambda_EU13L obj-h5005-reading Heating_circuit_Setpoint_flow_line_temp
attr Lambda_EU13L obj-h5005-set 1
attr Lambda_EU13L obj-h5005-setexpr $val*10
attr Lambda_EU13L obj-h5005-type S16
attr Lambda_EU13L obj-h5006-hint 0,1,2,3,4,5,6,7
attr Lambda_EU13L obj-h5006-poll 1
attr Lambda_EU13L obj-h5006-reading Heating_circuit_Operating_mode
attr Lambda_EU13L obj-h5006-set 1
attr Lambda_EU13L obj-h5006-type S16
attr Lambda_EU13L obj-h5050-expr $val/10
attr Lambda_EU13L obj-h5050-poll 1
attr Lambda_EU13L obj-h5050-reading Heating_circuit_Offset_flow_line_temp_setpoint
attr Lambda_EU13L obj-h5050-set 1
attr Lambda_EU13L obj-h5050-setexpr $val*10
attr Lambda_EU13L obj-h5050-type S16
attr Lambda_EU13L obj-h5051-expr $val/10
attr Lambda_EU13L obj-h5051-poll 1
attr Lambda_EU13L obj-h5051-reading Heating_circuit_Setpoint_room_heating_temp
attr Lambda_EU13L obj-h5051-set 1
attr Lambda_EU13L obj-h5051-setexpr $val*10
attr Lambda_EU13L obj-h5051-type S16
attr Lambda_EU13L obj-h5052-expr $val/10
attr Lambda_EU13L obj-h5052-poll 1
attr Lambda_EU13L obj-h5052-reading Heating_circuit_Setpoint_room_cooling_temp
attr Lambda_EU13L obj-h5052-set 1
attr Lambda_EU13L obj-h5052-setexpr $val*10
attr Lambda_EU13L obj-h5052-type S16
attr Lambda_EU13L oldreadings Hp_QP_heating,Heating_circuit_Room_device_temp
attr Lambda_EU13L room Lambda
attr Lambda_EU13L showError 1
attr Lambda_EU13L silentReconnect 0
attr Lambda_EU13L userReadings General_Ambient_Operating_state_text {if (ReadingsVal("Lambda_EU13L","General_Ambient_Operating_state","0") == 0) {return "Off";;} \
elsif (ReadingsVal("Lambda_EU13L","General_Ambient_Operating_state","0") == 1) {return "Automatic";;} \
elsif (ReadingsVal("Lambda_EU13L","General_Ambient_Operating_state","0") == 2) {return "Manual";;} \
elsif (ReadingsVal("Lambda_EU13L","General_Ambient_Operating_state","0") == 3) {return "Error";;} \
else {return "unknown";;}},\
General_E-Manager_Operating_state_text {if (ReadingsVal("Lambda_EU13L","General_E-Manager_Operating_state","0") == 0) {return "Off";;} \
elsif (ReadingsVal("Lambda_EU13L","General_E-Manager_Operating_state","0") == 1) {return "Automatic";;} \
elsif (ReadingsVal("Lambda_EU13L","General_E-Manager_Operating_state","0") == 2) {return "Manual";;} \
elsif (ReadingsVal("Lambda_EU13L","General_E-Manager_Operating_state","0") == 3) {return "Error";;} \
elsif (ReadingsVal("Lambda_EU13L","General_E-Manager_Operating_state","0") == 4) {return "Offline";;} \
else {return "unknown";;}},\
Hp_Error_state_text {if (ReadingsVal("Lambda_EU13L","Hp_Error_state","0") == 0) {return "None";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Error_state","0") == 1) {return "Message";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Error_state","0") == 2) {return "Warning";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Error_state","0") == 3) {return "Alarm";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Error_state","0") == 4) {return "Fault";;} \
else {return "unknown";;}},\
Hp_state_text {if (ReadingsVal("Lambda_EU13L","Hp_state","0") == 0) {return "Init";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 1) {return "Reference";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 2) {return "Restart-Block";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 3) {return "Ready";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 4) {return "Start Pumps";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 5) {return "Start Compressor";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 6) {return "Pre-Regulation";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 7) {return "Regulation";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 8) {return "Not used";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 9) {return "Cooling";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 10) {return "Defrosting";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 20) {return "Stopping";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 30) {return "Fault-Lock";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 31) {return "Alarm-Block";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_state","0") == 40) {return "Error-Reset";;} \
else {return "unknown";;}},\
Hp_Operating_state_text {if (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 0) {return "STDBY";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 1) {return "CH";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 2) {return "DHW";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 3) {return "CC";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 4) {return "Circulate";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 5) {return "Defrost";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 6) {return "Off";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 7) {return "Frost";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 8) {return "STDBY-Frost";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 9) {return "Not used";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 10) {return "Summer";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 11) {return "Holiday";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 12) {return "Error";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 13) {return "Warning";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 14) {return "Info-message";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 15) {return "Time-Block";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 16) {return "Release-Block";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 17) {return "Mintemp-Block";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Operating_state","0") == 18) {return "Firmware-Download";;} \
else {return "unknown";;}},\
Hp_Request_type_text {if (ReadingsVal("Lambda_EU13L","Hp_Request_type","0") == 0) {return "No Request";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Request_type","0") == 1) {return "Flow Pump Circulation";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Request_type","0") == 2) {return "Central Heating";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Request_type","0") == 3) {return "Central Cooling";;} \
elsif (ReadingsVal("Lambda_EU13L","Hp_Request_type","0") == 4) {return "Domestic hot water";;} \
else {return "unknown";;}},\
Boiler_Operating_state_text {if (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 0) {return "STDBY";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 1) {return "DHW";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 2) {return "Legio";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 3) {return "Summer";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 4) {return "Frost";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 5) {return "Holiday";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 6) {return "Prio-Stop";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 7) {return "Error";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 8) {return "Off";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 9) {return "Prompt-DHW";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 10) {return "Trailing-stop";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 11) {return "Temp-Lock";;} \
elsif (ReadingsVal("Lambda_EU13L","Boiler_Operating_state","0") == 12) {return "Stdby-Frost";;} \
else {return "unknown";;}},\
Buffer_Operating_state_text {if (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 0) {return "STDBY";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 1) {return "Heating";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 2) {return "Cooling";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 3) {return "Summer";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 4) {return "Frost";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 5) {return "Holiday";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 6) {return "Prio-Stop";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 7) {return "Error";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 8) {return "Off";;} \
elsif (ReadingsVal("Lambda_EU13L","Buffer_Operating_state","0") == 9) {return "Standy-Frost";;} \
else {return "unknown";;}},\
Heating_circuit_Operating_state_text {if (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 0) {return "Heating";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 1) {return "Eco";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 2) {return "Cooling";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 3) {return "Floordry";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 4) {return "Frost";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 5) {return "Max-Temp";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 6) {return "Error";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 7) {return "Service";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 8) {return "Holiday";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 9) {return "CH-Summer";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 10) {return "CC-Winter";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 11) {return "Prio-Stop";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 12) {return "Off";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 13) {return "Release-Off";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 14) {return "Time-off";;} \
elsif\
(ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 15) {return "Stdby";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 16) {return "Stdby-Heating";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 17) {return "Stdby-Eco";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 18) {return "Stdby-Cooling";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 19) {return "Stdby-Frost";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_state","0") == 20) {return "Stdby-Floordry";;} \
else {return "unknown";;}},\
Heating_circuit_Operating_mode_text {if (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 0) {return "Off(rw)";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 1) {return "Manual(r)";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 2) {return "Automatic(rw)";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 3) {return "Auto-heating(rw)";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 4) {return "Auto-cooling(rw)";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 5) {return "Frost(rw)";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 6) {return "Summer(rw)";;} \
elsif (ReadingsVal("Lambda_EU13L","Heating_circuit_Operating_mode","0") == 7) {return "Floor-dry(r)";;}  \
else {return "unknown";;}},\
Anzahl_Takte:Hp_QP_heating.* { (((OldReadingsVal("Lambda_EU13L","Hp_QP_heating","0") <= 0) and (ReadingsVal("Lambda_EU13L","Hp_QP_heating","0") > 0)) ? (return (ReadingsVal("Lambda_EU13L","Anzahl_Takte","0") + 1)) : (return undef));;;; },\
statHp_Statistics_COP_since_last_resetDay:statHp_Statistics_VdA_Q_since_last_resetDay.* { if (ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetDay","0") == 0) { return 0;;;; } \
else { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetDay","0")/ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetDay","1")));;;; }},\
statHp_Statistics_COP_since_last_resetMonth:statHp_Statistics_VdA_Q_since_last_resetMonth.* { if (ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetMonth","0") == 0) { return 0;;;; } \
else { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetMonth","0")/ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetMonth","1")));;;; }},\
statHp_Statistics_COP_since_last_resetYear:statHp_Statistics_VdA_Q_since_last_resetYear.* { if (ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetYear","0") == 0) { return 0;;;; } \
else { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetYear","0")/ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetYear","1")));;;; }},\
statHp_Statistics_COP_since_last_resetDayLast:statHp_Statistics_VdA_Q_since_last_resetDayLast.* { if (ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetDayLast","0") == 0) { return 0;;;; } \
else { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetDayLast","0")/ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetDayLast","1")));;;; }},\
statHp_Statistics_COP_since_last_resetMonthLast:statHp_Statistics_VdA_Q_since_last_resetMonthLast.* { if (ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetMonthLast","0") == 0) { return 0;;;; } \
else { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetMonthLast","0")/ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetMonthLast","1")));;;; }},\
statHp_Statistics_COP_since_last_resetYearLast:statHp_Statistics_VdA_Q_since_last_resetYearLast.* { if (ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetYearLast","0") == 0) { return 0;;;; } \
else { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetYearLast","0")/ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetYearLast","1")));;;; }},\
Hp_Statistics_COP_since_last_reset:Hp_Statistics_VdA_Q_since_last_reset.* { if (ReadingsVal("Lambda_EU13L","Hp_Statistics_VdA_E_since_last_reset","0") == 0) { return 0;;;; } \
else { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","Hp_Statistics_VdA_Q_since_last_reset","0")/ReadingsVal("Lambda_EU13L","Hp_Statistics_VdA_E_since_last_reset","1")));;;; }}, \
VdA_E_Day_kW:statHp_Statistics_VdA_E_since_last_resetDay.* { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetDay","0")/1000));;;;},\
VdA_Q_Day_kW:statHp_Statistics_VdA_Q_since_last_resetDay.* { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetDay","0")/1000));;;;},\
VdA_E_DayLast_kW:statHp_Statistics_VdA_E_since_last_resetDayLast.* { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_E_since_last_resetDayLast","0")/1000));;;;},\
VdA_Q_DayLast_kW:statHp_Statistics_VdA_Q_since_last_resetDayLast.* { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_VdA_Q_since_last_resetDayLast","0")/1000));;;;},\
COP_Day:statHp_Statistics_COP_since_last_resetDay.* { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_COP_since_last_resetDay","0")));;;;},\
COP_DayLast:statHp_Statistics_COP_since_last_resetDayLast.* { return sprintf("%.1f",(ReadingsVal("Lambda_EU13L","statHp_Statistics_COP_since_last_resetDayLast","0")));;;;},\
Hp_Heating_Max_Output_Power_calculated:General_Ambient_Calculated_ambient_temp.* {\
  my $temp = ReadingsVal("Lambda_EU13L","General_Ambient_Calculated_ambient_temp","0");;\
  my $maxPower = 13;;\
  \
  if ($temp < 0) {\
$maxPower = ReadingsVal("Lambda_EU13L","Hp_Heating_Max_Output_Power_at_0C","10")+((ReadingsVal("Lambda_EU13L","Hp_Heating_Max_Output_Power_at_-15C","13")-ReadingsVal("Lambda_EU13L","Hp_Heating_Max_Output_Power_at_0C","10"))*abs($temp/15));;\
  } elsif ($temp < 15) {\
$maxPower = ReadingsVal("Lambda_EU13L","Hp_Heating_Max_Output_Power_at_15C","5")+((ReadingsVal("Lambda_EU13L","Hp_Heating_Max_Output_Power_at_0C","10")-ReadingsVal("Lambda_EU13L","Hp_Heating_Max_Output_Power_at_15C","5"))*abs(1-$temp/15));;\
  } else {\
    $maxPower = ReadingsVal("Lambda_EU13L","Hp_Heating_Max_Output_Power_at_15C","5");;\
  } \
  \
  return sprintf("%.1f",$maxPower);;\
},Hp_Heating_Min_Output_Power_calculated:General_Ambient_Calculated_ambient_temp.* {\
  my $temp = ReadingsVal("Lambda_EU13L","General_Ambient_Calculated_ambient_temp","0");;\
  my $minPower = 1.4;;\
  \
  if ($temp < 0) {\
$minPower = ReadingsVal("Lambda_EU13L","Hp_Heating_Min_Output_Power_at_0C","6")+((ReadingsVal("Lambda_EU13L","Hp_Heating_Min_Output_Power_at_-15C","8")-ReadingsVal("Lambda_EU13L","Hp_Heating_Min_Output_Power_at_0C","6"))*abs($temp/15));;\
  } elsif ($temp < 15) {\
$minPower = ReadingsVal("Lambda_EU13L","Hp_Heating_Min_Output_Power_at_15C","1.4")+((ReadingsVal("Lambda_EU13L","Hp_Heating_Min_Output_Power_at_0C","6")-ReadingsVal("Lambda_EU13L","Hp_Heating_Min_Output_Power_at_15C","1.4"))*abs(1-$temp/15));;\
  } else {\
    $minPower = ReadingsVal("Lambda_EU13L","Hp_Heating_Min_Output_Power_at_15C","1.4");;\
  } \
  \
  return sprintf("%.1f",$minPower);;\
},Soll_VLT_Heizkurve:(General_Ambient_Calculated_ambient_temp.*|Heating_circuit_Room_device_temp.*) {\
  my $at_high  = 22;;     \
  my $vlt_high = 23;;     \
\
  my $at_mid   = 0;;      \
  my $vlt_mid  = 41;;     \
\
  my $at_low   = -22;;    \
  my $vlt_low  = 51;;     \
\
  my $vlt_min  = 20;;     \
  my $vlt_max  = 55;;    \
\
  my $room_set = 21;;     \
  my $room_fac = 1;;      \
\
\
  my $at = ReadingsNum(\
    "Lambda_EU13L",\
    "General_Ambient_Calculated_ambient_temp",\
    0\
  );;\
\
  my $room_is = ReadingsNum(\
    "Lambda_EU13L",\
    "Heating_circuit_Room_device_temp",\
    $room_set\
  );;\
  \
  my $room_is_old = OldReadingsNum(\
    "Lambda_EU13L",\
    "Heating_circuit_Room_device_temp",\
    $room_set\
  );;\
  \
 \
  if ($room_is < 0) {\
  $room_is = $room_is_old;;\
  }\
  \
  if ($room_is < 0) {\
  $room_is = $room_set;;\
  }\
\
  my ($m, $vlt);;\
\
  if ($at >= $at_mid) {\
    $m = ($vlt_mid - $vlt_high) / ($at_mid - $at_high);;\
    $vlt = $vlt_mid + $m * ($at - $at_mid);;\
  } else {\
    $m = ($vlt_low - $vlt_mid) / ($at_low - $at_mid);;\
    $vlt = $vlt_mid + $m * ($at - $at_mid);;\
  }\
\
  my $room_corr = ($room_set - $room_is) * $room_fac;;\
  $vlt += $room_corr;;\
\
  #Debug "VLT-Debug: AT=$at Room_is=$room_is Room_corr=$room_corr VLT_raw=$vlt";;\
\
  $vlt = $vlt_min if ($vlt < $vlt_min);;\
  $vlt = $vlt_max if ($vlt > $vlt_max);;\
\
  sprintf("%.1f", $vlt);;\
}