Welche Ota Update Strategie habt Ihr bei ESP?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Bei mir laufen ein paar Sensoren mit ESP266 die ihre Messdaten per ESPNow senden. Soweit so gut.

    Jetzt habe ich festgestellt dass die Sensoren einen Codeupdate bekommen sollten. Bislang habe ich dann den ESP aus dem Sensor entfernt und physikalisch auf ein Breadboard gesteckt wo ich ihn dann mit der neuen Software geflashed habe.

    Irgendwie ist mir das zu bloed und aufwaendig. Desshalb habe ich mir ueberlegt das der ESP beim booten in meinem LAN erste einmal nachsieht ob es fuer ihn einen SW Update gibt , den installiert und dann in den normalen ESP-Now Sensorzyklus geht.

    Code um den OTA Update vorzunehmen habe ich schon fuer nicht ESP-NOW Sensoren. Da hole ich mir erst eine Configdatei in der der aktuelle Codelevel steht und wenn er neuer ist wird die SW aktualisiert. Das funktioniert aber ist mir irgendwie umstaendlich durch die Indirektion ueber die Config Datei.

    Was nutzt Ihr fuer Updatestraegien? Idealerweise waere fuer mich dass einfach mit dem Dateiupdatedatum verglichen wird und dann ein Update initiiert wird.

  • Ist ein bissel OT, weil ich zur eigentlichen Frage nichts sagen kann. Ich verwende MicroPython auf meinen ESP32.

    Jetzt habe ich festgestellt dass die Sensoren einen Codeupdate bekommen sollten.

    Wozu? Sorry, aber mir stellt sich diese Frage öfter. Wenn das Security- oder Bugfixes sind ist das ok, aber warum sonst immer auf dem neuesten Stand sein? Die Funktionalität war und ist ja gegeben.

  • Moin framp,

    keine Ahnung. Ich buche mich in das WLan des ESP's ein und mache das Update.

    Aber ich habe letzt was darüber gelesen, weil es eine Option für einen "schlafenden" ESP ist.

    Sollte ich mich da mal drum kümmernn!?!

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Wozu?

    Ganz einfach: Es ist ein Bug in meinem Sensorcode :) Klar kann ich in jedem Sensor den ESP rausnehmen und in ein Breadboard stecken um ihn mit dem neuen Code zu flashen und dann wieder in den Sensor einstecken.

    Wenn ich einfach nur mal eben die Stromversorgung unterbreche und der ESP sich den neuen Code dann per OTA automatisch wenn es einen Update gibt runterlaedt ist das wesentlich more conventient ;)

  • Ich buche mich in das WLan des ESP's ein und mache das Update.

    Da gibt es zwei Probleme:

    1) Wenn der Sensor normale WLAN Verbindung nutzt (kein ESP-NOW) musst Du den Moment erwischen wo er nicht schlaeft um per Ardiono OTA den Code zu updaten.

    2) Wenn Du ESPNow nutzt musst Du Code haben der nicht per ESPNow sondern normal per WLAN OTA durchzieht.

    Sollte ich mich da mal drum kümmernn!?!

    Wenn Du sonst nichts zu tun hast - gerne :) . Beachte aber dabei dass ich ESPNow mit DeepSleep nutze um den Akku zu schonen. Bei jedem Revoke aus DeepSleep mal eben eine WLAN Verbindung aufzubauen um zu checken ob eine neue SW Version vorhanden ist ist aus Stromgesichtspunkten zu teuer. Das macht nur Sinn einmal beim booten.

  • Moin framp,

    Beachte aber dabei dass ich ESPNow mit DeepSleep nutze um den Akku zu schonen. Bei jedem Revoke aus DeepSleep mal eben eine WLAN Verbindung aufzubauen um zu checken ob eine neue SW Version vorhanden ist ist aus Stromgesichtspunkten zu teuer. Das macht nur Sinn einmal beim booten.

    Schon klar.

    Wenn Du sonst nichts zu tun hast - gerne :) .

    Bin ich Rentner?? Also habe ich zu tun!!

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Ich werde das jetzt so machen dass ich beim Starten eine WLAN Verbindung aufbaue und dann per HTTP HEAD das last modified Feld vom Imagefile hole und mit dem Buildzeitpunkt des aktuell laufenden Images vergleiche. Falls das aelter ist als das Image wird der ESP per OTA updated.

  • wird der ESP per OTA updated.

    kannst du das mal näher beschreiben?

    Bis jetzt habe ich nur einmal den OTA genutzt aus der Arduino IDE, das muss man aber selber anstoßen!

    Das der ESP sich das abholt toll, aber wie?

    Ich habe bei anderen ESP auch einen Weg gefunden die Software Version, das File namentlich anzuzeigen im SerialMonitor, leider ist mir die Umleitung zu Putty noch nicht gelungen, ich wollte einfach nur Serial auf Putty um Kommandos zu übergeben oder Status abfragen, Version, Variablen usw.

    Bei mir ist das wlan aber so mies das sich alleine der ESP schon Schwierigkeiten hat sich zu verbinden und so ganz blicke ich nicht durch in Verbindung zu meiner Fritzbox die hällt die Verbindung aktiv auch wenn der ESP längst weg ist, dann klappt neu einloggen natürlich nicht.

    Ich muss also nach reset und Programmstart mich erst mal ausloggen (technischer Unsinn nach Neustart) bevor ich mich neu einloggen kann. mal sagt der eine Sourcecode Pause 50ms der andere Sourcecode 1000ms in einer Schleife der ein log Versuche, welche Strategie die bessere ist habe ich noch nicht rausbekommen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • kannst du das mal näher beschreiben?

    Hier gibt es Beispiele wie man es machen kann.

    so ganz blicke ich nicht durch in Verbindung zu meiner Fritzbox die hällt die Verbindung aktiv auch wenn der ESP längst weg ist,

    Hm ... das ist merkwuerdig. Vielleicht machst Du zu dem Thema mal einen eigenen Thread auf?

  • Danke fuer den Link. Ich habe mittlerweile Code der laeuft. Allerdings nehme ich nicht das LastUpdated Datum des Images da das ja immer definitiv nach dem Builddatum liegt. Ich habe jetzt eine Versions Datei die gelesen wird und mit der Version im Image verglichen wird. Das bedeutet aber dass ich immer manuell die Version sowohl auf dem HTTP Server in der Versionsdatei als auch im Image erhoehen muss. Das funktioniert - ist aber umstaendlich.

    Vielleicht hat jemand eine bessere Idee wie man das einfacher automatisch erledigen lassen kann :conf:

  • Vielleicht hat jemand eine bessere Idee wie man das einfacher automatisch erledigen lassen kann

    __FILE__(Name) __TIME__ __DATE__ vom build bekommt der ESP selber raus, kann er das nicht aus dem Netzwerk und Files TIME/DATE auslesen?

    Codeschnipsel

    aus DATE_TIME einen String bauen YYYY_MM_DD__HH_MM_SS bauen dann kann man mit strcmp auf > abfragen für Neuere

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (31. Juli 2022 um 14:29)

  • aus DATE_TIME einen String bauen YYYY_MM_DD__HH_MM_SS bauen dann kann man mit strcmp auf > abfragen für Neuere

    Den Weg hatte ich ja urspruenglich im Sinn: Der Compiler baut Compiledatum und -zeit in das Image mit ein. Dann wollte ich urspruenglich das LatestUpdate Feld im HTTP Header nehmen und dagegen vergleichen. Wenn es neuer ist dann wird per OTA updated. Ich hatte einen Denkfehler (siehe #11) und dachte das funktioniert nicht - aber es funktioniert doch. Bin ueber Deine Antwort drauf gekommen :)

  • - aber es funktioniert doch

    freut mich!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • freut mich!

    Mich auch :)

    Den HTTP HEAD Request habe ich jetzt mit dem ESP266HTTPClient hinbekommen. War etwas Sucherei im ClientCode bis ich rausgefunden habe wie man das machen kann denn standardmaessig gibt es nur GET, POST, PATCH, PUT und DELETE.

    Nebenbei habe ich wieder ein nettes Feature vom ESP266HTTPClient kennengelernt was mich echt Zeit gekostet hat zu finden: Mir stuerzte mein ESP erst immer nach dem setup() ab. Grund: Man muss erst den WiFiClient instanziieren und danach den HTTPClient damit die Destruktoren in der richtigen Reihenfolge aufgerufen werden :wallbash:

    Dummerweise kommt die Last-Updated Zeit gemaess RFC in GMT und auf meinem Linux ist die Zeit die ins Image reingeht natuerlich in CEST. Da muessen noch ein wenig die Zeitzonen umgerechnet werden :shy: . Ich habe eine schoene Timezone Library gefunden die mir denke ich dabei sehr nuetzlich sein wird.

  • Moin.

    Ich have eine Versionsnummer in meinem Sketch.
    const int FW_VERSION = 101;

    Bei jeder Verbindung nach einem Deepsleep schaut der ESP nach ob es eine höhere Version ( Version +1) gibt.

    Auf dem Server liegt dann die Firmware, z.B.
    wemos-d1-pushbutton101.bin
    Gibt es eine

    wemos-d1-pushbutton102.bin
    wird das Update gemacht.

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Ich have eine Versionsnummer in meinem Sketch.
    const int FW_VERSION = 101;

    So aehnlich habe ich das ja bislang auch gemacht.

    case HTTP_UPDATE_NO_UPDATES: Serial.println("[update] Update no Update."); break;

    Ah ... d.h. der OTA Update kann checken ob ein Update notwendig ist.

    Code
    Its possible to point the update function to a script on the server. If a version string argument is given, it will be sent to the server. The server side script can use this string to check whether an update should be performed.

    Das wusste ich noch nicht. Vielen Dank fuer den Tipp. Jetzt muss ich ueberlegen ob ich diesen Weg gehe oder meinen Weg weiterverfolge :conf:

    Denn irgendwie nervt es aber immer die Version hochzuzaehlen. Deshalb such(t)e ich nach einer besseren Loesung. Ich bin noch dabei einen Proof of Concept zu implementieren nur das Builddate des Images sowie den LastUpdated Timestamp vom Webserver zu nehmen und zu vergleichen. Dann entfaellt die Version.

  • Ja, dann musst du allerdings etwas zurück geben. Wenn er bei mir keine xxx102.bin findet dann kommt nur ein Fehler zurück (File not found) und das Update bricht mit einem Fehler ab.

    Reicht für meine Zwecke aber so aus.

    Bei einem anderen Projekt bekommt der ESP per JSON die aktuelle FW Version nach dem liefern der Daten zurück.

    Ist die höher als die Aktuelle dann startet er das Update.
    Hat den Vorteil das du von 101 auf 105 gehen kannst.


    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Danke für Deinen Code.

    Auch eine interessante Lösung: Per POST in einem JSON Infos des ESPs zu liefern wie Version und Vcc und die Image Version wie Sleeptime per JSON in der POST Antwort zu liefen :thumbup:So kann man auch die Sleeptime dynamisch ändern.

  • Ich have eine Versionsnummer in meinem Sketch.

    die musst du aber manuell im Code ändern mit File, Time und Date ist das automatisch.

    Wenn ich die Version im Namen manuell hochzähle ist es im Code ohne Eingriff,

    neuOTA2_esp8266-01s_BasicOTA_win10_

    neuOTA3_esp8266-01s_BasicOTA_win10_

    wenn ich nur kleine Änderungen einbaue, ohne den Namen zu ändern sehe ich das an DATE TIME im ESP

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!