m4dmin / proxon-control

Control a Zimmermann Lüftung Proxon FWT2.0 Luft-Luft-Wärmepumpe with T300 Trinkwasser-Wärmepumpe via Modbus Protol and Python.
17 stars 0 forks source link

Please help me with installation of my proxon #3

Open AgentP38 opened 2 years ago

AgentP38 commented 2 years ago

Hi ,

vielen Dank, dass du mich unterstützen magst... Wie hast du das aufgebaut? über einen 2. Pi und MQTT?

m4dmin commented 2 years ago

Hi, anfänglich habe ich tatsächlich mal mit einem Python Script gespielt, das die Kommunikation zu Home Assistant per MQTT hergestellt hat. Später ist mir dann aufgefallen, dass Home Assistant eine eigene Modbus Integration hat. Die nutze ich im Moment und es funktioniert problemlos und zuverlässig. Mein Server auf dem Home Assistant läuft steht im Technikraum im Keller, wo auch meine Proxon Anlage steht. Ich musste also nur ein USB Verlängerungskabel kaufen um den RS 485 Stick anzuschließen.

In den configuration.yaml Datei von Home Assistant habe ich dann folgende Zeile hinzugefügt:

# Modbus (Proxon) Konfiguration
modbus: !include modbus.yaml

Dann habe ich eine neue Datei "modbus.yaml" angelegt und wie folgt befüllt:

