Automatyzacja warunkowa

Witam . może ktoś pomoże jak stworzyć automatyzację warunkową w HA w automatyzacjach . Potrzebuję automatyzację która będzie działać tak:
Jeżeli temperatura na czujniku X jest większa niż na czujniku Y to załącz urządzenie Z
Jeżeli temperatura na czujniku X jest mniejsza niż na czujniku Y to załącz urządzenie B
Jeżeli nie da się tego zrobić w jednej automatyzacji to mogą być dwie osobne .

A co jeżeli jest taka sama?

W sumie nie robi to różnicy co będzie jak będzie taka sama . Może zachowywać swój poprzedni stan .

Chyba Cię nie rozumiem, o jakim “stanie poprzednim” piszesz? Jeżeli temperatura na czujniku X jest taka sama jak na czujniku Y to nic nie rób?

automation:
  - alias: "Sterowanie pompami w zależności od temperatury 2 czujników, działanie przemienne "
    trigger:
      - platform: state
        entity_id: sensor.czujnik_x
      - platform: state
        entity_id: sensor.czujnik_y
    action:
      - choose:
          - conditions:
              - condition: numeric_state
                entity_id: sensor.czujnik_x
                above: sensor.czujnik_y
            sequence:
              - service: switch.turn_on
                entity_id: switch.pompa1
              - service: switch.turn_off
                entity_id: switch.pompa2
          - conditions:
              - condition: numeric_state
                entity_id: sensor.czujnik_x
                below: sensor.czujnik_y
            sequence:
              - service: switch.turn_on
                entity_id: switch.pompa2
              - service: switch.turn_off
                entity_id: switch.pompa1

W powyższym przykładzie, jeśli temperatura na czujniku X jest większa niż temperatura na czujniku Y, to włączona zostanie pompa1 i wyłączona zostanie pompa2. Jeśli temperatura na czujniku X jest mniejsza niż temperatura na czujniku Y, to włączona zostanie pompa2, a pompa1 zostanie wyłączona. Jeśli temperatura na obu czujnikach jest taka sama, żadna z pomp nie zostanie włączona.

Wydaje mi się, że było by lepiej jeśli opisał być do czego to ma służyć.
Może wtedy by można zastosować np. Generic Thermostat

2 polubienia

A więc tak już to opisuję . Mój piec centralnego ogrzewania mam ustawiony tak że nie chodzi cały czas tylko powiedzmy 2 godziny chodzi a dwie jest wyłączony , Pomimo że piec jest wyłączony to pompa CO chodzi cały czas i tym samym schładza mi wodę w w bojlerze który przez wężownicę spięty jest z instalacją CO . Chcąc tego uniknąć (schładzania bojlera podczas postoju pieca) zainstalowałem przed wężownicą bojlera motozawór który ma po prostu odcinać przepływ wody z instalacji CO do bojlera . Na instalacji rury ciepłej wody mam oczywiście zainstalowane czujniki temperatury a to wszystko spięte do Supli która jest dodana do HA . No i teraz chodzi o to by automatyzacja w HA działała tak : Czujnik temperatury na rurze ciepłej wody wskazuje że temperatura jest wyższa niż ta w bojlerze, to wtedy zostaje uruchomione otwieranie motozaworu a tym zamym woda płynie na wężownicę bojlera go i ogrzewa w nim wodę . Jeżeli temperatura na czujniku rury ciepłej wody jest niższa niż ta w bojlerze to zostaje zamknięty motozawór i tym samym krążąca w instalacji woda nie schładza bojlera .

Czyli “termostat” nie spełnił by swojej roli, ponieważ dożył by do uzyskania zadanej temperatury.

A tak przy temacie:
Innym sposobem konfiguracji automatyzacji jest wykorzystanie value_template

alias: Sterowanie pompą w zależności od temperatury 2 czujników, działanie przemienne
description: ""
trigger: []
condition: []
action:
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ states('sensor.czujnik_x') | float < states('sensor.czujnik_y') | float }}"
        sequence:
          - service: switch.turn_on
            target:
              entity_id: switch.pompa1
      - conditions:
          - condition: template
            value_template: "{{ states('sensor.czujnik_x') | float > states('sensor.czujnik_y') | float }}"
        sequence:
          - service: switch.turn_off
            target:
              entity_id: switch.pompa1
mode: single

Czyli ten twój pierwszy przyklad spelniłby swoją rolę ? Czyli nie ma szansy zrobić tego z interfejsu graficznego automatyzacji ? , trzeba wpisać kod .

  • Powinien działać poprawnie
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.temp_srednia
            above: sensor.test_4_temperatura_pressure
        sequence:
          - service: switch.turn_on
            entity_id: switch.vdev_controller
          - service: switch.turn_off
            entity_id: switch.computer
...

Edytor wizualny:


/
Ten pierwszy kod nie nadaje się do wklejenia, wymaga usunięcia automation: i ustawienie wcięcia.

Tak wygląda kod do wklejenia w Edycja w YAML

alias: >-
  Sterowanie pompami w zależności od temperatury 2 czujników, działanie
  przemienne
