Developing Terkin for CPython

Hier im Beitrag geht es darum, wie der Terkin Datenlogger ab Version 0.10.0 optimal in CPython Umgebungen betrieben werden kann. Es führt die initiale Arbeit von Terkin-Variante für CPython / Raspberry Pi / Dragino LoRa/GPS HAT fort und versucht, noch ein paar Ecken runder zu schleifen.

Im Gegensatz dazu beschreibt Developing Terkin for MicroPython die grundlegenden Entwicklungsarbeiten des Terkin Datenloggers bis Version 0.9.0, die ausschließlich unter MicroPython stattfanden.

Leider beide links 404
Würde es gerne Mal mit dem Witty Pi versuchen. Hab da noch ein paar Platinen vom HoneyPi

1 Like

Hi Michael,

das hier sind die richtigen Links:

Das Programm hat leider schon etwas länger keine Pflege mehr erfahren. Melde Dich bitte, falls es irgendwo hakt.

Die Verwendung eines virtualenv zur Installation des Terkin Pakets ist auf jeden Fall sinnvoll. Damit kann man die Installationsumgebung jederzeit wegwerfen und muss nicht etwaige abhängige Bibliotheken aus der Systeminstallation herausoperieren, falls etwas dabei schiefgegangen ist.

python3 -m venv .venv
source .venv/bin/activate
pip install terkin

Viele Grüße,
Andreas.

Habe es jetzt mit einem Pi Zero W mit Raspberry Pi OS with desktop May 7th 2021 Kernel version: 5.10 versucht, leider nicht mit Erfolg.

pi@raspberrypi:~ $ python3 -m venv .venv
pi@raspberrypi:~ $ source .venv/bin/activate
(.venv) pi@raspberrypi:~ $ pip install terkin
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting terkin
  Downloading https://www.piwheels.org/simple/terkin/terkin-0.10.0-py3-none-any.whl (129kB)
    100% |████████████████████████████████| 133kB 337kB/s 
Collecting adafruit-circuitpython-si7021==3.2.1 (from terkin)
  Downloading https://www.piwheels.org/simple/adafruit-circuitpython-si7021/adafruit_circuitpython_si7021-3.2.1-py3-none-any.whl
Collecting adafruit-circuitpython-busdevice==4.3.1 (from terkin)
  Downloading https://www.piwheels.org/simple/adafruit-circuitpython-busdevice/adafruit_circuitpython_busdevice-4.3.1-py3-none-any.whl
Collecting pyserial==3.4 (from terkin)
  Downloading https://files.pythonhosted.org/packages/0d/e4/2a744dd9e3be04a0c0907414e2a01a7c88bb3915cbe3c8cc06e209f59c30/pyserial-3.4-py2.py3-none-any.whl (193kB)
    100% |████████████████████████████████| 194kB 261kB/s 
Collecting mock==4.0.2 (from terkin)
  Downloading https://files.pythonhosted.org/packages/cd/74/d72daf8dff5b6566db857cfd088907bb0355f5dd2914c4b3ef065c790735/mock-4.0.2-py3-none-any.whl
Collecting click==7.1.2 (from terkin)
  Downloading https://files.pythonhosted.org/packages/d2/3d/fa76db83bf75c4f8d338c2fd15c8d33fdd7ad23a9b5e57eb6c5de26b430e/click-7.1.2-py2.py3-none-any.whl (82kB)
    100% |████████████████████████████████| 92kB 358kB/s 
Collecting adafruit-circuitpython-ina219==3.4.2 (from terkin)
  Downloading https://www.piwheels.org/simple/adafruit-circuitpython-ina219/adafruit_circuitpython_ina219-3.4.2-py3-none-any.whl
Collecting adafruit-circuitpython-bmp280==3.2.1 (from terkin)
  Downloading https://www.piwheels.org/simple/adafruit-circuitpython-bmp280/adafruit_circuitpython_bmp280-3.2.1-py3-none-any.whl
Collecting adafruit-circuitpython-ads1x15==2.2.1 (from terkin)
  Downloading https://www.piwheels.org/simple/adafruit-circuitpython-ads1x15/adafruit_circuitpython_ads1x15-2.2.1-py3-none-any.whl
Collecting esp32-machine-emulator==1.1.3 (from terkin)
  Downloading https://www.piwheels.org/simple/esp32-machine-emulator/esp32_machine_emulator-1.1.3-py3-none-any.whl
Collecting Adafruit-Blinka==4.6.0 (from terkin)
  Downloading https://www.piwheels.org/simple/adafruit-blinka/Adafruit_Blinka-4.6.0-py3-none-any.whl (102kB)
    100% |████████████████████████████████| 112kB 337kB/s 
Collecting terkin-micropython-libraries==0.10.0 (from terkin)
  Downloading https://files.pythonhosted.org/packages/ce/ff/b00341fe58cdf9ae002ab85ba3c634737bc19e7439a89e4dc74df5e49e5d/terkin_micropython_libraries-0.10.0-py3-none-any.whl (64kB)
    100% |████████████████████████████████| 71kB 310kB/s 