- name: proxon
  type: serial
  delay: 5
  baudrate: 19200
  bytesize: 8
  method: rtu
  parity: E
  port: /dev/ttyUSB0
  stopbits: 1
  switches:
    - name: "Heizelemente Global"
      unique_id: proxon_heizelemente_global
      scan_interval: 15
      slave: 41
      address: 325
      verify:
        delay: 1
    - name: "Heizelement Wohnzimmer (Zone1)"
      unique_id: proxon_heizelement_wohnzimmer_zone1
      scan_interval: 15
      slave: 41
      address: 187
      verify:
        delay: 1
    - name: "Heizelement Büro KG (Zone2)"
      unique_id: proxon_heizelement_buero_kg_zone2
      scan_interval: 15
      slave: 41
      address: 253
      verify:
        delay: 1
    - name: "Heizelement Küche"
      unique_id: proxon_heizelement_kueche
      scan_interval: 15
      slave: 41
      address: 254
      verify:
        delay: 1
    - name: "Heizelement Diele"
      unique_id: proxon_heizelement_diele
      scan_interval: 15
      slave: 41
      address: 255
      verify:
        delay: 1
    - name: "Heizelement Büro EG"
      unique_id: proxon_heizelement_buero_eg
      scan_interval: 15
      slave: 41
      address: 256
      verify:
        delay: 1
    - name: "Heizelement Schlafzimmer"
      unique_id: proxon_heizelement_schlafzimmer
      scan_interval: 15
      slave: 41
      address: 257
      verify:
        delay: 1
    - name: "Heizelement Martha"
      unique_id: proxon_heizelement_martha
      scan_interval: 15
      slave: 41
      address: 258
      verify:
        delay: 1
    - name: "Heizelement Marlene"
      unique_id: proxon_heizelement_marlene
      scan_interval: 15
      slave: 41
      address: 259
      verify:
        delay: 1
    - name: "Heizelement Keller 2"
      unique_id: proxon_heizelement_keller2
      scan_interval: 15
      slave: 41
      address: 261
      verify:
        delay: 1
    - name: "Heizelement Keller 3"
      unique_id: proxon_heizelement_keller3
      scan_interval: 15
      slave: 41
      address: 262
      verify:
        delay: 1
    - name: "Heizelement Wasser"
      unique_id: proxon_heizelement_wasser
      scan_interval: 15
      slave: 41
      address: 2001
      verify:
        delay: 1
    - name: "Kühlung Global"
      unique_id: proxon_kuehlung_global
      scan_interval: 15
      slave: 41
      address: 62
      verify:
        delay: 1
  sensors:
    - name: "Temperatur Wohnzimmer (Zone1)"
      unique_id: proxon_temperatur_wohnzimmer_zone1
      scan_interval: 30
      slave: 41
      address: 41
      input_type: input
      scale: 0.01
      precision: 1
      unit_of_measurement: °C
      data_type: uint16
    - name: "Temperatur Büro KG (Zone2)"
      unique_id: proxon_temperatur_buero_gg_zone2
      scan_interval: 30
      slave: 41
      address: 40
      input_type: input
      scale: 0.01
      precision: 1
      unit_of_measurement: °C
      data_type: uint16
    - name: "Temperatur Küche"
      unique_id: proxon_temperatur_kueche
      scan_interval: 30
      slave: 41
      address: 593
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Diele"
      unique_id: proxon_temperatur_diele
      scan_interval: 30
      slave: 41
      address: 596
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Büro EG"
      unique_id: proxon_temperatur_buero_eg
      scan_interval: 30
      slave: 41
      address: 599
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Schlafzimmer"
      unique_id: proxon_temperatur_schlafzimmer
      scan_interval: 30
      slave: 41
      address: 602
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Martha"
      unique_id: proxon_temperatur_martha
      scan_interval: 30
      slave: 41
      address: 605
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Marlene"
      unique_id: proxon_temperatur_marlene
      scan_interval: 30
      slave: 41
      address: 608
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Keller 2"
      unique_id: proxon_temperatur_keller2
      scan_interval: 30
      slave: 41
      address: 614
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Keller 3"
      unique_id: proxon_temperatur_keller3
      scan_interval: 30
      slave: 41
      address: 617
      input_type: input
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Temperatur Wasser"
      unique_id: proxon_temperatur_wasser
      scan_interval: 30
      slave: 41
      address: 814
      input_type: input
      scale: 0.1
      offset: -100
      precision: 1
      unit_of_measurement: °C
      data_type: uint16
    - name: "CO2 Wohnzimmer"
      unique_id: proxon_co2_wohnzimmer
      scan_interval: 30
      slave: 41
      address: 21
      input_type: input
      device_class: aqi
      unit_of_measurement: ppm
      data_type: int16 #das muss noch verifiziert werden
    - name: "Luftfeuchte Wohnzimmer"
      unique_id: proxon_luftfeuchte_wohnzimmer
      scan_interval: 30
      slave: 41
      address: 22
      input_type: input
      device_class: humidity
      unit_of_measurement: "%"
      data_type: int16 #das muss noch verifiziert werden
    - name: "Lüftungsstufe Ventilator Zuluft"
      unique_id: proxon_lueftungsstufe_ventilator_zuluft
      scan_interval: 30
      slave: 41
      address: 154
      input_type: input
      data_type: int16
    - name: "Betriebsart"
      unique_id: proxon_betriebsart
      scan_interval: 30
      slave: 41
      address: 16
      input_type: holding
      data_type: uint16
    - name: "Soll-Temperatur Wohnzimmer (Zone1)"
      unique_id: proxon_soll_temperatur_wohnzimmer_zone1
      scan_interval: 30
      slave: 41
      address: 70
      input_type: holding
      scale: 0.01
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Soll-Temperatur Büro KG (Zone2)"
      unique_id: proxon_soll_temperatur_buero_kg_zone2
      scan_interval: 30
      slave: 41
      address: 75
      input_type: holding
      scale: 0.01
      precision: 1
      unit_of_measurement: °C
      data_type: int16
    - name: "Soll-Temperatur Wasser"
      unique_id: proxon_soll_temperatur_wasser
      scan_interval: 30
      slave: 41
      address: 2000
      input_type: holding
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16 #das muss noch verifiziert werden
    - name: "Temperatur-Schwelle Heizstab Wasser"
      unique_id: proxon_temperatur_schwelle_heizstab_wasser
      scan_interval: 30
      slave: 41
      address: 2003
      input_type: holding
      scale: 0.1
      precision: 1
      unit_of_measurement: °C
      data_type: int16 #das muss noch verifiziert werden
    - name: "Restzeit Intensivlüftung"
      unique_id: proxon_restzeit_intensivlueftung
      scan_interval: 30
      slave: 41
      address: 133
      input_type: holding
      unit_of_measurement: min
      data_type: uint16
    - name: "Zeit FWT Online"
      unique_id: proxon_zeit_fwt_online
      scan_interval: 30
      slave: 41
      address: 467
      input_type: holding
      unit_of_measurement: std
      data_type: uint16
    - name: "Standzeit FWT Gerätefilter"
      unique_id: proxon_standzeit_fwt_geraetefilter
      scan_interval: 30
      slave: 41
      address: 460
      input_type: holding
      unit_of_measurement: std
      data_type: uint16
    - name: "Nutzzeit FWT Gerätefilter"
      unique_id: proxon_nutzzeit_fwt_geraetefilter
      scan_interval: 30
      slave: 41
      address: 469
      input_type: holding
      unit_of_measurement: std
      data_type: uint16
    - name: "Mitteltemperatur HNBP Keller 1"
      unique_id: proxon_mitteltemperatur_hnbp_keller1
      scan_interval: 30
      slave: 41
      address: 233
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Küche"
      unique_id: proxon_mitteltemperatur_nbp_kueche
      scan_interval: 30
      slave: 41
      address: 234
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Diele"
      unique_id: proxon_mitteltemperatur_nbp_diele
      scan_interval: 30
      slave: 41
      address: 235
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Büro EG"
      unique_id: proxon_mitteltemperatur_nbp_buero_eg
      scan_interval: 30
      slave: 41
      address: 236
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Schlafzimmer"
      unique_id: proxon_mitteltemperatur_nbp_schlafzimmer
      scan_interval: 30
      slave: 41
      address: 237
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Martha"
      unique_id: proxon_mitteltemperatur_nbp_martha
      scan_interval: 30
      slave: 41
      address: 238
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Marlene"
      unique_id: proxon_mitteltemperatur_nbp_marlene
      scan_interval: 30
      slave: 41
      address: 239
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Keller 2"
      unique_id: proxon_mitteltemperatur_nbp_keller2
      scan_interval: 30
      slave: 41
      address: 241
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Mitteltemperatur NBP Keller 3"
      unique_id: proxon_mitteltemperatur_nbp_keller3
      scan_interval: 30
      slave: 41
      address: 242
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur HNBP Keller 1"
      unique_id: proxon_offsettemperatur_hnbp_keller1
      scan_interval: 30
      slave: 41
      address: 213
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Küche"
      unique_id: proxon_offsettemperatur_nbp_kueche
      scan_interval: 30
      slave: 41
      address: 214
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Diele"
      unique_id: proxon_offsettemperatur_nbp_diele
      scan_interval: 30
      slave: 41
      address: 215
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Büro EG"
      unique_id: proxon_offsettemperatur_nbp_buero_eg
      scan_interval: 30
      slave: 41
      address: 216
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Schlafzimmer"
      unique_id: proxon_offsettemperatur_nbp_schlafzimmer
      scan_interval: 30
      slave: 41
      address: 217
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Martha"
      unique_id: proxon_offsettemperatur_nbp_martha
      scan_interval: 30
      slave: 41
      address: 218
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Marlene"
      unique_id: proxon_offsettemperatur_nbp_marlene
      scan_interval: 30
      slave: 41
      address: 219
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Keller 2"
      unique_id: proxon_offsettemperatur_nbp_keller2
      scan_interval: 30
      slave: 41
      address: 221
      input_type: holding
      unit_of_measurement: °C
      data_type: int16
    - name: "Offsettemperatur NBP Keller 3"
      unique_id: proxon_offsettemperatur_nbp_keller3
      scan_interval: 30
      slave: 41
      address: 222
      input_type: holding
      unit_of_measurement: °C
      data_type: int16

