Przepisanie/przeniesienie kodu z LUA do ESPhome

Hej,
Mam ogromną prośbę o pomoc z ESPhome bo sam nawet nie wiem od czego zacząć.
Parę lat temu zrobiłem sobie stację meteo - główny uC to ATmega328 (kod pisany w Bascom) + ESP8266-07 jako “most” Wi-Fi (kod pisany w LUA) do wysyłania danych na serwer. Stacja pracuje już od bardzo dawna, ale teraz chciałbym do wszytko przenieść do Home Assistant - nie chcę przerabiać dosłownie wszystkiego i pomyślałem aby zmienić/dostosować tylko kod w ESP. Tu zaczynają się schody… teraz działa to tak, że ATmega robi ciągłe pomiary, raz na minutę budzi ESP, przesyła wszystkie odczyty, ESP je sortuje, wysyła do serwera i przechodzi w stan uśpienia. Po nowemu myślę, że trzeba by użyć już MQTT.
Obecne kody wyglądają tak:

  1. init.lua
uart.setup(0,19200,8,0,1,0)
require("netconfig")
print("")
print("")
print("   METEO Weather Station  ")
print("projekt by team nettemp.pl")
print("")
wifi.setmode(wifi.STATION)
if (IPmode=="static") then
  cfg={ip=IPaddr,netmask=IPmask,gateway=IPgw}
  wifi.sta.setip(cfg)
end
wifi.sta.config(Siec,Haslo,1)
dofile("avr.lua")
  1. avr.lua
function SendsData()
print("Sends data...")
  conn=net.createConnection(net.TCP,0)   
  conn:connect(NTport,NTip)
  conn:on("connection",function(con)
  con:send("GET /receiver.php?key=" .. NTkey 
    .. "&id=1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22"
    .. "&type=rainfall;speed;wind;uv;lux;press;humid;temp;temp;temp;temp;temp;temp;temp;volt;volt;volt;volt;battery;gust;storm;lightining"
    .. "&value=" .. str .. "&ip=" .. wifi.sta.getip() .. "&device=ip&name=" .. Name
    .. " HTTP/1.1\r\nHost: NTip\r\nAuthorization: Basic "
    .. WWWauthmod .. "\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n") 	
  conn:on("receive",function(conn,payload)end)  
end)
  tmr.alarm(0,1000,0,function()
    conn:close()
    conn=nil
    data,str=nil,nil
    Siec,Haslo=nil,nil
    IPaddr,IPmask,IPgw,Name=nil,nil,nil,nil
    NTkey,NTip,NTpPort,WWWauthmod=nil,nil,nil,nil
    collectgarbage("collect")
    print("")
    print("I go to sleep...")
    node.dsleep(0) 
  end) 
end

uart.on("data","\r",function(data)   
  str=(data)
  str=string.gsub(str,"\r?\n?","")  
  SendsData()
end,0)
  1. netconfig.lua
--required
Siec="moja_siec"
Haslo="moje_haslo"
NTip="192.168.1.2"
NTport="80"
NTkey="123456"
Name="meteo"
WWWauthmod="YWRtaW46YWRtaW4="
IPmode="dhcp" --dhcp or static
--only if set server
IPport="80"		
--required if IPmode="static"
IPaddr="192.168.1.182" 
IPmask="255.255.255.0"
IPgw="192.168.1.1"

Będę ogromnie wdzięczny za pomoc w ogarnięciu tego :slight_smile:
Pozdrawiam. Piotrek

To może zapytam inaczej…
Jak napisać kod (czy ogóle się da?) w ESPhome, aby działał kolejno:

  • ESP jest cały czas w stanie uśpienia
  • raz na minutę ESP będzie budzony przez GPIO16
  • gdy ESP zostanie wybudzony, dostanie “porcję danych” (22 zmienne przedzielone “;”) w formie:
    “1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0;9.0;10.0;11.0;12.0;13.0;14.0;15.0;16.0;17.0;18.0;19.0;20.0;21.0;22.0”
  • dane mają być przesłane do HA do odpowiednich czujników
  • gdy dane zostaną przesłane do HA to ESP przechodzi w stan uśpienia

Pomóżcie ciemniakowi, bo ja sam nawet nie mogę znaleźć jakiegoś przykładu czy coś :frowning:

Możemy spróbować z Tasmota. Ale ostatnio mało czasu. Co do programowania to jestem zero. Samouk w każdej dziedzinie IT. Wiec bardziej skupiam sie na tym co z czym połączyć by działało. W ESPHome również wiele można osiągnąć. Lecz myślę, że jeśli świat mikrokontrolerów nie jest Ci obcy, to zrozumienie działania Tasmota będzie łatwiejsze do zrozumienia. Coś jak komendy AT. Moim zdaniem ma również lepszą dokumentację.
Polecam na początek oficjalne przykłady z książki kucharskiej i dział dotyczący DeepSleep.

