Smogomierz
Smogomierz copied to clipboard
Smogomierz przestaje wysyłać updaty
Dzień dobry, Bardzo fajny projekt i dobrze opisany jednakże mam z nim problem. Zbudowałem smogomierz na bazie ESP8266, pms7003 i bme280. Przez pierwsze 2 tyg wszystko było w porządku. Teraz od jakiegoś czasu zauważyłem iż urządzenie przestaje wysyłać aktualizacje stanów do wszystkich serwisów oraz przez MQTT. Gdy wejdę na nie bezpośrednio przez web pokazuje mi odczyty jednakże dopóki go nie zrestartuje nie odświeża Home Assistant (sprawdzałem i nic nie przychodzi przez mqtt) oraz api.eco czy airmonitor. Podpiąłem go też testowo pod thingspeak i widzę to samo zachowanie. Deepsleep wyłączony, zasięg wifi w porządku, urządzenie jest cały czas dostępne przez wifi. Zasilane z ładowaki do telefonu podpiętej do prądu. Dopiero odłączenie zasilania jednakże tylko na losowy czas (kilka do kilkunastu godzin). Spróbowałem zrobić upgrade przez OTA do testowej wersji 2.8, zmieniać interwały updatów ale to nie rozwiązało problemu.
Dodatkowo zastanawiam się czy da się zwiększyć timeout na mqtt bo gdy działa to Mosquitto pluje mi w logach przy każdym updacie(wydaje się tylko kosmetycznym problemem): 1594192398: New client connected from 192.168.13.19 as ESP8266Client (p2, c1, k15, u'mqtt'). 1594192422: Client ESP8266Client has exceeded timeout, disconnecting.
Fajnie by było także wprowadzić opcje zdalnego restartu na takie sytuacje. Jak nie to będę musiał podłączyć jakiś dodatkowy inteligentny przekaźnik.
Pozdrawiam i trzymajcie tak dalej! Artur
Dzień dobry
Miałem ten sam problem.
W kodzie nazwą klienta dla połączenia z serwerem MQTT jest: ESP8266Client. Do serwera MQTT nie mogą być połączeni dwaj klienci o tym samym ID. Jeżeli masz w sieci inne urządzenia, stworzone na podstawie przykladów PubSubClient, jest duża szansa, że podłącza się ono do serwera MQTT z podanym wyżej identyfikatorem. Serwer MQTT nie pozwoli przekazywać tematów drugiemu urządzeniu z zduplikowaną nazwą. Jednak PubSubClient podczas połączenia nie zgłasza błędu. Wygląda, że wszystko się udało.
W linii 451 pliku smogomierz.ino
if (mqttclient.connect("ESP8266Client", MQTT_USER, MQTT_PASSWORD)) {
zmień nazwę na device_name:
if (mqttclient.connect(device_name, MQTT_USER, MQTT_PASSWORD)) {
Powinno pomóc. Dodałem w tej sprawie pr. Mam nadzieję, że się przyjmie.
Fajnie by było także wprowadzić opcje zdalnego restartu na takie sytuacje. Jak nie to będę musiał podłączyć jakiś dodatkowy inteligentny przekaźnik.
Reset jest zawsze robiony, gdy zapiszesz zmiany w ustawieniach. Wystarczy tam wejść i zrobić zapisz, bez żadnych zmian.
Dodatkowo zastanawiam się czy da się zwiększyć timeout na mqtt bo gdy działa to Mosquitto pluje mi w logach przy każdym updacie(wydaje się tylko kosmetycznym problemem): 1594192398: New client connected from 192.168.13.19 as ESP8266Client (p2, c1, k15, u'mqtt'). 1594192422: Client ESP8266Client has exceeded timeout, disconnecting.
Drugi komunikat pojawia się, ponieważ wywołanie metody PubSubClient.loop() nie jest wywoływane i serwer uważa, że nastąpiło zerwanie połączenia. Standardowo PubSubClient.loop() wywołuje się w funkcji loop() głównego programu. W metodzie następuje komunikacja z serwerem i serwer nie zgłasza timeout. W przypadku smogomierza funkcja PubSubClient.loop() wywoływana jest tylko gdy dane przesyłane są na serwer, więc co kilka/kilkanaście minut.
Aby uniknąć takich komunikatów należy przerzucić mqttclient.loop();
z linii 1189 do pętli loop() głównego programu.
Projekt jest super. Mam jeszcze kilka pomysłów na usprawnienie kodu, dołożenie tego i owego. Pozwolę sobie zgłaszać pr.
Pozdrawiam Norbert