description: ""
trigger:
  - platform: state
    entity_id: sensor.temp_srednia
  - platform: state
    entity_id: sensor.test_4_temperatura_pressure
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.temp_srednia
            above: sensor.test_4_temperatura_pressure
        sequence:
          - service: switch.turn_on
            entity_id: switch.vdev_controller
          - service: switch.turn_off
            entity_id: switch.computer
      - conditions:
          - condition: numeric_state
            entity_id: sensor.temp_srednia
            below: sensor.test_4_temperatura_battery
        sequence:
          - service: switch.turn_on
            entity_id: switch.computer
          - service: switch.turn_off
            entity_id: switch.aqara_hub_51a1_pairing_mode
mode: single

A tak wygląda w Edytor wizualny:


:information_source: To jest tylko przykład bo ta automatyzacja (ostatnia) jest z losowych encji i nie ma sensu

Przepraszam że tak pózno odpisuję ale znowu ważny wyjazd .
Moje encje wyglądają tak :
Bojler temperatura - sensor.bojler_grzalka_temperature
Rura ciepła woda - sensor.bojler_sterowanie_temperature_2
Motozawór otwieranie - light.bojler_sterowanie_zawor_otwieranie
Motozawór zamykanie - light.bojler_sterowanie_zawor_zamykanie

A ma działać tak :
Jeżeli temperatura bojler większa niż temperatura rura ciepła woda - motozawór zamykanie
Jeżeli temperatura bojler mniejszaniż temperatura rura ciepła woda - motozawór otwieranie

Czy kod powinien wyglądać tak ?

alias: >-
  Sterowanie zaworem w zależności od różnicy temperatur
  przemienne
description: ""
trigger:
  - platform: state
    entity_id: sensor.bojler_grzalka_temperature
  - platform: state
    entity_id: sensor.bojler_sterowanie_temperature_2
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.bojler_grzalka_temperature
            above: sensor.bojler_sterowanie_temperature_2
        sequence:
          - service: switch.turn_off
            entity_id: light.bojler_sterowanie_zawor_zamykanie
      - conditions:
          - condition: numeric_state
            entity_id: sensor.bojler_grzalka_temperature
            below: sensor.bojler_sterowanie_temperature_2
        sequence:
          - service: switch.turn_on
            entity_id: light.bojler_sterowanie_zawor_otwieranie
mode: single

switch.turn_off a entity_id: light Jest błędne