Collecting gps==3.19 (from terkin)
  Downloading https://files.pythonhosted.org/packages/99/ae/a34d9b378033ddcee142e0a40833f3981526593f7fa7bf9e9c5ec642337c/gps-3.19-py3-none-any.whl
Collecting adafruit-circuitpython-bme280==2.4.1 (from terkin)
  Downloading https://www.piwheels.org/simple/adafruit-circuitpython-bme280/adafruit_circuitpython_bme280-2.4.1-py3-none-any.whl
Collecting adafruit-circuitpython-register (from adafruit-circuitpython-ina219==3.4.2->terkin)
  Downloading https://www.piwheels.org/simple/adafruit-circuitpython-register/adafruit_circuitpython_register-1.9.5-py3-none-any.whl
Collecting pytest (from esp32-machine-emulator==1.1.3->terkin)
  Downloading https://files.pythonhosted.org/packages/a1/59/6821e900592fbe261f19d67e4def0cb27e52ef8ed16d9922c144961cc1ee/pytest-6.2.4-py3-none-any.whl (280kB)
    100% |████████████████████████████████| 286kB 213kB/s 
Collecting pyftdi>=0.40.0 (from Adafruit-Blinka==4.6.0->terkin)
  Downloading https://files.pythonhosted.org/packages/db/d4/2aa53587bca47757351093656b3137dbcea68349ae993a459d8d7d30fc87/pyftdi-0.53.2-py3-none-any.whl (141kB)
    100% |████████████████████████████████| 143kB 301kB/s 
Collecting Adafruit-PureIO>=1.1.5 (from Adafruit-Blinka==4.6.0->terkin)
  Downloading https://www.piwheels.org/simple/adafruit-pureio/Adafruit_PureIO-1.1.9-py3-none-any.whl
Collecting sysv-ipc; platform_system != "Windows" and platform_machine != "mips" (from Adafruit-Blinka==4.6.0->terkin)
  Downloading https://www.piwheels.org/simple/sysv-ipc/sysv_ipc-1.1.0-cp37-cp37m-linux_armv6l.whl (68kB)
    100% |████████████████████████████████| 71kB 299kB/s 
Collecting rpi-ws281x>=4.0.0 (from Adafruit-Blinka==4.6.0->terkin)
  Downloading https://www.piwheels.org/simple/rpi-ws281x/rpi_ws281x-4.3.0-cp37-cp37m-linux_armv6l.whl (116kB)
    100% |████████████████████████████████| 122kB 340kB/s 
Collecting RPi.GPIO (from Adafruit-Blinka==4.6.0->terkin)
  Downloading https://www.piwheels.org/simple/rpi-gpio/RPi.GPIO-0.7.0-cp37-cp37m-linux_armv6l.whl (69kB)
    100% |████████████████████████████████| 71kB 290kB/s 
Collecting Adafruit-PlatformDetect>=2.7.0 (from Adafruit-Blinka==4.6.0->terkin)
  Downloading https://www.piwheels.org/simple/adafruit-platformdetect/Adafruit_PlatformDetect-3.15.3-py3-none-any.whl
Collecting pycopy-cpython-usocket==0.1 (from terkin-micropython-libraries==0.10.0->terkin)
  Downloading https://www.piwheels.org/simple/pycopy-cpython-usocket/pycopy_cpython_usocket-0.1-py3-none-any.whl
Collecting pycopy-cpython-uio==0.3 (from terkin-micropython-libraries==0.10.0->terkin)
  Downloading https://www.piwheels.org/simple/pycopy-cpython-uio/pycopy_cpython_uio-0.3-py3-none-any.whl
Collecting pycopy-cpython-micropython==0.2 (from terkin-micropython-libraries==0.10.0->terkin)
  Could not find a version that satisfies the requirement pycopy-cpython-micropython==0.2 (from terkin-micropython-libraries==0.10.0->terkin) (from versions: 1.0)
No matching distribution found for pycopy-cpython-micropython==0.2 (from terkin-micropython-libraries==0.10.0->terkin)
(.venv) pi@raspberrypi:~ $ 

habe es auch mit der sandbox und pip install --user terkin[sbc] versucht, klappte leider ebenso wenig.

Würde gerne testen, ob der Zero W Terkin und gleichzeitig einen Audio Stream zu meinem Saraswati Rechner hin bekommt.

2 Likes

Hi Michael,

Vielen Dank für Deinen Bericht. Wir haben nun ein paar Updates gemacht, um den Fehler zu beheben und die Standardkonfiguration zu vereinfachen.

Mit der aktuellen Version »Terkin 0.11.4« läuft Terkin nun per terkin --config src/settings.raspberrypi-basic.py [1,2] einwandfrei mit CPython 3.8.10. Getestet wurde auf macOS, daher waren keinerlei Sensoren aktiv außer system.memfree. Als Telemetrievariante wurde MQTT gewählt. Wir sind gespannt, ob das auch auf dem Raspberry Pi Zero gut klappt.

Mit “pip install terkin[sbc] --upgrade” kannst Du ebenfalls die neueste Version installieren. Wir freuen uns auf entsprechende Rückmeldungen, ob das nun grundlegend schonmal besser funktioniert.

