Alle Beiträge von Holger

Tür öffnen mit Siri, OTP und FHEM (fInal?)

Das ist (vielleicht) mein letztes Update zum Thema Tür öffnen.

Zuerst mal eine gute Nachricht: Es gab noch keinen Versuch, sich hier widerrechtlich Zugang zu verschaffen. Das liegt aber voraussichtlich daran, dass diese Seite hier niemandem auffällt, der ernste Absichten hat, bei mir einzubrechen. Und wenn doch: Irgendwie fände ich es geil, wenn jemand sich die Mühe macht, um alle beteiligten Systeme zu hacken, um dann doch den Türöffner auszulösen, nur um dann zu sehen, dass hier nichts zu holen ist. Es wäre nur nett, wenn der- oder diejenige mir danach mitteilt, wo die Fehler in meinem Konzept waren.

Wie dem auch sei: Ich habe noch ein paar Optimierungen vorgenommen, die ich euch nicht vorenthalten möchte.

Zunächst einmal habe ich mir den „Schaltplan“ vom GIRA-Steuergerät Audio 128700 besorgt. Naja, nicht wirklich. Ich habe einfach nur endlich gecheckt, was die Symbole auf dem Gerät selber bedeuten.

Das bedeutet: Wenn man an die Terminals 7 und 8 einen Schaltkontakt anlegt, dann wird der Türöffnerkontakt ausgelöst, wenn der Kontakt geschlossen wird.

Also kann ich damit den ganzen Servo-Kram weglassen! Ich brauche also nur ein Relais-Modul am Wemos D1 und kann damit dann den Türöffner auslösen.

Also weg mit dem Servo, her mit einem Wemos D1 Relais Shield (für ’n paar günstige Taler erhältlich bei AZ-Delivery) und kurz den Sketch geändert: Dann sieht das ganze im Schaltschrank jetzt so aus:

Wemos D1 Relais Shield

Ausgang vom Relais mit Terminal 7 und 8 verbunden

Der Wemos-Sketch ist nun so geändert:

#include <Arduino.h> 
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
// Update these with values suitable for your network.
 
const char* ssid = "ssid";
const char* password = "wlanpw";
const char* mqtt_server = "mqtt.server.ip"; // MQTT IP oder DNS-Name
const char* servo_topic = "/SmartHome/Keller/Door/servo/cmnd"; // Topic braucht ihr später noch in FHEM
const char* status_topic = "/SmartHome/Keller/Door/servo/stat"; // Topic braucht ihr später noch in FHEM
  
WiFiClient espClient;
PubSubClient mqttClient(espClient);
// long lastMsg = 0;
// char msg[50];
int interval = 0;
const int relayPin = D1;
int relayState = LOW;

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
 
void callback(char* topic, byte* payload, unsigned int length) {
  String payloadstring;
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (unsigned int i = 0; i < length; i++) {
    // Serial.print((char)payload[i]);
    payloadstring+=((char)payload[i]);  
  }
   
  if (strcmp(topic, servo_topic) == 0)  
    interval = payloadstring.toInt();
    Serial.println(payloadstring);
    if (interval > 0) {
      digitalWrite(relayPin, HIGH); // turn on relay with voltage HIGH
      mqttClient.publish(status_topic, "opened");
      delay(interval);
      digitalWrite(relayPin, LOW);  // turn off relay with voltage LOW
      mqttClient.publish(status_topic, "closed");
    } else {
      mqttClient.publish(status_topic, "init");
    }
 }
 
