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

Zapytam inaczej, co jest podpięte do tego mikrokontrolera, jakie elementy pomiarowe?

Znalazłem stary opis/spis

  • Ilość opadu deszczu
  • 0-65535mm/m2
  • Prędkość wiatru
  • 0-255km/h
  • Kierunek wiatru
  • 16 kierunków świata
  • Temperatura zewnętrzna (BME280)
  • -40 +85°C
  • Temperatura do słońca (DS18B20)
  • -55 +125°C
  • Temperatura przy gruncie +15cm (DS18B20)
  • -55 +125°C
  • Temperatura gruntu -10cm (DS18B20)
  • -55 +125°C
  • Temperatura gruntu -25cm (DS18B20)
  • -55 +125°C
  • Temperatura gruntu -50cm (DS18B20)
  • -55 +125°C
  • Temperatura gruntu -100cm (DS18B20)
  • -55 +125°C
  • Wilgotność (BME280)
  • 0-100%
  • Napięcie solar 1
  • 0-6,8V
  • Napięcie solar 2
  • 0-6,8V
  • Napięcie turbina wiatrowa
  • 0-6,8V
  • Napięcie akumulatora
  • 0-4,5V
  • Promieniowanie UV
  • 0-11 INDEX UV
  • Natężenie światła (BH1750)
  • 0-65535lux
  • Odległość burzy od nas (AS3935)
  • 0-40km
  • Ciśnienie (BME280)
  • 300-1100hPa
  • Procentowy stan akumulatora
  • 0-100%

Nie chciałbym ruszać ATmegi bo to za dużo zabawy.

Masz może zdjęcie tej stacji ? Rozumiem że to jest kilka członów meteo. W czym umieściłeś czujniki do pomiaru temperatury w glebie ? Temperatura do słońca - co to mierzy ? Możesz pokazać deszczomierz ?
Możesz pokazać dashboard z tymi wszystkimi danymi ?

Nie mam innych zdjęć (nawet nie wiedziałem, że to aż tyle czasu minęło - stacja pracuje od 28/10/2016) jak te gdy wyniosłem testowo stację na zewnątrz - później zmieniłem tylko miejsce zamontowania :slight_smile:






Wszytko razem siedzi, na jednym maszcie.

Ha, do dziś tego nie zamontowałem :frowning:

W sumie to temperatura termometru ha ha
To był pierwszy, poważny projekt i troszkę dużo dziwnych pomysłów.

deszcz

Tak to mniej więcej wygląda



A tu prototyp płytki

Na zdjęciach nie widać, ale na PCB są dwa koszyki na sześć akumulatorów 18650

Czujnik UV bardzo szybko padł, czujnik AS3935 nigdy nie zadziałał jak trzeba…
Myślę, że teraz jak się uda to przenieść do HA to i tak będzie super.

4 polubienia

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:

Nawet nie wiem jak się za to zabrać, ale punkty 1, 2, 4 i 5 powinny dać się w miarę łatwo ogarnąć, ale nie mam pomysłu na 3 (zapewne coś się da wyrzeźbić na podstawie template, ale zupełnie nie wiem jak ogarniasz przesyłanie danych między oboma MCU).
Dokumentacja ESPHome jest “modułowa”, więc nie unikniesz przeczytania wielu jej rozdziałów dotyczących core, obsługi ESP8266 czy MQTT (pominąć możesz w zasadzie wszelkie rodzaje sensorów).

Tak bardzej obrazowo to działa tak:

  • AVR caly czas pracuje, mierzy i liczy itd
  • raz na minutę AVR wysyla na UART wszyskie dane (jedna ramka danych)
  • chwilę przed wysłaniem danych do ESP, AVR budzi ESP poprzez sygnał na GPIO16

Mówiąc krótko, gdybym podłączył AVR pod komputer to w terminalu będę otrzymywał co minutę ramkę danych z 22 odczytami

