Home Assistant Automation vereinfachen? (YAML)



  • Moin, ich finde die Syntax von HA teils extrem schwer überprüfbar, aber vielleicht ist das auch nur Gewöhnungssache.

    Was möchte ich?

    Es ist Winter und neben einer Tür steht ein Temperatursensor. Wenn ich die Tür öffne, wird es innen kälter (da Winter ist, und die Außentemperatur kleiner ist als die Innentemperatur). Daraufhin soll eine LED automatisch eingeschaltet werden. Danach und wenn ich die Tür wieder schließe, wird es innen nicht mehr kälter und die LED soll wieder ausgeschaltet werden.

    Vice versa, wenn es Sommer ist (die Innentemperatur ist dann kleiner und es wird wärmer, wenn die Tür geöffnet wird).

    Was ist das Problem?

    Die Automation startet bei jeder Temperaturänderung des Türsensors. Das ist so weit in Ordnung. Aber ich möchte einen Early-Stop erreichen: Wenn der Threshold gar nicht erreicht wird und die LED nicht eingeschaltet ist, dann soll auch gar nichts passieren. Und ich weiß nicht, ob es auch so etwas wie globale Automation-States gibt.

    Die LED soll eben nicht unnötig oft ein- und ausgeschaltet werden oder "angefunkt" werden, obwohl nix ist.

    alias: Dyn Temp Shift Door
    description: Automatically adjusts the sensitivity based on the temperature difference.
    triggers:
      - trigger: state
        entity_id: sensor.temp_shift_door
    actions:
      - variables:
          temp_innen_1: '{{ states(''sensor.temp_combi'') | float(24) }}'
          temp_innen_2: '{{ states(''sensor.wohnzimmer_tp357_klein_temperature'') | float(24) }}'
          temp_aussen: '{{ states(''sensor.aktuelle_wetter_temperatur'') | float(15) }}'
          temp_shift_door: '{{ states(''sensor.temp_shift_door'') | float(0) }}'
          delta: '{{ max((temp_innen_2 - temp_aussen) | abs, 4) }}'
          threshold: '{{ 0.01 + (delta * 0.005) }}'
      - choose:
          - conditions:
              - condition: template
                value_template: '{{ temp_innen_1 >= temp_aussen }}'
            sequence:
              - choose:
                  - conditions:
                      - condition: template
                        value_template: '{{ temp_shift_door < (threshold * -1) }}'
                    sequence:
                      - action: light.turn_on
                        target:
                          entity_id: light.tapo_l530_balkon
                  - conditions:
                      - condition: template
                        value_template: '{{ temp_shift_door > 0.01 }}'
                      - condition: state
                        entity_id: light.tapo_l530_balkon
                        state: 'on'
                    sequence:
                      - action: light.turn_off
                        target:
                          entity_id: light.tapo_l530_balkon
          - conditions:
              - condition: template
                value_template: '{{ temp_innen_1 < temp_aussen }}'
            sequence:
              - choose:
                  - conditions:
                      - condition: template
                        value_template: '{{ temp_shift_door > threshold }}'
                    sequence:
                      - action: light.turn_on
                        target:
                          entity_id: light.tapo_l530_balkon
                  - conditions:
                      - condition: template
                        value_template: '{{ temp_shift_door < -0.01 }}'
                      - condition: state
                        entity_id: light.tapo_l530_balkon
                        state: 'on'
                    sequence:
                      - action: light.turn_off
                        target:
                          entity_id: light.tapo_l530_balkon
    
    

    temp_combi ist ein Kombinationssensor aus allen Temperatursensoren im Raum (arithmetisches Mittel, ändert sich kaum, wenn die Tür geöffnet wird), tp357 ist der Türsensor und temp_shift_door ist die Ableitung des Türsensors.



  • Hab's übersichtlicher hinbekommen, und auch einen Fehler behoben, glaube ich:

    alias: Dyn Temp Shift Door
    description: Automatically adjusts the sensitivity based on the temperature difference.
    triggers:
      - trigger: state
        entity_id: sensor.temp_shift_door
    actions:
      - variables:
          temp_innen_1: '{{ states(''sensor.temp_combi'') | float(24) }}'
          temp_innen_2: '{{ states(''sensor.wohnzimmer_tp357_klein_temperature'') | float(24) }}'
          temp_aussen: '{{ states(''sensor.aktuelle_wetter_temperatur'') | float(15) }}'
          temp_shift_door: '{{ states(''sensor.temp_shift_door'') | float(0) }}'
          is_winter: '{{ temp_aussen < temp_innen_1 }}'
          delta: '{{ (temp_aussen - temp_innen_1) | abs }}'
          threshold: '{{ (-1.0 if is_winter else 1.0) * (0.03 + (delta * 0.005)) }}'
      - choose:
          - conditions:
              - condition: state
                entity_id: light.tapo_l530_balkon
                state: 'off'
              - condition: template
                value_template: >-
                  {{ (is_winter and temp_shift_door < threshold) or (not is_winter
                  and temp_shift_door > threshold) }}
            sequence:
              - action: light.turn_on
                target:
                  entity_id: light.tapo_l530_balkon
          - conditions:
              - condition: state
                entity_id: light.tapo_l530_balkon
                state: 'on'
              - condition: template
                value_template: >-
                  {{ (is_winter and temp_shift_door > 0.01) or (not is_winter and
                  temp_shift_door < -0.01) }}
            sequence:
              - action: light.turn_off
                target:
                  entity_id: light.tapo_l530_balkon
    
    

    temp_innen_2 braucht man, glaube ich, gar nicht, da dieser Wert ja schon in temp_shift_door ist.



  • Habe die Werte noch ein wenig angepasst und eine zusätzliche Aktion in Form einer anderen/zusätzlichen Automation hinzugefügt (Vorteil, die zusätzlichen Aktionen kann ich einfach per Knopfdruck ein/aus stellen):

    alias: Dyn Temp Shift Door
    description: Automatically adjusts the sensitivity based on the temperature difference.
    triggers:
      - trigger: state
        entity_id: sensor.temp_shift_door
    actions:
      - variables:
          temp_innen: '{{ states(''sensor.temp_combi'') | float(24) }}'
          temp_aussen: '{{ states(''sensor.aktuelle_wetter_temperatur'') | float(15) }}'
          temp_shift_door: '{{ states(''sensor.temp_shift_door'') | float(0) }}'
          is_winter: '{{ temp_aussen < temp_innen }}'
          delta: '{{ (temp_aussen - temp_innen) | abs }}'
          threshold: '{{ (-1.0 if is_winter else 1.0) * (0.03 + (delta * 0.01)) }}'
      - choose:
          - conditions:
              - condition: state
                entity_id: light.tapo_l530_balkon
                state: 'off'
              - condition: template
                value_template: >-
                  {{ (is_winter and temp_shift_door < threshold) or (not is_winter
                  and temp_shift_door > threshold) }}
            sequence:
              - action: light.turn_on
                target:
                  entity_id: light.tapo_l530_balkon
              - action: automation.trigger
                target:
                  entity_id: automation.leds_in_switch
                data:
                  skip_condition: false
          - conditions:
              - condition: state
                entity_id: light.tapo_l530_balkon
                state: 'on'
              - condition: template
                value_template: >-
                  {{ (is_winter and temp_shift_door > 0.01) or (not is_winter and
                  temp_shift_door < -0.01) }}
            sequence:
              - action: light.turn_off
                target:
                  entity_id: light.tapo_l530_balkon
              - action: automation.trigger
                target:
                  entity_id: automation.leds_in_switch
                data:
                  skip_condition: false
    
    

    Bspw. sind zurzeit 6° Temperaturunterschied (delta) zwischen drinnen und draußen, das heißt, der threshold wäre -0.1, das heißt, die Temperatur müsste um mindestens 0,1° pro Minute weniger werden (also in 10 Minuten mind. minus 1°), damit die Aktionen stattfinden, was praktisch nur der Fall ist, wenn die Tür geöffnet wird. Bis jetzt trat auch noch kein "Dangling" auf, das heißt, es gab keine false-positives.

    Was natürlich nicht funktioniert, ist ein Triggering bei nahezu gleichen Temperaturen (dann kann es ja auch nicht kälter/wärmer werden). Jetzt könnte man aber argumentieren, dass man das tagsüber, wenn es ohnehin hell ist, auch ohnehin nicht braucht.

    Ein weiterer Nachteil wäre, dass das System natürlich reaktiv und etwas träge ist, das heißt, man muss schon ne halbe Minute warten, ehe das Licht umgeschaltet wird... aber das stört nicht, dafür sind die Sensoren relativ einfach, günstig und stabil... Und ich werde mir dafür nicht extra eine Lichtschranke oder so holen. 😃

    Hmm, sicherheitstechnisch gesehen wäre vielleicht noch so eine Art "Spoofing" möglich, das heißt, der Nachbar könnte einen Fake-Sensor mit gleicher MAC nachahmen und eine gerade rapid abfallende Temperatur signalisieren... also das, wovor sie aktuell auch bei diesen bösen GPS-Satelliten Angst haben... aber für sehr realistisch halte ich so ein Szenario nicht. Ich glaube, das wäre dann so etwas: https://de.wikipedia.org/wiki/Überlagerungsempfänger

    Aber damit kenne ich mich zu wenig aus... habe nun nicht E-Technik oder dergleichen studiert.



  • @Anon-81275 sagte in Home Assistant Automation vereinfachen? (YAML):

            value_template: >-
              {{ (is_winter and temp_shift_door > 0.01) or (not is_winter and
              temp_shift_door < -0.01) }}
    

    Ich hab's natürlich verkackt... Es müsste > -0.01 und < +0.01 sein, nicht umgekehrt... (der Bereich müsste also enger sein)

    Ich weiß nicht, ob euch das auch so geht, aber alles, was i-wie mit Thresholds zu tun hat, ist extrem kompliziert für mich... obwohl es eigentlich nur 4 Möglichkeiten gibt: < -, < +, > - oder > + . Ich glaube, alles, was nicht binär oder ternär ist, übersteigt einfach meine Vorstellungskraft... und dabei habe ich eigentlich keine Dyskalkulie. Ist das Übungssache, so ähnlich wie Fahrradfahren? Ist das "auffrischbar" (retrieval)? Haben wir Kognitionswissenschaftler hier, der Tricks geben kann?


Anmelden zum Antworten