Zobacz również dokumentację dla:

Chyba ten przykład reguły będzie dla Ciebie najlepszy:

Processing JSON received from (Software)SerialBridge

Prawdę mówiąc to słyszałem, że jest taki zwierz jak Tasmota, ale jeszcze nie było jakoś okazji popróbować.

To tak jak ja :wink: Ja mam taki problem, że jak coś zaczynam załapywać jak coś działa to znów pokazuje się coś nowego, innego i uczę się od nowa.

Dziękuję za odpowiedź, poczytam i może coś się uda zdziałać. Myślałem też o Arduino na ESP…

Jeszcze takie pytanie dodatkowe… Czy ja mając ramkę danych z 22 odczytami to ja te dane muszę poszatkować na pojedyncze i przesłać do HA przez MQTT czy mozna jakoś “hurtem” przesłać te dane?

Chyba nie będzie takiej potrzeby:

Sorki za tłumacza, ale z angielskim też nie było po drodze za PRL :joy:

Dzięki wielkie, będę próbował :wink:

Ha, mnie też próbowali uczyć cyrylicy :crazy_face:

Ograniczeniem może być ilość zmiennych var w standardzie jest to chyba 16, jak dobrze pamiętam. Ale może własna kompilacja zwiększa tę ilość.

Zmienne reguł

Musisz poczytać jak działają reguły Tasmota, jeśli nie zdecydujesz się na te oprogramowanie i bliżej Ci już do ESPHome, to może mistrz szablonów @Stravi poradzi coś z ubraniem tego w automatyzacji z lambda:

Lektury:

EDIT:

Jeśli już wybierzesz, jedno z dwóch rozwiązań, to w obu przypadkach trzeba będzie użyć szablonów.
W ESPHome możesz to zrobić na etapie konfiguracji YAML przed kompilacją wsadu do ESP. Ale jest trudniej, bo dokumentacja modułowa nie ułatwia tego. A ty potrzebujesz UART, DeepSleep i szablonu dla stworzenia sensorów z UART w działaniu z wybudzaniem i ponownym uśpieniem.
W Tasmota podejrzewam, że skończy się na przesłaniu wiadomości MQTT z ładunkiem JSON i na podstawie takiej wiadomości w HA będzie trzeba stworzyć sensory dla każdego z czujników. Innymi słowy, stworzyć je z wiadomości MQTT jako encję w HA dzięki szablonowi.
Tyle, że w Tasmota jeden zestaw reguł (może być ich trzy) może zrobić kilka rzeczy w jednym poleceniu.
Wszystko dzięki funkcji Backlog the Power of Backlog

Ten przykład powinien coś niecoś rozjaśnić:

Cezary już Ci nieźle podsunął linki, mogę pomóc choć z uart’em jeszcze się nie bawiłem. Jestem zwolennikiem ESPHome ponieważ jest bardzo dobrze spięty z HA. Mam 17 urządzeń ESPHome i w każde z nich tylko wygrywam soft i zapominam :wink: z Tasmota niestety tak nie miałem, ale to pewnie mój brak wiedzy, choć do dzisiaj nie rozumiem po co domyślnie kilkukrotne utracenie zasilania resetuje urządzenie do ustawień fabrycznych.

1 polubienie

Ja również, na szczęście można to (jak prawie wszystko) wyłączy odpowiednią komendą setoption65
Legranda głosi, że to funkcja dla np żarówek i urządzeń bez dostępu do płytki. Tylko czemu jest domyślne włączona? :crazy_face:
Co do stabilności potwierdzam, płytka z czujnikami ruchu działa bez przerwy i jest mega stabilnie, pomimo braku zwłoki dla detekcji ruchu.

1 polubienie

Dziękuję za wyszykanie i podesłanie tak duzej ilości linków. Zaraz kończę pracę, wracam do domu i biorę się za lekturę.
Tak czytam wasze komentarze i zastanawiam się czy nie było by prościej to wszytko zbudować od nowa?

To zależy czy wszystko co robisz po stronie atmegi jesteś w stanie przenieść do ESPHome z deep sleep i co stracisz jeśli będziesz robił pomiary tylko raz na minutę czy też kilka minut.

Tak czytam co napisałeś na drugim forum i przy tym skomplikowaniu wykonania tej stacji meteo, to masz na myśli zbudowanie oprogramowania czy całej stacji meteo od nowa? A może przejść na jakieś nisko prądowe rozwiązanie i pominąć ESP z Wi-Fi?

Dam w takim razie jeszcze taki link dla DIY pod Zigbee:

https://ptvo.info/zigbee-configurable-firmware-features/uart/

