Writing a component for Luxtronik Heatpumps

To clarify: what I did in my code was this (pseudocode)

...
if(ID_WEB_WP_BZ_akt == 5)
  if(ID_WEB_HauptMenuStatus_Zeile3 == 10)
    return 'cooling';
  else
    return 'no request'
...

Did this because it seems like it couldn’t be only dependent on one single variable.

Check, but also the AlphaApp displays No request.

I’m 100% sure that my heatpump is cooling at the moment. I can see that on the RBE unit but also on the Temperatures and the status of the Pumps.

At my situation the ID_WEB_HauptMenuStatus_Zeile3 parameter isn’t the actual status. It look like a status from far far far ago.

Zeile3 is the actual status on my device. It works fine displaying cooling. Maybe the protocol is somewhat different? Have you restarted the heatpump yet?

I think zeile3 might be the internally used text buffer to display on the Luxtronik display on the heatpump. So if the display is not on the specific page that shows the status, it might not be updated.

Hi guys,

I just pushed a small update to my component, it breaks the config but in my opinion its worth it:

  • the domain is now luxtronik
  • its now possible to define a friendly_name for a given sensor
  • binary_sensors can now be inverted by setting invert: true
  • I added default icons for every sensor type which can be overridden by setting icon: “mdi:flash” for example

Let me know what you think and if you tested the new changes.

I also tried to ceck the issues with the cooling but my pump does not show anything that indicates cooling, at least I’ve not yet found it :upside_down_face:

Here is a quick overview:

@Bouni

I’ve download the three new .py files and changed my config but got errors when restarting .

luxtronik:
host: “192.168.4.55”
port: 8889

binary_sensor:

  • platform: luxtronik
    scan_interval: 60
    sensors:
    • id: ID_WEB_VBOout #brinepomp / Ventilator
    • id: ID_WEB_VD1out #Compressor 1
    • id: ID_WEB_VENout
    • id: ID_WEB_ZIPout
    • id: ID_WEB_ZUPout
    • id: ID_WEB_BWTin
    • id: ID_WEB_HDin
    • id: ID_WEB_MOTin
    • id: ID_WEB_NDin
    • id: ID_WEB_BUPout
    • id: ID_WEB_HUPout
    • id: ID_WEB_FreigabKuehl

sensor:

  • platform: luxtronik
    scan_interval: 60
    sensors:
    • id: ID_WEB_Temperatur_TVL #Aanvoer friendly_name: Temperatur Vorlauf
    • id: ID_WEB_Temperatur_TRL
    • id: ID_WEB_Sollwert_TRL_HZ
    • id: ID_WEB_Temperatur_TA
    • id: ID_WEB_Temperatur_TBW
    • id: ID_WEB_Einst_BWS_akt
    • id: ID_WEB_Time_WPein_akt
    • id: ID_WEB_Temperatur_TWE
    • id: ID_WEB_Temperatur_TWA
    • id: ID_WEB_Code_WP_akt
    • id: ID_WEB_Zaehler_BetrZeitWP
    • id: ID_WEB_Zaehler_BetrZeitKue
    • id: ID_WEB_Zaehler_BetrZeitBW
    • id: ID_WEB_Zaehler_BetrZeitHz
    • id: ID_WEB_RBE_RT_Ist
    • id: ID_WEB_RBE_RT_Soll
    • id: ID_WEB_WMZ_Heizung
    • id: ID_WEB_WMZ_Brauchwasser
    • id: ID_WEB_WP_BZ_akt
    • id: ID_WEB_Temperatur_THG
    • id: ID_WEB_Zaehler_BetrZeitImpVD1
    • id: ID_WEB_Freq_VD
    • id: ID_WEB_HZIO_PWM
    • id: ID_WEB_VD1out
    • id: ID_WEB_Time_LGS_akt
    • id: ID_WEB_Switchoff_file_Nr0
    • id: ID_WEB_HauptMenuStatus_Zeile1
    • id: ID_WEB_HauptMenuStatus_Zeile2
    • id: ID_WEB_HauptMenuStatus_Zeile3

I got this error when restarting:

Invalid config for [sensor.luxtronik]: value should be a string @ data['sensors'][0]. Got OrderedDict([('id', 'ID_WEB_Temperatur_TVL')])
value should be a string @ data['sensors'][10]. Got OrderedDict([('id', 'ID_WEB_Zaehler_BetrZeitWP')])
value should be a string @ data['sensors'][11]. Got OrderedDict([('id', 'ID_WEB_Zaehler_BetrZeitKue')])
value should be a string @ data['sensors'][12]. Got OrderedDict([('id', 'ID_WEB_Zaehler_BetrZeitBW')])
value should be a string @ data['sensors'][13]. Got OrderedDict([('id', 'ID_WEB_Zaehler_BetrZeitHz')])
value should be a string @ data['sensors'][14]. Got OrderedDict([('id', 'ID_WEB_RBE_RT_Ist')])
value should be a string @ data['sensors'][15]. Got OrderedDict([('id', 'ID_WEB_RBE_RT_Soll')])
value should be a string @ data['sensors'][16]. Got OrderedDict([('id', 'ID_WEB_WMZ_Heizung')])
value should be a string @ data['sensors'][17]. Got OrderedDict([('id', 'ID_WEB_WMZ_Brauchwasser')])
value should be a string @ data['sensors'][18]. Got OrderedDict([('id', 'ID_WEB_WP_BZ_akt')])
value should be a string @ data['sensors'][19]. Got OrderedDict([('id', 'ID_WEB_Temperatur_THG')])
value should be a string @ data['sensors'][1]. Got OrderedDict([('id', 'ID_WEB_Temperatur_TRL')])
value should be a string @ data['sensors'][20]. Got OrderedDict([('id', 'ID_WEB_Zaehler_BetrZeitImpVD1')])
value should be a string @ data['sensors'][21]. Got OrderedDict([('id', 'ID_WEB_Freq_VD')])
value should be a string @ data['sensors'][22]. Got OrderedDict([('id', 'ID_WEB_HZIO_PWM')])
value should be a string @ data['sensors'][23]. Got OrderedDict([('id', 'ID_WEB_VD1out')])
value should be a string @ data['sensors'][24]. Got OrderedDict([('id', 'ID_WEB_Time_LGS_akt')])
value should be a string @ data['sensors'][25]. Got OrderedDict([('id', 'ID_WEB_Switchoff_file_Nr0')])
value should be a string @ data['sensors'][26]. Got OrderedDict([('id', 'ID_WEB_HauptMenuStatus_Zeile1')])
value should be a string @ data['sensors'][27]. Got OrderedDict([('id', 'ID_WEB_HauptMenuStatus_Zeile2')])
value should be a string @ data['sensors'][28]. Got OrderedDict([('id', 'ID_WEB_HauptMenuStatus_Zeile3')])
value should be a string @ data['sensors'][2]. Got OrderedDict([('id', 'ID_WEB_Sollwert_TRL_HZ')])
value should be a string @ data['sensors'][3]. Got OrderedDict([('id', 'ID_WEB_Temperatur_TA')])
value should be a string @ data['sensors'][4]. Got OrderedDict([('id', 'ID_WEB_Temperatur_TBW')])
value should be a string @ data['sensors'][5]. Got OrderedDict([('id', 'ID_WEB_Einst_BWS_akt')])
value should be a string @ data['sensors'][6]. Got OrderedDict([('id', 'ID_WEB_Time_WPein_akt')])
value should be a string @ data['sensors'][7]. Got OrderedDict([('id', 'ID_WEB_Temperatur_TWE')])
value should be a string @ data['sensors'][8]. Got OrderedDict([('id', 'ID_WEB_Temperatur_TWA')])
value should be a string @ data['sensors'][9]. Got OrderedDict([('id', 'ID_WEB_Code_WP_akt')]). (See ?, line ?). Please check the docs at https://home-assistant.io/components/sensor.luxtronik/
Invalid config for [binary_sensor.luxtronik]: value should be a string @ data['sensors'][0]. Got OrderedDict([('id', 'ID_WEB_VBOout')])
value should be a string @ data['sensors'][10]. Got OrderedDict([('id', 'ID_WEB_HUPout')])
value should be a string @ data['sensors'][11]. Got OrderedDict([('id', 'ID_WEB_FreigabKuehl')])
value should be a string @ data['sensors'][1]. Got OrderedDict([('id', 'ID_WEB_VD1out')])
value should be a string @ data['sensors'][2]. Got OrderedDict([('id', 'ID_WEB_VENout')])
value should be a string @ data['sensors'][3]. Got OrderedDict([('id', 'ID_WEB_ZIPout')])
value should be a string @ data['sensors'][4]. Got OrderedDict([('id', 'ID_WEB_ZUPout')])
value should be a string @ data['sensors'][5]. Got OrderedDict([('id', 'ID_WEB_BWTin')])
value should be a string @ data['sensors'][6]. Got OrderedDict([('id', 'ID_WEB_HDin')])
value should be a string @ data['sensors'][7]. Got OrderedDict([('id', 'ID_WEB_MOTin')])
value should be a string @ data['sensors'][8]. Got OrderedDict([('id', 'ID_WEB_NDin')])
value should be a string @ data['sensors'][9]. Got OrderedDict([('id', 'ID_WEB_BUPout')]). (See ?, line ?). Please check the docs at https://home-assistant.io/components/binary_sensor.luxtronik/

I tried to change the values with qoutes for string, but that gives the same error:

  - platform: luxtronik
    scan_interval: 60
    sensors:
      - id: "ID_WEB_Temperatur_TVL" #Aanvoer 
        name: "Temperatur Vorlauf"

So what’s wrong with my configsection?

Problem solved. I think something with caching of the old .py files. Now I will play with the changes you made in the last release. Thanks for doing this great work.

