arnemauer / Ducobox-ESPEasy-Plugin

Plugin voor ESPEasy om een Ducobox Silent / Focus / WTW Energy Comfort aan te sturen en sensoren uit te lezen. Er zijn twee plugins: een ducobox RF gateway en ducobox serial gateway.
75 stars 16 forks source link

P150 - RF gateway: uitlezen CC1101 via SPI in interrupt #103

Closed arnemauer closed 1 year ago

arnemauer commented 2 years ago

Wanneer de CC1101 een pakket ontvangt zal hij een GDO pin hoog maken. De pin is verbonden met de ESP8266 en zorgt ervoor dat er een interrupt service routine (ISR) wordt uigevoerd. Deze ISR wordt bij voorkeur zo kort mogelijk gehouden, zodat de esp8266 ook aan het hoofdprogramma toekomt en klaar is om nieuwe interrupts af te handelen.

In de ISR wordt op dit moment data uit de CC1101 uitgelezen zodat de buffer in de CC1101 weer zo snel mogelijk leeg is om een nieuwe radiopakket te ontvangen. Dit uitlezen in een interrupt zorgt soms voor een exception waarna de ESP reboot.

Een mogelijke oplossing is om in de interrupt een variabele te markeren en in de hoofdcode te kijken of de variabele is gemarkeerd. Wanneer de variabele gemarkeerd is dan wordt de CC1101 uitgelezen en de data verwerkt. De controle of de variabele gemarkeerd is zal in 'PLUGIN_FIFTY_PER_SECOND' plaatsvinden. Dit komt erop neer dat de functie iedere 20ms wordt aangeroepen. Dit is wel best effort, door achtergrondtaken kan het zijn dat het langer duurt voordat de functie wordt aangeroepen.

De 20ms zou voldoende moeten zijn om snel genoeg te reageren op de berichten van de Ducobox. Bij het testen blijkt echter dat de Ducobox en de gateway na enige tijd geen berichten meer naar elkaar sturen. Hierdoor stuurt de Ducobox niet meer de actuele ventilatiemode naar de gateway.

arnemauer commented 2 years ago

De gateway loopt erg stabiel wanneer de uitlezen van de CC1101 niet meer in de interrupt gebeurt. Hierdoor is wel een bekende bug in de CC1101 naar boven gekomen. Zie daarvoor: https://www.ti.com/lit/er/swrz020e/swrz020e.pdf onder RXFIFO_OVERFLOW Issue.

De interrupt pin blijft in deze situatie continu hoog en de radio blijft in RX modus maar ontvangt geen pakketjes.

arnemauer commented 2 years ago

Inmiddels een oplossing gevonden waardoor de RXFIFO_OVERFLOW regelmatig wordt gecheckt en indien nodig de radio opnieuw in RX gezet.

Nu is er wel een nieuwe bug opgetreden bij het opslaan van het network ID in CustomTaskSettings:

0x40285458 in flash_hal_write(unsigned int, unsigned int, unsigned char const) at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/flash_hal.cpp:161 0x40283104 in spiffs_impl::SPIFFSImpl::spiffs_hal_write(unsigned int, unsigned int, unsigned char const) at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs_api.h:339 0x40289968 in spiffs_phys_wr at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_cache.cpp:206 0x40287918 in spiffs_page_delete at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_nucleus.cpp:919 0x402899c4 in spiffs_phys_wr at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_cache.cpp:225 0x40287a99 in spiffs_page_move at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_nucleus.cpp:873 0x40287ea0 in spiffs_object_update_index_hdr at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_nucleus.cpp:1046 0x40287918 in spiffs_page_delete at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_nucleus.cpp:919 0x402899c4 in spiffs_phys_wr at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_cache.cpp:225 0x40288a99 in spiffs_object_modify at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_nucleus.cpp:1666 0x40283120 in spiffs_impl::SPIFFSImpl::spiffs_hal_read(unsigned int, unsigned int, unsigned char) at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs_api.h:345 0x402856bc in spiffs_hydro_write at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_hydrogen.cpp:445 0x402899eb in spiffs_cache_page_allocate_by_fd at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/spiffs/spiffs_cache.cpp:256 0x4010128f in umm_free_core at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_malloc.cpp:351 0x40101558 in free at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/umm_malloc/umm_malloc.cpp:398 0x4029cda5 in operator delete(void) at /workdir/repo/gcc/libstdc++-v3/libsupc++/del_op.cc:48 0x40283047 in std::_Sp_counted_deleter<spiffs_impl::SPIFFSFileImpl, std::shared_ptr<spiffs_impl::SPIFFSFileImpl, (gnu_cxx::_Lock_policy)0>::_Deleter<std::allocator >, std::allocator, (__gnu_cxx::_Lock_policy)0>::_M_destroy() at /root/.platformio/packages/toolchain-xtensa@2.40802.200502/xtensa-lx106-elf/include/c++/4.8.2/bits/shared_ptr_base.h:357 0x4028e54e in fs::File::close() at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FS.cpp:111 0x4025a758 in doSaveToFile(char const, int, unsigned char const, int, char const) at src/src/Helpers_tmp/tmpfile.cpp:2220 0x4028f0e0 in spiffs_cache_page_get_by_fd at ??:? 0x4027ef00 in random(long) at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WMath.cpp:45 0x4025a26c in fileExists(String const&) at src/src/Helpers_tmp/tmpfile.cpp:1196 (discriminator 1) 0x4027efbc in String::~String() at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WString.cpp:125 0x4025c43c in SaveToFile(SettingsType::Enum, int, unsigned char const, int, int) at src/src/Helpers_tmp/__tmpfile.cpp:2384 0x402d7ae6 in chip_v6_unset_chanfreq at ??:? 0x4027f990 in String::operator=(__FlashStringHelper const) at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WString.cpp:294 (discriminator 1) 0x4025c6c5 in SaveToFile(SettingsType::Enum, int, unsigned char const, int) at src/src/Helpers_tmp/__tmpfile.cpp:2366 0x4027efbc in String::~String() at /root/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/WString.cpp:125 0x4022ec35 in Plugin_150(unsigned char, EventStruct, String&) at src/_P150_DucoRFGateway.ino:701