Die Register und deren Namen sind in dem Beispiel natürlich auf mein Haus ausgelegt, aber ein Großteil bleibt natürlich gleich.

Damit ich die einzelnen Register auch regelkonform schalten konnte habe ich dann in Node-Red noch einige Automationen gebaut, z.B. um die Offset-Temperaturen der Bedienpanels korrekt anzusteuern.

Ich denke im ersten Schritt solltest du aber erstmal Home Assistant mit deiner Proxon verbinden um eine Grundlage zu haben. Alles weitere ist dann irgendwie nur noch Fleißarbeit. Gerne kann ich dir dazu später auch nochmals ein paar Hinweise geben.

Grüße

AgentP38 commented 2 years ago

Wahnsinnnnnn vielen lieben Dank!!!

Hast du eine Idee, wie man erkennt welcher Raum welche ID hat?

m4dmin commented 2 years ago

Ich habe einfach die ausgegebenen Werte (Temperaturen) mit den Werten aus der Android App verglichen, dann war es bei mir recht schnell eindeutig.

sethur277 commented 2 years ago

Guten Tag zusammen, da geselle ich mich kurz zur Diskussion. Ich habe deine Beispiel Config auch bei mir als Starthilfe in Home Assistant genutzt und kann auch wunderbar die Temperaturen auslesen sowie die Heizelemente schalten an meinerProxon Anlage. Meine Frage, wie genaue wäre den die Syntax um Werte in die Holding Register zu schreiben? Also zum Beispiel wie kann ich die Solltemperatur für einen Raum setzen? Danke für die ausführlichen Infos hier!