Im nächsten Schritt können die Sensoren und ggf. andere Telemetrievarianten (HTTP?) getestet werden, in diesem Bereich könnten sich ebenfalls Änderungen und Inkompatibilitäten zu den abhängigen Bibliotheken (teils aus dem Adafruit CircuitPython Ökosystem) ergeben haben. Sag Bescheid, wenn es hier noch irgendwo klemmen sollte.

Viele Grüße,
Andreas.

[1] Setup on CPython — Terkin Datalogger 0.14.0 documentation
[2] https://raw.githubusercontent.com/hiveeyes/terkin-datalogger/master/src/settings.raspberrypi-basic.py

1 Like

Super die Instalation mit pip install terkin[sbc] --upgrade klappt jetzt. Allerdings bin ich noch etwas verwirrt.

terkin --config src/settings.raspberrypi-basic.py

liefert einen Fehler das das Verzeichnis bzw. die Datei nicht gefunden wird. Eine globale suche nach der Datei liefert auch keine Resultate. Also habe ich git clone https://github.com/hiveeyes/terkin-datalogger.git nachgeschoben. Jetzt läuft es zumindest schon mal etwas weiter.
Hätte eigentlich getippt, das sich Git-Clone mit dem Pip-Install erledigen würde. Fehlte denke ich nur eine .settings.py, könnte ich aber noch prüfen. Wär natürlich schön, wenn ein Config File über Pip mitkommen würde.

(.venv) pi@raspberrypi:~/terkin-datalogger $ terkin --config src/settings.raspberrypi-basic.py
2021-07-27 23:39:20,742 [root                          ] INFO   : Setting up CPython compatibility layer
2021-07-27 23:39:21,842 [root                          ] INFO   : Starting bootloader
2021-07-27 23:39:21,856 [root                          ] INFO   : Loading modules
2021-07-27 23:39:22,115 [root                          ] INFO   : Loading settings from "src/settings.raspberrypi-basic.py"
2021-07-27 23:39:22,191 [root                          ] INFO   : Setting up Terkin
2021-07-27 23:39:22,194 [terkin.datalogger             ] INFO   : Starting Terkin datalogger
2021-07-27 23:39:22,200 [terkin.configuration          ] INFO   : Starting TerkinConfiguration on path "/home/pi/terkin-datalogger"
2021-07-27 23:39:22,207 [terkin.configuration          ] INFO   : User settings: None
2021-07-27 23:39:22,222 [terkin.device                 ] INFO   : Reset cause and wakeup reason: {'reset_cause': {'code': 0, 'message': 'PWRON'}, 'wakeup_reason': {'code': 0, 'message': 'PWRON'}}
2021-07-27 23:39:22,226 [terkin.watchdog               ] INFO   : Skipping watchdog timer (WDT)
2021-07-27 23:39:22,231 [terkin.device                 ] INFO   : Start curating the garbage collector
2021-07-27 23:39:22,246 [terkin.device                 ] INFO   : Collecting garbage
2021-07-27 23:39:22,258 [terkin.device                 ] INFO   : Curating the garbage collector finished. Free memory: 76.11509223181929
2021-07-27 23:39:22,263 [terkin.device                 ] INFO   : Turning off Bluetooth
2021-07-27 23:39:22,289 [terkin.datalogger             ] INFO   : Starting Terkin Datalogger 0.11.4
2021-07-27 23:39:22,341 [terkin.device                 ] INFO   :

========================
Terkin Datalogger 0.11.4
========================
Device id    3235323639

CPU freq     1000.0   MHz

Python  : 3.7.3 (default, Jan 22 2021, 20:04:44) [GCC 8.3.0]
platform: linux
machine : armv6l
nodename: raspberrypi
release : 5.10.17+
sysname : Linux
version : #1414 Fri Apr 30 13:16:27 BST 2021


2021-07-27 23:39:22,352 [terkin.device                 ] INFO   : Starting networking
2021-07-27 23:39:22,357 [terkin.device                 ] INFO   : [WiFi] Interface not enabled in settings.
2021-07-27 23:39:22,362 [terkin.network.core           ] INFO   : Starting mode server on 0.0.0.0:666
2021-07-27 23:39:22,379 [terkin.device                 ] INFO   : [LoRa] Interface not enabled in settings.
2021-07-27 23:39:22,383 [terkin.device                 ] INFO   : [LTE]  Interface not enabled in settings.
2021-07-27 23:39:22,391 [terkin.device                 ] INFO   : [GPRS] Interface not enabled in settings.
2021-07-27 23:39:22,395 [terkin.device                 ] INFO   : Starting telemetry
2021-07-27 23:39:22,387 [terkin.api.udp                ] INFO   : Starting UdpServer on 0.0.0.0:666
Traceback (most recent call last):
2021-07-27 23:39:22,400 [terkin.telemetry.core         ] INFO   : Telemetry channel topology: MqttKitTopology
2021-07-27 23:39:22,415 [terkin.telemetry.core         ] INFO   : Telemetry channel URI: mqtt://01D8V8B3AS97FZJ9C3HJ1TTGT2:Mubofmew@swarm.hiveeyes.org/hiveeyes/01D8V8B3AS97FZJ9C3HJ1TTGT2/Oering/ZeroPi-Test-mqtt-json
  File "/home/pi/.venv/lib/python3.7/site-packages/terkin/api/udp.py", line 45, in start_real
    self.server_socket.bind((self.ip, self.port))