void reconnect() {
  // Loop until we're reconnected
  while (!mqttClient.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqttClient.connect("ESP8266Client")) {
      Serial.println("connected");
      mqttClient.publish(status_topic,"connected");
      mqttClient.subscribe(servo_topic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(relayPin, OUTPUT);
  // myservo.attach(D0);
  // myservo.write(interval);
  setup_wifi();
  mqttClient.setServer(mqtt_server, 1883);
  mqttClient.setCallback(callback);
}
 
void loop() {
  if (!mqttClient.connected()) {
    reconnect();
  }
  mqttClient.loop();
}

Aber das war noch nicht alles.

Auch auf der Client-Device Seite hat sich bei mir etwas getan: Die Family besitzt jetzt Apple-Watches. Damit kann (könnte) man den Kurzbefehl auch auf der Watch ausführen. Also kann (könnte) man einfach „Tür öffnen“ in die Watch sprechen (vorausgesetzt, man ist in der Nähe des heimischen WLAN) und die Tür geht auf. Das funktioniert aber aufgrund der Siri-Architektur (jemand hat mir mal gesagt, dass jedesmal, wenn man „Hey Siri“ sagt, erstmal ein Microservice (Docker-Container) bei Apple hochgefahren werden muss, um die Anfrage zu bearbeiten) nur bedingt schnell… Nix ist peinlicher, als dass jemand vor der Haustür steht und mehrfach „Tür öffnen“ in sein Handgelenk spricht und nix passiert. Manchmal klappt das aber.

Andererseits können aber die aktuellen iPhones auch NFC-Tags in eine Kurzbefehl-Automatisierung einbauen. Und da wird es schon wieder spannend:

Warum also nicht irgendwo „hinter“ (also innen an) der Haustür einen NFC-Tag anbringen und zwar so, dass ein aktuelles iPhone diesen Tag erkennt und dann den Kurzbefehl „Tür öffnen“ ausführt.

Und jetzt könnte die Frage gestellt werden: Warum das iPhone an die Tür halten (inkl. Face-/Touch-ID Entsperrung), um die Tür zu öffnen, wenn es der Schlüssel genauso tut?

Die Antwort kann man nicht rational beantworten. Aber es ist einfach cool, wenn man’s kann.

Tür öffnen mit Siri und OTP – neue Version

Nach ein paar Wochen Betrieb meines OTP-Türöffners https://vc4.de/tuer-oeffnen-mit-otp-und-siri-shortcuts/ habe ich über ein paar Optimierungen – insbesondere bei den Siri-Shortcuts nachgedacht.

Zunächst habe ich entdeckt, dass die meisten OTP-Apps die Möglichkeit bieten, das OTP in die Zwischenablage zu kopieren. Also habe ich die erste Aktion „Gib den Zugangscode ein“ ersetzt durch „Zwischenablage abrufen“ und dann in die nächste Aktion durch „Variable sOTP auf Zwischenablage festlegen“ ersetzt. Das spart dann zumindest mal einen Schritt.

Und danach dachte ich mir: Vielleicht gibt es eine Shortcut-fähige OTP App, die dann in der Lage ist, per Siri Shortcut einen Code direkt in die Zwischenablage zu kopieren. Und siehe da: Die gibt es tatsächlich.

Auf Reddit gibt es eine Liste der Shortcut-fähigen Apps: https://www.reddit.com/r/shortcuts/comments/9rd56b/running_list_of_apps_that_supports_siri_shortcuts/

Und da findet sich die App OTP Auth von Roland Moers: https://apps.apple.com/us/app/otp-auth/id659877384

Mehr Infos zur App auch auf der Webseite von Roland Moers hier: https://cooperrs.de/otpauth.html

Nun sieht der erste Teil meines Kurzbefehls so aus:

Und damit brauche ich außer dem Aufruf des Shortcuts keine weitere Interaktion mehr mit meinem iPhone. Und das coolste war das Gesicht der Personen, die mich vor der Tür stehend haben sagen hören „Hey Siri, Tür öffnen“. Der Blick: Unbezahlbar!

P.S.: Die 4,49 € für die Pro Version von OTP Auth habe ich gerne bezahlt auch wenn ich die eigentlich nicht gebraucht hätte. Danke Roland.

Tür öffnen mit OTP und Siri-Shortcuts

Kurzer Disclaimer vorweg: Alles was ihr jetzt lest und ggf. nachmacht, macht ihr auf eigene Gefahr. Die hier vorgestellte Lösung ist dazu geeignet, dass ihr den Inhalt eueres Hauses verlieren könnt. Wenn ihr irgendetwas davon nachmachen wollt, solltet ihr sicher sein, dass das was ihr hier lest, auch komplett verstanden und von euch nachvollzogen werden kann. Ich hab‘ euch jedenfalls gewarnt!

Was wird benötigt, um das ganze zu verstehen?

  • Fundierte FHEM-Kenntnisse
  • Eine gegenüber dem Internet abgeschottete FHEMWEB-Instanz
  • FHEM kann aus dem Internet über DynDNS erreicht werden
  • Ein iOS Gerät mit der Kurzbefehle-App und Kenntnisse, wie man einen Siri-Shortcut erstellt
  • Programmierkenntnisse in der Arduino-IDE (oder vergleichbaren Lösungen)
  • Einen MQTT-Broker und Kenntnisse, wie das MQTT Protokoll funktioniert
  • Einen WeMos D1 Mini und ein wenig Verständnis, wie der funktioniert
  • Ein kleines SG90 Servo (zumindest in meinem speziellen Fall, aber dazu später)
  • Ein wenig „vorhandene“ Hardware z.B. Breadbord, Jumperwires usw. was man als Maker so eben braucht

So und jetzt geht’s los.

Seit einigen Jahren setze ich FHEM zur Hausautomatisierung ein. Seit den ersten Tagen habe ich eine Möglichkeit gesucht, über FHEM meine Haustür öffnen zu können. Und das möglichst charmant und natürlich auch sicher. Die Haustür hat einen elektrischen Türöffner, der über ein GIRA Steuergerät Audio 1287 00 und entsprechende Türsprechstellen bzw. Wohnungsstationen ausgelöst werden kann.

Leider gab es hier immer zwei kleinere Hürden zu überwinden:

Das Steuergerät von GIRA wird über ein Bus-System gesteuert, zu dem es – zumindest für mich – keine Protokollbeschreibungen gibt. Außerdem kann ich an den Wohnungsstationen nur dann die „Tür öffnen-Taste“ bedienen, wenn vorher jemand an der Türstation geklingelt hat… Irgendwie in diese vorhandenen Geräte einzugreifen und über Relais, Optokoppler oder sonstwas die Tür zu öffnen und dabei das komplette „System“ zu gefährden, kam also nicht in Frage.

Die zweite Hürde war, das ganze irgendwie gegen Missbrauch abzusichern. Natürlich kann man in FHEM Befehle ja über einen URL-Aufruf per http im Browser ausführen. Aber FHEM ungesichert aus dem Internet erreichbar zu machen? No way! Die Instanz mit einem Benutzer und einem komplexen Passwort abzusichern? Schon besser. HTTPS verwenden über einen Reverse-Proxy und let’s encrypt Zertifikaten? Wir kommen dem Ziel schon näher.

Doch zunächst zur ersten Hürde zurück. Zum Glück gibt’s von dem Steuergerät eine Bedienungsanleitung in der folgendes steht:

Die Taste „Türöffnerprogr.“ hat zwei Funktionen:

  1. Türöffner-Programmiermodus einschalten:
    Wird die Taste „Türöffnerprogr.“ für 3 s gedrückt, während sich das System im Programmiermodus befindet, wird der Türöffner-Programmiermodus aktiviert … blablabla
  2. Betätigung des angeschlossenen Türöffners.
    Durch kurzes Drücken der Taste „Türöffnerprogr.“ wird der Türöffner für die eingestellte Zeit (Türöffnerzeit) aktiviert…

Aha! Der zweite Punkt lässt sich also mit ein wenig Hardware lösen: Ein kleines Servo gesteuert von einem WeMos D1 mini sollte doch diese kleine Taste betätigen können. Und der WeMos wäre ja auch nicht der erste, der sich im Schaltschrank befindet. Ein wenig Recherche im Netz und der Code für die Servosteuerung über MQTT war fertig:

/*
Wifi, MQTT und Servo
*/

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#include <Servo.h> 
Servo myservo; 

// Update these with values suitable for your network.

const char* ssid = "SSID";
const char* password = "WLANPASSWORT";
const char* mqtt_server = "MQTTBROKER"; // MQTT IP oder DNS-Name
const char* servo_topic = "/servo/cmd"; // Topic braucht ihr später noch in FHEM
 
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
  Serial.begin(115200);
  myservo.attach(2);
  myservo.write(value);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
   String string;

  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
   // Serial.print((char)payload[i]);
     string+=((char)payload[i]);  
  }
  
  Serial.print(string);

  if (strcmp(topic, servo_topic) == 0)  
    Serial.print(" ");
    int resultado = string.toInt();   
    int pos = resultado;
    Serial.println(pos);
    myservo.write(pos);
    delay(300);
    myservo.write(0);
 }

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      client.subscribe(servo_topic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  delay(100);
}

