ESPhome warunki if, else

Witam.
Od niedawna zacząłem bawić się esphome, więc bardzo proszę o wyrozumiałość.
Do tej pory oprogramowanie na mikrokontrolery, czy też PC pisałem w C, C++, C# i w tych środowiskach sobie radzę, natomiast esphome, to dla mnie nowość, której nie do końca potrafię zrozumieć. Tu proszę was o pomoc. Do ESP12-F mam dołączone 3 czujniki: BMP280, DHT11 oraz SDS01. Skrypt jak poniżej

sensor:
  - platform: bmp280
    i2c_id: bus_a
    temperature:
      name: "Temperatura_BMP"
      oversampling: 16x
    pressure:
      name: "Ciśnienie"
    address: 0x76
    update_interval: 30sec

  - platform: dht
    pin: D0
    temperature: 
      name: "Temperatura_DHT"
    id: hum
    humidity: 
      name: "Wilgotność"
    update_interval: 30sec
  
  
  - platform: sds011
    pm_2_5:
      name: "PM <2.5µm"
    pm_10_0:
      name: "PM <10.0µm "
    update_interval: 30min

Wszystko działa pięknie, dane przesyłane są do HA ale czy istnieje możliwość wstawiania warunku, w którym załączanie SDS011 nastąpi tylko i wyłącznie wtedy jeśli wilgotność odczytana z DHT będzie poniżej zadanej wartości?
coś jak:

if(humidity<75){
  wykonajPomiar;
}
else{
  nieRobNic;
}

Dziękuję.

Musisz zmienić sposób myślenia, nie jesteś pierwszy, który ma z tym problem ale to nic trudnego :slight_smile:.

HA i ESPHome wykorzystują automatyzacje, które wykonują się jeżeli coś się zmieni, jeżeli encja zmieni swój stan i tak w przypadku sensor w ESPHome masz takie możliwości - sensor-automation. Proponuje dokładnie czytać dokumentację, jest tam sporo przykładów, nawet Twój przypadek:

sensor:
  - platform: dht
    # ...
    on_value_range:
      - below : 75.0
        then:
          - switch.turn_on: relay_1

Bardzo dziekuje za konkretną i wyczerpującą odpowiedź. O to mi chodziło.

Jednak nie jest tak łatwo jakby się wydawało. Korzystając z metody on_value_range edytor nie podpowiada/nie widzi id czujnika. Jeśli spróbuję wprowadzić go ręcznie, to zgłasza błędy. Też zauważyłem, że zamiana miejscami poszczególnych czujników (zamiana w kodzie) powoduje wywalanie się kompilatora lub zgłaszanie błędu w edytorze.
ESPhome jest fajnym narzędziem, ale jakoś nie potrafię zrozumieć jego logiki.

Chyba będę musiał oprogramować urządzenie w tradycyjny sposób. Czyli na piechotę w C++ z wykorzystaniem MQTT.

A jeszcze jedna rzecz mi się nasuwa na myśl. Czy spod HA można odnieść się do zmiany interwału odpytywania konkretnego urządzenia - czujnika?

Sorry ale nie wiem o czym piszesz więc nie jestem wstanie pomóc. Jezeli bedziesz potocznie coś opisywał bez przykładów to raczej marna szansa żeby rozwiązać problem techniczny.

Problem opisany na samym początku z przykładem. Trzy czujniki podłączone do esp8266. Chodzi o to aby zezwolenie na uruchomienie czujnika SDS011 nastąpiło tylko i wyłącznie jeśli wilgotność powietrza jest niższa niż 75%. Co masz na myśli mówiąc o potocznym przedstawianiu problemu?

Jeśli zaczynasz pisać, to edytor podpowiada składnię tak? Natomiast w przypadku czujnika sds011 nie robi tego. Jesli ręcznie wprowadzę dane takie jak id czujnika, to z automatu mam podkreślenie błędu.

Przegladajac dokumentacje, czy przykłady nie spotkałem aby ktoś uzależniał działanie jednego czujnika od drugiego. Są co prawda akcje związane z przyciskiem i przekaźnikiem ale to nie to samo.

Niestety nie jestem Yamlowy. Nie potrafię przestawić się na taki język. Na codzień pisze w pochodnych języka C wiec proszę nie dziwcie się, ze yaml jest dla mnie mało logiczny.

Jest mało logiczny, bo to nie jest język programowania, pod spodem tego YAMLa są kilometry c++, więc skoro to jest coś czym żyjesz, to świetnie, bo raczej będziesz musiał sobie stworzyć komponent niestandardowy na bazie sds011, zobacz jak jest zbudowany komponent standardowy (być może to co wymyślisz da się wdrożyć jako bardziej ogólne rozwiązanie w ESPHome lub wybranych komponentach, którym by się właśnie coś podobnego przydało)

1 Like

Dziekuje. To wiele wyjaśnia.

Co masz na myśli? Jak technicznie to się ma odbyć. Mam nadzieję, że próbujesz użyć switch.turn_on do encji typu sensor.

Zrób print screen tego błędu tak aby byla widoczna definicja encji czujnika.

Ja rozumiem ideę - ale switch tu nie pomoże.
Mało technicznie, ale zrozumiesz - SDS011 (jak i wiele innych czujników pyłu zawieszonego) ma własny MCU w który nie ingerujemy (ten się komunikuje UARTem).

Natomiast czujnik jako całość nie jest wieczny - tam pracuje mechaniczny wentylator oraz naświetlacz LED (z wykręconą mocą tak daleko, że wytrzymuje tylko parę tysięcy godzin pracy), można jego żywotność znacznie przedłużyć aktywując go tylko na czas jednego pomiaru oraz nie aktywując go wcale jeśli warunki w których nie jest w stanie dać wiarygodnych wartości (za wysoka wilgotność).

Komponent standardowy przewiduje tylko możliwość pracy ciągłej (interwał 0 minut) lub pracy cyklicznej (w zakresie 1-30 min), ale nie przewiduje możliwości wyłączenia.
Technicznie jest to możliwe, ale nie na bazie komponentu standardowego.

Tak wiem o tym i dlatego chce usypiać czujnik na dłużej i blokować go przy dużej wilgotności powietrza. Kilka lat temu zbudowałem sobie stacje monitorująca, która działa do dziś, dzięki temu, ze czujnik nie działa w trybie automatycznym, tylko w najlepszych dla niego warunkach (czyli przy niskiej wilgotności). Program do obsługi SDS011 pisalem w oparciu o kartę katalogowa czujnika, stad wiem jakie są jego słabe punkty. Wtedy jako protokół komunikacyjny z HA wykorzystałem MQTT. Dwa dni temu wpadło mi w oko właśnie esphome i spodobało mi się api. Stad tez pomysł aby przenieść mój projekt na platformę esphome. Spróbuje w takim razie połączyć swój kod z yaml. Jeśli będzie działać, to się podzielę.

Na twoim miejscu, to bym raczej zgłosił propozycję kluczowym deweloperom, bo to projekt, który się rozwija i chyba każde sensowne ulepszenia są mile widziane.
Tu taką ogólną ideą jest możliwość wstrzymania pracy tego czujnika (i wielu innych podobnych), bo to jest dobrze uzasadnione jako nowa funkcjonalność.

Oczywiście komponent niestandardowy jest jakimś posunięciem, ale widziałem że bywały takie sytuacje, gdy ktoś napisał coś lepszego niż to co było wcześniej i w całości wymieniono cały komponent na nowy innego autora.