New integration for REMKO Heatpump

@Altrec Vielen Dank für deine Arbeit. Ich suche schon länger nach einer guten Lösung für meine Remko WKF 120 compact. Deine Lösung habe ich die letzten Tage auf meiner Home Assistant Instanz ausprobiert. Leider besitze ich die Software Version 4.26, sodass ich die Remko Codes anpassen musste. Mir war außerdem die Drehzahl des Lüfters vom Außengerät wichtig.
Hier die Codes die ich getestet habe

reg_id = {
    #  reg_id: ['reg#', 'type', 'unit', 'min', 'max'],
    "dhw_opmode": ["1079", "select_input", "", 0, 16],
    "water_temp_req": ["1082", "temperature_input", "ºC", 0, 60],
    "main_mode": ["1951", "select_input", "", 0, 16],
    "opmode": ["5001", "sensor_mode", "", "", ""],
    "out_temp": ["5055", "temperature", "ºC", 0, 40],
    "water_temp": ["5039", "temperature", "ºC", 0, 70],
    "heat_water_temp_req": ["5033", "temperature", "ºC", 0, 90],    
    "heat_water_temp": ["5034", "temperature", "ºC", 0, 90],
    "el_consumption": ["5138", "sensor_el", "W", 0, 10000],
    "communication_status": ["communication_status", "generated_sensor", "", 0, 0],
    "luefterdrehzahl": ["5743", "drehzahl", "rpm", 0, 1500],
    "heizstab_status": ["5051", "generated_sensor", "", 0, 0],
    "heizstab_stufe": ["5008", "generated_sensor", "", 0, 0],
}

Teilweise musste ich noch an anderen Stellen Änderungen am Code durchführen, aber ich will nicht auf zu viele Punkte in meinem Post eingehen. Es wird jetzt schon ein Roman.

  1. Mir ist aufgefallen, dass die oben genannten Remko Codes nur über MQTT veröffentlicht werden, wenn die Werte auf der Website der Wärmepumpe angezeigt werden. Kann es sein, dass man die gewünschte Querylist per MQTT publish anfragen muss? In der smt.js gibt es eine einsprechende Funktion dazu.
    function updateQueryList(a). Leider kenne ich mich mit js Scripten gar nicht aus.
  2. Ich habe beim Betriebsmodus keine Historie. Es sieht so aus als wenn er von nummerischen Werten ausgeht, da beim Initialisieren -1 als Wert übergeben wird.
  3. Nur als Info: Remko Code 5138 liefert nur die Ampere. Ich berechne mir aus der Rückgabe die Leistung.
  4. Hast du Dir mal den lokalen Storage des Browsers angeschaut? Bei mir heißt die Storage Datei 4.26_shm und 4.26_smt.json Im shm Storage werden auch immer alle Werte befüllt und im smt Storage ist die Querylist enthalten.

Aktuell habe ich für meine Remko eine andere Lösung im Einsatz. Ich hole mir über einen Headless Browser (selenium) die Daten. Die Lösung ist aber nicht empfehlenswert. Man braucht dazu das AppDaemon AddOn und dann simuliert man einen User per Python Script. Da die Weboberfläche für einen einzelnen User designed ist, werden parallele Websessions mit dem Python Script problematisch.

Ich glaube die keep alive message muss noch korrigiert werden, um die abzufragenden Daten zu senden. Die Query_List scheint wichtig zu sein.

    async def mqtt_keep_alive(self) -> None:
        """Heatpump sends MQTT messages only when triggered."""

        topic = self._cmd_topic
        query_list = [1079,1082,1951,5001,5008,5033,5034,5039,5051,5055,5138,5743]
        payload = json.dumps({"FORCE_RESPONSE": True ,"query_list":query_list,"CLIENT_ID":"SMT068I0000000000000000","LASTWRITE":0,"SMT_USER":0,"ISTOUCH": False ,"DEVID":"DCE53321752A"})
        _LOGGER.debug("topic:[%s]", topic)
        _LOGGER.debug("payload:[%s]", payload)
        self._hass.async_create_task(
            self._hass.components.mqtt.async_publish(
                self._hass, topic, payload, qos=2, retain=False
            )
        )

Ich hab es immer noch nicht geschafft, die Integration zum laufen zu bekommen.
Im MQTT Explorer kommen werte an, wenn ich den Benutzername und Passwort der Remko eingebe.
Im Mosquito hab ich eigentlich andere Zugangsdaten eingerichtet.
Aber so wie ich es verstehe kann Mosquito ja uch die Benutzerdaten die im Homeassistant eingerichtet sind nutzen.
Habe also einen Homeassistant-Benutzer mit den Daten der Remko als lokaler Nutzer und ohne Adminrechte angelegt.
Remko_MQTT ist eingerichtet, hat aber keine Geräte und Entitäten.
Hat Jemand eine Idee?
Hab in Remko_MQTT auch den Harken “Enable Debug” gesetzt. Hab aber keine Ahnung wo er das speichert.