PermissionError: [Errno 13] Permission denied
2021-07-27 23:39:22,419 [terkin.telemetry.core         ] INFO   : Starting Terkin TelemetryClient
2021-07-27 23:39:22,433 [terkin.datalogger             ] INFO   : Setting up sensors
2021-07-27 23:39:22,427 [terkin.api.udp                ] ERROR  : Failed starting UdpServer on 0.0.0.0:666

2021-07-27 23:39:22,438 [terkin.sensor.core            ] INFO   : Starting buses: []
2021-07-27 23:39:22,448 [terkin.datalogger             ] INFO   : Registering sensors
2021-07-27 23:39:22,453 [terkin.datalogger             ] INFO   : Setting up sensor with id=system.memfree and type=system.memfree on bus=None with address=None
2021-07-27 23:39:22,461 [terkin.datalogger             ] INFO   : Importing module "terkin.driver.system.memfree_sensor"
2021-07-27 23:39:22,470 [terkin.sensor.core            ] INFO   : Starting all sensors
2021-07-27 23:39:22,473 [terkin.datalogger             ] INFO   : Setup finished
2021-07-27 23:39:22,477 [root                          ] INFO   : Starting Terkin
2021-07-27 23:39:22,484 [terkin.datalogger             ] INFO   : Reading 1 sensor ports
2021-07-27 23:39:22,487 [terkin.datalogger             ] INFO   : Reading sensor port "SystemMemoryFree"
2021-07-27 23:39:22,498 [terkin.datalogger             ] INFO   : Sensor data:

           system.memfree                             76.11509223181929

2021-07-27 23:39:22,506 [terkin.device                 ] INFO   : Start curating the garbage collector
2021-07-27 23:39:22,518 [terkin.device                 ] INFO   : Collecting garbage
2021-07-27 23:39:22,527 [terkin.device                 ] INFO   : Curating the garbage collector finished. Free memory: 76.11509223181929
2021-07-27 23:39:22,531 [terkin.telemetry.core         ] INFO   : Telemetry transport: MQTT over TCP
2021-07-27 23:39:22,538 [terkin.telemetry.core         ] INFO   : Connecting to MQTT broker at swarm.hiveeyes.org with username 01D8V8B3AS97FZJ9C3HJ1TTGT2. client_id=terkin.3236313036
2021-07-27 23:39:22,557 [terkin.telemetry.core         ] INFO   : MQTT topic:   hiveeyes/01D8V8B3AS97FZJ9C3HJ1TTGT2/Oering/ZeroPi-Test-mqtt-json/data.json
2021-07-27 23:39:22,560 [terkin.telemetry.core         ] INFO   : MQTT payload: {"system.memfree": 76.11509223181929}
2021-07-27 23:39:22,564 [terkin.telemetry.core         ] INFO   : Connecting to MQTT broker at swarm.hiveeyes.org with username 01D8V8B3AS97FZJ9C3HJ1TTGT2
2021-07-27 23:39:22,689 [terkin.telemetry.core         ] INFO   : Connecting to MQTT broker at ('46.4.251.66', 1883) succeeded
2021-07-27 23:39:22,771 [terkin.datalogger             ] INFO   : Telemetry status: SUCCESS (1/1)
2021-07-27 23:39:22,775 [terkin.device                 ] INFO   : Start curating the garbage collector
2021-07-27 23:39:22,787 [terkin.device                 ] INFO   : Collecting garbage
2021-07-27 23:39:22,796 [terkin.device                 ] INFO   : Curating the garbage collector finished. Free memory: 76.0515153992171
(.venv) pi@raspberrypi:~/terkin-datalogger $ 

Es gibt also noch eine Rechteverletzung mit der udp.py. mit sudo vorweg gibt es keine
Fehlermeldung. Fehler oder Feature?*

Morgen versuche ich die einzelnen Sensoren einzubinden . Ich habe noch keine Ahnung, wie ich den einzelnen Gipo pins die entsprechende Zuweisung im Terkin-Config File und in der /boot/config.txt geben muß. Gibt auf alle fälle von Fall zu fall andere Wege. 1-Wire scheint z.B. direkt über Linux zugewiesen zu werden.
Ich hoffe, das Fragezeichen lichtet sich aber von selbst, wenn ich erstmal damit anfange.


meine Platine Schaut übrigens so aus:

2 Likes

Hi Michael,

vielen Dank für Deine Eingaben. Meine Antwort geht entlang der Themen, die Du angesprochen hast.

Konfigurationsblaupause erstellen

Wo genau hast Du diese Zeile her? CPython sandbox — Terkin Datalogger 0.14.0 documentation zeigt eine leicht andere Variante.

Für die Installationsvariante “by using only pip” gibt es bei Setup on CPython — Terkin Datalogger 0.14.0 documentation die entsprechende Anleitung, die die Konfigurationsdatei per wget beschafft.

Ja, ein command line subcommand à la terkin create-config --flavor=sbc würde hier noch mehr Komfort bringen. Bei CPython: Feature to create configuration file blueprint · Issue #90 · hiveeyes/terkin-datalogger · GitHub habe ich eine entsprechende Notiz gemacht.

