Mit Node Red Heizungsautomationen erstellen?

Hallo zusammen,

Ich fange gerade an mit Node Red Automationen zu erstellen und die ersten klappen auch schon. zb. Bewegungsmelder für Licht etc.

Nun möchte ich gerne meine Heizungsautomationen damit versuchen, weil die Automationen in HA nicht so gut funktionieren.
Ich bin allerdings aktuell noch etwas überfordert mit den ganzen nodes und finde irgendwie keinen funktionierenden Anfang. Vielleicht kann mir jemand kurz erklären welche Nodes ich wofür (für meinen case) nehmen kann.

folgende Hardware soll eingebunden werden:

  • Außentemperatursender (Bresser Wetterstation)
  • Raumtemperatursensor (Aqara)
  • Fenster und/oder Türen (Aqara)
  • Thermostat (Aqara e1)

Die automation soll ungefähr so sein:

  • wenn temp außen unter 15 grad und im raum unter 21 und die fenster sind zu dann heize bis 21 grad erreicht ist.
  • Wenn fenster auf, dann nach 5 minuten heizung aus und wenn fenster zu und die oben genannten bedingungen sind erfüllt, dann wieder auf 21 grad hochheizen
  • wenn temperatur außen über 15 grad dann thermostat aus oder auf 19 grad

Ich habe dazu leider auch kein Video bei youtube gefunden…

Über jede Hilfe freue ich mich sehr

Das ist übrigens meine jetzige automation ind HA, aber das bekomme ich in node nicht wirklich umgesetzt weil ich die nodes alle noch nicht kenne

alias: TRV Büro an
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.temperatur_buro_temperatur
  - platform: time_pattern
    minutes: /10
condition:
  - condition: numeric_state
    entity_id: sensor.ipapen67_temperature
    below: 15
action:
  - if:
      - condition: numeric_state
        entity_id: sensor.temperatur_buro_temperatur
        below: 19
    then:
      - service: climate.set_temperature
        data:
          temperature: 30
        target:
          entity_id: climate.heizung_buro_thermostat
  - if:
      - condition: numeric_state
        entity_id: sensor.temperatur_buro_temperatur
        above: 20
    then:
      - service: climate.set_temperature
        data:
          temperature: 21.5
        target:
          entity_id: climate.heizung_buro_thermostat
  - if:
      - condition: state
        entity_id: input_boolean.niemand_zuhause
        state: "on"
        for:
          hours: 0
          minutes: 0
          seconds: 0
    then:
      - service: climate.set_temperature
        data:
          temperature: 21
        target:
          entity_id: climate.heizung_buro_thermostat
    enabled: false
mode: single

Bei mir läuft die Heizungssteuerung schon länger über Node Red.

Bei den Raumtermostaten sieht das momentan so aus:

Kernelement ist der Light Scheduler Node, der einen Wochenplan steuert (abhängig von Urlaub und Heizsaison-Status)
Der 2. Ast steuert dann Heizung und Klimanlage nach bei Fentseröffnung und spring danach wieder zu den Vorgabewerten.

Zusätzlich läuft auch die Tag-/Nacht-Steuerung der Gasheizung über den gleichen Light Scheduler Node. Dass auch noch Vorlauftemperatur und Pumpenleistung in die Steuerung einbezogen werden ist ein anderes Thema.

danke dir!
mit shedule habe ich bisher nicht gearbeitet.

kannst du mir die vondig vom call service beim einschalten deiner heizung/trv mal bitte zeigen?

ich habe es mal so versucht:

ich verstehe allerdings nicht den unterschied zwischen diesen beiden nodes:
Bildschirmfoto 2024-03-10 um 18.04.00

und hier zeigt er irgendwie einen fehler an:

Bildschirmfoto 2024-03-10 um 18.03.03

ich weiß jedoch nicht warum

EIgentlich sollte das Heizungsventil an Sich schon Regeln und nur jeweils eine Vorgabe-Temperatur bekommen. Die Steuerung über einen ext. Sensor ist etwas komplexer - dabei verlasse ich mich bisher auf die Fritz-Verknüpfung zwischen einem DECT200 und der DECT301-Heizungsventilen (also an der Stelle ohne HA).