np.
service: light.turn_off dla światła entity_id: light.xxx
service: switch.turn_off dla przełączników entity_id: switch.xxx`
:information_source:Światłem (żarówką sterujesz zaworami)?
/
Temperature pobiera bezpośrednio z atrybutów

Jeśli nie popełniłem błędu w kodzie i logice to powinno działać

alias: Sterowanie zaworem w zależności od różnicy temperatur
description: ""
trigger:
  - platform: state
    entity_id: sensor.bojler_grzalka_temperature
  - platform: state
    entity_id: sensor.bojler_sterowanie_temperature_2
condition: []
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.bojler_grzalka_temperature
            above: "{{ state_attr('sensor.bojler_sterowanie_temperature_2', 'state') }}"
        sequence:
          - service: switch.turn_off
            entity_id: switch.bojler_sterowanie_zawor_zamykanie
      - conditions:
          - condition: numeric_state
            entity_id: sensor.bojler_grzalka_temperature
            below: "{{ state_attr('sensor.bojler_sterowanie_temperature_2', 'state') }}"
        sequence:
          - service: switch.turn_on
            entity_id: switch.bojler_sterowanie_zawor_otwieranie
mode: single

No niestety taką mam encję ustawioną . Nie wiem kiedy popełniłem ten błąd ale mi działa dlatego nie zwróciłem na to wcześniej uwagi . A steruję zaworem przez przekazniki .

Już sprawdziłem jak to się stało że jest to light a nie swith . Sterowanie jest postawione na Supli a w niej jedyna opcja jaka mnie satysfakcjonowała czyli działała jak chciałem to ustawienia tego jako " Automat schodowy " i niestety tak musi zostać . I zapewne dlatego pokazuje encję jako light .

Ok
Jak zmienisz swój kod z
- service: switch.turn_off na - service: light.turn_off
a
- service: switch.turn_on na - service: light.turn_on
To będzie Ok
:thinking:Tak się zastanawiam.
Czy w tej automatyce są wymagane “wyzwalacze” bo wydaje mi się, że nie

Już wstawiam tą automatyzację . Lecz nie mam możliwości sprawdzić tego na szybko bo czujniki mam zabudowane i trzeba czekać na zmianę temperatur. Jutro jak nie wyjadę znowu to dam znać czy działa . Mocne podziękowania za pomoc i poświęcony czas .

:grinning: Możesz wywołać zmianę wartości, wpisując i klikając Ustaw Stan zmieni się wartość do czasu kiedy zostaną odczytany nowe dane np. sensora

Zrobiłem jak napisałeś . Działa połowicznie , tzn gdy rura ma wyższą temp. niż bojler to otwiera zawór (otwieranie trwa 7 sekund - tak ma być .) a następnie znowu otwiera i otwiera i tak ciągle . Natomiast jak rura ma niższą temp. niż bojler to nie dzieje się nic . Kod mam taki :

alias: Sterowanie zaworem w zależności od różnicy temperatur przemienne
description: ""
trigger:
  - platform: state
    entity_id: sensor.bojler_grzalka_temperature
  - platform: state
    entity_id: sensor.bojler_sterowanie_temperature_2
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.bojler_grzalka_temperature
            above: sensor.bojler_sterowanie_temperature_2
        sequence:
          - service: light.turn_off
            entity_id: light.bojler_sterowanie_zawor_zamykanie
      - conditions:
          - condition: numeric_state
            entity_id: sensor.bojler_grzalka_temperature
            below: sensor.bojler_sterowanie_temperature_2
        sequence:
          - service: light.turn_on
            entity_id: light.bojler_sterowanie_zawor_otwieranie
mode: single

Zatrzymaj tamtą automatyzacje a uruchom tą:

  alias: Sterowanie zaworem w zależności od różnicy temperatur przemienne TEST
description: ""
trigger:
  - platform: state
    entity_id: sensor.bojler_grzalka_temperature
  - platform: state
    entity_id: sensor.bojler_sterowanie_temperature_2
action:
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ states('sensor.bojler_grzalka_temperature') | float > states('sensor.bojler_sterowanie_temperature_2') | float }}"
        sequence:
          - service: light.turn_off
            entity_id: light.bojler_sterowanie_zawor_zamykanie
      - conditions:
          - condition: template
            value_template: "{{ states('sensor.bojler_grzalka_temperature') | float < states('sensor.bojler_sterowanie_temperature_2') | float }}"
        sequence:
          - service: light.turn_on
            entity_id: light.bojler_sterowanie_zawor_otwieranie
mode: single

Jeśli ta nie zadziała poprawnie, to musisz upewnić się czy np. light.bojler_sterowanie_zawor_otwieranie - po wywołani stanu ON otwiera zawór
/
:thinking:
light.bojler_sterowanie_zawor_otwieranie
i
light.bojler_sterowanie_zawor_zamykanie
To jest ta sama żarówka (przełącznik)?
/
Wrzuć ten kod do Narzędzia deweloperskie > Szablon. HA pokarze który spełnia warunek ( “False” inny “True”)

Nie . Tylko cały czas otwiera zawór co ileś sekund . Może napiszę jak to jest na Supli zrobione to będzie łatwiej . Otwieranie i zamykanie zaworu trwa ok 7 sekund . Dlatego na supli mam to tak ustawione jako automat schodowy . Czyli w aplikacji HA naciskam otwieranie zaworu to w supli zalącza się tzw . automat schodowy , czyli supla załącza mi przekaznik który podaje przez 7 sekund napięcie na motozawór i zostaje on otwarty . Po 7 sekundach tzw. automat schodowy się wyłącza i napięcie nie jest już podawane do następnego wyzwolenia . Analogicznie zamykanie zaworu . Tylko tu napięcie podawane jest na drugi przekaznik który znowu obraca zawór w drugą stronę , tym razem go zamykając . Czyli moim zdaniem nie powinno być w jednym sequence light.turn_on a w drugim light.turn_off , tylko w obu light.turn_on

OK ( “tu jest pies pogrzebany”)
Podmień i daj znać

Tak to jest to . Nareszcie działa . Jeszcze raz dziękuję za pomoc . Nie wiem czy by nie trzeba jeszcze dodać jakiejś histerezy bo nie wiem co się będzie działo jak temperatury będą blisko siebie . Trochę się za wcześnie ucieszyłem bo po ok dwóch minutach nastąpiło ponowne zamknięcie zaworu po następnych znowu zamknięcie pomimo że temperatury się nie zmieniały i znowu zamknięcie . Spróbuję jeszcze wyłączyć z prądu cały serwer może się coś popieprzyło . Mój kod wygląda teraz tak :

alias: Sterowanie zaworem w zależności od różnicy temperatur przemienne TEST
description: ""
trigger:
  - platform: state
    entity_id: sensor.bojler_grzalka_temperature
  - platform: state
    entity_id: sensor.bojler_sterowanie_temperature_2
action:
  - choose:
      - conditions:
          - condition: template
            value_template: >-
              {{ states('sensor.bojler_grzalka_temperature') | float >
              states('sensor.bojler_sterowanie_temperature_2') | float }}
        sequence:
          - service: light.turn_on
            data: {}
            target:
              entity_id: light.bojler_sterowanie_zawor_zamykanie
      - conditions:
          - condition: template
            value_template: >-
              {{ states('sensor.bojler_grzalka_temperature') | float <
              states('sensor.bojler_sterowanie_temperature_2') | float }}
        sequence:
          - service: light.turn_on
            entity_id: light.bojler_sterowanie_zawor_otwieranie
mode: single

Niestety mimo restartu servera ciągle co parę minut , sekund włącza zamykanie zaworu (teraz powinien być cały czas zamknięty ). Nawet nie wiem od czego to jest zależne bo czasy uruchomiania zamykania zaworu są różne .