Berechtigungen für Modeserver

Danke für diesen Bericht. Man müsste wohl den Port von 666 auf einen Port >=1024 verlegen, damit Terkin auf CPython unter Linux nicht als Superuser gestartet werden muss. Einstweilen habe ich den “Modeserver” in den entsprechenden Konfigurationsblaupausen per CPython: Don't enable modeserver in example configuration blueprints · hiveeyes/terkin-datalogger@ea9d297 · GitHub deaktiviert, auf Linux/CPython braucht man dessen Möglichkeiten (Wartungsmodus für den Terkin-Datenlogger) vermutlich (erstmal) nicht.

Hardware-Sensoren konfigurieren

Basiskonfiguration: Hier ganz oben bei Terkin-Variante für CPython / Raspberry Pi / Dragino LoRa/GPS HAT - #2 by tonke findest Du alle Einstellungen, die @tonke in der /boot/config.txt auf seinem Raspberry Pi vorgenommen hatte.

Terkin-Konfiguration: Die Ansteuerung der GPIOs auf dem RaspberryPi läuft über die GPIO Zero Bibliothek. Das muss vermutlich bei GPIO Zero Konfiguration erst einmal aktiviert werden. Um auf den GPIO Ports dann Busse zu definieren, gibt es hier ein paar Konfigurationsbeispiele:

I2C

Bei I2C Bus Konfiguration für Raspberry Pi findet sich ein Schnipsel für die softwareseitige Verdrahtung von GPIO Ports als I2C Bus. Unter der Haube kommt hier das busio Modul aus der Adafruit Blinka Bibliothek zum Einsatz, der entsprechende Adapter findet sich in terkin.sensor.core.

1-Wire

1-Wire Konfiguration für Raspberry Pi ist ein Beispielschnipsel zur Konfiguration von GPIOs als 1-Wire Bus. Die entsprechenden Softwareadapter für Terkin finden sich in terkin.sensor.linux.

In der Tat übernimmt hier das Auslesen bereits der Linux Kernel vollumfänglich. Der Ergebnisse werden dann ins sysfs eingeblendet, bei unserem Test-Setup war das /sys/bus/w1/devices/w1_bus_master1.

Fazit

Ich hoffe, dass das bereits einige Antworten auf Deine Fragen gibt und Dir weiterhilft, das Gerät in Betrieb zu nehmen.

Viele Grüße,
Andreas.

Bei CPython: Run Terkin as system service · Issue #91 · hiveeyes/terkin-datalogger · GitHub ist nun noch eine ähnliche Notiz hinzugekommen. Hier geht es darum, den gleichen Mechanismus wie bei Prepare Saraswati to run as system service by amotl · Pull Request #11 · hiveeyes/saraswati · GitHub einzuführen: sudo terkin setup --systemd.

1 Like

Bin Heute leider nicht sehr viel weiter gekommen.

  • der BME280 läuft schon mal.
  • die DS18B20 ebenfalls
    mit dem DS18B20 gibt es ein Problem. Hat mit dem OS oder dem Pin zu tun. Ich bekomme ihn einfach nicht zum laufen.(hat aber definitiv nichts mit Terkin zu tun)
  • für den HX711 sind anscheinend keine Treiber verfügbar
2021-07-28 22:27:07,368 [root                          ] INFO   : Setting up CPython compatibility layer
2021-07-28 22:27:08,514 [root                          ] INFO   : Starting bootloader
2021-07-28 22:27:08,532 [root                          ] INFO   : Loading modules
2021-07-28 22:27:08,855 [root                          ] INFO   : Loading settings from "src/settings.raspberrypi-basic.py"
2021-07-28 22:27:08,884 [root                          ] INFO   : Setting up Terkin
2021-07-28 22:27:08,887 [terkin.datalogger             ] INFO   : Starting Terkin datalogger
2021-07-28 22:27:08,893 [terkin.configuration          ] INFO   : Starting TerkinConfiguration on path "/home/pi/terkin-datalogger"
2021-07-28 22:27:08,900 [terkin.configuration          ] INFO   : User settings: None
2021-07-28 22:27:08,920 [terkin.device                 ] INFO   : Reset cause and wakeup reason: {'reset_cause': {'code': 0, 'message': 'PWRON'}, 'wakeup_reason': {'code': 0, 'message': 'PWRON'}}
2021-07-28 22:27:08,924 [terkin.watchdog               ] INFO   : Skipping watchdog timer (WDT)
2021-07-28 22:27:08,928 [terkin.device                 ] INFO   : Start curating the garbage collector
2021-07-28 22:27:08,943 [terkin.device                 ] INFO   : Collecting garbage
2021-07-28 22:27:08,956 [terkin.device                 ] INFO   : Curating the garbage collector finished. Free memory: 79.03671141305335
2021-07-28 22:27:08,960 [terkin.device                 ] INFO   : Turning off Bluetooth
2021-07-28 22:27:08,985 [terkin.datalogger             ] INFO   : Starting Terkin Datalogger 0.11.4
2021-07-28 22:27:09,036 [terkin.device                 ] INFO   :