m4dmin commented 2 years ago

Ich mache mal ein Beispiel, wie ich die Temperatur in einem Zimmer setze.

Erstmal die Grundlagen:

Um die Aktuell eingestellte Temperatur für einen Raum zu bestimmen muss man als die Summe der Mittel- und Offset-Temperatur addieren. Ich mache das via eines Template Sensors...

Hier ein Beispiel:

# Template Konfiguration
template:
  - sensor:
      - name: "Soll Temperatur Küche"
        unique_id: template_soll_temperatur_kueche
        unit_of_measurement: °C
        state: "{{ states.sensor.mitteltemperatur_nbp_kuche.state | int + states.sensor.offsettemperatur_nbp_kuche.state | int }}"

Wenn ich nun die Soll-Temperatur in Abhängigkeit zur Mittel-Temperatur ändern möchte, dann mache ich das über die Offset-Temperatur.

Die Home Assistant Automations-Möglichkeiten fand ich ein wenig zu kompliziert und habe daher via Node-Red noch eine Automation gebaut, die bei einer Änderung in der UI, diese auch an Modbus weitergibt.

AgentP38 commented 2 years ago

So ich habe meine Heizung jetzt verbunden und kann die Werte auslesen. Die entities habe ich auch raus gefunden und den Zimmern zugeordnet.

Vielen Dank schon einmal dafür war eine Riesen Hilfe...

Jetzt stellt sich mir die Frage, wie ich die Sensor Werte per Bus dann in die Heizung schreibe. Reicht es wenn ich den Sensorwert einfach ändere, oder muss dass speziell gesendet werden?

AgentP38 commented 2 years ago

Habe ein wenig versucht über nodered Modbus zu konfigurieren...

Scheitere aber schon an der Connection...

Welches setup muss ich da nehmen?

m4dmin commented 2 years ago

Ich spreche die Proxon Anlage nicht direkt aus Node-Red via Modbus an, sondern rufe einen Home Assistant Service auf, der die Modbus Änderung durchführt.

Nachfolgend habe ich den Node-Red Flow kopiert, der folgendes macht:

  1. Wenn meine Home Assistant "Helfer"-Entität für die Offset Temperatur eine Änderung registriert, wird diese im entsprechenden Modbus Register der Proxon Anlage gespeichert.
  2. Wenn eine Änderung über die Proxon Anlage (z.B. via Proxon App, oder Wand-Panel) durchgeführt wird, dann wird das auf die Home Assistant "Helfer"-Entität für die Offset Temperatur übertragen.

Mithilfe dieser beiden Abfragen, kann ich Home Assistant und Proxon syncron halten (mit wenigen Sekunden versatz, aber das ist nicht kritisch).


