Projekt:Sensors

Aus k4cg.org
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)|
+---+---------------------------------+
    |
    | ^4 to ^6 Con^ert
    |
+---v-------------------------------------------------------+
| Scotty, SOCAT (bind to localhost:4223, listen ::/0:31338) |
+---+-------------------------------------------------------+
    |
    | Internet (^6 to ^6)
    |
+---v-------------------------------------------------------------+
| Nixe, SOCAT (Bind to Scotty |6 IP:31338, listen 127.0.0.1:31338)|
+---+-------------------------------------------------------------+
    | v6 to v4 Convert
    |
+---v----------------------------------------------------------------+
| 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