Der “Notfall”-Taster – eine FHEM-Spielerei

Für “spezielle” Notfälle

Nachdem ich in unserem Bad einen Abluftventilator eingebaut und die Steuerung feuchtigkeitsabhängig mit FHEM in die Hausautomation eingebunden habe kam mir die “Schnapsidee”: Was ist eigentlich wenn man auf dem “Thron” hockt und ein Notfall eintritt? (Muss ich das wirklich näher erläutern 😉 ) Das ließe sich doch bestimmt mit Trick 17 und FHEM lösen…

Die erste Idee versuchte meine Frau dann niederzuschmettern mit dem Argument “Dafür haben wir doch dieses Raumspray Brise One Touch“.
Aber ich wäre nicht ich wenn ich dafür nicht eine Gadget-Lösung erfinden könnte. Und das Argument meiner Frau brachte mich auf eine noch größere Idee – eine Verbindung aus beidem!!!. Also ran ans Werk!

mit Fritzing zusammen gepfuscht

Zuerst habe ich mir Gedanken gemacht wie ich überhaupt ein Signal absetzen kann damit die Hausautomation den Lüfter aktivieren kann. Da bei mir bereits MQTT auf dem Raspberry läuft wollte ich auf das System setzen. Im Keller lagen noch ein paar Bauteile wie Taster und ESP8266 herum mit denen man das realisieren könnte. Ähnlich einem Dash-Button von Amazon habe ich dann einen WLAN-Taster gebaut der eine MQTT-Message absetzt. Anregungen dazu findet man zu Hauf im Netz, ich habe mich für die allereinfachste Variante entschieden: Ein ESP8266 der im Deepsleep schlummert, auf Tastendruck auchwacht, eine bestimmte Message absetzt und wieder in den Deepsleep zurück fällt. Bevor jetzt gemault wird “warum denn der ESP8266 12e? Der ESP-01 langt doch vollkommen!”: Ja, der langt, aber ich hatte aus einer Falschlieferung noch ne Menge 12e übrig und da musste ich auch keine Stifte auslöten 😉  (Pinouts für den 12e und den ESP-01)
Die Schaltung ist nicht zu 100% perfekt (man könnte am Taster noch nen PullDown-Widerstand einsetzen), für meinen Anwendungszweck aber ausreichend und bisher hatte ich noch keine Ausfälle. Ebenso könnte man die Batterie durch eine andere Variante tauschen, aber auch hier wollte ich es so einfach wie möglich haben und habe mich für 2 AAA-Batterien entschieden. Aktuell habe ich einen Satz seit rund 7 Monaten in Betrieb und die Spannung langt immer noch für die Schaltung.

Nun zur Software auf dem ESP. Grundlage hierfür war ein Script von Andy Wolff welches ich für meine Zwecke etwas “ausgedünnt” habe (Ich brauche nicht alle Funktionen).

Was macht das Script? Durch Tastendruck den ESP aus dem Deepsleep aufwecken, MQTT-Message mit Schaltzustand und Batteriespannung absetzen, ESP wieder in den Deepsleep setzen. (Moment, hatte ich das nicht schon erwähnt?)

Script auf den ESP flashen, testen, weiter geht es.

Natürlich würde das jetzt schon langen um den Lüfter zu aktivieren. Aaaaber: meine Frau sprach ja was von “Raumspray”. Das muss natürlich auch mit integriert werden.
Also ein Gehäuse entwerfen wo Batterien, der ESP nebst Taster und so eine Brise One Touch Kartusche rein passen UND auch noch zusammen aktiviert werden können!
Gemessen, gemessen, gemessen und in Fusion360 konstruiert. Nach einiger Zeit war dann die Grundplatte fertig und mit dem 3D-Drucker gedruckt. Schaltung eingebaut, Deckel gedruckt, Taster etwas “feingetunt” (Ich hab ein Stück Zellkautschuk drüber geklebt um den Druck etwas abzufangen) und ausprobiert: fertig.

 

 

 

 

 

Ist nicht schick aber funktional. Die Dateien für den 3D-Drucker könnt ihr bei Thingiverse downloaden (ihr findet dort auch einen Deckel ohne Schriftzug).

In FHEM wird die MQTT_Message  mittels eines MQTT-Device ausgelesen und in meinem Fall mit einem DOIF ein Watchdog-Timer gesetzt der den Badlüfter für 5 Minuten aktiviert (hier: Fall ## 1)

## 1
([Paniktaster] eq "ON" )
(set Watchdog_Paniktaster on-for-timer 300)
(set Bad_Luefter on)
## 2
DOELSEIF
([Sensor_Badezimmer:humidity] > 70)
(set Bad_Luefter on)
## 3
DOELSEIF
([Watchdog_Paniktaster] eq "off" and [Sensor_Badezimmer:humidity] < 70)
(set Bad_Luefter off)

Fertig!

 

 

 

 

 

Nachtrag 17.10.2023

Damit ich mich selber wieder dran erinnern kann wie ich das oben genannte Script angepasst habe.
Ja, ich hab heute echt lang dran gesessen (weil ich es vergessen habe wie ich das gemacht habe) das für einen Umzug auf einen anderen MQTT-Broker zu ändern.
Also kopiere ich mir die angepasste Version hier noch mal her:

 

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <WiFiClient.h>
//###########################################################################
#define button 12 // Pin for Webupdate
#define mqtt_user “MQTTUSERNAME” //MQTT Broker User
#define mqtt_password “MQTTPASSWORT” //MQTT Broker Password
//###########################################################################
// Wifi
const char* ssid = “WLAN-NAME”; //WLAN SSID
const char* password = “WLAN-PASSWORT”; //WLAN Password
// MQTT
const char* mqtt_server = “127.0.0.1”; //IP Address MQTT Broker
const char* mqtt_clientId = “dashbutton1”;
const char* outTopicMsg = “dashbuttons/dashbutton1/message”;
const char* outTopicVCC = “dashbuttons/dashbutton1/vcc”;
// Misc
char msg[50]; // message for mqtt publish
//###########################################################################

ADC_MODE (ADC_VCC); // VCC Read

WiFiClient espClient;
PubSubClient client(espClient);

void setup(){
pinMode(button, INPUT_PULLUP);
Serial.begin(115200);

// Setup Wifi
setup_wifi();

// Setup MQTT
client.setServer(mqtt_server, 1883);
}

void setup_wifi() {
int wifiCounter = 0;
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) {
if(wifiCounter < 10){
delay(500);
Serial.print(“.”);
}else{ESP.deepSleep(0, WAKE_RFCAL);}
wifiCounter++;
}
}

void reconnect() {
// Loop until we’re reconnected
while (!client.connected()) {
Serial.println(“Attempting MQTT connection…”);
// Client ID connected
if (client.connect(mqtt_clientId, mqtt_user, mqtt_password)) {
Serial.print(mqtt_clientId);
Serial.println(” connected”);
// Once connected, publish an announcement…
client.publish(“outTopic”, “connected”);
} 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(){
// MQTT Client
if (!client.connected()) {
reconnect();
}
client.loop();
// Read the VCC from Battery
float vcc = ESP.getVcc() / 1000.0;
vcc = vcc – 0.12; // correction value from VCC

if(digitalRead(button == HIGH)){
client.publish(outTopicMsg, “ON”);
delay(50);
client.publish(outTopicMsg, “OFF”);
delay(50);
dtostrf(vcc, sizeof(vcc), 2, msg);
client.publish(outTopicVCC, msg);
delay(50);
ESP.deepSleep(0, WAKE_RFCAL);
}

}