FHEM Tutorial-Reihe - Part 35: Google Auth in FHEM
Weiter geht es mit einer coolen Spielrei, welche unglaublich hohes Potenzial hat. Und zwar mit dem Google Authenticator. Mit dessen Hilfe können ablaufende Codes vom Smartphone genutzt werden, um damit Aktionen in FHEM zu validieren. Klingt erstmal kompliziert, ist aber wirklich super schnell eingerichtet!
Was wird benötigt?
- Eine FHEM-Installation
- Die App “Google Authenticator” - kostenlos im App-Store
Video
Befehle
Um den Authenticator nutzen zu können, müssen ein paar Perl-Pakete installiert werden. Diese habe ich im Video nicht erwähnt, um das Ganze etwas abzukürzen.
sudo apt-get install libconvert-base32-perl libauthen-oath-perl libcrypt-urandom-perl
Danach kann in FHEM auch schon das Gerät angelegt werden:
define GoogleAuth GoogleAuth
set GoogleAuth new
Ist dies durchgeführt, solltet Ihr einen QR-Code sehen, welcher wie im Video gezeigt einfach mit der App gescannt werden muss. Das wars dann auch schon! Ab jetzt können in FHEM die Codes validiert werden. Ich habe mir dazu einmal dieses günstige Keypad aus HongKong bestellt, zu welchem ich dann auch noch ein Video machen werde. Ziel ist es dann, mehrere Tasten hintereinander auf dem Pad zu drücken, und wenn es 6 Tastendrücke waren, wird der Code wie bereits gezeigt mit Perl validiert.
{gAuth("GoogleAuth", "575910")}
Sollte eigentlich recht einfach zu machen sein. Ihr könnt gespannt sein!
Teil 2 - Keypad integrieren
In diesem Video flashen wir einen Wemos D1 Mini mit Hilfe von Platform IO (statt Arduino IDE wie sonst). Einfach, weil ich ein neues MacBook habe und die Arduino IDE dort noch nicht installiert war und ich gerne mal neue Dinge ausprobiere.
https://github.com/Nullkraft/Keypad
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Keypad.h>
const char* mqtt_server = "192.168.178.11";
const char* ssid = "WLAN_SSID";
const char* password = "PASSWORD";
Keypad keypad(
makeKeymap(((char[4][4]) {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
})),
(byte[]){5, 4, 0, 2},
(byte[]){14, 12, 13, 15},
4,
4
);
WiFiClient net;
PubSubClient client(net);
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
Serial.begin(115200);
Serial.println();
Serial.println("Booting...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
connect();
Serial.println("Setup completed...");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
char key = keypad.getKey();
if (key) {
Serial.print("Pressed Key: ");
Serial.println(key);
client.publish("/Keller/Keypad", &key);
}
}
void connect() {
// WiFi
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(ssid, password);
Serial.println("WiFi connection failed. Retry.");
}
Serial.print("Wifi connection successful - IP-Address: ");
Serial.println(WiFi.localIP());
// MQTT
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "WemosKeypad-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
Pin 1-4 zeigen die Reihe an und Pin 5-8 die Spalte, das heisst, wenn man auf die 6 drückt, verbinden sich der 2. und der 7. Pin (2. Reihe und 3. (+4) Spalte).
define KE_Keypad MQTT_DEVICE
attr KE_Keypad subscribeReading_keypress /Keller/Keypad
define n_KE_KeypadValidate notify KE_Keypad:.* {}
KE_Keypad:keypress:.* {
my $newValue = $EVTPART1;
if ($newValue ne '#') {
fhem("setreading KE_Keypad current_entry " . ReadingsVal("KE_Keypad", "current_entry", "") . $newValue);
} else {
if (gAuth("GoogleAuth", ReadingsVal("KE_Keypad", "current_entry", "")) == 1) {
fhem("set BU_Deckenlicht toggle");
}
fhem("deletereading KE_Keypad current_entry");
}
}