[
    {
        "id": "a5815ba7c7afa2f9",
        "type": "tab",
        "label": "HA-Proxon - Offset Temp",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "1dde0404bec1be4b",
        "type": "server-state-changed",
        "z": "a5815ba7c7afa2f9",
        "name": "State Changed: Helfer Offset Temperatur",
        "server": "d0108cd6.fca61",
        "version": 4,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "input_number.helper_offset_temperatur_",
        "entityidfiltertype": "regex",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 1,
        "output_only_on_state_change": true,
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 200,
        "y": 100,
        "wires": [
            [
                "1a0e6540159b5b15",
                "bdc76933e880cc01",
                "7f464108edc8b158",
                "24eb724af6d3cf94"
            ]
        ]
    },
    {
        "id": "1a0e6540159b5b15",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 630,
        "y": 60,
        "wires": []
    },
    {
        "id": "574595b4df5539b0",
        "type": "api-call-service",
        "z": "a5815ba7c7afa2f9",
        "name": "Modbus Write Register - Offset Temperatur",
        "server": "d0108cd6.fca61",
        "version": 5,
        "debugenabled": false,
        "domain": "modbus",
        "service": "write_register",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 250,
        "y": 260,
        "wires": [
            [
                "6e704344fa4e3552"
            ]
        ]
    },
    {
        "id": "6e704344fa4e3552",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 630,
        "y": 260,
        "wires": []
    },
    {
        "id": "bed845048dd67674",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 630,
        "y": 180,
        "wires": []
    },
    {
        "id": "62f42978d07d6714",
        "type": "server-state-changed",
        "z": "a5815ba7c7afa2f9",
        "name": "State Changed: Proxon Offset Temperatur",
        "server": "d0108cd6.fca61",
        "version": 4,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "sensor.offsettemperatur_*",
        "entityidfiltertype": "regex",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 1,
        "output_only_on_state_change": true,
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 200,
        "y": 460,
        "wires": [
            [
                "4c68d7c05eacc222",
                "b370e59684aa2b9d",
                "d32431e66787d95f",
                "8ca40248c2e832c3"
            ]
        ]
    },
    {
        "id": "4c68d7c05eacc222",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 630,
        "y": 420,
        "wires": []
    },
    {
        "id": "bdc76933e880cc01",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 620,
        "y": 100,
        "wires": []
    },
    {
        "id": "7f464108edc8b158",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "data",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 620,
        "y": 140,
        "wires": []
    },
    {
        "id": "5fcfe3ca85664ac8",
        "type": "api-call-service",
        "z": "a5815ba7c7afa2f9",
        "name": "HA Wert setzen - Helfer Offset Temperatur",
        "server": "d0108cd6.fca61",
        "version": 5,
        "debugenabled": true,
        "domain": "input_number",
        "service": "set_value",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 240,
        "y": 620,
        "wires": [
            [
                "462290644894afdb"
            ]
        ]
    },
    {
        "id": "462290644894afdb",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 630,
        "y": 620,
        "wires": []
    },
    {
        "id": "b370e59684aa2b9d",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "data",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 620,
        "y": 500,
        "wires": []
    },
    {
        "id": "d32431e66787d95f",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "topic",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 620,
        "y": 460,
        "wires": []
    },
    {
        "id": "24eb724af6d3cf94",
        "type": "function",
        "z": "a5815ba7c7afa2f9",
        "name": "Modbus Address & Register Value bestimmen",
        "func": "//16Bit -> 65536 \n//With 16 bits, you have 2^16 possibilities = 65536.\n//half of them are used for negative numbers, which have the most significant bit set to 1 (negative). So the range goes from -32768 to (and including) +32767. Note that the ‘positive’ numbers start at 0.\n\n\n//{\t   \n//  \"address\":msg.payload.address,\n//  \"unit\":\"41\",\n//  \"value\": msg.payload.value,\n//  \"hub\":\"proxon\"\n//  }\nvar inputTopic    = msg.topic;\nvar outputAddress = \"\";\n\nswitch (inputTopic) {\n  case \"input_number.helper_offset_temperatur_buero_kg_zone2\": outputAddress = 213; break;\n  case \"input_number.helper_offset_temperatur_kueche\": outputAddress = 214; break;\n  case \"input_number.helper_offset_temperatur_diele\": outputAddress = 215; break;\n  case \"input_number.helper_offset_temperatur_buero\": outputAddress = 216; break;\n  case \"input_number.helper_offset_temperatur_schlafzimmer\": outputAddress = 217; break;\n  case \"input_number.helper_offset_temperatur_martha\": outputAddress = 218; break;\n  case \"input_number.helper_offset_temperatur_marlene\": outputAddress = 219; break;\n  case \"input_number.helper_offset_temperatur_keller2\": outputAddress = 221; break;\n  case \"input_number.helper_offset_temperatur_keller3\": outputAddress = 222; break;\n  default: fail;\n}\n\n\nvar inputValue  = msg.payload | 0;\nvar outputValue = 0;\n\nswitch (inputValue) {\n  case -3: outputValue = 65533; break;\n  case -2: outputValue = 65534; break;\n  case -1: outputValue = 65535; break;\n  default: outputValue = inputValue; break;\n}\n\nmsg.payload = {\n  \"data\": {\n    \"address\": outputAddress,\n    \"unit\":\"41\",\n    \"value\": outputValue,\n    \"hub\":\"proxon\"\n  }\n}\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 240,
        "y": 180,
        "wires": [
            [
                "bed845048dd67674",
                "574595b4df5539b0"
            ]
        ]
    },
    {
        "id": "9236b01255486a4d",
        "type": "comment",
        "z": "a5815ba7c7afa2f9",
        "name": "Setzen der Offset Temperatur via HA",
        "info": "",
        "x": 160,
        "y": 40,
        "wires": []
    },
    {
        "id": "febee0a47b390b45",
        "type": "comment",
        "z": "a5815ba7c7afa2f9",
        "name": "Setzen der Offset Temperatur via Proxon",
        "info": "",
        "x": 180,
        "y": 400,
        "wires": []
    },
    {
        "id": "8ca40248c2e832c3",
        "type": "function",
        "z": "a5815ba7c7afa2f9",
        "name": "HA Entity & Wert bestimmen",
        "func": "var inputEntity    = JSON.parse(JSON.stringify(msg.data)).entity_id;\nvar inputValueOld  = JSON.parse(JSON.stringify(msg.data)).old_state.state;\nvar inputValueNew  = JSON.parse(JSON.stringify(msg.data)).new_state.state;\n\n\nvar outputEntity = \"\";\n\nswitch (inputEntity) {\n  case \"sensor.offsettemperatur_hnbp_keller_1\": outputEntity = \"input_number.helper_offset_temperatur_buero_kg_zone2\"; break;\n  case \"sensor.offsettemperatur_nbp_kuche\": outputEntity = \"input_number.helper_offset_temperatur_kueche\"; break;\n  case \"sensor.offsettemperatur_nbp_diele\": outputEntity = \"input_number.helper_offset_temperatur_diele\"; break;\n  case \"sensor.offsettemperatur_nbp_buro_eg\": outputEntity = \"input_number.helper_offset_temperatur_buero\"; break;\n  case \"sensor.offsettemperatur_nbp_schlafzimmer\": outputEntity = \"input_number.helper_offset_temperatur_schlafzimmer\"; break;\n  case \"sensor.offsettemperatur_hnbp_martha\": outputEntity = \"input_number.helper_offset_temperatur_martha\"; break;\n  case \"sensor.offsettemperatur_nbp_marlene\": outputEntity = \"input_number.helper_offset_temperatur_marlene\"; break;\n  case \"sensor.offsettemperatur_nbp_keller_2\": outputEntity = \"input_number.helper_offset_temperatur_keller2\"; break;\n  case \"sensor.offsettemperatur_nbp_keller_3\": outputEntity = \"input_number.helper_offset_temperatur_keller3\"; break;\n  default: fail;\n}\n\n\n//var outputValue = 0;\n\nif (inputValueOld == inputValueNew) {\n    fail;\n} else {\n    var outputValue = inputValueNew;\n}\n\n\nmsg.payload = {\n  \"data\": {\n    \"entity_id\": outputEntity,\n    \"value\": outputValue\n  }\n}\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 180,
        "y": 540,
        "wires": [
            [
                "f2f8d8d3a8615481",
                "5fcfe3ca85664ac8"
            ]
        ]
    },
    {
        "id": "f2f8d8d3a8615481",
        "type": "debug",
        "z": "a5815ba7c7afa2f9",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 630,
        "y": 540,
        "wires": []
    },
    {
        "id": "d0108cd6.fca61",
        "type": "server",
        "name": "Home Assistant",
        "version": 2,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30"
    }
]
´´´´
AgentP38 commented 2 years ago