In den markierten Zeilen noch die eigenen Daten eintragen SSID, WLAN-Passwort, MQTT-Broker und Topic und ab damit auf den WeMos. Kleine Anmerkung: Der Code ist quick and dirty zusammengeschustert. Hier fehlt noch z.B. WifiManager mit eigenen Parametern verwenden, Servo-Status publishen, Telemetrie-Daten des WeMos per MQTT publishen, LWT festlegen, Serial-Output mit debug-flag ein- und ausschaltbar machen usw. Ihr könnt gerne mithelfen 😉

Eine Sache im Code ist ganz wichtig: Bevor irgendeine Ausgabe auf der seriellen Schnittstelle erfolgt, muss das Servo initialisiert werden und auf seine 0-Stellung gesetzt werden. Wenn im Setup schon serial.print Befehle drin sind, dann spinnt das Servo. Wenn es dann in seiner Position ist, kann es sich auch mal weiter drehen, als notwendig, und dann ggf. doch die Taste evtl. zu lange drücken oder sich in die falsche Richtung drehen und mit dem Hebel am Steuergerät hängen bleiben. Was dann mit dem WeMos passiert? K.P.!

Für die Schaltung mache ich kein Fritzing auf. Mein Servo hat ein rotes, ein braunes und ein orangenes Kabel. Rot kommt am WeMos an 3,3V (oder 5V), braun an GND und orange an D4 (daher im code oben myservo.attach(2) – PIN2 ist D4 auf dem WeMos).

