ESP8266 als Wasserwarner mit Sprachausgabe per Alexa

Ob durch Waschmaschine, Leitungsleck oder Starkregen, dieser DIY Wassermelder kann Wasserschäden vermeiden.
Es wird mit einem Wassersensor, der an einem Microcontroller angeschlossen ist, fortlaufend kontrolliert, ob es noch trocken oder leider nass am Sensor ist.
Dieser Status wird alle 10 Sekunden per MQTT über WLAN in eine Datenbank geschrieben. In diesem Fall ist es unser IOBroker der diese Funktion übernimmt.
Eine fortlaufende Überwachung per Script, das hier mit Blockly erstellt wurde, wird dann Alexa veranlassen, per Sprache sofort Alarm schlagen.
Die 5V Stromversorgung erfolgt über die USB Schnittstelle per Netzteil.
Details der Erstellung siehe unten im Video.
Es kann auch alternativ ein smarter Feuermelder als Alarmgeber angesprochen werden.

Hardware:
NodeMCU ESP8266
Wassersensor MH-RD
Amazon Alexa
WLAN

Software:
Arduino IDE
MQTT Broker
IOBroker
Javascript Script mit Blockly – ioBroker

Verdrahtung:

Arduino Quellcode:

//Datenbereitstellung ueber MQTT mit NodeMCU ESP8266
// Verwendung MH-RD Digital Output, NodeMCU
// Liest Wert Wassersensor und sendet an MQTT Broker
// prilchen.de
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define wassersensor 2
const char* ssid = "WLAN-AP";
const char* password = "Test";
const char* mqtt_server = "10.10.20.20";
#define userName "mqttuser"
#define passmptt "Test"

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {

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

  WiFi.mode(WIFI_STA); //Arbeite nur als Station und nicht als AccessPoint
  WiFi.begin(ssid, password);

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

  randomSeed(micros());

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

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Nachricht angekommen [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266wasseralarm";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    //if you MQTT broker has clientID,username and password
    //please change following line to    if (client.connect(clientId,userName,passWord))
    if (client.connect("ESP8266wasseralarm", "mqttuser", "Test")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      //client.publish("outTopic", "hello world");
      // ... and resubscribe
      //client.subscribe("outtemp"); aboniere folgendes Thema
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  Serial.println(F("Wasseralarm startet..."));

}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  // lese Wassersensor sensor every 10 seconds
  if (now - lastMsg > 10000) {
    lastMsg = now;


    String msg = "1";
    char MsgAlarm[25];
    int zustand = digitalRead(wassersensor);
    Serial.print("Digital Output: ");
    Serial.print(zustand);
    if (zustand == 1) {
      Serial.println("   Status: trocken");
      msg = "false";
      msg.toCharArray(MsgAlarm, 25);
    } else {
      Serial.println("   Status: nass");
      msg = "true";
      msg.toCharArray(MsgAlarm, 25);
    }

    client.publish("WasserimKeller", MsgAlarm);

  }
}

Es gibt noch einen Aufsteller für den Sensor zum Ausdrucken am 3D Drucker unter
MH-RD Wasserstand Regensensor Ständer by Prilchen – Thingiverse

Im IOBrocker wurden die Adapter
Alexa, MQTT Broker, Script Engine und optional SendEMails installiert und eingerichtet.

Es ist mit Blockly ein leichtes, diese fortlaufende Überwachung zu erstellen:

Unter Script Engine mit Blockly wurde diese Überwachung erstellt

Tutorial als Video:

, , ,