Heizungssteuerung mit "freien" Temperaturen bzw. Sollwerten

Hallo zusammen,
ich bin noch relativ neu hier, und Umsteiger von iobroker…
Dort habe ich meine Heizungssteuerung für die homematic ip Thermostate per blockly realisiert.
Die Temperatur die ich am Thermostat bzw per App einstelle, schreibt sich auf einen Hilfsmerker, und zusätzlich nochmal “-2°” auf einen weiteren, für die Absenkung bei Nacht bzw. Abwesenheit aller…
Darum kann ich mit den blueprints bzw better Thermostate m.E. nicht viel anfangen; weil ich dort doch nur fixe Sollwerte eintragen kann, oder?!?
Für die Wunsch- und Absenk-Sollwerte habe ich mir schon Helfer angelegt, die ich per Automation beschreiben wollte; aber da fängt es ja schon an, dass ich das nicht hin bekomme…
Hat da vielleicht jemand von euch nen Tipp?

VG Tom

I.d.R. macht man das dann über Automationen (mit Hilfe von Zeitplänen o.ä.).

Also, ich hab mir ziemlich was ähnliches (ev. sogar genau das gleiche) zusammengebastelt. Ganz grob umschrieben in etwa so:

  1. drei Helfer: “Solltemperatur”, “Absenktemperatur” und “letzter Sollwert”
  2. den Sollwert zeige ich mit einer Kachelkarte als Slider im Dashboard
  3. Skript, welches den Sollwert ausliest und die TRVs entsprechend stellt
  4. Automation, die das Skript auslöst

Der Helfer “letzter Sollwert” dient mir dazu, dass wenn auf Absenktemperatur geheizt wird, der letzte Sollwert dort gespeichert wird und so wieder bei der Temperatur weiter geheizt werden kann, welche vor der Absenktemperatur eingestellt war.

Ist eigentlich logisch und einfach, die Umsetzung dagegen doch etwas aufwändiger…

@maxe Als Zeitplan für die Nachtabsenkung, klar.
Aber wie ich die flexiblen Sollwerte speichern und wieder abrufen kann, das ist mein Problem…
VG Tom

Klingt wirklich sehr in die gleiche Richtung gedacht :grin:.
Dass das hier bisschen aufwändiger wird, hatte ich schon befürchtet; ist “für mich” aber die einzig logische Rangehensweise.
Mit festen SW für Tag/Nacht/Abwesend brauche ich der Chefin gar nicht erst zu kommen…
@Ubuntubirdy ; Ist so ein Skript von dir streng geheim, oder darf ich mir da was abkucken?!
VG Tom

Das Skript ist überhaupt nicht geheim. Aber da hängt noch anderes Gedöns dran, was für Verwirrung sorgen könnte. Ich steure meine TRVs z.B. nur mit einem einzigen Temperaturfühler…
Und der Lerneffekt ist natürlich auch viel grösser, wenn du das selber baust.
Aber natürlich kann ich dir einzelne Schritte bei Bedarf zeigen und dich unterstützen!

So schreibe ich den aktuellen Solltemperatur-Wert in den Helfer:

      - service: input_number.set_value
        metadata: {}
        data:
          value: "{{ states('input_number.solltemperatur') }}"
        target:
          entity_id: input_number.letzter_sollwert

Und genau gleich kannst du den auch wieder auslesen, einfach die Helfer-Entitäten tauschen.

Edit: Aber du kannst natürlich auch mit meinem Skript und der Automation versuche für dich das nötige raus zu picken.

Skript:

alias: heizen normal
sequence:
  - if:
      - condition: or
        conditions:
          - condition: template
            value_template: >-
              {{ states('input_number.solltemperatur') | float ==
              states('input_number.absenktemperatur') | float and
              states('input_boolean.heizen_on_off') == "off" }}
          - condition: template
            value_template: >-
              {{ states('input_number.solltemperatur') | float >
              states('input_number.absenktemperatur') | float and
              states('input_boolean.heizen_on_off') == "on" }}
    then:
      - repeat:
          count: 2
          sequence:
            - service: timer.finish
              metadata: {}
              data: {}
              target:
                entity_id: timer.repeatertimeout
            - service: timer.start
              metadata: {}
              data: {}
              target:
                entity_id: timer.repeatertimeout
            - if: []
              then:
                - service: climate.set_temperature
                  target:
                    device_id:
                      - 441bfadf031aa65b1df8587657e5593c
                      - 00ab6873f2c8c59cdf0f7b32d5a5fe81
                      - 35e7d97b81dc565407c33297b18fde0b
                  data:
                    temperature: >-
                      {% if (states('input_number.solltemperatur') | float ) ==
                      states('input_number.absenktemperatur') | float %} {{
                      states('input_number.absenktemperatur') | float }} {% else
                      %} {{ states('input_number.solltemperatur') | float -2 }}
                      {% endif %}
                - service: climate.set_temperature
                  target:
                    device_id:
                      - cab5231548e718bfb5fbe9489a6746af
                      - edd6e052905a1ecdc961c0804491927f
                  data:
                    temperature: "{{ states('input_number.solltemperatur') }}"
                - service: climate.set_temperature
                  target:
                    device_id: 6675b06d19a278139f4349e9ab0b5fd2
                  data:
                    temperature: >-
                      {% if (states('input_number.solltemperatur') | float ) ==
                      states('input_number.absenktemperatur') | float %} {{
                      states('input_number.absenktemperatur') | float }} {% else
                      %} {{ states('input_number.solltemperatur') | float +1.5
                      }} {% endif %}
            - wait_for_trigger:
                - platform: event
                  event_type: timer.finished
                  event_data:
                    entity_id: timer.repeatertimeout
              continue_on_timeout: true
        enabled: true