WeMos auf Breadboard im Multimedia-Feld im Schaltschrank

Das Servo wird nun an geeigneter Position auf dem Steuergerät befestigt:

ob es tatsächlich so schlau war, die grüne, dauerleuchtende Status LED des Steuergerätes mit dem Servo zu überkleben, werden wir in ein paar Wochen sehen…

Weiter geht es mit der zweiten Hürde: Absicherung der Lösung und Integration in FHEM.

Halten wir folgendes fest: FHEM ist aus dem Internet über https mit einem gültigen Zertifikat und einer definierten URL über DynDNS erreichbar und mit Benutzer und Passwort abgesichert, am besten noch mit einer eigenen FHEMWEB-Instanz. Stimmt’s? Wenn nicht: Sorry, aber das sind Basics, die müsst ihr euch anderweitig erarbeiten. Alles andere wäre jetzt grob fahrlässig und dann bitte die folgenden Schritte nicht nachmachen. Schreibt mir ggf. eine Mail und ich schicke euch Links dazu, die ich für meine FHEM-Installation genutzt habe, um diese Anforderungen zu erfüllen.

Die Überschrift sagt ja was von OTP und Siri-Shortcuts. Also kümmern wir uns zunächst mal um OTP: Ein „Einmalkennwort“.

https://de.wikipedia.org/wiki/Einmalkennwort

In FHEM gibt es ein GoogleAuth-Modul. Dieses kann man wie folgt anlegen:

defmod GoogleAuth GoogleAuth
attr GoogleAuth DbLogExclude .*
attr GoogleAuth ga_labelName FHEM

Weitere Infos dazu hier bei Matthias Kleine auf YouTube

Damit hat man dann eine zusätzlich Funktion in FHEM, um über eine Authenticator-App auf dem Smartphone ein OTP zu generieren und dieses in FHEM auf Gültigkeit zu prüfen.

Um jetzt FHEM „von Außen“ das OTP zu übergeben, legen wir mal ein Dummy-Device an:

defmod gAuthTest dummy
attr gAuthTest DbLogExclude .*
attr gAuthTest readingList AuthCode
attr gAuthTest setList AuthCode
attr gAuthTest stateFormat AuthCode

Damit geht ja schon mal folgendes:

https://meine.fhem.instanz/fhem?cmd=set%20gAuthTest%20AuthCode%20OTP_aus_der_App&XHR=1

… äh, nein! Stichwort csrfToken

Ich empfehle dazu folgenden Link https://wiki.fhem.de/wiki/CsrfToken-HowTo

Also alles etwas komplizierter, aber ihr seid ja Experten (sonst wäret ihr gar nicht hier).

Also, nachdem wir es nun erfolgreich geschafft haben über eine URL das Reading „AuthCode“ im Device „gAuthTest“ zu setzen, legen wir uns noch ein Notify an, welches überprüft, ob das ein gültiges OTP war:

defmod n_ValidateGAuth notify gAuthTest:AuthCode:.* {\
if (gAuth("GoogleAuth", ReadingsVal("gAuthTest", "AuthCode", "")) == 1) {\
			fhem("set DoorServo Value 25");;\
		}\
}
attr n_ValidateGAuth DbLogExclude .*
attr n_ValidateGAuth room 97_Logic

Hier habe ich jetzt etwas vorgegriffen. Der set-Befehl im Notify funktioniert natürlich noch nicht, weil das Device DoorServo nicht existiert. Also holen wir das schnell nach;

