Heimautomatisierung mit dem ESP8266 (Alexa Sprachsteuerung) - Seltsamer Absturz?

Hallo,
eine Frage hat die Software Cracks.
Ich steuere meine Funksteckdosen und andere 433 MHz kompatible Geräte über ein ESP8266 und die RC Switch Library. Nun ist neuerdings auch Amazon Alexa mit im Boot und ich habe angefangen nochmal einen neuen Sketch zu schreiben, welcher nur für die Sprachsteuerung zuständig ist.

Einzelne Geräte kann ich wunderbar an und ausschalten. Das Problem tritt nur auf, wenn ich versuche über eine Schleife alle Geräte an bzw. auszuschalten. Vermute den Fehler in einem Überlauf. Deswegen sind die C-Profis gefragt.

Die Gerätedaten sind im JSON Format in einem String abgespeichert. Mein JSON Array “DEVICES” wird bei dem Sprachruf “Alle Geräte” durchschleift und die RC_Switch Library sendet dann entsprechende Codes.

Schleife:

    DynamicJsonBuffer jsonBuffer;
    JsonObject& root = jsonBuffer.parseObject(json);

    int NumberDevices = root["DEVICES"].size();

    for (int zaehler=0; zaehler< (NumberDevices-1); zaehler++){

          String label = root["DEVICES"][zaehler]["label"];
          Serial.println(label);
          
          mySwitch.setPulseLength(root["DEVICES"][zaehler]["pulse"]);
          if (state) {
            mySwitch.send(root["DEVICES"][zaehler]["code_on"], root["DEVICES"][zaehler]["length"]);
          } else {
            mySwitch.send(root["DEVICES"][zaehler]["code_off"], root["DEVICES"][zaehler]["length"]);
          }
          
    delay(50);
    }

Kann mir jemand helfen? Was passiert ist im Seriellen Monitor zu sehen…

Ausgabe des Seriellen Monitors:

[WIFI] Verbunden mit Airport Extreme ...................
[WIFI] STATION Mode, SSID: Airport Extreme, IP Adresse: 192.168.0.24
Lade Geräte aus Datenbank...

Es wurden 13 Geräte gefunden

Schlafzimmer Deckenlicht - bereitgestellt
Wohnzimmer Deckenlicht 1 - bereitgestellt
Wohnzimmer Deckenlicht 2 - bereitgestellt
Papierlampe - bereitgestellt
Schreibtisch Lampe - bereitgestellt
Wohnzimmer Ambient - bereitgestellt
Schlafzimmer Ambient - bereitgestellt
Bettbeleuchtung - bereitgestellt
Schreibtischbeleuchtung - bereitgestellt
TV Board - bereitgestellt
Luftentfeuchter - bereitgestellt
Stereoanlage - bereitgestellt

Alle Geräte sind nun bereit
---------------------------------------------------------

Schreibtisch Lampe - Aus - 1119692 - 24 - 180

Wohnzimmer Deckenlicht 1 - Aus - 16404 - 24 - 360

TV Board - Ein - 5576131 - 24 - 180

Alle 13 Geräte einschalten...
Schlafzimmer Deckenlicht
Wohnzimmer Deckenlicht 1
Wohnzimmer Deckenlicht 2
Papierlampe
Schreibtisch Lampe

Soft WDT reset

ctx: sys 
sp: 3ffffb30 end: 3fffffb0 offset: 01b0

