Zamiana zmiennej na wartość tekstową

Potrzebuję zamienić zmienną która przyjmuje wartości 1-0 zamienić na tekst “ON’” “OFF”

  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5" 
    lambda: |-
      if (id(sensor5).state == 0) {
        return "ON";
      } else {
        return "OFF";
      }

W tym kodzie kompilator pluje się do wartości “ON” “OFF”

@Pier_pe używasz skrótów myślowych, nigdzie wprost nie jest napisane, że chodzi o kod yaml w ESPHome, prawda? Teraz nie powinien nic robić tylko czekać na Twoje potwierdzenie a to powoduje wydłużenie czasu rozwiązywania Twojego problemu i niepotrzebną zabawę w sto pytań :wink:

1 polubienie

a jak dasz bez cudzysłowów ?

  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5" 
    lambda: |-
      if (id(sensor5).state == 0) {
        return ON;
      } else {
        return OFF;
      }

Nie wiem co dokładnie chcesz osiągnąć ale wg standardów HA robisz błąd ponieważ “ŚWIATŁO” to domena light przyjmująca wartości 1/0, on/off dlatego zamiast sensor należy użyć binary_sensor.

Myślałem że jak daję pytanie w kategorii esphome to może chodzić tylko o yaml.
Bez cudzysłowów też jest błąd:

<unicode string>: In lambda function:
<unicode string>:74:16: error: 'ON' was not declared in this scope; did you mean 'OK'?
<unicode string>:76:16: error: 'OFF' was not declared in this scope
*** [.pioenvs/esp-kotownia/src/main.cpp.o] Error 1

“Światło” to tylko jedna z wartości. Mam też “Pompa” i “Zawór”:

esphome:
  name: esp-kotownia
  friendly_name: KOTŁOWNIA

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Kotownia Fallback Hotspot"
    password: "798w4FM5X8dX"

uart:
  baud_rate: 19200
  tx_pin: 1
  rx_pin: 3
  id: UART3
  parity: even
  debug:
    direction: RX
    dummy_receiver: true
    after:
       bytes: 14
    sequence:
    - lambda: |-
       UARTDebug::log_int(direction, bytes,',');

         //int val1=10;
         //int val2=0;
        //std::string str(bytes.begin(), bytes.end());

       //if (sscanf(str.c_str(), "%d,%d", &val1, &val2) == 2 ) {
       id(sensor1).publish_state(bytes [0]); 
       id(sensor2).publish_state(bytes [1]);
       id(sensor3).publish_state(bytes [3]);
       id(sensor4).publish_state(bytes [4]);
       id(sensor5).publish_state(bytes [5]);
          //}
sensor:
  - platform: template
    name: "KOCIOŁ"
    unit_of_measurement: "°C"
    id: "sensor1"
  - platform: template
    name: "ZASOBNIK C.W.U."
    unit_of_measurement: "°C"
    id: "sensor2"
  - platform: template
    name: "ZAWÓR C.W.U."
    id: "sensor3"
  - platform: template
    name: "POMPA"
    id: "sensor4"
  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5" 
    lambda: |-
      if (id(sensor5).state == 0) {
        return "ON";
      } else {
        return "OFF";
      }

Może źle kombinuje i trzeba to zrobić bezpośrednio w HA? Ale tam szukałem bezskutecznie.

Bo słusznie zauważył @macek , że powinieneś użyć binary_sensor
wtedy za dokumentacją …

po utworzeniu sensora możesz ten stan opublikować dla HA binary_sensor.template.publish

OFF TOPIC

esphome to nie kategoria tylko tag, forum wymaga przebudowy, ale raczej nie możemy stworzyć osobnego działu “esphome”, bo większość istniejących wątków powiązanych z ESP zawiera odniesienia do rożnych projektów bazujących na tym sprzęcie, więc przyszły dział gdzie by to mogło pasować postulowałem jako coś od nazwą w rodzaju “DIY-Espressif” - potrzebna dyskusja na ten temat!

Ech ja naprawdę nie mogę tego zrozumieć:

binary_sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
        lambda: |-
      if (id(sensor3).state ==1) {
        return true;
      } else {
        return false;
      }

Nie chce się skompilować:

while parsing a block mapping
  in "<unicode string>", line 64, column 5
did not find expected key
  in "<unicode string>", line 66, column 9

Jezeli wygląda to dokladnie jak podałeś wyżej to masz błędne wcięcie powinno byc:

binary_sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
    lambda: |-
      if (id(sensor3).state ==1) {
        return true;
      } else {
        return false;
      }

zwróć uwagę na "wcięcia w kodzie, one mają znaczenie. Zobacz jak w podlinkowanej dokumentacji.
PS. @macek był szybszy :bullettrain_front:

Nie podziałało:

esphome:
  name: esp-kotownia
  friendly_name: KOTŁOWNIA

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Kotownia Fallback Hotspot"
    password: "798w4FM5X8dX"