defmod DoorServo MQTT_DEVICE
attr DoorServo DbLogExclude .*
attr DoorServo IODev mqtt
attr DoorServo publishSet_Value /servo/cmnd
attr DoorServo room MQTT

Hier könntest Du jetzt einen Test machen, um alles in FHEM und auf dem WeMos programmierte zu prüfen, in dem Du einfach mal z.B. im Browser versuchst das Reading AuthCode im Device AuthTest zu setzen. Wenn Du das OTP korrekt in der URL eingegeben hast, dann sollte sich das Servo nun kurz um 25° bewegen und dann wieder auf die 0-Stellung zurückfallen. Wenn das OTP nicht passt, dann passiert einfach gar nix.(Und hier erwarte ich eine Menge Feedback, weil das so einfach nicht ist. Stichworte: URL mit BasicAuth aufrufen, URL codieren, csrf-Token korrekt angeben usw. Aber: Das muss verstanden werden und funktionieren, sonst geht’s hier nicht weiter. Fragen? Gerne per Mail.)

Also weiter gemäß der Überschrift im Beitrag. OTP ist also geklärt nun kommt Siri dran.

Ich meine, seit iOS 11 gibt es die Siri-Shortcuts und mittlerweile auch die „Kurzbefehle-App“ auf iPhones und iPads. Wer sich etwas mit den Apple Betriebssystemen auskennt, weiß vielleicht, dass es in Betriebssystemen von Apple immer eine Möglichkeit der IAC=“Inter Application Communication“ gegeben hat. Auf dem Mac gab es schon in den 90er’n AppleScript. Ich behaupte, dass viele Betriebe, die sich in den 90er’n hin zu Multimedia-Betrieben entwickelt haben, ohne AppleScript nicht überlebt hätten. Über AppleScript konnten Programme untereinander und mit dem Betriebssystem interagieren. Und das noch über eine „lesbare“ Programmiersprache. Die Weiterentwicklung war dann in Mac OS X der „Automator“ und als letztendliche Konsequenz kam dann diese Funktionalität auch mit den Siri-Shortcuts bzw. der Kurzbefehle-App auf Apple’s mobiles Betriebssystem iOS. (Sorry für den Exkurs, aber das war, ist und bleibt ein Grund für mich, Apple-Systeme zu nutzen. Ich stehe einfach auf IAC 😉 )

Und all das hilft uns jetzt, das „Problem“ zu lösen!

Wie wäre es, wenn man folgendes tun könnte:

  • „Hey Siri, Tür öffnen“
  • Siri antwortet mit „Gib den Zugangscode ein“
  • „123456“ zu Siri zu sprechen und die Tür geht auf

Und genau das machen wir jetzt abschließend zu dem Beitrag.

Anmerkung: Es ist leider nicht ganz so einfach, den Siri-Shortcut in Form von Text zu exportieren. Aufgrund der verwendeten Zugangsdaten zu FHEM werde ich diesen Kurzbefehl hier nicht zum Download anbieten. Daher werde ich Text und Bild verwenden, um euch den Kurzbefehl zu erklären.

Zunächst aktivieren wir in den Einstellungen des iOS Devices für die Kurzbefehle-App die Option „Nicht vertrauensw. erlauben“ (ob das wirklich notwendig ist, muss ich noch recherchieren, aber wir machen das jetzt einfach mal).

Wir starten mit dem Aufruf der Kurzbefehle-App, gehen auf „Meine Kurzbefehle“ und wählen „Kurzbefehl erstellen“ aus. Den Kurzbefehlnamen nennen wir „Tür öffnen“. Damit geht schon mal „Hey Siri, Tür öffnen“. Als erste Aktion fügen wir „Nach Eingabe Fragen“ ein und definieren die Frage „Gib den Zugangscode ein“. Eingabetyp ist „Text“ (weil das OTP auch mit einer Null beginnen kann).

Die Nächste Aktion ist „Variable konfigurieren“. Diese nennen wir „sOTP“ und setzen sie auf „Eingabe breitgestellt“ fest.

Die nächste Aktion ist „Text“. Hier geben wir die externe FHEM-URL ein und (leider) zwar mit der Angabe von Username und Passwort (Wenn jemand da eine andere Möglichkeit kennt: Her damit!) Also lautet die URL dann beispielsweise so:

https://username:passwort@meine.fhem.instanz

Als nächstes brauchen wir eine neue Aktion „zu Variable hinzufügen“ Und zwar fügen wir den Text zu sBaseURL hinzu.