>>>stack>>>
3ffffce0:  3fff3726 00000012 3ffffd70 4020ce03  
3ffffcf0:  40106fac 3ffefde0 00000000 4020ea94  
3ffffd00:  3ffe84c9 3fff43e0 3ffffd70 40207d6a  
3ffffd10:  00000103 00000000 3fff3796 00000018  
3ffffd20:  00000001 00000000 ffffffff 40207e3e  
3ffffd30:  001115c3 3ffefdf2 00000017 3ffefde0  
3ffffd40:  3ffe84c9 3fff4058 3fff3796 3ffefde0  
3ffffd50:  3ffe84c9 3fff4058 00000004 4020777a  
3ffffd60:  3ffe9218 00000000 3fff784c 00001000  
3ffffd70:  3fff779c 0000001f 00000012 00000000  
3ffffd80:  00000000 00000000 00000000 00000000  
3ffffd90:  00000000 00000000 00000000 00000000  
3ffffda0:  001115c3 00000001 3ffffdd0 4010068c  
3ffffdb0:  3fff634c 3ffffe40 00000000 3ffeb640  
3ffffdc0:  00000001 3fff634c 00000001 40207a04  
3ffffdd0:  00000000 00000000 00000000 00000002  
3ffffde0:  3fff634c 0000000c 3ffefdf8 4020e4c2  
3ffffdf0:  3ffe9559 00000021 3ffffe40 40208bb9  
3ffffe00:  3fff0080 00000bbe 00000bbe 3fff3148  
3ffffe10:  3ffeb640 0000012b 3fff30fc 40208be4  
3ffffe20:  3ffe9559 00000000 3ffffe70 4020e85c  
3ffffe30:  3ffeb63e 0000012d 3fff30fc 4020a7c8  
3ffffe40:  00000000 00000000 00000000 4010068c  
3ffffe50:  3fff74cc 00800100 3fff30fc 40107474  
3ffffe60:  00000000 00000000 000002ce 4010020c  
3ffffe70:  3fff0080 00000bb8 00000bb8 3fff3088  
3ffffe80:  00000001 3fff776c 3fff3034 4020a8a9  
3ffffe90:  40225069 00000000 3fff3034 4020c0e8  
3ffffea0:  3fff2f64 3fff7104 3fff2f64 4022cf35  
3ffffeb0:  3fff1994 3fff19a0 00000006 3fff17a8  
3ffffec0:  3fff2f64 3fff17b0 3fff17ac 4020c13b  
3ffffed0:  3fff2f64 3fff17b0 3fff17ac 4023269c  
3ffffee0:  000001f9 1800a8c0 00000018 000001f9  
3ffffef0:  00000018 00000000 3fff0160 40107464  
3fffff00:  00000000 00000000 3ffec846 3fff1998  
3fffff10:  3ffeb54a 3fff19a0 3fff776c 40230ba5  
3fffff20:  3fff16bc 3fff1e54 3fff1e54 3ffef1b0  
3fffff30:  00000000 3fff776c 0000001c 3fff1e54  
3fffff40:  3ffeb53c 00000000 3fff776c 4022ffa1  
3fffff50:  1c00a8c0 00000257 00000000 00000023  
3fffff60:  00000002 0000001a 402109d3 3ffedff0  
3fffff70:  3ffeb514 3fffdcc0 3ffea6e8 3ffea6e8  
3fffff80:  40210946 3ffedff0 00000000 3fff1ee4  
3fffff90:  3fffdc80 00000000 3fff776c 40224a2f  
3fffffa0:  40000f49 3fffdab0 3fffdab0 40000f49  
<<<stack<<<

 ets Jan  8 2013,rst cause:2, boot mode:(1,6)


 ets Jan  8 2013,rst cause:4, boot mode:(1,6)

wdt reset

Den ganzen Code kann ich aufgrund der Zeichenbegrenzung nicht posten. Hänge das Projekt als ZIP an.


Edit:
Interessant. Anscheinend liegt der Fehler nicht an einem Überlauf. Führe ich die Problem-Funktion im Setup einmalig zum testen aus:

Trigger_All_Devices(true);

funktioniert alles wunderbar. Der Fehler tritt also nur auf, wenn sie über die callback Funktion aufgerufen wird:

void callback(uint8_t device_id, const char * device_name, bool state) {

  if (String(device_name) == "Alle Geräte") {
      Trigger_All_Devices(state);
  } else {
      Trigger_Single_Device(device_name, state);
  }

}

Alexa_Sketch.zip (2.58 KB)

Schreibe doch mal in die for-Schleife noch ein paar serielle Outputs rein, um zu sehen wie sie läuft.

Kennst Du den ESP Exception Decoder?

Gruß Tommy

Tommy56:
Schreibe doch mal in die for-Schleife noch ein paar serielle Outputs rein, um zu sehen wie sie läuft.

Kennst Du den ESP Exception Decoder?

Gruß Tommy

Habe ich ja bereits. Der Absturz erfolgt i.d.R. NACH dem 6. Gerät:
Serial.println(label);

Hast du noch eine Idee?

Hier die Ausgabe des Decoders:

Decoding 30 results
0x4020ce0f: String::reserve(unsigned int) at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/WString.cpp line 519
0x40106fac: delayMicroseconds at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/core_esp8266_wiring.c line 74
0x4020eaa0: Print::write(unsigned char const*, unsigned int) at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/Print.cpp line 76
0x40207d90: RCSwitch::transmit(RCSwitch::HighLow) at /Users/max/Documents/Arduino/libraries/RC_Switch/RCSwitch.cpp line 139
0x40207e57: RCSwitch::send(unsigned long, unsigned int) at /Users/max/Documents/Arduino/libraries/RC_Switch/RCSwitch.cpp line 139
0x40207782: Trigger_All_Devices(bool) at /Users/max/Desktop/Alexa_Sketch/Alexa_Sketch.ino line 74
0x4010068c: free at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/umm_malloc/umm_malloc.c line 1733
0x40207a10: callback(unsigned char, char const*, bool) at /Users/max/Desktop/Alexa_Sketch/Alexa_Sketch.ino line 39
0x4020e4ce: std::_Function_handler ::_M_invoke(std::_Any_data const&, unsigned char, char const*, bool) at /Users/max/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073
0x40208ba5: fauxmoESP::_handleContent(AsyncWebServerRequest*, unsigned int, char*) at /Users/max/Documents/Arduino/libraries/xoseperez-fauxmoesp-fdf5ffd6793d/src/fauxmoESP.cpp line 197
0x40208bf0: _M_invoke at /Users/max/Documents/Arduino/libraries/xoseperez-fauxmoesp-fdf5ffd6793d/src/fauxmoESP.cpp line 197
0x4020e868: AsyncCallbackWebHandler::handleBody(AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at /Users/max/Documents/Arduino/libraries/ESPAsyncWebServer-master/src/WebHandlerImpl.h line 104
0x4020a7d4: AsyncWebServerRequest::_onData(void*, unsigned int) at /Users/max/Documents/Arduino/libraries/ESPAsyncWebServer-master/src/WebRequest.cpp line 740
0x4010068c: free at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/umm_malloc/umm_malloc.c line 1733
0x40107474: vPortFree at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/heap.c line 18
0x4010020c: _umm_free at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/umm_malloc/umm_malloc.c line 1287
0x4020a8b5: _M_invoke at /Users/max/Documents/Arduino/libraries/ESPAsyncWebServer-master/src/WebRequest.cpp line 740
0x40225075: system_pp_recycle_rx_pkt at ?? line ?
0x4020c0f4: AsyncClient::_recv(tcp_pcb*, pbuf*, signed char) at /Users/max/Documents/Arduino/libraries/ESPAsyncTCP-master/src/ESPAsyncTCP.cpp line 650
0x4022cf41: pbuf_free at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/core/pbuf.c line 758
0x4020c147: AsyncClient::_s_recv(void*, tcp_pcb*, pbuf*, signed char) at /Users/max/Documents/Arduino/libraries/ESPAsyncTCP-master/src/ESPAsyncTCP.cpp line 650
0x402326a8: tcp_input at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/core/tcp_in.c line 394 (discriminator 1)
0x40107464: pvPortMalloc at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/heap.c line 13
0x40230bb1: ip_input at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/core/ipv4/ip.c line 559
0x4022ffad: ethernet_input at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/netif/etharp.c line 1379
0x402109df: pp_tx_idle_timeout at ?? line ?
0x40210952: pp_tx_idle_timeout at ?? line ?
0x40224a3b: ets_snprintf at ?? line ?

Ich meinte eher NumberDevices und i.

Eigentlich sollte yield in delay aufgerufen werden aber hänge in die for-Schleife an den Anfang mal ein yield() mit rein. Evtl. hilft es.

Er scheint Time-Probleme beim Netzwerkhandling zu haben.

Gruß Tommy

Hab ich drin. Komme in der Schleife bis 10.. fehlen drei :frowning:

Mit yield() bekomme ich das:

Decoding 27 results
0x4010068c: free at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/umm_malloc/umm_malloc.c line 1733
0x4020d561: __yield at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/core_esp8266_main.cpp line 56
0x402076d3: as  at /Users/max/Documents/Arduino/libraries/ArduinoJson-master/include/ArduinoJson/Internals/../JsonObjectSubscript.hpp line 58
:  (inlined by) as  at /Users/max/Documents/Arduino/libraries/ArduinoJson-master/include/ArduinoJson/Internals/../JsonVariantBase.hpp line 61
:  (inlined by) ArduinoJson::JsonVariantBase   >::asArray() const at /Users/max/Documents/Arduino/libraries/ArduinoJson-master/include/ArduinoJson/Internals/../JsonVariantBase.hpp line 39
:  (inlined by) ArduinoJson::JsonVariantBase   >::operator[](int) const at /Users/max/Documents/Arduino/libraries/ArduinoJson-master/include/ArduinoJson/Internals/../JsonArraySubscript.hpp line 87
:  (inlined by) Trigger_All_Devices(bool) at /Users/max/Desktop/Alexa_Sketch/Alexa_Sketch.ino line 65
0x4010068c: free at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/umm_malloc/umm_malloc.c line 1733
0x40207a2c: callback(unsigned char, char const*, bool) at /Users/max/Desktop/Alexa_Sketch/Alexa_Sketch.ino line 39
0x4020e4ea: std::_Function_handler ::_M_invoke(std::_Any_data const&, unsigned char, char const*, bool) at /Users/max/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073
0x40208bc1: fauxmoESP::_handleContent(AsyncWebServerRequest*, unsigned int, char*) at /Users/max/Documents/Arduino/libraries/xoseperez-fauxmoesp-fdf5ffd6793d/src/fauxmoESP.cpp line 197
0x40208c0c: _M_invoke at /Users/max/Documents/Arduino/libraries/xoseperez-fauxmoesp-fdf5ffd6793d/src/fauxmoESP.cpp line 197
0x4020e884: AsyncCallbackWebHandler::handleBody(AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at /Users/max/Documents/Arduino/libraries/ESPAsyncWebServer-master/src/WebHandlerImpl.h line 104
0x4020a7f0: AsyncWebServerRequest::_onData(void*, unsigned int) at /Users/max/Documents/Arduino/libraries/ESPAsyncWebServer-master/src/WebRequest.cpp line 740
0x4010068c: free at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/umm_malloc/umm_malloc.c line 1733
0x40107474: vPortFree at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/heap.c line 18
0x4010020c: _umm_free at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/umm_malloc/umm_malloc.c line 1287
0x4020a8d1: _M_invoke at /Users/max/Documents/Arduino/libraries/ESPAsyncWebServer-master/src/WebRequest.cpp line 740
0x40225091: system_pp_recycle_rx_pkt at ?? line ?
0x4020c110: AsyncClient::_recv(tcp_pcb*, pbuf*, signed char) at /Users/max/Documents/Arduino/libraries/ESPAsyncTCP-master/src/ESPAsyncTCP.cpp line 650
0x4022cf5d: pbuf_free at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/core/pbuf.c line 758
0x4020c163: AsyncClient::_s_recv(void*, tcp_pcb*, pbuf*, signed char) at /Users/max/Documents/Arduino/libraries/ESPAsyncTCP-master/src/ESPAsyncTCP.cpp line 650
0x402326c4: tcp_input at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/core/tcp_in.c line 394 (discriminator 1)
0x40107464: pvPortMalloc at /Users/max/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/heap.c line 13
0x40230bcd: ip_input at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/core/ipv4/ip.c line 559
0x4022ffc9: ethernet_input at /Users/igrokhotkov/espressif/arduino/tools/sdk/lwip/src/netif/etharp.c line 1379
0x402109fb: pp_tx_idle_timeout at ?? line ?
0x4021096e: pp_tx_idle_timeout at ?? line ?
0x40224a57: ets_snprintf at ?? line ?

Da weiß ich auch nicht mehr weiter. Evtl. zieht das Senden kurz hintereinander die Spannung zu weit runter. Gehe mal versuchsweise mit dem Delay in der for-Schleife höher.

Hast Du die in den einen Beitrag verlinkten Kondensatoren am Sendemodul?

Gruß Tommy

Leider hat das Problem nichts mit dem Sender oder der Schleife zu tun. Wie oben schon geschrieben, kann ich den Code manuell ausführen und erhalte das gewünschte Ergebnis ohne Absturz. Der Fehler tritt nur auf wenn die Funktion über die callback() Funktion aufgerufen wird. Vermutlich liegt das Problem also in der Library. Schätze da komm ich dann nicht mehr weiter :frowning:

Warum ignorierst Du die Hinweise auf die Versorgung so hartnäckig?

Gruß Tommy

Wer sagt dass ich etwas ignoriere? Die Hardware ist ordnungsgemäß angeschlossen, Kondensatoren sind angelötet und nocheinmal... Löse ich die Funktion außerhalb des Callbacks aus klappt alles. Demnach liegt der Fehler in der Software