#!/bin/sh # Firmware über Funk aufspielen. Kein Kabel, kein Aufschrauben. # # ./ota.sh vogelkamera.local # # Den Schlüssel zeigt das Gerät beim Start auf der seriellen Leitung # ("Schluessel fuer Updates: …") und die Einrichtungsseite. Er bleibt über # Neustarts und Updates hinweg derselbe -- er liegt im NVS. # # ⚠ --limit-rate ist KEIN Schönheitsfehler, sondern Bedingung. Ohne # Drosselung kommt der Chip mit dem Schreiben in den Flash nicht # hinterher, hört auf vom Socket zu lesen, und beide Seiten warten # aufeinander, bis jemand aufgibt. Am 24.09.2026 hat genau das zwei # Anläufe gekostet, bevor klar war, dass es nicht am Endpunkt liegt. # # ⚠ Der Detector muss weg. Der Webserver auf der Kamera hat einen # einzigen Arbeiter, und der Stream gibt ihn nie zurück: # # ssh root@erkennung.local systemctl stop vogelalbum-detector@traenke # ./ota.sh … # ssh root@erkennung.local systemctl start vogelalbum-detector@traenke set -e ZIEL="$1" SCHLUESSEL="$2" ABBILD="${3:-build/vogelkamera.bin}" if [ -z "$ZIEL" ] || [ -z "$SCHLUESSEL" ]; then echo "Aufruf: $0 [abbild]" >&2 exit 2 fi if [ ! -f "$ABBILD" ]; then echo "Kein Abbild unter $ABBILD -- erst 'idf.py build'." >&2 exit 2 fi echo "Vorher:" curl -s -m 5 "http://$ZIEL:8081/status" || echo " (keine Antwort)" echo echo "Spiele $(wc -c < "$ABBILD") Bytes auf $ZIEL auf …" curl --fail --max-time 300 --limit-rate 150k \ -w '\n HTTP %{http_code} %{size_upload} Bytes in %{time_total}s\n' \ -X POST \ -H "Expect:" \ -H "X-Vogelkamera-Token: $SCHLUESSEL" \ --data-binary "@$ABBILD" \ "http://$ZIEL:8080/update" echo echo "Warte auf den Neustart …" sleep 12 echo "Nachher:" curl -s -m 8 "http://$ZIEL:8081/status" || echo " (noch nicht zurück -- gleich nochmal schauen)"