========================
Terkin Datalogger 0.11.4
========================
Device id    3131353636

CPU freq     1000.0   MHz

Python  : 3.7.3 (default, Jan 22 2021, 20:04:44) [GCC 8.3.0]
platform: linux
machine : armv6l
nodename: raspberrypi
release : 5.10.17+
sysname : Linux
version : #1414 Fri Apr 30 13:16:27 BST 2021


2021-07-28 22:27:09,045 [terkin.device                 ] INFO   : Starting networking
2021-07-28 22:27:09,050 [terkin.device                 ] INFO   : [WiFi] Interface not enabled in settings.
2021-07-28 22:27:09,055 [terkin.network.core           ] INFO   : Starting mode server on 0.0.0.0:666
2021-07-28 22:27:09,079 [terkin.device                 ] INFO   : [LoRa] Interface not enabled in settings.
2021-07-28 22:27:09,084 [terkin.device                 ] INFO   : [LTE]  Interface not enabled in settings.
2021-07-28 22:27:09,090 [terkin.device                 ] INFO   : [GPRS] Interface not enabled in settings.
2021-07-28 22:27:09,094 [terkin.device                 ] INFO   : Starting telemetry
2021-07-28 22:27:09,086 [terkin.api.udp                ] INFO   : Starting UdpServer on 0.0.0.0:666
2021-07-28 22:27:09,100 [terkin.telemetry.core         ] INFO   : Telemetry channel topology: MqttKitTopology
2021-07-28 22:27:09,109 [terkin.telemetry.core         ] INFO   : Telemetry channel URI: mqtt://01D8V8B3AS97FZJ9C3HJ1TTGT2:Mubofmew@swarm.hiveeyes.org/hiveeyes/01D8V8B3AS97FZJ9C3HJ1TTGT2/Oering/ZeroPi-Test-mqtt-json
2021-07-28 22:27:09,113 [terkin.telemetry.core         ] INFO   : Starting Terkin TelemetryClient
2021-07-28 22:27:09,118 [terkin.datalogger             ] INFO   : Setting up sensors
2021-07-28 22:27:09,123 [terkin.sensor.core            ] INFO   : Starting buses: ['bus-i2c-1', 'bus-onewire-0']
2021-07-28 22:27:09,432 [terkin.sensor.core            ] INFO   : Scan I2C with id=1 bus for devices...
2021-07-28 22:27:09,493 [terkin.sensor.core            ] INFO   : Found 1 I2C devices: [118]
2021-07-28 22:27:09,496 [terkin.sensor.core            ] INFO   : Registering bus "i2c:1"
2021-07-28 22:27:09,512 [terkin.sensor.linux           ] INFO   : Starting LinuxSysfsOneWireBus on /sys/bus/w1/devices/w1_bus_master1/
2021-07-28 22:27:09,518 [terkin.sensor.core            ] INFO   : Found 0 1-Wire (DS18x20) devices: []
2021-07-28 22:27:09,521 [terkin.sensor.core            ] INFO   : Registering bus "onewire:0"
2021-07-28 22:27:09,525 [terkin.datalogger             ] INFO   : Registering sensors
2021-07-28 22:27:09,530 [terkin.datalogger             ] INFO   : Setting up sensor with id=system.memfree and type=system.memfree on bus=None with address=None
2021-07-28 22:27:09,545 [terkin.datalogger             ] INFO   : Importing module "terkin.driver.system.memfree_sensor"
2021-07-28 22:27:09,552 [terkin.datalogger             ] INFO   : Setting up sensor with id=scale-1 and type=hx711 on bus=None with address=None described as "Waage 1"
2021-07-28 22:27:09,556 [terkin.datalogger             ] INFO   : Importing module "terkin.driver.hx711_sensor"
2021-07-28 22:27:09,602 [terkin.driver.hx711_sensor    ] INFO   : Selected HX711 hardware driver "heisenberg"
2021-07-28 22:27:09,606 [terkin.datalogger             ] INFO   : Setting up sensor with id=ds18b20-1 and type=ds18b20 on bus=onewire:0 with address=None
2021-07-28 22:27:09,609 [terkin.datalogger             ] INFO   : Importing module "terkin.driver.ds18x20_sensor"
2021-07-28 22:27:09,625 [terkin.datalogger             ] INFO   : Setting up sensor with id=bme280-1 and type=bme280 on bus=i2c:1 with address=0x76 described as "Bme280 on ic2:1 0x76"
2021-07-28 22:27:09,629 [terkin.datalogger             ] INFO   : Importing module "terkin.driver.bme280_sensor"
2021-07-28 22:27:09,645 [terkin.datalogger             ] INFO   : Setting up sensor with id=gpiozero and type=gpiozero on bus=None with address=None described as "gpiozero"
2021-07-28 22:27:09,648 [terkin.datalogger             ] INFO   : Importing module "terkin.driver.gpiozero_sensor"
2021-07-28 22:27:09,664 [terkin.sensor.core            ] INFO   : Starting all sensors
2021-07-28 22:27:09,668 [terkin.driver.hx711_sensor    ] INFO   : Initializing HX711 sensor with pin_dout=5, pin_pdsck=6, gain=128, scale=4.424242, offset=-73000.0
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/terkin/driver/hx711_sensor.py", line 106, in start
    self.loadcell = self.driver_class(pin_dout, pin_pdsck, gain)
  File "/usr/local/lib/python3.7/dist-packages/terkin/lib/hx711_heisenberg.py", line 45, in __init__
    super().__init__(dout, pd_sck, gain)
  File "/usr/local/lib/python3.7/dist-packages/terkin/lib/hx711.py", line 33, in __init__
    raise NotImplementedError('HX711 is not implemented on this platform')
