FHEM Tutorial-Reihe - Part 35: Google Auth in FHEM

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

Achtung: Dieser Inhalt ist nicht mehr aktuell! Es ist nicht empfohlen nach dieser Anleitung vorzugehen.
FHEM Tutorial-Reihe - Part 35: Google Auth in FHEM
FHEM Tutorial-Reihe - Part 35: Google Auth in FHEM
  • 08.08.2017
  • Veraltet!
  • Integration
  • Webservice

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

ioBroker-Kurs

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

ioBroker-Kurs

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");
	}
}
Du willst mehr?

Smart-Home-Trainings von A-Z

Steig' noch tiefer in die Themen ein und meistere Deine Projekte! Über 15.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.