mode: restart

Automation:

alias: WARM heizen
description: regelt die TRV an den Radiatoren im Winter
trigger:
  - platform: state
    entity_id:
      - input_boolean.heizen_on_off
    to: "on"
    id: Heizen
  - platform: state
    entity_id:
      - input_boolean.heizen_on_off
    to: "off"
    id: Absenktemperatur
  - platform: numeric_state
    entity_id:
      - sensor.weather_station_temperature
    id: heizen normal
    for:
      hours: 0
      minutes: 15
      seconds: 0
    value_template: >-
      {{ states('sensor.weather_station_temperature') | float -
      states('input_number.solltemperatur') | float  }}
    below: 0
    above: -1
  - platform: numeric_state
    entity_id:
      - sensor.weather_station_temperature
    id: mehr heizen
    for:
      hours: 0
      minutes: 15
      seconds: 0
    above: -2
    below: -1
    value_template: >-
      {{ states('sensor.weather_station_temperature') | float -
      states('input_number.solltemperatur') | float  }}
  - platform: numeric_state
    entity_id:
      - sensor.weather_station_temperature
    id: noch mehr heizen
    for:
      hours: 0
      minutes: 15
      seconds: 0
    value_template: >-
      {{ states('sensor.weather_station_temperature') | float -
      states('input_number.solltemperatur') | float  }}
    below: -2
  - platform: numeric_state
    entity_id:
      - sensor.weather_station_temperature
    id: weniger heizen
    for:
      hours: 0
      minutes: 15
      seconds: 0
    below: 2
    above: 1
    value_template: >-
      {{ states('sensor.weather_station_temperature') | float -
      states('input_number.solltemperatur') | float  }}
  - platform: numeric_state
    entity_id:
      - sensor.weather_station_temperature
    id: noch weniger heizen
    value_template: >-
      {{ states('sensor.weather_station_temperature') | float -
      states('input_number.solltemperatur') | float  }}
    above: 2
  - platform: state
    entity_id:
      - input_number.solltemperatur
    id: neue Solltemperatur
    for:
      hours: 0
      minutes: 0
      seconds: 0
condition:
  - condition: state
    entity_id: binary_sensor.winter_is_coming
    state: "on"
action:
  - choose:
      - conditions:
          - condition: trigger
            id: Absenktemperatur
        sequence:
          - service: input_number.set_value
            metadata: {}
            data:
              value: "{{ states('input_number.solltemperatur') }}"
            target:
              entity_id: input_number.letzter_sollwert
          - service: input_number.set_value
            metadata: {}
            data:
              value: "{{ states('input_number.absenktemperatur') }}"
            target:
              entity_id: input_number.solltemperatur
      - conditions:
          - condition: trigger
            id:
              - Heizen
              - heizen normal
              - neue Solltemperatur
        sequence:
          - if:
              - condition: trigger
                id:
                  - Heizen
            then:
              - service: input_number.set_value
                metadata: {}
                data:
                  value: "{{ states('input_number.letzter_sollwert') }}"
                target:
                  entity_id: input_number.solltemperatur
            else: []
          - service: script.heizen_normal
            metadata: {}
            data: {}
      - conditions:
          - condition: trigger
            id:
              - mehr heizen
              - noch mehr heizen
        sequence:
          - service: script.heizen_plus_1_grad
            metadata: {}
            data: {}
      - conditions:
          - condition: trigger
            id:
              - weniger heizen
              - noch weniger heizen
        sequence:
          - service: script.heizen_minus_1_grad
            metadata: {}
            data: {}
mode: restart

PS: Ich weiss grad nicht mehr wer, aber falls die device_id-sammlung Augenkrebs verursacht: mir egal! :stuck_out_tongue_winking_eye:

Supi, Danke für den Input.
Werde ich mich die nächsten Tage (oder Wochen) mal dran versuchen; natürlich “auch” im Selbstversuch, will ja auch verstehen was da abgeht…
VG Tom