Benutzer-Werkzeuge

Webseiten-Werkzeuge


projekte:raumstatus

Raumstatus-System

Wer: protagonist
aktueller Stand: aktiv, Dauerbetrieb
Rahmen: Club

aktueller Status


Livebild

grundlegende Design-Idee

  • Hauptfunktion: aktuellen Öffnungszustand unseres Hackerspaces im Internet anzeigen
    • Ampelsystem: Icons für offen (grün) und zu (rot), gelb für Fehler
  • Ziel: vollautomatisches, wartungsfreies Info-System
  • übernimmt keine „kritischen“ Infrastruktur-Aufgaben wie Türöffnung
ein live-aktualisierter Raumstatus ist sinnvoll
  • sehr praktisches Anwesenheitssystem - läd zum Vorbeischauen ein
  • manuelles Nachfragen/Aktualisieren hat sich als sehr unzuverlässig, langsam, aufwendig und ineffektiv erwiesen
  • für alle Gruppen interessant, die nicht (ausschließlich) zu einem festen Zeitplan aktiv sind
was soll/darf das System nicht können
  • Alarmanlage
  • Infos über individuelle Anwesende verraten (!)
Inspiration
Funktionsweise
  • Sensor ←Kabel→ Arduino Shield ↔ Arduino Uno ←USB→ Rechner(VM) ←Internet→ Webserver
  • Hardware vor Ort (stateless) schiebt Informationen zum Webserver, der kümmert sich um alles andere inkl. Archiv und Web-Darstellung
Daten, Visualisierung
  • Aktualisierung via https vom Sensorsystem: alle 30-60 Sekunden
  • Round Robin Database (RRD) mit 5min Auflösung, Graphen-Visualisierung via rrdtool
  • Ampel: dynamischer Verweis auf das passende Icon via kurzen pythonskripts
Interface, Interface-Doku

Hardwarekomponenten - hackerspace status device 1.8

  • Node: Geigermonitor + Arduino Uno Sensorsammlung
  • großteils privat gespendet/gekauft/Privatbesitz

VM auf lokalem Server

  • für die Datenverarbeitung und Kommunikation mit dem Webserver zuständig
  • USB durchgeleitet

Arduino Uno

  • Clubarduino Nr. 1 - R3/SMD
    • Stromversorgung & Seriell über USB
  • Gehäuse: alter Barcodescanner (solides Metallgehäuse, Glasfenster vorne)
  • Drehspul-Anzeige mit LED
    • optisches Feedback des Status
      • Beleuchungs-LED (grün) ist ein bzw. aus
      • Drehspulinstrument ist auf 0 (zu) oder pendelt im oberen Drittel (offen)
        • Arduino „random“ → PWM
        • weils toll aussieht

Türsensor

  • Separeetür offen ⇒ Hackerspace offen
  • keine false-Positives bei Benutzung des Seminarraums durch andere Gruppen
  • Anbindung Türsensor<>Arduino
    • 5m Cat5e (=geschirmt) quer über die Decke
    • Zwei RJ45-Buchsen + Platinen, Steckverbinder ⇒ modulares System
  • Ziele bei der Sensorentwicklung waren:
    • muss viele Türöffnungen aushalten ⇒ berührungslos
    • diskrete Abfrage → Vermeidung von Kalibration bei jedem Neustart
      • Sensor muss ständig auf/zu Zustand erkennen können, nicht nur die Wechsel
    • Zuverlässigkeit und großer Unterschied zwischen Werten offen/zu und Signal/Rauschverhältnis
    • robust
  • Umsetzung: aktiver Infrarot-Reflexionssensor am Türbalken, von oben auf die Tür gerichtet
    • Infrarot-LED sendet Infrarotlicht Richtung Tür
      • LED ist nur im ~2ms Zeitraum der Messung angeschaltet
      • mit Vorwiderstand (ca. 100 Ohm, Trimmer) an 3.3V
  • IR Transistor -Typ folgt
    • alter Sensor: Infrarotdiode SFH 203 FA an 5V und A0 in Sperrichtung
    • erkennt reflektiertes IR-Licht, falls Tür geschlossen ist, ansonsten nur das im Raum vorhande IR-Licht
    • wir haben Fluoreszenzlampen, die nur wenig Infrarot erzeugen, und der Sensor zeigt Richtung Boden in eine Lampe
    • Werte von >200 bei geschlossener Tür (Reflektion) vs 10 bei offener Tür (keine Reflektion)
    • d.h. keine Kalibration des Hintergrundlevels mit ausgeschalteter IR-LED notwendig
  • 10 Bit ADC Eingang Arduino (A0) mit 1 Megaohm Pulldown zu GND
  • zu berücksichtigen: Kabel- / Schirmungsprobleme
    • vorher waren ca ~6.50m Flachbandkabel 10-Pin im Einsatz → ungeschirmt, Probleme
    • Omega: 10 Pin Flachbandkabel ca. 0.6€/Meter
  • andere Sensorvorschläge
    • mechanischer Taster
      • Verschleiß
      • muss stabil und sicher befestigt werden
      • dauerhafte Veränderungen an der Tür
    • Reed-Schalter + Magnet
      • berührungslos