arnemauer commented 2 years ago

Ik ben erachter waarom de ESP8266 nu constant crashed :) Ik gebruik CustomTaskSettings voor het opslaan van het networkId. Het uitlezen en schrijven van de CustomTaskSettings zorgt voor een crash en ik kan er helaas niet achter komen waarom precies gebeurt. Bij andere plugins die CustomTaskSettings gebruiken gebeurt dat namelijk niet. Ik heb de code nu zo aangepast dat het networkId wordt opgeslagen in TaskDevicePluginConfig. Dat werkt nu stabiel.

Ik zal de code opschonen en dan een nieuwe firmware maken.

arnemauer commented 2 years ago

Ik ben nog dagelijks aan het testen en zoeken naar de bugs. Wanneer de ventilatiemodus veranderd dan stuurt de gateway de ventilatiestand direct door naar de controller met sendData(event). https://github.com/arnemauer/Ducobox-ESPEasy-Plugin/blob/6da449b9cdb0cc5097886c00981ba2d430552e35/_P150_DucoRFGateway.ino#L325

Dit commando zorgt ervoor dat de gateway niet meer reageert en de hardware watchdog de esp reset. Aangezien de hardware watchdog reset is er geen exception met debug informatie, in tegenstelling tot de software watchdog.

Ik ben nu stuk voor de stuk de code eruit aan het halen om te kijken waar het precies mis gaat. Geen idee hoelang dit nog gaat duren maar ik ben er druk mee bezig! :)

Gibletron commented 2 years ago

Ik ben nog dagelijks aan het testen en zoeken naar de bugs. Wanneer de ventilatiemodus veranderd dan stuurt de gateway de ventilatiestand direct door naar de controller met sendData(event).

https://github.com/arnemauer/Ducobox-ESPEasy-Plugin/blob/6da449b9cdb0cc5097886c00981ba2d430552e35/_P150_DucoRFGateway.ino#L325

Dit commando zorgt ervoor dat de gateway niet meer reageert en de hardware watchdog de esp reset. Aangezien de hardware watchdog reset is er geen exception met debug informatie, in tegenstelling tot de software watchdog.

Ik ben nu stuk voor de stuk de code eruit aan het halen om te kijken waar het precies mis gaat. Geen idee hoelang dit nog gaat duren maar ik ben er druk mee bezig! :)

Klinkt top! Moet zeggen dat het tot nu toe best goed gaat met statische IP instellingen Hij blijft nu ongeveer 5 uur lang stabiel, en dat is acceptabel voor nu Goed te horen dat je er nog aan werkt, en mocht ik iets kunnen testen dan hoor ik het graag :)

arnemauer commented 2 years ago

Ik heb alle bugs gefixed en de gateway loopt nu weer stabiel :) Ik hoor graag of de nieuwe firmware bij jullie ook goed draait. e0e49de

Gibletron commented 2 years ago

Ik heb alle bugs gefixed en de gateway loopt nu weer stabiel :) Ik hoor graag of de nieuwe firmware bij jullie ook goed draait. e0e49de

Volgens mij is er nog één issue over.. Hij onthoud de Network ID niet na een reboot, volgens mij.. Misschien dat iemand anders ook een keer kan testen om te zien of het aan mijn setup ligt?

arnemauer commented 2 years ago

Klopt helemaal, ik had de binary er tijdelijk even afgehaald om het aan te passen. Het is inmiddels gefixt! :) https://github.com/arnemauer/Ducobox-ESPEasy-Plugin/tree/master/Binaries/Binary%20based%20on%20ESPEasy_mega-20220427

Gibletron commented 2 years ago

Klopt helemaal, ik had de binary er tijdelijk even afgehaald om het aan te passen. Het is inmiddels gefixt! :) https://github.com/arnemauer/Ducobox-ESPEasy-Plugin/tree/master/Binaries/Binary%20based%20on%20ESPEasy_mega-20220427

Deze onthoud de NetworkID weer, top! Wat ik wel zie is dat de fan RPM niet meer wordt uitgelezen Verder heb ik nu het meeste getest en lijkt het allemaal goed te werken, permanente modussen doen het ook goed Zaken die ik nog niet getest heb: DHCP op automatic zetten en NTP op een eigen NTP server zetten Daarnaast moet ik nog kijken hoe lang hij online blijft, maar daarvoor heb ik nog niet voldoende tijd laten draaien

Edit: Al 22 uur draaiend, zonder herstart! Edit 2: ik ga eens testen met DHCP IP