WLAN-Button

From Maschinendeck Wiki
Jump to: navigation, search
WLAN-Button
Why Update the Raumstatus - the easy way
What hardware
Who Ranlvor
Status running
Tags ESP8266, Freifunk, Raumstatus

Version 2

Version 1 hatte durch unerwartete Leckströme einen unerwartet hohen Energieverbrauch. Da die Batterielautzeit mit 3 Tagen inakzeptabel kurz war, habe ich den Freifunkrouter im Raum um einen Raumstatusbutton erweitert. Code liegt auf Github.

Howto

  • WPS-Knopf am Router 1x kurz drücken.
  • Die linke WLAN-LED hört auf zu blinken und geht für einen Moment aus. Wenn sie wieder an geht, ist das Skript fertig.
  • Die rechte WLAN-LED ist jetzt
    • aus: Der Raumstatus ist jetzt geschlossen.
    • an: Der Raumstatus ist jetzt offen.
    • blinkt: Fehler beim Updaten des Raumstatus.
  • Nach 10 Sekunden übernehmen die LEDs wieder ihre eigentliche Funktion.

Funktionsweise

  • Jedes Knopf-Event triggert ein Shellskript. /etc/hotplug.d/button/60-raumstatus
  • Wenn das Event „WPS wurde losgelassen“ war, wird das Luaskript /usr/bin/raumstatus/raumstatus.lua gestartet (der Code ist relativ selbsterklärend, siehe Github).
    • schalte die linke WLAN-LED ab
    • rufe die Nonce via getchallenge.php ab
    • rufe doaction.php mit HMAC auf
      • toggel den Raumstatus
    • setze die LED passend zum Rückgabewert von doaction.php

Howto „das muss auf einen anderen Router“

  • secret.lua beschaffen. (Zufällig generieren und auf Serverseite eintragen oder alte von $irgendwo besorgen)
  • git clone --recursive https://github.com/maschinendeck/WLAN-Button.git (das --recursive ist wichtig, nicht vergessen)
  • secret.lua nach WLAN-Button/freifunkrouter kopieren
  • cd WLAN-Button/freifunkrouter; ./make.sh
  • Ordner build nach router:/usr/bin/raumstatus kopieren
  • 60-raumstatus nach router:/etc/hotplug.d/button kopieren
  • luabitop installieren

Version 1

WLAN-Button
WLAN-Button Schaltplan

Sourcecode: [1]

Howto

  • Knopf drücken (eventuell mehrfach) bis die LED anfängt rot/grün zu blinken.
  • Sobald die LED länger als 1 Sekunde leuchtet, ist der Raumstatus aktuallisiert. Rote LED = Raum zu, Grüne LED = Raum offen.

Funktionsweise

  • Drücken des Buttons aktiviert den µC
  • Beginnt die LEDs rot/grün zu blinken
  • Verbindet sich mit dem nächsten trier.freifunk.net
  • Baut eine HTTPS-Verbindung zu internetbutton.starletp9.de auf
  • Ruft per getchallenge.php eine Nonce ab
  • Sendet seinen Batterieladestand an doaction.php
    • doaction.php toggelt den Raumstatus
    • doaction.php gibt die neue LED-Farbe, grün = Raum ist jetzt offen, rot = Raum ist jetzt zu, aus
  • Leuchte in dieser Farbe 10 Sekunden lang
  • Schalte den µC ab

Infobits

  • Sollte sich 2 Minuten nach Beginn des Verbindungsversuch automatisch abschalten
  • Wenn's nicht geht: Nochmal drücken. Oft nochmal drücken. Mal länger drücken, mal kürzer drücken, 20x drücken. Manchmal landet er im Bootloader und dann hilft nochmal drücken. Sobald die Software läuft ist der Button außer Funktion bis die LED sich wieder abschaltet.
  • Batteriehalter hat einen Wackelkontakt, das macht schonmal Probleme
  • Eigentlich ist die Betriebsspannung 3,3V, läuft zur Zeit auf 2x AA
  • Stecker, Buchse und Loch für externe Spannungsversorgung ist vorhanden
  • Standbyverbrauch: 1 mA. Ich schätze die Batteriehaltbarkeit auf 1 Monat, also sollte bis zum 18.03.2016 das Projekt durch etwas anderes abgelöst werden.

Protokoll

getchallenge.php

  • Gibt eine Nonce für das angegebene Device aus. Diese Nonce ist an die Deviceid und an die IP-Adresse des Clients gebunden und läuft nach 60 Sekunden oder nach erfolgreicher benutzung automatisch ab.
  • GET-Parameter:
    • device: Integer mit der Deviceid
 Beispiel:
 /getchallenge.php?device=1

doaction.php

  • Prüft die Nonce, den Authcode, invalidiert die Nonce, speichert die Telemetrie und updated den Raumstatus
  • GET-Parameter
    • device: Integer mit der Deviceid
    • data: Payload
    • auth: hash_hmac("sha256", $data, $HMAC_KEY) (in Hexadezimalkodierung)
  • Inhalt von data
    • data ist eine Art kaputtes CSV / Key-Value-Format
    • Die Datensätze werden mit " voneinander getrennt (weil Zeilenumbrüche urlencoded werden müssten und das auf den kleinen Devices zu fummelig wäre)
    • Key und Value werden mit : voneinander getrennt
    • Mögliche Keys
      • challenge: eine Ausgabe von /getchallenge.php. Muss vorhanden und gültig sein, sonst wird die Anfrage ignoriert
      • tele: Telemetriedaten. Wird bisher von Version 2 nicht genutzt. Version 1 läd im Feld vdd die aktuelle Versorgungsspannung hoch
        • tele ist eine Art kaputtes CSV / Key-Value-Format
        • Die Datensätze werden mit ; voneinander getrennt
        • Key und Value werden mit - voneinander getrennt
 Beispiel:
 /doaction.php?device=1&data=challenge:b76c924d95a76476e33c63165fe617d224a11d96745aaf62ec6054bdc1450260"tele:vdd-3082&auth=34fdfa69e9c56fc7650930075cb3e6d023be0eabcace0862eeadca5158e56080
 
 ?device=1
 &data=
   challenge:b76c924d95a76476e33c63165fe617d224a11d96745aaf62ec6054bdc1450260
   "tele:
     vdd-3082
 &auth=34fdfa69e9c56fc7650930075cb3e6d023be0eabcace0862eeadca5158e56080