Dann brauchen wir noch eine „Text“-Aktion. Diese enthält den FHEM-Befehl und wird ergänzt mit der Variable sOTP.

Dann brauchen wir eine URL Codieren Aktion (wie immer am besten die Suche verwenden, damit man diese Aktionen schnell finden kann). Mit dieser Aktion codieren wir den Text, damit Leerzeichen etc. entsprechend ersetzt werden.

Die dann folgende Aktion ist „Variable konfigurieren“. Hier legen wir die Variable sCMD auf den Text der codierten URL fest. Die Schritte sehen dann so aus:

So, jetzt kommt ein „tricky-part“. FHEM bzw. FHEMWEB hat seit einiger Zeut ja einen Schutzmechanismus gegen Cross-Site-Scripting-Attacks eingebaut. Das ganze wird über das csrf-Token geregelt. Und genau das holen wir uns jetzt mit den nächsten 3 Aktionen.

Die erste davon ist „Header von URL abrufen“. Hier bauen wir uns die URL wie folgt zusammen: sBaseURL/fhem?XHR=1

Die nächste Aktion ist „Wörterbuchwert abrufen“. Damit holen wir uns letztendlich aus einem named-array einen bestimmten Wert (Was für eine blöde Übersetzung). Und zwar den Wert für X-FHEM-csrfToken in Header von URL abrufen.

Die dritte Aktion, die wir jetzt brauchen ist wieder eine „Variable konfigurieren“ und zwar sCSRF auf Wörterbuchwert festlegen. Das sieht dann im Detail so aus:

wer findet den Schreibfehler?

Und zu guter Letzt rufen wir eine Aktion „Inhalte von URL abrufen auf“ und bauen darin die URL mit den einzelnen Variablen zusammen:

CSRF <> CSFR 😉

Fertig? Leider noch nicht so ganz. Beim Testen ist mir ein Eintrag im FHEM-Log aufgefallen, der wohl kein großes Problem verursacht, aber Einträge in Logfiles, die sich nicht so einfach erklären lassen, sind per se verdächtig. Es handelte sich um z.B. diese Zeile im log:

2020.05.22 20:46:50 3: WEB_192.168.xxx.xxx_12345: unsupported HTTP method HEAD, rejecting it.

Das konnte ich durch Setzen eines Attributes in der FHEMWEB-Instanz eliminieren.

attr WEB allowedHttpMethods GET|POST|HEAD

Fertig? Ja!

Mit fhem, Harmony Hub und Sonoff Pow den Stromverbrauch senken (und messen)

Hier möchte ich euch mal mitteilen, wie ich meine Multimedia-Anlage dazu bringe, sich komplett ab- bzw. wieder einzuschalten, je nachdem, welche Aktivität in der Harmony gerade läuft oder eben nicht mehr läuft.

>>Kritik-Mode-ON<< Wie immer gibt es leider im fhem-wiki dazu nur uralt-Beiträge und auch das Forum ist nur bedingt hilfreich, weil man sich durch etliche Beiträge durchkämpfen muss, bevor man etwas brauchbares findet. >>Kritik-Mode-Off<<

Wie im Titel erwähnt, handelt es sich um einen Beitrag zur Hausautomatisierungssoftware „fhem“. Daher sind alle Befehle, die in diesem Beitrag stehen, fhem-spezifisch und es wird vorausgesetzt, dass beim Weiterlesen fhem-spezifische Begriffe (Device, DoIf, Readings etc…) verstanden werden. Das Prinzip kann aber sicherlich auf andere Hausautomatisierungssysteme übertragen werden.

Nun zum Thema.

Mein Hardware-Setup sieht folgendermaßen aus:

  • RaspberryPi 3 für fhem
  • Sonoff Pow (mit Tasmota)
  • Amazon Dash Button
  • Logitech Harmony Hub
  • Philips Ambilight TV
  • Onkyo-Receiver
  • Magnat Surround-Boxen (mit aktivem Subwoofer)

Lässt man mal den RaspberryPi und den Sonoff Pow weg, komme ich auf einen Stromverbrauch von etwa 160 W wenn der TV, der Receiver und der Subwoofer eingeschaltet sind. Im Standby verbrauchen diese etwa 52 W(!). Das liegt zum größten Teil am Onkyo und dem Subwoofer.

Also liegt es nahe, den Stromverbrauch auf ca. 0 W zu senken, wenn die Multimedia-Anlage nicht in Betrieb ist.