uart:
  baud_rate: 19200
  tx_pin: 1
  rx_pin: 3
  id: UART3
  parity: even
  debug:
    direction: RX
    dummy_receiver: true
    after:
       bytes: 14
    sequence:
    - lambda: |-
       UARTDebug::log_int(direction, bytes,',');

         //int val1=10;
         //int val2=0;
        //std::string str(bytes.begin(), bytes.end());

       //if (sscanf(str.c_str(), "%d,%d", &val1, &val2) == 2 ) {
       id(sensor1).publish_state(bytes [0]); 
       id(sensor2).publish_state(bytes [1]);
       id(sensor3).publish_state(bytes [3]);
       id(sensor4).publish_state(bytes [4]);
       id(sensor5).publish_state(bytes [5]);
          //}
sensor:
  - platform: template
    name: "KOCIOŁ"
    unit_of_measurement: "°C"
    id: "sensor1"
  - platform: template
    name: "ZASOBNIK C.W.U."
    unit_of_measurement: "°C"
    id: "sensor2"
binary_sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
    lambda: |-
      if (id(sensor3).state == 1) {
        return true;
      } else {
        return false;
      }
  - platform: template
    name: "POMPA"
    id: "sensor4"
  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5" 

Błędy kompilacji:

INFO ESPHome 2023.12.5
INFO Reading configuration /config/esphome/esp-kotownia.yaml...
Failed config

uart: [source <unicode string>:28]
  - baud_rate: 19200
    tx_pin: 
      number: 1
      mode: 
        output: True
        input: False
        open_drain: False
        pullup: False
        pulldown: False
        analog: False
      inverted: False
    rx_pin: 
      number: 3
      mode: 
        input: True
        output: False
        open_drain: False
        pullup: False
        pulldown: False
        analog: False
      inverted: False
    id: UART3
    parity: EVEN
    debug: 
      direction: RX
      dummy_receiver: True
      after: 
        bytes: 14
        timeout: 100ms
      sequence: 
        - then: 
            - 
              Couldn't find ID 'sensor3'. Please check you have defined an ID with that name in your configuration. These IDs look similar: "sensor5", "sensor4", "sensor2".
              lambda: !lambda |-
                UARTDebug::log_int(direction, bytes,',');
                
                  //int val1=10;
                  //int val2=0;
                 //std::string str(bytes.begin(), bytes.end());
                
                //if (sscanf(str.c_str(), "%d,%d", &val1, &val2) == 2 ) {
                id(sensor1).publish_state(bytes [0]); 
                id(sensor2).publish_state(bytes [1]);
                id(sensor3).publish_state(bytes [3]);
                id(sensor4).publish_state(bytes [4]);
                id(sensor5).publish_state(bytes [5]);
                   //}
    rx_buffer_size: 256
    stop_bits: 1
    data_bits: 8
binary_sensor.template: [source <unicode string>:64]
  platform: template
  name: ZAWÓR C.W.U.
  
  Couldn't find ID 'sensor3'. Please check you have defined an ID with that name in your configuration. These IDs look similar: "sensor5", "sensor4", "sensor2".
  lambda: !lambda |-
    if (id(sensor3).state == 1) {
      return true;
    } else {
      return false;
    }
  disabled_by_default: False

Zamieniłem co nieco:

esphome:
  name: esp-kotownia
  friendly_name: KOTŁOWNIA

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "cw0X0ZruJjxyIDimhqcR9kgBTs5B52U3iVvKwqsjFOk="  

ota:
  password: "d4026780126edfe7970bf578498e266e"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Kotownia Fallback Hotspot"
    password: "798w4FM5X8dX"

uart:
  baud_rate: 19200
  tx_pin: 1
  rx_pin: 3
  id: UART3
  parity: even
  debug:
    direction: RX
    dummy_receiver: true
    after:
       bytes: 14
    sequence:
    - lambda: |-
       UARTDebug::log_int(direction, bytes,',');

         //int val1=10;
         //int val2=0;
         //std::string str(bytes.begin(), bytes.end());

       //if (sscanf(str.c_str(), "%d,%d", &val1, &val2) == 2 ) {
       id(sensor1).publish_state(bytes [0]); 
       id(sensor2).publish_state(bytes [1]);
       id(sensor3).publish_state(bytes [3]);
       id(sensor4).publish_state(bytes [4]);
       id(sensor5).publish_state(bytes [5]);
          //}
sensor:
  - platform: template
    name: "KOCIOŁ"
    unit_of_measurement: "°C"
    id: "sensor1"
  - platform: template
    name: "ZASOBNIK C.W.U."
    unit_of_measurement: "°C"
    id: "sensor2"
  - platform: template
    name: "POMPA"
    id: "sensor4"
  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5" 

binary_sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
     lambda: |-
      if (id(sensor3).state == 1) {
        return true;
      } else {
        return false;
      }

I podkreśla mi na czerwono sam początek -esphome: i wyświetla że są błędy unicode string w lini 71 i 73