Temperatursensor
  • DS18S20, one Wire
  • passende Arduino-Bibliothek
Geigerzähler
Platine Display
  • 4 Datenleitungen
    • 1x Input Switchzustand
      • 10k Pulldown auf GND, Kippschalter an der Gehäusefront mit 3.3V auf HIGH
    • 1x Output PWM für Drehspulinstrument
      • 1 Megaohm Trimmer → Drehspulinstrument (extern) reagiert bei 100Kiloohm optimal
    • 1x Output 0V/3.3V für Status LED
      • 250Ohm Trimmer → grüne LED (hell)
    • 1x nicht belegt
  • 2 Stromleitungen
    • 1x 3.3V vom Arduino
    • 1x GND vom Arduino
  • RJ45 Buchse
  • RJ45, GND
  • GND, Output IR-LED, 5V, IR-Sensor
  • RJ45 Buchse <> Pin Header
  • 4 Pin belegt für: GND, Output IR-LED, 5V, IR-Sensor

Dokumentation der restlichen Hardware

  • folgt
sonstiges elektrisch
  • funktioniert besser mit Erdung (u.a. falls an einem Accesspoint betrieben)

Revisionen

Revision 1.01
  • Kippschalter am Gerät als manueller Override auf „Raum ist offen“
    • Override ist gegen von false negatives beim Arbeiten mit geschlossener Separeetür gedacht
    • Sollte nicht zu oft benutzt werden, wird leicht vergessen
      • SINNVOLLES FEATURE für später: rote Warn-LED bei aktiviertem Override
Revision 1.1
  • Verlagerung der Verkabelung am Arduino auf ein custom Arduino Shield
  • Vorbereitung für weitere Erweiterungen
Revision 1.2
  • neues Gehäuse
  • Verlagerung des Sensors an eine bessere Stelle
  • robuster gegen mechanische Störungen
Revision 1.3
  • Infrarottransistor statt Infrarotdiode
  • besseres Signal/Rauschverhältnis
  • robuster gegen elektrische Störungen
Revision 1.5
  • UP/DOWN VU-Meter für Netzdurchsatz
    • über 2 PWM Ports + Trimmer
    • Hardware fertig
    • noch nicht im Einsatz, Software dazu folgt
Revision 1.6
  • Geigerzähler (separate Datenübertragung per USB-FTDI)
Revision 1.7
  • Temperatursensor
Revision 1.8
  • Lichtsensor Besprechungsraum
    • 3x BPW40 vorhanden
Revision 1.9 - geplant - auf Eis
  • funktionaler Teil der Netz-UP/DOWNstream Anzeige

Software

Arduino Node (momentan im Einsatz)
  • Sensorverarbeitung am Arduino
  • digitalRead() beim Override Switch
  • analogRead() beim IR-Sensor
  • keine Kalibrationen notwendig
  • sämtliche Sensoren sind diskret abfragbar
  • Anzeige: grüne LED, PWM für Raumstatus-o-Meter, 2x PWM für Netzanzeige
  • USB-serielle Verbindung Richtung Rechner