Super schaue ich mir an!!

WelchenHelfer hast du benutzt?

AgentP38 commented 2 years ago

So habe es geschafft...

vielen lieben Dank für die Unterstützung...

AgentP38 commented 2 years ago

So jetzt habe ich wieder ein kleines Problem...

Wie hast du das Write der Temperaturwerre für die T300 gelöst?

Auslesen kann ich die Werte... aber alles was geschrieben werden soll wenn ich auf 48 Grad stellen will ist falsch... entweder ein Integer mit 48 ohne 0 oder wenn ich einen String setze geht es auch nicht...

Hast du eine Idee??

m4dmin commented 2 years ago

Die Temperatur der T300 lese ich im Moment nur aus, das einzige was ich verändere ich Heizstab an/aus. Hier kann ich dir leider nicht helfen.

AgentP38 commented 2 years ago

Danke habe es auch gerade geschafft... wichtig ist, dass man für 40 Grad eine 400 setzen muss dann klappt es...und natürlich den Payload von String auf Number Umstellen muß

pantanis007 commented 1 year ago

Hi m4dmin, ich bin ein ziemlicher Noob was die Einbindung von Skripten in den ioBroker geht. Könntest du mir helfen? Wie bzw. wo muss ich die Ordner-Struktur anlegen? Bisher habe ich alles über Blockly automatisiert. Auch den Modbus von meiner PV-/Batterieanlage konnte ich auslesen. Nun fehlt nur noch meine Proxon-Heizung. Über den Modbus-RTU habe ich einige Daten manuell ausgelesen, aber ich glaube mit deinem Skript könnte es besser gehen.

