Wartungsmodus für den Terkin-Datenlogger

Basic maintenance mode

Siehe auch Maintenance mode galore.

Einleitung

Mit der neuesten Version im Repository bekommt man:

  • Einführung des Wartungsmodus, bei dem deep sleep maskiert und der Schlafzyklus auf fünf Sekunden begrenzt wird.
  • Einfache aber effektive und komfortable Aktivierung des Wartungsmodus inkl. device discovery im LAN. Anleitung: Toggle between maintenance and field mode.

Synopsis

Displays successful device discovery and maintenance mode enablement.

$ sudo python3 -m tools.terkin maintain
2019-07-10 19:49:21,698 [terkin] INFO   : IP networks found: ['192.168.178.0/24']
2019-07-10 19:49:21,698 [terkin] INFO   : Sending an ARP ping to discover already connected devices on network 192.168.178.0/24
2019-07-10 19:49:21,698 [terkin] INFO   : Waiting for any devices having MAC address prefixes of ['30:ae:a4', '80:7d:3a'] to appear on your local network
2019-07-10 19:49:25,172 [terkin] INFO   : Found device at {'mac': '80:7d:3a:c2:de:44', 'ip': '192.168.178.166'}
2019-07-10 19:49:25,172 [terkin] INFO   : Connecting to device mode server at 192.168.178.166:666
2019-07-10 19:49:25,172 [terkin] INFO   : Pulling 192.168.178.166 into maintenance mode

Details

Mit obigen Dingen wurden einige Aspekte implementiert, die wir bei ESP32 network discovery through LAN IP scanning and Ethernet ARP monitoring diskutiert hatten, es bildet gleichzeitig die Grundlage für Maintenance mode galore. Vielen Dank für Eure Beiträge!

Damit lassen sich bei folgenden Beiträgen aufgegriffene Dinge zukünftig komfortabler gestalten:

Es besteht nun die Möglichkeit, direkt von der commandline aus komfortabel die IP-Adresse des Geräts herausfinden zu können sowie – neueste Firmware aus dem Repository HEAD/master vorausgesetzt – das Gerät jeweils temporär in den Wartungs- bzw. wieder zurück in den Feldbetriebsmodus zu versetzen.

Unter der Haube wird dazu ein kleines UDP Beacon an das Gerät versendet, sobald es im Netzwerk gefunden werden konnte, à la

echo 'maintenance.enable()' | ncat --udp 192.168.178.20 666

Howto

Hier eine kurze Übersicht der aktuell noch etwas hemdsärmligen Bedienung:

# Device discovery only.
# Will continuously monitor local network for 
# devices and print out their MAC- and IP-addresses.
sudo python3 -m tools.terkin monitor

# Device discovery plus "maintenance mode" switchover.
# Wait for device to appear on local network, then enable maintenance mode.
sudo python3 -m tools.terkin maintain

# Same as above, but address specific device.
sudo python3 -m tools.terkin maintain 80:7d:3a:c2:de:44

# Device discovery plus "field mode" switchover.
# Wait for device to appear on local network, then disable maintenance mode.
# Note that power cycling will also do the same.
sudo python3 -m tools.terkin field

Setup

Damit das klappt, muss man noch ein paar Abhängigkeiten installieren. Wir skizzieren hier die Installation unter Linux/macOS sowie Windows.

Installationsanleitungen für Linux, macOS und Windows

Installation unter Linux/macOS

Da Python meist schon installiert ist, reicht normalerweise eine einfache Installation der benötigten Pakete à la…

pip3 install scapy netifaces netaddr

Installation unter Windows

Es handelt sich um Python 3.x für Windows, einige weitere Python Pakete, sowie die Npcap: Windows Packet Capture Library & Driver.

:warning: Es ist zu beachten, dass der MicroTerkin Agent nativ unter Windows installiert werden muss, eine Installation innerhalb von WSL funktioniert hier nicht.

Python 3 über Anaconda oder Chocolatey

Unter Windows ist der Griff zu Anaconda oft hilfreicher als der Fußweg. Danke, @MKO!

Eine weitere komfortable Alternative ist aber auch die Installation des neuesten Python 3.x

Letzteres ist u.U. sparsamer bei der Download-Größe. Anaconda hat in der Basisinstallation laut bereits ~500 MB. Danke, @clemens.

Npcap

Bei Npcap: Windows Packet Capture Library & Driver bekommt man Npcap (den Nachfolger von Winpcap) solo. Direktlink: Npcap 0.996 installer for Windows Vista/2008, 7/2008R2, 8/2012, 8.1/2012R2, 10/2016 (x86 and x64).

Python Pakete

bekommt man entweder per pip oder per conda installiert. Es handelt sich um scapy · PyPI, netifaces · PyPI und netaddr · PyPI.

# Installation per pip
pip install scapy netifaces netaddr

# Installation per conda
conda install -c conda-forge scapy netifaces netaddr
1 Like

Zwei Hinweise dazu:

Das Zurückschalten des field modes kann man auch auf ein Gerät begrenzen, wenn man die MAC mit angibt, oder? Steht in der Doku so nicht explizit drin:

sudo python3 -m tools.terkin field 80:7d:3a:c2:de:44

Hatte gestern etwas Probleme damit, den mode wieder per power cycling will / reset auf field-Mode, d.h. mit dem ursprünglichen intervall und dem deep sleep, zurückzuschalten, da der python-Befehl