Odwołujesz się w lambda do id_(sensor3) a on nie jest zdefiniowany w sekcji sensor, podobnie w binary_sensor.

sensor:
  - platform: template
    name: "KOCIOŁ"
    unit_of_measurement: "°C"
    id: "sensor1"
  - platform: template
    name: "ZASOBNIK C.W.U."
    unit_of_measurement: "°C"
    id: "sensor2"
  - platform: template
    name: "NAZWA SENSORA"
    id: "sensor3"

binary_sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
    lambda: |-
      if (id(sensor3).state == 1) {
        return true;
      } else {
        return false;
      }
  - platform: template
    name: "POMPA"
    id: "sensor4"
  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5"

Czyli zakładasz, że mamy sobie to “conieco” sami w tym wszystkim wyszukać na zasadzie “znajdź różnice na rysunku”? Kto z nas jest najbardziej postrzegawczy :slight_smile:? To ja się poddaję :grin:.
A tak poza konkursem - jak się coś testuje to robi sie to dla jednej zmiennej, jak to działa to probuję się to zrobic dla dwóch zmiennych, jak zadziała to robi się zwielokrotnienie tego dla pozostałych - postępowanie w tej sposób pozwala szybko i sprawnie debugować gdzie i jakie pojawią się błędy.

Że jak?

Wcześniejsza kompilacja z samymi “Sensor” działała pomimo że w sekcji sensor nie było ich definicji:

esphome:
  name: esp-kotownia
  friendly_name: KOTŁOWNIA

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxx"  

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Kotownia Fallback Hotspot"
    password: "798w4FM5X8dX"

uart:
  baud_rate: 19200
  tx_pin: 1
  rx_pin: 3
  id: UART3
  parity: even
  debug:
    direction: RX
    dummy_receiver: true
    after:
       bytes: 14
    sequence:
    - lambda: |-
       UARTDebug::log_int(direction, bytes,',');

         //int val1=10;
         //int val2=0;
        //std::string str(bytes.begin(), bytes.end());

       //if (sscanf(str.c_str(), "%d,%d", &val1, &val2) == 2 ) {
       id(sensor1).publish_state(bytes [0]); 
       id(sensor2).publish_state(bytes [1]);
       id(sensor3).publish_state(bytes [3]);
       id(sensor4).publish_state(bytes [4]);
       id(sensor5).publish_state(bytes [5]);
          //}
sensor:
  - platform: template
    name: "KOCIOŁ"
    unit_of_measurement: "°C"
    id: "sensor1"
  - platform: template
    name: "ZASOBNIK C.W.U."
    unit_of_measurement: "°C"
    id: "sensor2"
  - platform: template
    name: "ZAWÓR C.W.U."
    id: "sensor3"
  - platform: template
    name: "POMPA"
    id: "sensor4"
  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5" 



I jakie wartości przyjmuja te poszczególne sensory dla takiej konfiguracji jak poniżej?

sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
    id: "sensor3"
  - platform: template
    name: "POMPA"
    id: "sensor4"
  - platform: template
    name: "ŚWIATŁO"
    id: "sensor5" 

Edit:
@Pier_pe szybkie pytanie - szybka odpowiedz, nad czym sie tak zastanawiasz? Nie zmieniaj w miedzy czasie niczego innego bo inaczej nie widzę sensu wspólnego rozwiązywania tego problemu.

Znalazłem problem.
Prawidłowa konfiguracja dla binary_sensor:

binary_sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
    id: "sensor3"   //<----TEGO ZABRAKŁO
    lambda: |-
      if (id(sensor3).state == 1) {
        return true;
      } else {
        return false;
      }

Tylko teraz pytanie czy używając binary_sensor mam jakiś wpływ na to co wyświetla się w HA? Teraz mam “wł” “wył” a chciałbym np dla zaworu “otwarty” “zamknięty”…

1 polubienie

Jezeli wcześniejszy sensor "ZAWÓR C.W.U." przyjmuje wartości tylko 0 i 1 to wtedy wystarczy taka definicja:

binary_sensor:
  - platform: template
    name: "ZAWÓR C.W.U."
    id: "sensor3" 
    device_class: opening  //<---- jak widziany jest binary_sensor w HA

Oczywiście, że tak, wystarczy zdefiniować klasę urządzenia wg Binary sensor - Home Assistant albo zrobić co Ci się podoba jeżeli chodzi o ikonę encji, opis stanów encji.

P.S. "ZAWÓR C.W.U." jeżeli to faktycznie sterowanie zaworu (a nie tylko stan) przez Twoj “protokół” to poszedłbym o krok dalej i dorobił jego sterowanie za pomocą Template Switch — ESPHome, podobnie z "POMPA" ale brakuje szczegołów z Twojego rozwiązania.

Spoko opanowałem ikony i ich opisy…

Zawór C.W.U. to tylko stan zaworu nie sterowanie (na razie), dążę do sterowania tym zaworem…

Dzięki wielkie za pomoc.