Projekt:Sensors
Projekt:Sensors | |
Betreuer*In | noqqe |
Jahr | 2016 |
Läuft auf | scotty.intern.k4cg.org |
URL | https://github.com/k4cg/rezeptionistin |
Sensors @ K4CG
Die ehemaligen Sensoren von organic-entropy.org wurden unterhalb von Host:scotty.intern.k4cg.org angebracht und an diesen angeschlossen.
Die Sensoren liefern Daten über folgendes:
Temperatur (schon wieder...) Licht Intensität (i.e. Helligkeit) Geräusch Pegel (KEIN Aufnahmegerät) Accelerometer (pretty much useless, weil an die Wand gehängt)
Setup des Daemons auf Scotty
Brickd von tinkerforge.com herunterladen und das .deb Paket installieren.
Konfigurieren von brickd und start
listen.address = 0.0.0.0 listen.plain_port = 4223 listen.websocket_port = 0 listen.dual_stack = off
Hurra.
Netzwerk
Um diese Daten ins IRC zu bekommen brauch wir Verbindung von Host:nixe.k4cg.org zu Host:scotty.intern.k4cg.org.
Die Kurzbeschreibung der gebauten Lösung sieht so aus
Scotty, BRICKD (listen 0.0.0.0:4223) -> Scotty, SOCAT (bind to localhost:4223, listen ::/0:31338) -> Nixe, SOCAT (Bind to Scotty v6 IP:31338, listen 127.0.0.1:31338) -> Rezeptionistin, Python Tinkerforge Lib (connect to localhost:31338).
Warum ist das alles so behindert und komplierziert? Ja das frag ich mich auch. Für die Nachwelt:
Problem 1
Brickd hört nur auf IPv4 Adressen, zum abholen brauchen wir aber v6 wegen M-Net.
Lösung: socat
rult! IPv6 auf IPv4 local NAT sozusagen.
[program:sensors] directory=/root/ command=/usr/bin/socat TCP6-LISTEN:31338,fork TCP4:127.0.0.1:4223 autostart=true autorestart=true startsecs=10 user=root stdout_logfile=/root/sensors.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stderr_logfile=/root/sensors.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB environment = HOME="/root/", USER="root"
Startet auf scotty automatisch
Problem 2
Die tinkerforge library, die in Rezeptionistin benutzt wird, kann kein IPv6. Also brauchen wir auch hier wieder einen socat, nur umgekehrt.
Config
# Service for v6 connection to heimat. Tinkerforge Connect only works with v4 systemd.services.sensorsipv6bridge= { enable = true; description = "IPv6 Tunnel to Scotty"; wants = [ "network.target" ]; environment = { OPENSSL_CONF = "/etc/ssl/"; SSL_CERT_FILE = "/etc/ssl/certs/ca-certificates.crt"; }; serviceConfig = { ExecStart = "/run/current-system/sw/bin/socat TCP4-LISTEN:31338,fork 'TCP6:[2001:a60:f073:0:21d:92ff:fe25:2a23]:31338'"; WorkingDirectory = "/usr/local/rezeptionistin/"; User = "ircbot"; }; };
Rezeptionistin
Die Anbildung und Einsammeln der Daten ist innerhalb der Plugins relativ einfach:
def get_light(self): ipcon = IPConnection() uvl = BrickletUVLight(self.licht_id, ipcon) ipcon.connect(self.licht_host, int(self.licht_port)) uv_light = uvl.get_uv_light() ipcon.disconnect() return(str(uv_light) + " µW/cm²")
Siehe https://github.com/k4cg/Rezeptionistin/blob/master/plugins/light.py und https://github.com/k4cg/Rezeptionistin/blob/master/plugins/sound.py