WLAN-Button: Unterschied zwischen den Versionen

Aus Maschinendeck Wiki
Zur Navigation springen Zur Suche springen
>Ranlvor
(+Howto)
>Ranlvor
(Update status)
 
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
|What=hardware
|What=hardware
|Who=Ranlvor,
|Who=Ranlvor,
|Status=running
|Status=abandoned
|Tags=ESP8266,
|Tags=ESP8266, Freifunk, Raumstatus
}}
}}


== Aktuelle Situation ==
Version 1 hat nie funktioniert, Version hat den Umzug in die Eurener Straße nie mitgemacht.
== 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. [https://github.com/maschinendeck/WLAN-Button/tree/master/freifunkrouter 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 [https://github.com/maschinendeck/WLAN-Button/blob/master/freifunkrouter/raumstatus.lua#L52-L79 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
** Lade das luabitop-Paket von einem Mirror deines geringsten Misstrauens (z.B. der, der in /etc/opkg/distfeeds.conf angegeben ist). Ich hab letztes Mal https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/packages/luabitop_1.0.2-1_ar71xx.ipk genommen.
** Kopiere es auf dem Router nach /tmp
** Installiere es mit opkg install luabitop_1.0.2-1_ar71xx.ipk
== Version 1 ==
[[File:WLAN-Button.jpg|200px|thumb|left|WLAN-Button]]
[[File:WLAN-Button.jpg|200px|thumb|left|WLAN-Button]]
[[File:WLAN-Button-Hardware.png|400px|thumb|right|WLAN-Button Schaltplan]]
[[File:WLAN-Button-Hardware.png|400px|thumb|right|WLAN-Button Schaltplan]]
Zeile 12: Zeile 49:
Sourcecode: [https://github.com/maschinendeck/WLAN-Button]
Sourcecode: [https://github.com/maschinendeck/WLAN-Button]


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


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


== Infobits ==
=== Infobits ===
* Sollte sich 2 Minuten nach Beginn des Verbindungsversuch automatisch abschalten
* 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.
* 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.
Zeile 35: Zeile 72:
* Stecker, Buchse und Loch für externe Spannungsversorgung ist vorhanden
* 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.
* 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

Aktuelle Version vom 15. Oktober 2019, 18:49 Uhr

WLAN-Button
Weshalb Update the Raumstatus - the easy way
Was hardware
Wer Ranlvor,
Status läuft



Aktuelle Situation[Bearbeiten | Quelltext bearbeiten]

Version 1 hat nie funktioniert, Version hat den Umzug in die Eurener Straße nie mitgemacht.

Version 2[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

  • 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[Bearbeiten | Quelltext bearbeiten]

  • 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“[Bearbeiten | Quelltext bearbeiten]

  • 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[Bearbeiten | Quelltext bearbeiten]

WLAN-Button
WLAN-Button Schaltplan

Sourcecode: [1]

Howto[Bearbeiten | Quelltext bearbeiten]

  • 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[Bearbeiten | Quelltext bearbeiten]

  • 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[Bearbeiten | Quelltext bearbeiten]

  • 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[Bearbeiten | Quelltext bearbeiten]

getchallenge.php[Bearbeiten | Quelltext bearbeiten]

  • 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[Bearbeiten | Quelltext bearbeiten]

  • 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