Thanks for your great work on this component ! I’ll install soon a heat pump Alpha Innotec SWC 82K3, so I’ll be able to test it !

Do you still plan to make it an official component ?

Hi,

Do you still plan to make it an official component ?

Yes, the only issue is my limited time :sweat_smile:

Hi everyone,

the luxtronik component is on its way!

During Hacktober I’ll create a pull request for an official component.

I defenitely will create a service for writing to the heatpump and change settings.
In order to do so It would be nice to know what values you guys want to be able to change.
In my opinion its to dangerous to let user change all parameters, especially because all this is based on reverse engeneering.
For a lot of parameters is completely unknown what they do.

I started reversing the Android App to see what values the user can change through the app.

These are the parameters that are used in the app:

1:      "heating_temperature_tolerance"             Int
3:      "heating_heating_circuit"                   [0-4]
4:      "hot_water_operation_mode"                  [0-4]
105:    "hot_water_temperature_tolerance"           Int
108:    "cooling_operation_mode"                    [0-1]
110:    "cooling_outdoor_temperature_clearance"     Int
119:    "pool_operation_mode"                       [0,2-4]
124:    "solar_t_diff"                              Int
132:    "cooling_set_point_mk1"                     Int
133:    "cooling_set_point_mk2"                     Int
134:    "cooling_working_temperature_difference_1"  Int
135:    "cooling_working_temperature_difference_2"  Int
696:    "heating_mixed_circuit_2"                   [0,2-4]
755:    "password_char_1"                           Int
756:    "password_char_2"                           Int
757:    "password_char_3"                           Int
758:    "password_char_4"                           Int
759:    "password_char_5"                           Int
760:    "password_char_6"                           Int
779:    "heating_mixed_circuit_3"                   [0,2-4]
850:    "cooling_outdoor_temperature_overrun"       Int
851:    "cooling_outdoor_temperature_underrun"      Int
881:    "solar_operation_mode"                      [0-4]
894:    "ventilation_operation_mode"                [0-3]
966:    "cooling_set_point_mk3"                     Int
967:    "cooling_working_temperature_difference_3"  Int
993:    Not a 100% sure whats going onhere

The number is the parameter number, as far as I can tell, the app dynamically determins if a value is displayed depending on Heatpump model and visibilities but its very weird (lots and lots of edge cases)

Would you agree in having just the above values writable?

I would state in the documentation that if somebody needs an additional parameter writable he/she can open a issue or pull request.

Another option is that a parameter can be passed through the configuration that disables the safeguard.

Let me know what you guys think!

1 Like

Hi Bouni,

that’s very good, I would leave it that way.

I thought a little about this and cam to the conclusion that I’ll create a config option safe that when set to false will allow users to write whatever parameters they want. The default will be true so users must disable the safety intentionally.

Finally, I managed to do several cleanups and submit a pull request! :partying_face:

https://github.com/home-assistant/home-assistant/pull/27230

1 Like

Hi Bouni,

Thanks for your greate Work!:+1:
I use this component for my WZSV 62H3M.
Is it possible to add this parameter and correct one in the calculations.py file?

correct:
231: Celsius(“ID_WEB_Freq_VD”) this unit is not celsius, it´s frequency in “Hz” and needs no
calculation

add:
241: Percent("ID_WEB_HZUP_PWM ") its the circulating pump in “%”
257: is the heat output in “W” but i have no name.

Awesome work! Can’t wait to have it integrated into the official release :slight_smile:

@Volti-Ba

For sure! I’ll happily fixe issues or change things if you tell me what you discovered (as you did here).

Ideally you submit an issue here: https://github.com/Bouni/luxtronik/issues

That will help keeping track of issues and changes.

@Roemer

I slightly changed the config with the official release but thats due to my rewrite of the underlying python lib. (Nothing serious :wink: )

@Volti-Ba Wher did you got the name “ID_WEB_HZUP_PWM” from?
I just try to figure out how to name unknown parameters in the future.

Hi Bouni,
many thanks for this awesome work! I will certainly deploy this component as I have fiddled around with the rest api sensors for a while and you gain great visibility already now.
My 5 cents: it would be important to have a hand on 2 values in particular, so that you can “trick” the heatpump to think that it needs to work - now! This is useful when you have some electricity (from PV) to burn for instance:

  • ID_WEB_Einst_BWS_akt (defines the minimum temperature of the hot water boiler)
  • ID_WEB_Sollwert_TRL_HZ (defines the minimum temperature of the water that goes back into the heating circuit. N.B.: If you have the bridge NTC-24 connected to ground (via potential free contact, such as done through a Fibaro Smart Implant), then the value of 45 degrees is set)

Again, thank you very much!
Markus

@ Bouni
it´s from the FHEM Forum:

https://forum.fhem.de/index.php/topic,98930.msg922874.html#msg922874

@mastermarkush

Ok, I’ll mark these two parameters as writable!
Please open an issue next time, that will make life much easier for me!