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 Likes

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 Like

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 Likes