NotImplementedError: HX711 is not implemented on this platform
2021-07-28 22:27:09,699 [terkin.driver.hx711_sensor    ] ERROR  : HX711 hardware driver failed. Reason: HX711 is not implemented on this platform

2021-07-28 22:27:09,753 [terkin.driver.gpiozero_sensor ] INFO   : Initializing sensor GPIOZero
2021-07-28 22:27:10,220 [terkin.datalogger             ] INFO   : Setup finished
2021-07-28 22:27:10,223 [root                          ] INFO   : Starting Terkin
2021-07-28 22:27:10,229 [terkin.sensor.core            ] INFO   : Sending power_on to bus i2c:1
2021-07-28 22:27:10,233 [terkin.sensor.core            ] INFO   : Sending power_on to sensor HX711Sensor
2021-07-28 22:27:10,236 [terkin.driver.hx711_sensor    ] INFO   : Powering up HX711
2021-07-28 22:27:10,240 [terkin.datalogger             ] INFO   : Reading 5 sensor ports
2021-07-28 22:27:10,246 [terkin.datalogger             ] INFO   : Reading sensor port "SystemMemoryFree"
2021-07-28 22:27:10,255 [terkin.datalogger             ] INFO   : Reading sensor port "HX711Sensor"
2021-07-28 22:27:10,259 [terkin.driver.hx711_sensor    ] INFO   : Powering down HX711
2021-07-28 22:27:10,264 [terkin.datalogger             ] INFO   : Reading sensor port "DS18x20Sensor"
2021-07-28 22:27:10,268 [terkin.driver.ds18x20_sensor  ] INFO   : Acquire readings from all DS18x20 sensors attached to bus "onewire:0"
2021-07-28 22:27:11,022 [terkin.driver.ds18x20_sensor  ] INFO   : Start conversion for DS18x20 devices on bus "onewire:0"
2021-07-28 22:27:11,027 [terkin.driver.ds18x20_sensor  ] WARNING: No data from any DS18x20 devices on bus "onewire:0"
2021-07-28 22:27:11,032 [terkin.datalogger             ] INFO   : Reading sensor port "BME280Sensor"
2021-07-28 22:27:11,180 [terkin.datalogger             ] INFO   : Reading sensor port "GPIOZeroSensor"
2021-07-28 22:27:11,183 [terkin.driver.gpiozero_sensor ] INFO   : Reading sensor GPIOZero
GPIOZero Data: {'cputemp': '37.932', 'diskusage': '5.7419893004755185', 'loadaverage': '0.33'}
2021-07-28 22:27:11,194 [terkin.datalogger             ] INFO   : Sensor data:

           cputemp.rpi                                           37.932                  gpiozero
           diskusage.rpi                             5.7419893004755185                  gpiozero
           humidity.0x76.i2c:1                        55.89199661626913      Bme280 on ic2:1 0x76
           loadaverage.rpi                                         0.33                  gpiozero
           pressure.0x76.i2c:1                       1005.2552738715547      Bme280 on ic2:1 0x76
           system.memfree                             78.53808286861275
           temperature.0x76.i2c:1                         25.2517578125      Bme280 on ic2:1 0x76

2021-07-28 22:27:11,203 [terkin.device                 ] INFO   : Start curating the garbage collector
2021-07-28 22:27:11,216 [terkin.device                 ] INFO   : Collecting garbage
2021-07-28 22:27:11,225 [terkin.device                 ] INFO   : Curating the garbage collector finished. Free memory: 78.53626637118309
2021-07-28 22:27:11,230 [terkin.telemetry.core         ] INFO   : Telemetry transport: MQTT over TCP
2021-07-28 22:27:11,236 [terkin.telemetry.core         ] INFO   : Connecting to MQTT broker at swarm.hiveeyes.org with username 01D8V8B3AS97FZJ9C3HJ1TTGT2. client_id=terkin.3639343533
2021-07-28 22:27:11,263 [terkin.telemetry.core         ] INFO   : MQTT topic:   hiveeyes/01D8V8B3AS97FZJ9C3HJ1TTGT2/Oering/ZeroPi-Test-mqtt-json/data.json
2021-07-28 22:27:11,266 [terkin.telemetry.core         ] INFO   : MQTT payload: {"system.memfree": 78.53808286861275, "temperature.0x76.i2c:1": 25.2517578125, "humidity.0x76.i2c:1": 55.89199661626913, "pressure.0x76.i2c:1": 1005.2552738715547, "cputemp.rpi": "37.932", "diskusage.rpi": "5.7419893004755185", "loadaverage.rpi": "0.33"}
2021-07-28 22:27:11,272 [terkin.telemetry.core         ] INFO   : Connecting to MQTT broker at swarm.hiveeyes.org with username 01D8V8B3AS97FZJ9C3HJ1TTGT2
2021-07-28 22:27:11,373 [terkin.telemetry.core         ] INFO   : Connecting to MQTT broker at ('46.4.251.66', 1883) succeeded
2021-07-28 22:27:11,449 [terkin.datalogger             ] INFO   : Telemetry status: SUCCESS (1/1)
2021-07-28 22:27:11,453 [terkin.device                 ] INFO   : Start curating the garbage collector
2021-07-28 22:27:11,467 [terkin.device                 ] INFO   : Collecting garbage
2021-07-28 22:27:11,476 [terkin.device                 ] INFO   : Curating the garbage collector finished. Free memory: 78.44725799712994
pi@raspberrypi:~/terkin-datalogger $