No to szansa jest.
Ale nie czuję się na siłach by podprowadzić jak to ma wyglądać.
Z moich doświadczeń wynika, że budzenie ESP co minutę nie ma sensu (może chciałem za bardzo oszczędzać energię?), bo najwięcej energii idzie na ustanawianie połączenia sieciowego, można to trochę zoptymalizować używając statycznego IP.
Kod ESPHome jest (lub był?) prawdopodobnie niezbyt dobrze zoptymalizowany (a w każdym razie takie miałem podejrzenie, gdy próbowałem wykorzystać deep sleep, obecnie z tego nie korzystam).

Czyli nie jest to takie hop-siup jak sobie myślałem - nic dziwnego, że nic podobnego nie znalazłem…
Muszę pomyśleć nad jakimś innym rozwiązaniem programowym, aby przesłać dane z AVR (nie zmieniając mu kodu) poprzez ESP do HA

Myślę, że da się zrobić, ale sam nawet nie używam MQTT w ESPHome (to upraszcza komunikację z HA, bo ESPHome dysponuje API zgodnym z HA).
Jeśli masz drugi egzemplarz PCB z zaprogramowanym AVR to będziesz miał świetną platformę doświadczalną.
Szukałem jakiegoś przykładu, na którym mógłbyś się wstępnie oprzeć, ale faktycznie nic mi się w oczy nie rzuciło.

Tu masz przykład jak ktoś podszedł do obróbki zastanych danych (tyle, że ich format jest zupełnie inny niż w twojej konstrukcji, ale przy okazji masz przykład wykorzystania kawałka własnego kodu w ESPHome):

Być może taki format danych jakim dysponujesz dałoby się oblecieć stosując wyłącznie template?

1 polubienie

Muszę poszukać w domu swojej pierwszej, prototypowej płytki :slight_smile:

Tu jest przykład na ESPHome, który wysyła do HA linię danych odebraną z portu UART. W tym przykładzie, zawartość całej linii jest prezentowana jako 1 text_sensor w HA.

Tutaj jest też podobny temat

Jeszcze tu jest projekt podłączenia chińskiej stacji pogodowej do HA , za pomocą ESPHome

2 polubienia

Witaj ja zakupiłem od ciebie kiedyś płytki i złożyłem to i mam ten sam problem że chciałbym aby to szło do home assistanta moje pytanie jest takie czy posiadasz jeszcze schematy łatwiej by było zobaczyć jak to było zrobione. Moja koncepcja jest taka że trzeba napisać najlepiej na arduino program do obsługi tego co tam jest u ciebie jak pamiętam było w bascomie . Tego nie przejdziesz trzeba to konwertować na json i to wszystko wysłać przez uart do esp .Esp tu tylko wyśle to co ma na uarcie powinno to działać.

Hej,
Ja ostatnio nie mam kompletnie czasu aby do tego usiąść i coś podziałać…
W załączniku przesyłam schemat (plik EAGLE) który udało się odnaleźć na starym dysku - nie jestem na 100% pewny czy to był ostateczny projekt czy coś jeszcze było poprawiane.
meteo.zip (115,4 KB)

Daj znać gdybyś coś wymyślił :wink:

Witaj temat przeanalizowałem i stwierdziłem że potrzeba niestety zrobić sterownik od nowa po prostu wyjdzie to szybciej. Zaprojektowałem już płytkę na bazie twojej co by w obudowę weszło ma taką samą. Co do rzeczy które zostawiłem to prędkość i kierunek wiatru jedno gniazdo rj11 dla obu. Czujnik opadów jedno gniazdo r11. Czujnik bme zostawiłem oraz czujnik ds18b20. AS3935 do wykrywania wyładowania zostawiłem ale w wersji z aliexpress jest lepiej dostępna. Dwa wejścia na panel solarny wraz z pomiarem napięcia .Bateria też ma odczyt napięcia . Za odczyt odpowiada uklad ADS1115 .Po testach sprawuje się super. Jeśli chcesz żebym dodał coś jeszcze to daj znać. Planuję jeszcze w tym roku dać do produkcji.