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

Mit ** gekennzeichne Links auf dieser Seite sind Affiliatelinks.

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

FHEM-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

FHEM-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");
    }
}

Newsletter

Trage Dich jetzt in den Newsletter ein und genieße dadurch viele Vorteile:

  • 5€-Gutschein als Dankeschön
  • Zugang zu exklusiven Inhalten
  • Rabattaktionen für Kurse
  • Angebote für Produkte

* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir regelmäßig Informationen und Produktempfehlungen aus dem Fachgebiet Smart Home zugesendet werden. Mit dem Eintrag akzeptieren Sie unsere Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.

Matthias Kleine

Matthias Kleine

Großer Fan und Anhänger von OpenSource-Projekten und erweiterbaren Haus-Automatisierungskomponenten. Je offener und flexibler das System, desto besser. Ich lege mich ungern auf einzelne Protokolle oder Standards fest, sondern probiere aus allen Welten das Beste zu verheiraten. Unterwegs als Softwareentwickler, Trainer und Blogger im Bereich Smart Home.

Auf YouTube und hier im Blog gibt es bereits unzählige kostenlose Videos, Informationen und Tutorials. Wenn Dir das noch nicht reicht, ist ein Training genau das richtige für Dich! Die folgenden Trainings haben den Vorteil, dass immer von Anfang an gestartet wird und Du ohne Vorwissen teilnehmen kannst.