EDIT: 1 Wire (DS18b20) geht jetzt auch! War ein schlecht gequetschter Stecker (Isolierung mit eingeklemmt).

Hi Michael,

Exzellent!

Das stimmt. Wir haben hier zwei Möglichkeiten:

  1. Portierung des “pure-Python” HX711-Treibers von HoneyPi, siehe rpi-scripts/sensors/HX711.py at v1.3.2 · Honey-Pi/rpi-scripts · GitHub.
  2. Erstellung eines Sensor-Adapters für den HX711-Treiber des Linux Industrial I/O Subsystem aka. Linux-IIO, siehe linux/drivers/iio/adc/hx711.c at v5.13 · torvalds/linux · GitHub. Diesen Weg ging auch Andreas Klinger (ebenfalls der Autor dieses Treibers!) bei Linux IIO in einer Bienenstockwaage. Danke, @weef!

Ich bin eindeutig für Variante 2. Bei Variante 1 sind fehleranfällige Messungen vorprogrammiert, weil man mit Python auf Linux die timing-kritischen Dinge (“bitbanging”!!!) nur sehr schwer bis gar nicht korrekt hinbekommt, das gilt an der Stelle für alle Userspace-Programme. Bei Variante 2 werden die timing-relevanten Aspekte jedoch vom Kernel übernommen, wie bei der Ansteuerung der DS18B20-Sensoren auch.

Am komfortabelsten funktioniert das Auslesen vermutlich über die libiio von Analog Devices, Inc. [1], per pylibiio gibt es sogar ein entsprechendes Python-binding dafür.

Viele Grüße,
Andreas.

P.S.: Der Artikel von Andreas Klinger zeigt auch, dass er die BME280 Sensoren ebenfalls per Linux-IIO ausgelesen hat. Sobald wir uns dem Thema entlang der Erschließung des HX711 generell ein wenig mehr genähert haben und entsprechende erste Codeschnipsel entstanden sind, könnten wir u.U. darüber nachdenken, das hier ebenfalls zu tun.


  1. Siehe auch What is libiio? [Analog Devices Wiki]. ↩︎

1 Like

Mal das Gute zuerst:

Der BME280 ist schon mal standardmäßig bei Raspberry OS mit an Bord. Da ich ihn am Standard I²C Bus hängen habe, reicht es, diese 2 Zeilen in der /boot/config.txt einzufügen:

dtparam=i2c_arm=on
dtoverlay=i2c-sensor,bme280,addr=0x76

Nach dem Reboot ist der Sensor bereits aktiv:

pi@raspberrypi:~ $ cd /sys/bus/iio/devices/
pi@raspberrypi:/sys/bus/iio/devices $ ls
iio:device0
pi@raspberrypi:/sys/bus/iio/devices $ cd iio\:device0
pi@raspberrypi:/sys/bus/iio/devices/iio:device0 $ ls
dev                                     in_pressure_input               in_temp_oversampling_ratio  power
in_humidityrelative_input               in_pressure_oversampling_ratio  name                        subsystem
in_humidityrelative_oversampling_ratio  in_temp_input                   of_node                     uevent
pi@raspberrypi:/sys/bus/iio/devices/iio:device0 $ cat in_temp_input
24660
pi@raspberrypi:/sys/bus/iio/devices/iio:device0 $ cat in_pressure_input
100.003250000
pi@raspberrypi:/sys/bus/iio/devices/iio:device0 $ cat in_humidityrelative_input
51783
pi@raspberrypi:/sys/bus/iio/devices/iio:device0 $ cat uevent
MAJOR=240
MINOR=0
DEVNAME=iio:device0
DEVTYPE=iio_device
OF_NAME=bme280
OF_FULLNAME=/soc/i2c@7e804000/bme280@76
OF_COMPATIBLE_0=bosch,bme280
OF_COMPATIBLE_N=1
pi@raspberrypi:/sys/bus/iio/devices/iio:device0 $

Die schlechte Nachricht?

Mit dem HX711 scheint das ab “Werk” auch zu gehen: linux/hx711.c at rpi-5.10.y · raspberrypi/linux · GitHub. Leider habe ich noch nicht rausgefunden, wie ich den Treiber in der /boot/config.txt aktiviere und die Pins konfiguriere.

1 Like

A post was merged into an existing topic: Erschließung des HX711 Treibers für Linux-IIO