Der Unterschied zwisachen den beiden Knoten ist, dass der mit dem Pfeil keinen Eingang hat und als Trigger verwendet werden kann (also statt z.B. einem Inject.
Den mit dem “i” liest nur die Entität, braucht aber einen Anstoß von der Input Seite aus.

Einschalten mache ich nur bei den Klimaanlagen:

Bei den Thermostaten übergebe ich die Wunschtemperatur als nsd.payload an das Themostat:

also vorgegeben wir mir bei climate nur das hier

wenn ich hier aber auf load example klicke passiert nichts…

wie genau geht das mit dem payload? wo muss ich meine zieltemp denn einstellen?

da scheint es bei mir noch probleme zu geben:

Ich stehe auch immer auf dem Kriegsfuß mit den verschiednen NR-Variablen.
In dem Fall definiere ich den Wert als Helfer in HA und lese ihn dann in NR aus:

Danach steht die aktuelle Tempertur in msg.payload und kann vom folgenden Knoten benutzt werden

PS; den ersten Vorschlag in climate.set_temperature benutze ich ja mit temperature und target temperature

das verstehe ich nicht… ich muss echt sagen das heizungsautomationen mit abstand die schwierigsten sind

Ich kopiere mal den einen Flow als Beispiel:

[
    {
        "id": "2a5ebdaf.63b2ba",
        "type": "light-scheduler",
        "z": "531329de.63e52",
        "settings": "6c8fbe70.2540b8",
        "events": "[{\"start\":{\"dow\":1,\"mod\":790},\"end\":{\"dow\":1,\"mod\":1290}},{\"start\":{\"dow\":3,\"mod\":790},\"end\":{\"dow\":3,\"mod\":1290}},{\"start\":{\"dow\":0,\"mod\":600},\"end\":{\"dow\":0,\"mod\":1290}},{\"start\":{\"dow\":4,\"mod\":790},\"end\":{\"dow\":4,\"mod\":1290}},{\"start\":{\"dow\":5,\"mod\":790},\"end\":{\"dow\":5,\"mod\":1290}},{\"start\":{\"dow\":6,\"mod\":600},\"end\":{\"dow\":6,\"mod\":1290}},{\"start\":{\"dow\":2,\"mod\":790},\"end\":{\"dow\":2,\"mod\":1290}}]",
        "topic": "",
        "name": "Heizung Wohnzimmer",
        "onPayload": "ON",
        "onPayloadType": "str",
        "offPayload": "OFF",
        "offPayloadType": "str",
        "onlyWhenDark": false,
        "scheduleRndMax": 0,
        "sunElevationThreshold": "0",
        "sunShowElevationInStatus": false,
        "outputfreq": "output.statechange.startup",
        "x": 160,
        "y": 1720,
        "wires": [
            [
                "15baf22a.3ceeee"
            ]
        ]
    },
    {
        "id": "15baf22a.3ceeee",
        "type": "switch",
        "z": "531329de.63e52",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "ON",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "OFF",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 330,
        "y": 1720,
        "wires": [
            [
                "b3f7cca3aab357a5"
            ],
            [
                "c7ecff30c7d86ff3"
            ]
        ]
    },
    {
        "id": "7dfdb31272e16765",
        "type": "api-current-state",
        "z": "531329de.63e52",
        "name": "Comf lesen",
        "server": "3ee43a18.3e87e6",
        "version": 3,
        "outputs": 1,
        "halt_if": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "input_number.hz_wohnzimmer_high",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 1270,
        "y": 1720,
        "wires": [
            [
                "10fdd7baf95e49f8"
            ]
        ]
    },
    {
        "id": "4debfbeb1df21185",
        "type": "api-current-state",
        "z": "531329de.63e52",
        "name": "ECO lesen",
        "server": "3ee43a18.3e87e6",
        "version": 3,
        "outputs": 1,
        "halt_if": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "input_number.hz_wohnzimmer_low",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 1270,
        "y": 1760,
        "wires": [
            [
                "10fdd7baf95e49f8"
            ]
        ]
    },
    {
        "id": "10fdd7baf95e49f8",
        "type": "api-call-service",
        "z": "531329de.63e52",
        "name": "Set Temparature Wohnzimmer",
        "server": "3ee43a18.3e87e6",
        "version": 5,
        "debugenabled": false,
        "domain": "climate",
        "service": "set_temperature",
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "climate.wohnzimmer"
        ],
        "data": "{\"temperature\":msg.payload}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 1590,
        "y": 1740,
        "wires": [
            []
        ]
    },
    {
        "id": "2bc77485ef7cce46",
        "type": "link in",
        "z": "531329de.63e52",
        "name": "link in 3",
        "links": [
            "4b2cce688d03fa83"
        ],
        "x": 75,
        "y": 1680,
        "wires": [
            [
                "2a5ebdaf.63b2ba"
            ]
        ]
    },
    {
        "id": "4a46bba31baf0cd9",
        "type": "switch",
        "z": "531329de.63e52",
        "name": "Urlaub?",
        "property": "urlaub",
        "propertyType": "global",
        "rules": [
            {
                "t": "eq",
                "v": "on",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 780,
        "y": 1720,
        "wires": [
            [],
            [
                "f301f0df9f2d8376"
            ]
        ]
    },
    {
        "id": "b3f7cca3aab357a5",
        "type": "switch",
        "z": "531329de.63e52",
        "name": "Heizsaison?",
        "property": "heizsaison",
        "propertyType": "global",
        "rules": [
            {
                "t": "eq",
                "v": "on",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 550,
        "y": 1720,
        "wires": [
            [
                "4a46bba31baf0cd9"
            ],
            []
        ]
    },
    {
        "id": "843f2fe3db27bfdb",
        "type": "switch",
        "z": "531329de.63e52",
        "name": "Urlaub?",
        "property": "urlaub",
        "propertyType": "global",
        "rules": [
            {
                "t": "eq",
                "v": "on",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 780,
        "y": 1760,
        "wires": [
            [],
            [
                "e5cf60694e3b68d2"
            ]
        ]
    },
    {
        "id": "c7ecff30c7d86ff3",
        "type": "switch",
        "z": "531329de.63e52",
        "name": "Heizsaison?",
        "property": "heizsaison",
        "propertyType": "global",
        "rules": [
            {
                "t": "eq",
                "v": "on",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 550,
        "y": 1760,
        "wires": [
            [
                "843f2fe3db27bfdb"
            ],
            []
        ]
    },
    {
        "id": "f301f0df9f2d8376",
        "type": "api-current-state",
        "z": "531329de.63e52",
        "name": "Fenster geschlossen?",
        "server": "3ee43a18.3e87e6",
        "version": 3,
        "outputs": 2,
        "halt_if": "off",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "binary_sensor.lumi_lumi_sensor_magnet_aq2_opening",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 1060,
        "y": 1720,
        "wires": [
            [
                "7dfdb31272e16765"
            ],
            []
        ]
    },
    {
        "id": "e5cf60694e3b68d2",
        "type": "api-current-state",
        "z": "531329de.63e52",
        "name": "Fenster geschlossen?",
        "server": "3ee43a18.3e87e6",
        "version": 3,
        "outputs": 2,
        "halt_if": "off",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "binary_sensor.lumi_lumi_sensor_magnet_aq2_opening",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": 0,
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 1060,
        "y": 1760,
        "wires": [
            [
                "4debfbeb1df21185"
            ],
            []
        ]
    },
    {
        "id": "6c8fbe70.2540b8",
        "type": "light-scheduler-settings",
        "name": "Liebigstraße",
        "latitude": "51.27149093442626",
        "longitude": "6.557010412107048"
    },
    {
        "id": "3ee43a18.3e87e6",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": "at: ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "h23",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": true
    }
]

Das müsstest du eigentlich importieren können.

Ich habe nun schon einige Flows gemacht und ich halte nichts davon einfach loszulegen. NodeRed ist ein tolles Tool um seine Logik easy grafisch abzubilden. Bevor Du aber den ersten Flow machst, solltest Du Dein Logik formulieren und dann anfangen den Flow anhand Deiner Logik zu implementieren. Es wird Dir nicht viel helfen, wenn du einfach irgendetwas von jemand anders kopierst.

Man kann durchaus versuchen, so einen Flow zusammen zu entwickeln, aber wie gesagt dafür musst Du Dir erst mal ein Kochbuch mit Deiner Logik erstellen.

Wenn es funktioniert, hilft es doch sehr wohl. Es gibt keinen Grund das Rad jedes Mal selbst zu erfinden. Und an vorhandenen Beispielen kann man für gewöhnlich gut lernen.
Der Technik ist nämlich egal, ob man es selbst entwickelt und vollständig versteht oder etwas funktionierendes importiert und später anfängt zu verstehen. :wink:

die Vorlage hat mir so nichts gebracht weil ich keine sheduler nutze, aber trotzdem vielen dank @klaus123

mein flow sieht aktuell so aus:

grundsätzlich geht es auch!

Meine Frage dazu ist aber folgende: ich habe nun kühlen und heizen wieder zurückverbunden zu den temperaturabfragen des raumes. in der hoffnun, das er diese regelmäßig kontrolliert und auch entsprechend handelt.

macht er das so wie ich es mir gedacht habe oder muss ich nochwas anderes dafür machen?

er soll also regelmäßig den raum und die außentemp kontrollieren und entsprechend heize oder kühlen

EDIT: Mir fällt gerade nochwas ein:
ich nutze Betterthermostat in HA, wo ja schon die KOntakte mit einbezogen werden… somit kann die Automation doch viel kleiner ausfallen oder?

da ich ja BT benutze sollte diese automation doch auch schon reichen oder?
Ich meine zumindest das es richtig ist. per poll state (alle 10 Minuten) fragt er die temperatur ab und wenn zb.
raum unter 21 + draußen unter 15 dann heizen.
wenn false dann eben das gegenteil.

kann das so funktionierenwie ich mir das gedacht habe?

oder sollte ich hier die fensterkontakte noch mit einbauen? diese werden ja schon über BT abgefragt

also ungefähr so:

Grundsätzlich funktioniert das alles - aber Du musst halt trotzdem schauen, dass Du eine Eindeutigkeit bekommst - und deshalb ist die Logik wichtig. Das Prinzip hast Du schon richtig erkannt, dass man Bedingungen die alle erfüllt sein müssen (UND Bedingung) durch serielle Anordnung erstellt und ODER Bedingungen durch parallele Anordnung im Flow. - Nur musst Du Deine Logik überprüfen. Wenn es draußen unter 15 °C hat und im Zimmer über 21 °C, soll dann gleichzeitig gekühlt und geheizt werden? - Das Gleiche wenn es über 15°C draußen, aber unter 21°C drinnen? - Meines Erachtens macht es dann wohl mehr Sinn die Aussentemperatur beim Heizen abzufragen. Das meinte ich, dass Du die Logik anhand Deiner NOdes durchgehen sollst.

das mit der Logik habe ich in der tat noch nicht so drauf. so wie du es geschrieben hast macht das natürlich wenig sinn… ich blicke da nur so richtig nicht durch, weil es die logik eben noch nicht verstehe

dann so oder?

Na entweder Du kannst die Entität mit der Außentemperatur direkt abfragen, wenn Dein Innenthermometer getriggert hat, also so wie Du auch abfragst, ob das Fenster zu ist - die Außentemperatur muss ja Deinen Flow nicht triggern, sondern es langt ja wenn das Dein Innenthermometer macht oder halt umgekehrt. So bekommst Du wieder ein widersprüchliches Signal wenn das Zimmer unter 21°C ist und es draußen über 15°C ist. Das schöne an NodeRed ist ja, dass Du nur den Linien folgen musst.

Du kannst auch Dein Aussenthermometer triggern lassen und dann die Zimmertemperatur abfragen. Dann wird bei Temperaturen über 15°C immer abgeschaltet und bei Temperaturen unter 15°C überprüfst Du erst ob das Fenster auf ist und dann die Innentemperatur. :wink: - Also einfach mal denken, wie Du es gerne hättest.

ok, also müsste es dann so richtig sein oder?
logisch ist das für mich immer noch nicht ganz :smiley:

1 „Gefällt mir“

Genau das ist jetzt die erste Variante. Was ist daran nicht logisch?

Dein Innenthermometer triggert den Flow. Nun überprüfst Du ob es draussen kalt ist. Wenn es nicht kalt ist, schaltest Du die Heizung ab. Wenn es kalt ist prüfst Du ob die Fenster offen sind und wenn nicht dann heizt Du. Das ist doch logisch.

Was Du nun noch machen kannst ist, dass Du die Fenster triggern lassen kannst und dann die Aussentemperatur und Innentemperatur überprüfst, damit Du wenn das Fenster wieder geschlossen wird, nicht warten musst bis das Innenthermometer wieder triggert.

Jedenfalls ist es so eindeutig, da Du nie wieder gleichzeitig heizt und kühlst. :wink:

ja stimmt irgendwie… na ich bekomme das schon hin :slight_smile: Man lernt nie aus…

Kann ich das triggern mit dem fenster denn direkt in den flow mit einbauen oder muss das ein extra trigger sein?

scheinbar heizt er aktuell aber nicht, weil der beim event heizen nichts stehen hat, obwohl der raum gerade 20,2 grad hat

Na Du lässt das Fenster triggern, überprüfst die Innentemperatur und wenn die unter 21°C ist führst Du einfach das Kabel in die Node, die die Aussentemperatur überprüft.

Im Moment musst Du warten bis das Innen-Thermometer triggert (sprich sich das Thermometer einen Wert ausgibt) - wenn Du die Fenster Nodes triggern lässt, dann kannst Du mit den Fenstern triggern.

das problem war beim fenster offenbar, das ich die werte on/off zustand verwechselt habe

was mit der automation wie ich sie jetzt habe aber nicht abgedeckt ist (zumindest meine ich das):

wenn temp innen über 21 und außen unverändert dann heizung aus
das sollte damit behoben sein oder?

Genau nun ist es behoben, da über 21°C ausgeschaltet wird, egal wie warm es draußen ist oder ob das Fenster auf ist. Ist doch einfach. :wink:

Und wenn Du die Überprüfung der Aussentemperatur noch hochschiebst, dann schaut der Flow auch noch einigermaßen übersichtlich aus. Sich kreuzende Linien machen das immer etwas unübersichtlich und sind der Logik nicht dienlich.

Und wenn die Fenster triggern kannst Du auch gleich diekt bei geöffneten Fenstern ein Kabel zu Aus machen, bei geschlossenen Fenstern überprüfst Du wieder die Innen und Aussentemperatur.