Freue mich von dir zu hören!

m4dmin commented 1 year ago

Hi @pantanis007 , beim ioBroker kann ich dir leider nicht helfen, ich nutze den Home Assistant. Dort habe ich auch die Proxon via Modbus nativ integriert. Das Script von mir entwickle ich nicht weiter und nutze es auch nicht mehr. Gerne kannst du es dir forken und weiterentwickeln :) Grüße

fabi9163 commented 1 year ago

Danke für die Config, das meiste läuft. Hat jemand eine schöne Möglichkeit gefunden die Betriebsmodis für WP+T300 sauber in der GUI zu schalten?

m4dmin commented 1 year ago

Ich mache mal ein Beispiel, wie ich die Temperatur in einem Zimmer setze.

Erstmal die Grundlagen:

  • Für jeden Raum gibt es einen Wert für die Mittel-Temperatur (das stellt die Proxon Anlage irgendwie ein, vermutlich in Zusammengang mit der für die Zone gesetzte Temperatur, diesen Wert lasse ich unangetastet)
  • Für jeden Raum gibt es einen Wert für die Offset-Temperatur (dieser Wert gibt die Plus oder Minus Werte Am Wand Panel wieder. Dieser Wert passe ich via Home Assistant an, das spiegelt sich dann auch direkt am Wand Panel wieder)

Um die Aktuell eingestellte Temperatur für einen Raum zu bestimmen muss man als die Summe der Mittel- und Offset-Temperatur addieren. Ich mache das via eines Template Sensors...

Hier ein Beispiel:

# Template Konfiguration
template:
  - sensor:
      - name: "Soll Temperatur Küche"
        unique_id: template_soll_temperatur_kueche
        unit_of_measurement: °C
        state: "{{ states.sensor.mitteltemperatur_nbp_kuche.state | int + states.sensor.offsettemperatur_nbp_kuche.state | int }}"

Wenn ich nun die Soll-Temperatur in Abhängigkeit zur Mittel-Temperatur ändern möchte, dann mache ich das über die Offset-Temperatur.

Die Home Assistant Automations-Möglichkeiten fand ich ein wenig zu kompliziert und habe daher via Node-Red noch eine Automation gebaut, die bei einer Änderung in der UI, diese auch an Modbus weitergibt.

Hallo @fabi9163, in diesem Post hatte ich die Integration der Wärmepumpe für die einzelnen Räume beschrieben. Die T300 habe ich nur mit einem Schalter den heizstab und einer Temperaturanzeige für das Wasser integriert...

Baeumchen30 commented 7 months ago

Danke habe es auch gerade geschafft... wichtig ist, dass man für 40 Grad eine 400 setzen muss dann klappt es...und natürlich den Payload von String auf Number Umstellen muß

Hallo @AgentP38 wäre es möglich den Code/den NodeRed-Flow (falls damit realisiert) hochzuladen? Soweit läuft die Steuerung bei mir komplett - einzig die Wassertemperatur bekomme ich nicht hin.

@m4dmin Vielen Dank für die Erstellung des Projekts, das hätte ich sonst nie hinbekommen!

AgentP38 commented 6 months ago

Hallo Baeumchen30,

Der Flow ist in meiner Repro

https://github.com/AgentP38/Proxxon-HomeAssistant

Baeumchen30 commented 6 months ago

Hallo Baeumchen30,

Der Flow ist in meiner Repro

https://github.com/AgentP38/Proxxon-HomeAssistant

Tausend Dank dir, läuft einwandfrei!