Voraussetzung im Harmony Hub

  • Ein zusätzliches dummy Gerät beliebiger Art ist angelegt (gebt einfach als Hersteller „dummy“ und als Modellnummer „dummy“ ein und legt das Gerät dann an. Hauptsächlich es kennt die Befehle „PowerOn“ und „PowerOff“).
  • Dem Gerät eine Einschaltverzögerung von ca. 15 sec. geben.
  • Die Betriebseinstellung für dieses Gerät auf „Immer eingeschaltet lassen“ stellen
  • In der Sequenz „Befehle für Aktionsstart“ aller Aktivitäten, dieses Gerät als erstes hinzufügen mit dem Befehl „Power On“
  • In der Sequenz „Befehle für Aktionsende“ aller Aktivitäten, dieses Gerät als letztes hinzufügen mit dem dem Befehl „Power Off“

Voraussetzung in fhem

  • harmony device (in meinem Fall „WZ.Harmony“ genannt)
  • Tasmota_Device (von Matthias Kleine) device (in meinem Fall „WZ.Multimedia“ genannt)
  • dash_dhcp Device für den Amazon dash_button (in meinem Fall „DashButton“ genannt)

Nun kann folgendes DoIf in fhem angelegt werden

([WZ.Harmony:currentActivity] eq "PowerOff" ) (sleep 20; set WZ.Multimedia OFF) 
DOELSEIF
([WZ.Harmony:currentActivity] ne "PowerOff" ) (set WZ.Multimedia ON)

Attribute, wie „do always“ etc. bitte weglassen!

Kurze Erklärung: Immer dann, wenn das Reading „currentActivity“ des Devices „WZ.Harmony“ den Wert „PowerOff“ bekommt, dann wartet fhem 20 Sekunden und sendet dann den Befehl „OFF“ an das Device „WZ.Multimedia“. Das gibt den an der Aktivität beteiligten Geräten genug Zeit, sich vernünftig in den StandBy-Betrieb zu schalten. Wenn das Reading „currentActivity“ nicht „PowerOff“ ist, dann wird direkt ein „ON“ an das Device „WZ.Multimedia“ gesendet. Die im Harmony-Gerät „Sonoff“ definierte Einschaltverzögerung, gibt den an der Aktivität beteiligten Geräten genug „Vorlaufzeit“, um auf den eigentlichen Einschaltbefehl in der Startsequenz reagieren zu können. Der Onkyo und der Philips TV brauchen halt eine gewisse Zeit, bis Sie auf Befehle des Harmony Hubs reagieren, nachdem Sie mit Strom versorgt werden.

Mit der Einschaltverzögerung und dem sleep-Wert im DoIf kann man sicher noch experimentieren.

Und wie spare ich nun Strom?

Erstmal reduziert sich der Stromverbrauch um etwa 50 W, wenn der Harmony Hub die Aktivität „PowerOff“ ausführt. Zudem schlafe ich sehr gerne vor der Glotze ein und dann wache ich morgens auf und die komplette Nacht hindurch hat die Anlage Strom verbraucht 🙁

Und jetzt kommt der DashButton ins Spiel:

Folgendes zusätzliches DoIf sorgt dafür, dass der Sleeptimer im Harmony Hub gesetzt wird, wenn ich den DashButton drücke:

([DashButton:"^dash1:.short$"]) (set WZ.Harmony sleeptimer 60)

Wichtig hierbei ist, dass im DoIf das Attribut „do“ auf „always“ gesetzt wird. Nur damit wird erreicht, dass bei einem erneuten Drücken des DashButtons, der Sleeptimer wieder auf 60 Minuten gesetzt wird. Während ich also zum ersten Mal den Button gedrückt habe, wird der Sleeptimer auf 60 Minuten gesetzt. Nach 60 Minuten wird die Aktivität „PowerOff“ gestartet und damit wird über den Sonoff nach weiteren 20 Sekunden die Anlage komplett abgeschaltet. Schaffe ich es, den Button innerhalb der 60 Minuten mindestens ein weiteres Mal zu drücken, bleibt die Anlage wieder für 60 Minuten an und der Vorgang wiederholt sich.

Und jetzt noch ein paar Worte außerhalb des eigentlichen Themas:

Vielen Dank an die fhem-Forum Benutzer Byte09, justme1968 sowie an Matthias Kleine für das Entwickeln des Tasmota_Device und die genialen Beiträge auf seiner Site und an alle fhem-Forum User, die mit konstruktiven Beiträgen im fhem-Forum behilflich sind, anderen Nutzern lösungsorientiert zu helfen. Kein Dank geht an Alle, die nur auf die angebliche Faulheit der fhem-Forum Benutzer schimpfen, sich selbst Wissen anzulesen und an diejenigen, die auf die CommandRef oder das fhem-Wiki verweisen, weil sie einfach nur mit ihren Wissensvorsprung angeben wollen und nicht wirklich daran interessiert sind, anderen Menschen zu helfen.

Der Programmierer

Ein Programmierer kommt in den Himmel.

An der Pforte begrüßt ihn Petrus.

Dort hängen auch ganz viele Uhren unter denen jeweils der Name einer Firma steht.

Der Programmierer schaut sich die Uhren an. Jede der Uhren hat nur einen Zeiger. Bei manchen Uhren geht der Zeiger schneller, bei manchen langsamer.

Er fragt Petrus, was das bedeutet.

Petrus sagt: „Jedes mal, wenn ein Programmierer einen Fehler macht, springt der Zeiger eine Stelle weiter“.

Der Programmierer betrachtet die Uhren genauer und fragt dann: „Wo ist denn die Microsoft-Uhr?“

Darauf Petrus: „Die hängt in der Hölle und dient dort als Ventilator!“

Liebe Raser und Drängler

Normalerweise habe ich etwas gegen Auto-Aufkleber wie z.B. „Kevin on Board“, die Weissagung der Cree, Stuttgart 21 oder gar den Christenfisch. Aber es schwebt mir immer mal wieder eine Idee für genau so eine Art Aufkleber durch den Kopf, wenn ich auf bundesdeutschen Autobahnen unterwegs bin. Die grafische Umsetzung überlasse ich entweder Anderen oder mache das irgendwann selbst. Wichtig ist mir der Inhalt der Message an alle Idioten da draußen:

Stellt euch vor, in einer Tempo 100 Zone kann jemand folgenden Text auf einem Aufkleber am Heck eueres Autos lesen:

„Liebe Raser und Drängler:
Selten WILL ich nicht schneller,
manchmal KANN ich nicht schneller,
aber meistens DARF ich nicht schneller fahren“

Darf gerne in dieser oder ähnlicher Form mal auf einem Auto gesehen werden.

SAT-Streamer mit RaspberryPi, MLD und Mac OS X Teil2

Hier nun der zweite Teil zum Thema.

Ich gehe davon aus, dass die Installation der MLD auf dem RaspberryPi erfolgreich war.

Mittlerweile bin ich auf OS X 10.10. (Yosemite) und alles funktioniert immer noch. Das ist erstmal positiv.

Ich nutze easystream am Mac. Wir finden dieses hier:

https://www.sigvdr.de/Software/EasyStream/EasyStream.html

Dort findet man derzeit folgenden Eintrag:

EasyStream Rev. 0.6-18

  • Dank Stefan und trummerjo gibt es neue Versionen für MacOSX

Die passende Version für das jeweilige System laden wir uns runter und installieren das auf dem Mac.

Einstellungen nur kurz:

IP Adresse/Name: mld_server
&Port(SDVRP): 6149
Port(Streaming): 3000
Empfangskarten: 1 Plugin „vdrinfo“ nutzen (Haken setzen)

Dann sollte man easystream nutzen können.

Bei mir funktioniert das ohne Probleme, auch wenn ich den MLD des RaspberryPi mehr als eine Woche nicht benutzt habe.

In Teil 3 zeige ich, wie man am Mac mit easystream und dem MLD Aufnahmen planen und wiedergeben kann.

AppleMail zeigt falsche Anzahl ungelesener oder markierter E-Mails an

Ich hatte hier vor einiger Zeit mal das Problem, dass ich bei AppleMail plötzlich immer eine bestimmte E-Mail als ungelesen angezeigt bekommen habe, obwohl diese selbst keine „ungelesen“ Markierung mehr hat. Folgender Eintrag aus Apples Supportcommunity hat mir dann weitergeholfen:

Guess what, i have the answer. go into the library folder in lion they make it so you cant see this folder. to get into it, go to your „go“ menu from finder with the option button held down and go to library, then go to mail, then go to the folder V2, then go to the folder „maildata“. move three files to your desktop or anywhere out of the way: „Envelope Index“, „Envelope index-shm“ and „envelope index-wal“. then re-start mail. it should fix the whole problem. It worked for me. after this, you can delete the old files from wherever you put them.

via Phantom unread emails: Mail shows 5 unread mess… | Apple Support Communities.