Geigerzähler
Server für Web und Datenspeicherung
  • Speicherbasis: RoundRobinDatabase, also rrdtool mit rrdpython library als Verbindung
  • benötigte Pakete: python-rrdtool und rrdtool, dazu natürlich noch python, einen Webserver und cgi/ähnliches
    • work in progress
    • step = 300, also Auflösung 300s = 5 min
    • DS: open mit GAUGE als Datentyp, DS:open:GAUGE:600:0:1
      • ABSOLUTE ist nicht der Absolutwert, GAUGE hingegen schon
    • RRA: mit LAST, xff=0.5, steps=1,1 Jahr Daten → rows=100000,
      • AVERAGE ist auch möglich
      • LAST sorgt für max. 5 min. 'Verzögerung', ist kein Problem
      • xff muss weiter getestet werden
  • update.py - Statusupdate durch Client-Node
    • Node macht http-Aufruf zum Server
      • muss unbedingt auf https umgestellt werden
    • Passwortabfrage gegen gesalteten sha-256 Hash zur Authentifizierung
  • iconraumstatus.py - Auslieferung von Statusinfo-Icon
    • soll dynamisch das richtige Icon zurückgeben, leicht einbindbar / Wiki etc.
    • Funktionalität erreicht, inkl. Check auf Zeitintervall
    • wird immer dynamisch erstellt, d.h. ist sofort aktuell
    • rrdtool.info liefert
      • letzten Zeitstempel
      • last_ds ist letzter Wert
      • wird von rrdpython geparst
    • 3 Statusicons:
      • grün - offen (<10 min)
      • gelb - keine Infos für >10min → Störung
      • rot - zu (<10 min)
    • Statusicons mit Inkscape erstellt
    • Stand: grobe Funktionalität ist erreicht, es werden aktuelle Icons direkt zurückgegeben
  • graphraumstatus.py - erstellt aktuellen Graph aus der DB
    • Graph muss weiter getestet werden
    • Graph wird nur neu generiert, wenn alter Graph älter als 10 Sekunden ist (variabel)
      • reduziert Belastungspotential, hat kaum Nachteile
  • create.py nicht im Live-Einsatz, legt RRD neu an
    • –no-overwrite-Flag aktiviert, um unabsichtliches Überschreiben zu verhindern
    • Aussage Birger: –no-overwrite funktioniert nicht zuverlässig
  • Doku Konfiguration: lighttpd
    • /etc/lighttpd/lighttpd.conf → „.py“ als Dateiendung zu den exceptions hinzufügen
    • /etc/lighttpd/conf-available/10-cgi.conf in /etc/lighttpd/conf-enabled kopieren, entsprechend anpassen
    • Python irgendwo in /var/www, unter Debian: auf entsprechende Schreib/Leserechte von www-data achten
    • create.py sollte speziell gesichert sein, beispielsweise chmod -rwx create.py
    • eventuell /etc/init.d/lighttpd restart, um Konfiguration zu übernehmen
  • OpenWRT Trunk
    • Treiber: kmod-usb-acm (aktuelles OpenWRT notwendig)
    • coreutils-stty = stty
    • screen
    • ash
      • Skript auf dem Linux-Accesspoint, pusht die Werte alle 60 Sekunden in Richtung Server
      • rebootsicher, da in /etc/rc.local
      • bash-Skript
        • → python wäre zusätzlicher Ressourcenverbrauch, bei embedded-Geräten sehr knapp
      • Kontrolle über die Seriell-Verbindung braucht stty
        • unter OpenWRT muss coreutils-stty nachinstalliert werden
      • nodepush.sh
        • erstes bash-skript mit wget läuft, ist aber noch nicht optimal
        • Kontrolle per stty über serielle Schnittstelle
        • Arduino ist ttyACMx, normalerweise ttyACM0
        • Upload alle 60 Sekunden, Check über einen Timestamp
        • läuft im Hintergrund via screen
          • screen, ash nodepush.sh, STRG + A, STRG + D
Statusbot im CCCFr Chat
  • Statusbot im Jabber / Jabber Konferenzraum
  • schnell zusammengehackt
  • gibt auf Nachfrage Raumstatus, Temperatur und Strahlungswerte aus
  • wenig stabil

Doku StatusVM

  • Debian
Software
  • python-serial
  • python
  • screen

mögliche Hardware Ideen

  • weitere Drehspulinstrumente
    • 2 verfügbar, reserviert
      • 1x Skala, 1x Zahlen 1 bis 6
      • optimale Widerstände herausfinden
  • Statusanzeige
    • optisch: RGB LED ?

Erfolge / aktueller Stand

  • Do 13 Sep 2012 - Arduino Uno läuft an ähnlichem TP-Link AP per USB stabil und sendet munter per serial
  • Mo 17 Sep 2012 - kmod-usb-acm geht nur mit aktuellem OpenWRT-trunk, der lässt sich mom. nicht installieren (bleibt auf v.327xx hängen)
  • Di 18 Sep 2012 - OpenWRT Sysupgrade erfolgreich, Arduino wird erkannt
  • Sa 22 Sep 2012 - Fortschritte auf Serverseite, rrdpython-Interface funktioniert
  • So 23 Sep 2012 - große Fortschritte beim Python-Code
  • Mo 24 Sep 2012 - Daten vom Arduino empfangen, Drehspulinstrument funktioniert
  • Di 25 Sep 2012 - Arbeit am bash-Skript
  • Mo 1 Okt 2012 - hackerspace status device 1.0 gebaut
  • Di 2 Okt 2012 - Testserver online
  • Sa 6 Okt 2012 - Platine Türsensor fertig
  • Di 10 Okt 2012 - Türsensor verkabelt und funktioniert
  • Do 18 Okt 2012 - Verbesserungen an der Verkabelung, Umstieg auf Cat5e Kabel
  • Sa 20 Okt 2012 - Pythoncode läuft serverseitig
  • So 21 Okt 2012 - Einbindung in Wiki läuft
  • Sa 3 Nov 2012 - Arbeit am Override-Switch
  • Mi 5 Dez 2012 - Revision 1.1, Vorbereitung an Netzanzeige
  • Sa 16 Feb 2013 - Revision 1.5, Sensorposition/Montierung verbessert, Hardware Netzanzeige, Verbesserung Sensor
  • Mo 18 Feb 2013 - weitere Verbesserungen geplant
  • März 2013 - Geigerzähler, Temperatursensor
  • 2013 - Statusbot, neues Gehäuse für den Geigerzähler
  • Ende 2013 - neues Gehäuse, Modifikation Geigerzähler, Störungssuche
  • 2014 - diverse Kleinigkeiten und Verbesserungen
projekte/raumstatus.txt · Zuletzt geändert: 2014/08/26 15:35 von protagonist