sudo python3 -m tools.terkin maintain

in einer Schleife läuft und wenn das skript weiter läuft der jedes mal nach einem reset sofort wieder in den maintenance mode geschickt wird.

Entweder das skript dann vorher manuell stoppen oder das skript stoppt, wenn es die angeforderte MAC uimgeschaltet hat.

Das skript ist da sehr hartnäckig! ;-)

2019-07-12 09:14:47,235 [tools/terkin.py] INFO   : Found device at {'mac': '30:ae:a4:4f:fc:84', 'ip': '192.168.178.26'}
2019-07-12 09:14:47,235 [tools/terkin.py] INFO   : Connecting to device mode server at 192.168.178.26:666
2019-07-12 09:14:47,235 [tools/terkin.py] INFO   : Pulling 192.168.178.26 into maintenance mode
2019-07-12 09:15:16,885 [tools/terkin.py] INFO   : Found device at {'mac': '30:ae:a4:4f:fc:84', 'ip': '192.168.178.26'}
2019-07-12 09:15:16,885 [tools/terkin.py] INFO   : Connecting to device mode server at 192.168.178.26:666
2019-07-12 09:15:16,885 [tools/terkin.py] INFO   : Pulling 192.168.178.26 into maintenance mode
2019-07-12 09:15:16,978 [tools/terkin.py] INFO   : Found device at {'mac': '30:ae:a4:4f:fc:84', 'ip': '192.168.178.26'}
2019-07-12 09:15:16,978 [tools/terkin.py] INFO   : Connecting to device mode server at 192.168.178.26:666
2019-07-12 09:15:16,978 [tools/terkin.py] INFO   : Pulling 192.168.178.26 into maintenance mode
2019-07-12 09:15:17,897 [tools/terkin.py] INFO   : Found device at {'mac': '30:ae:a4:4f:fc:84', 'ip': '192.168.178.26'}
2019-07-12 09:15:17,897 [tools/terkin.py] INFO   : Connecting to device mode server at 192.168.178.26:666
2019-07-12 09:15:17,897 [tools/terkin.py] INFO   : Pulling 192.168.178.26 into maintenance mode

Hi Clemens,

schön, dass es nun auch bei Dir gut klappt und danke für die Hinweise.

As intended ;].

Es wurde nun so implementiert wie geplant. Falls es konzeptionelle Verbesserungsvorschläge gibt, können wir sie u.U. einarbeiten. Der Gedanke ist, dass man sorgenfrei auf dem Gerät arbeiten kann (inkl. power cycle), während der “maintenance mode puller” aka MicroTerkin Agent läuft. Man muss sich nur daran erinnern, ihn abzuschalten, wenn man das nicht mehr will.

Man könnte über irgendeine Art von Timeout-Verhalten nachdenken (z.B. nach 10 Minuten automatisch den Maintenance Mode wieder verlassen, wie @roh auch kurz anriss), aber a) benötigt das zusätzliche Infrastruktur/Bookkeeping und ist b) nicht workflow-deterministisch. Falls wir uns solche Dinge doch “on top” wünschen, gebt gern Bescheid.

Feedback welcome and have fun.

Viele Grüße,
Andreas.

2 posts were split to a new topic: The MicroTerkin Agent

Maintenance mode Python-API

Wenn man das laufende Programm auf einer REPL-Shell beobachtend per CTRL+C unterbricht,

Traceback (most recent call last):
  File "main.py", line 72, in <module>
  File "main.py", line 67, in main
  File "datalogger.py", line 158, in start
  File "datalogger.py", line 175, in start_mainloop
  File "main.py", line 57, in loop
  File "datalogger.py", line 155, in loop
  File "datalogger.py", line 203, in loop
  File "datalogger.py", line 230, in sleep
KeyboardInterrupt:

>>>

dann aber unversehens nach 10 Sekunden der Watchdog zuschlägt (wenn man ihn so eingestellt hat)

rst:0x7 (TG0WDT_SYS_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff8028,len:8
load:0x3fff8030,len:2156
ho 0 tail 12 room 4
load:0x4009fa00,len:19208
entry 0x400a05f4
Initializing filesystem as LittleFS!

kann man sich analog zur Ansteuerung über Netzwerk

auch mit der entsprechenden Python-API weiterhelfen um den Watchdog abzuschalten

>>> datalogger.device.watchdog.suspend()
  166.2075 [terkin.watchdog          ] INFO   : Suspending watchdog
  166.2265 [terkin.watchdog          ] INFO   : Reconfiguring watchdog timeout to 999999999 milliseconds

seitdem wir vor kurzem per https://github.com/hiveeyes/hiveeyes-micropython-firmware/commit/56c7e7bc die Referenz zum Datenlogger-Objekt über die globale Variable datalogger (sic!) zur Verfügung gestellt haben.

Analog dazu versetzt

>>> datalogger.device.status.maintenance = True

das Gerät in den Wartungsmodus.


P.S.: Auf der REPL funktioniert übrigens auch Autocompletion!

# Status auslesen
>>> datalogger.device.status.maintenance
False
# Watchdog wieder anschalten
>>> datalogger.device.watchdog.resume()
 1158.7009 [terkin.watchdog          ] INFO   : Resuming watchdog
 1158.7193 [terkin.watchdog          ] INFO   : Reconfiguring watchdog timeout to 10000 milliseconds