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”
macek
15 Styczeń 2024 16:12
2
@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ń
1 polubienie
MariuszAK
(mariuszak)
15 Styczeń 2024 16:13
3
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;
}
macek
15 Styczeń 2024 16:19
4
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.
MariuszAK
(mariuszak)
15 Styczeń 2024 16:40
6
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
szopen
15 Styczeń 2024 17:01
7
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
macek
15 Styczeń 2024 17:18
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;
}
MariuszAK
(mariuszak)
15 Styczeń 2024 17:19
10
zwróć uwagę na "wcięcia w kodzie, one mają znaczenie. Zobacz jak w podlinkowanej dokumentacji.
PS. @macek był szybszy
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
MariuszAK
(mariuszak)
15 Styczeń 2024 17:36
12
Pier_pe:
Błędy kompilacji:
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"
macek
15 Styczeń 2024 17:39
13
Pier_pe:
Zamieniłem co nieco:
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 ? To ja się poddaję .
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"
macek
15 Styczeń 2024 17:43
15
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
macek
15 Styczeń 2024 18:10
17
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.