Archiv der Kategorie: Arduino

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.