Deep sleep und TTN wollte ich mir auch nochmal genauer anschauen, Danke für den Impuls @Andreas, und ja, sehr komisch, dass bei TTN-Geräten – die ja sehr häufig ultra low power laufen sollen – dieses Thema anscheinend dann doch nicht so zentral ist, dass alle Anwendungsfälle und side cases schon durchdekliniert sind. Die Wichtigkeit das Thema wurde 2020 auch schon postuliert: Feature request: Keep session during deep sleep. · Issue #5 · manuelbl/ttn-esp32 · GitHub
Currently, the underlying MCCI LMIC library does not support it even though there are discussions about implementing it. The feature would be a huge win for many applications.
I will implement it in this library if the MCCI LMIC implements it or if I find another suitable library that could be used instead of MCCI LMIC.
Warum es bei manchen läuft, und bei anderen Probleme macht, könnte auch an folgenden beiden Parametern liegen: a) der verwendete join-Prozedur und b) der Umgang mit per sketch gesetzen Variablen-Inhalten nach sleep mode (sprich ESP vs. “Arduino”).
Join via OTAA vs ABP
Der Unterschied zwischen Over the air activation (OTAA) und Activation by personalization (ABP) wird ganz gut unter LoRa-Endgeräte-Aktivierung (ABP vs. OTAA) beschrieben.
Und mit dem OTAA-Detail hier kommen wir unserem Problem auch schon näher:
Das Endgerät startet den Join-Vorgang, indem es eine Join-Request-Nachricht sendet. Diese enthält DevEUI
, AppEUI
und DevNonce
. DevEUI
und AppEUI
beziehen sich auf den Global End Device bzw. Application Identifier und folgen dem IEEE EUI-64 Adressraumformat.
Die DevNonce
ist eine Zufallszahl, die mit jedem Join-Vorgang größer wird. Dazu muss die DevNonce
in einem nichtflüchtigen Speicher gespeichert werden.
ESP32 vs. Arduino, z.B. Cortex M0
Bei einem “normalen” Arduino könnte man die DevNonce
einfach in eine Variable schreiben, dort überleben die nach Programmstart veränderten Variableninhalte auch einen deep sleep. Dagegen vergisst der ESP alle Variableninhalte bzw. initialisiert sie ggf. neu mit den default-Werten, da setup()
nach jedem deep sleep cycle ausgeführt wird.
Bei der ttn-esp32-lib wird das so bschreiben Deep Sleep and Power Off · manuelbl/ttn-esp32 Wiki · GitHub
So the challenge with deep sleep and power off is to retain the information associated with the current TTN session.
Weiter steht da, dass ein neuer OTAA join nach jedem deep sleep cycle auch keine gute Idee ist:
If the state were not retained, the device would need to rejoin every time it wakes up from deep sleep or power off. This does not only take a lot of time and power. It also undermines many mechanisms for the efficient use of the LoRa spectrum. This is why TTN v3 implements restrictive limits on the number of joins.
Daher gibt es in der ttn-esp32 eine Mechanismus für deep sleep, s. Understanding the need of re-join · Issue #30 · manuelbl/ttn-esp32 · GitHub und Deep Sleep and Power Off · manuelbl/ttn-esp32 Wiki · GitHub
Allerdings ist die ttn-esp32-lib für die ESP-IDF und nicht für Arduino.
Jack Gruber – ich kenne ihn nicht :-) – hat im Artikel https://jackgruber.github.io/2020-04-13-ESP32-DeepSleep-and-LoraWAN-OTAA-join/ (code unter https://github.com/JackGruber/ESP32-LMIC-DeepSleep-example/) beschreiben wie er die notwendigen Parameter im RTC memory des ESP deep sleep save speichert.
Diskussionen, allgemein zu deep sleep, ESP32 und TTN auch unter What LMIC state must be preserved during sleep mode? - #32 by bluejedi - LMIC - The Things Network
In eine issue der MCCI LMIC lib wird interessanterweise auf die Implementierung beim Pax-Counter verweisen: deep sleep ttn otaa · Issue #889 · mcci-catena/arduino-lmic · GitHub
Für “Arduino-Boards” brauchen wir diesen Zauber nicht, Stuart Robinson hat die gleiche Funktionalität so für ein Non-ESP-board implementiert: Easy Build TTN and LoRaWAN Nodes | StuartsProjects
Und wenn wir statt OTAA mit ABP joinen brauchen wir uns auch keine Gedanken darüber zu machen. Vermutlich läuft es auch schon bei @Thias seit Ewigkeiten stabil, da er mit ABP joined.
Sicherheitstechnisch hat OTAA Vorteile, und wir sollten das nutzen. Wenn ich richtig informiert bin, braucht ABP aber keine uplinks, und ist an Standorten stabiler an denen ein node noch ein gateway erreicht, aber der node Probleme beim Empfang hat.