@o-live-r
Da ich selbst die Version 4.28 habe, kann ich immer nur von meinem Stand ausgehend testen. Die Idee war, dass man über eine Anpassung der remko_regs Daten hinzufügen, bzw. entfernen kann. Je mehr ich jedoch an neuen Daten hinzufüge, desto mehr merke ich, dass nur wenige Werte mit dem gleichen type abgearbeitet werden können.

  1. Wenn ich auf die Startseite meiner Wärmepumpe gehe ist meine Querylist sehr ausführlich, so dass ich keine eigene Abfrage machen musste. Problematisch ist jedoch, dass es nur einen Benutzerkontext gibt. Ist man auf dem Bedienfeld der WP unterwegs verändert dies die Querylist und umgekehrt. Nichts desto trotz habe ich die Möglichkeit eine eigene Liste mitzugeben implementiert. Die IDs trägt man in der remko_regs ein. Danach muss man noch in der mqtt_keep_alive einen Wert auf “True” setzen. Ich habe das als schnellen fix erst einmal fest reingeschrieben.
       async def mqtt_keep_alive(self) -> None:
        """Heatpump sends MQTT messages only when triggered."""

        topic = self._cmd_topic
        value = "true"
        use_querylist = False
  1. Das müsste ich bei mir erst einmal prüfen. Ich hatte die Historie für die Heizung ausgeschaltet, da meine Datenbank mit Einträgen überflutet wurde. In einer neuen Version habe ich nun eine Frequenz eingebaut, so dass er nur alle X Datenpakete diese auch verarbeitet.
  2. Ich nutz 5320, gibt es den bei dir nicht?
  3. Ja, da ziehe ich mir auch die Codes raus, bisher hatte ich mich aber auf das beschränkt, was mich selbst interessiert.
1 Like
  1. Ich installiere gerade dein Update. Ich bin gespannt. Danke im Voraus!
  2. Gute Idee
  3. Leider gibt es 5320 bei mir nicht. Liegt vermutlich an der Version V04P26. Ich nehme die Amper und multipliziere mit der Spannung und dann habe ich das gleiche Ergebnis.

Bei mir gab es ein Problem mit der Frequenz. Ich musste diese in der const.py von “freq” auf 100 setzen.

CONF_FREQ = 100

Ich muss das nochmal prüfen, bin aber noch nicht wieder zum Programmieren gekommen.

So, Problem mit der Frequenz ist nun behoben. Außerdem funktioniert nun auch die konfigurierbare MQTT Node, so dass er nicht nur auf “V04P28/SMTID” hört.

Danke für deine Rückmeldung. Meine Tests mit der neuen Version waren auch nicht erfolgreich. Ich kann Dir zum Teil sagen woran es liegt. Deine neue Schleife (if self.mqtt_counter == CONF_FREQ) steigt ja immer nach der vorgegebenen Frequenz aus z.B. 100. Es ist sehr wahrscheinlich, dass in der Message beim Auslösen der Schleife nicht die richtigen Daten enthalten sind. Man müsste sonst prüfen, ob im Inhalt der Message die Querylist beantwortet wird.
Das zweite Problem ist die Funktion await self.mqtt_keep_alive(). Sie wird nicht mehr richtig ausgeführt. Im MQTT Explorer gab es nicht eine keep alive message aus der Funktion.

Jetzt haben sich unsere Antworten überschlagen. Ich werde deine neue Version gleich updaten.

Habe noch ein kleines Update für die query list nachgeschoben. Wenn man in der remko_regs nun eine Liste definiert (Standard ist nun eine leere Liste), dann feuert er die query list ab. So muss man nur an einer Stelle etwas konfigurieren.

PS: Danke fürs Testen und berichten.

Leider habe ich immer noch das Problem, dass die Keep Alive Message nie erneut gesendet wird. Ich habe den Aufruf ins else geschoben und nun kriege ich die Infos. Nun werden allerdings zu viele Messages versendet.

Ich habe die Keep Alive Funktion wegen dem Spam nochmal verschieben müssen.
Jetzt sieht es besser aus bei mir.

Sehr merkwürdig. Bekommst du überhaupt (regelmäßig) Werte rein? Denn der Aufruf ist der vorletzte, wenn er MQTT Nachrichten der Wärmepumpe verarbeitet.

In deiner ursprünglichen Version wurde die Keep Alive Funktion nie ausgeführt. Im MQTT Browser gab es nur eine initiale Message nach Home Assistant Neustart und dann wurden keine weiteren Messages versandt. Mit dem Umzug des Aufrufs vor die IF-Abfrage passt das Ergebnis.