Prawdę mówiąc to już sam nie wiem co z tym zrobić. Ze swojej stacji jestem zadowolony bo działa już 6 lat, ale niestety projekt nettemp (wszytko budowalem pod ten projekt) umarł już dawno temu. Jakiś czas temu zacząłem wszytko od nowa z Home Assistant. Licznik energii udało mi się już “przenieść” do HA - na forum ArturHome ludzie mi pomogli aby to zrobić na ESPhome - działa dużo lepiej niż bym chciał. Została mi stacja meteo z którą ciężko mi się rozstać bo to mój chyba najpoważniejszy projekt w życiu niedzielnego amatora elektroniki.
W HA mam taki problem, że jest tak dużo opcji, że aż ciężko się w tym wszytkim połapać i coś wybrać :slight_smile:

1 polubienie

Jako ojciec czasem brzydkich ale wdzięcznych projektów, rozumiem dobrze o czym piszesz. Nie rezygnuj, na Twoim miejscu próbował bym z ESPHome. Może na początek coś prostszego z UART na biurku.

Gdyby potraktować te dane jako JSON to może by się to jednak dało jakoś łatwiej oblecieć w ESPHome.
Licznik był wręcz banalny w porównaniu z tą stacją pogodową (dzięki temu, że od jakiegoś czasu jest gotowy komponent modbus w ESPHome).

W pierwszej chwili chciałem zaproponować budowę od nowa na bazie ESPHome, ale rozwiązanie z ATmega jest prawdopodobnie lepsze, bo mniej prądożerne.

A co do szablonów (template) to można podejść do tego etapami

  • w 1 fazie projektu przesłać dane do HA i tam je oblecieć szablonami
  • w 2 fazie te już gotowe szablony przenieść do ESPHome (w dużej części te rozwiązania się pokrywają, jest szansa że w wystarczającym stopniu)
1 polubienie

Piszesz, że stacja dane przesyła na serwer. Więc może łatwiej dane z serwera przerobić i ukazać w HA.
Szablony to potężne narzędzie. A protokołów w HA ci dostatek.

image
image

W jakiej formie są te dane na serwerze? Lecą po TCP? A może przechwycić te sygnały z ESP i przerobić już to co masz w eterze, tylko nie w ESP.
Jeśli dane już są w Twojej sieci to:

Przykład:

sensor:
# Example configuration.yaml entry
  - platform: tcp
    name: Central Heating Pressure
    host: 10.0.0.127
    port: 8888
    timeout: 5
    payload: "r WaterPressure\n"
    value_template: "{{ value.split(';')[0] }}"
    unit_of_measurement: Bar

Też o tym myślałem na początku, ale z drugiej strony miałbym system tylko do odczytu stacji, gdzie ten system miałby za zadanie tylko odebrać dane i przesłać je do HA - dlatego chciałem pominąć to rozwiązanie i dane przesłać bezpośrednio do HA.

Zmienić ramkę danych przesyłanych z AVR do ESP to żaden problem

Może i banalny, ale nie dla mnie :slight_smile:

Taki też był powód przy budowie tego, czyli AVR z małym apetytem na prąd sobie robi wszytkie obliczenia, a ESP budzi się tylko na czas wysyłki danych

Tego to nie wiem. Wiem tyle, że serwer odbiera przez chyba stronę PHP i wrzuca wszytko do bazy danych

Jeżeli w przeglądarkę wrzucę coś takiego:

192.168.1.2/receiver.php?key=1234&id=1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22&type=rainfall;speed;wind;uv;lux;press;humid;temp;temp;temp;temp;temp;temp;temp;volt;volt;volt;volt;battery;gust;storm;lightining&value=1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0;9.0;10.0;11.0;12.0;13.0;14.0;15.0;16.0;17.0;18.0;19.0;20.0;21.0;22.0&ip=192.168.1.111&device=ip&name=cos_tam

To wszystkie dane pojawią się na serwerze.

Moim zdaniem powinno zadziałać z integracją po TCP na porcie 80.

Poczytaj i spróbuj zrobić to dla jednego sensora. Dopasuj Configuration Variables zgodnie z instrukcjami i swoimi danymi. W payload daj wszystko co wpisujesz po adresie IP

receiver.php?key=1234&id=1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22&type=rainfall;speed;wind;uv;lux;press;humid;temp;temp;temp;temp;temp;temp;temp;volt;volt;volt;volt;battery;gust;storm;lightining&value=1.0;2.0;3.0;4.0;5.0;6.0;7.0;8.0;9.0;10.0;11.0;12.0;13.0;14.0;15.0;16.0;17.0;18.0;19.0;20.0;21.0;22.0&ip=192.168.1.111&device=ip&name=cos_tam

Szablon value_template dla konkretnego odczytu musisz dopasować.