Ich habe noch einen Verbesserungswunsch, den ich mit meinem Skill bisher nicht lösen konnte. Der Sensor “Betriebsmodus” speichert keine historischen Daten. Der Verlauf ist immer leer. Ich gucke gerne welchen Zusammenhang die Stromverbräuche haben. Siehe Screenshot.
image

Bei mir gibt es da auch keine Historie, das müsste ich mir bei Gelegenheit mal anschauen. Du bekommst aber sonst bei allen anderen Sensoren regelmäßig Werte rein?

Alle nummerischen Werte sind historisiert. Bei den String Statuswerten fehlt die Historie. Vielleicht liegt es am Datentyp.
image

Wenn du sonst noch Zeit hast, wäre das Hinzufügen einer Unique_ID je Entität auch hilfreich. Ich habe gestern versucht sie nachträglich über die customize.yaml hinzuzufügen, aber das klappt nicht.

sensor.remko_mqtt_wkf120_out_temp:
  unique_id: remko_mqtt_wkf120_out_temp

Ich habe noch einen praktischen Tipp für die Nutzung des Energie Dashboards.
Man kann in Home Assistant den Energieverbrauch(kWh) rechnerisch über die Messung der Leistung(W) ermitteln lassen.

Die Konfiguration ist relativ einfach. Hier ein Beispiel zum Vorgehen

  1. In die customize.yaml folgende Zeilen hinzufügen
sensor.remko_waermepume_power_consumption:
  state_class: measurement
  device_class: power
  friendly_name: Remko Wärmepumpe Power Consumption
  icon: mdi:flash
  1. In die configuration.yaml folgende Zeilen hinzufügen
template:
    - sensor:
      - name: remko_waermepume_power_consumption
        unique_id: remko_waermepume_power_consumption
        unit_of_measurement: W
        availability: "{{ is_number(states('sensor.remko_mqtt_wkf120_el_consumption')) }}"
        state: "{{ states('sensor.remko_mqtt_wkf120_el_consumption') | float | round (0) }}"
  1. Außerdem in die configuration.yaml folgende Zeilen hinzufügen
utility_meter:
  remko_waermepume_energy_consumption_total_daily:
    source: sensor.remko_waermepume_energy_consumption_total
    cycle: daily
    unique_id: remko_waermepume_energy_consumption_total_daily
  remko_waermepume_energy_consumption_total_monthly:
    source: sensor.remko_waermepume_energy_consumption_total
    cycle: monthly
    unique_id: remko_waermepume_energy_consumption_total_monthly

Es gibt für den oben beschriebenen Weg nun auch die Möglichkeit den Energieverbrauch je Betriebsmodus zu erfassen. Ich erkläre hier nur noch den wichtigsten Schritt für Punkt 2. Die Schritte für Punkt 1 und 3 muss man nur für die anderen Senoren wiederholen. Hier ein Beispiel für den Betriebsmodus “Heizen”:

      - name: remko_waermepume_power_consumption_heizen
        unique_id: remko_waermepume_power_consumption_heizen
        unit_of_measurement: W
        availability: "{{ is_number(states('sensor.remko_mqtt_wkf120_el_consumption')) }}"
        state: >
          {% if is_state('sensor.remko_mqtt_wkf120_opmode', 'Heizen') %}
            {{ states('sensor.remko_mqtt_wkf120_el_consumption') }}
          {% else %}
            0
          {% endif %}

Die Energiesensoren müssen dann nur noch im Editor des Energie Dashboards hinzugefügt werden.
image

So sieht es dann im Ergebnis aus:

@Altrec Wo ich gerate die Verbräuche für den Betriebsmodus “Abtauung” sehe (11-12Uhr), kommen mir Zweifel auf. Ich werde es beobachten. Die Außentemperatur lag eigentlich weit über 0°C.
image

Neue Version online.

  • Namen der Entities geändert (remko_mqtt_remko_…)
  • Unique_id hinzugefügt
  • History für alle Sensoren
1 Like

Danke für deine Arbeit. Ich aktualisiere gerade und werde dann testen.

Die Unique ID und die Historie funktionieren.
Ich weiß nur noch nicht warum der Sensor remko_mqtt_el_consumption bei -1W bleibt.


Folgende Veränderung hatte ich am Sensor vorgenommen

                             if reg_id[self._id_reg[k]][1] == "sensor_el":
                                self._hpstate[k] = int(self._hpstate[k], 16) * 23

Wenn ich die Rückmeldung auf Code 5138 auslese sehe ich 0000. Der Code steht in der query_list, reg_id und id_names

@Altrec Hast du noch eine Idee?