In diesem Video ist zu sehen, wie ein ESP8266 als mobile Signalstation errichtet werden kann.
Er soll als Informationsgeber dienen und zum Beispiel am Wohnungseingang zeigen, ob alle Türen und Fenster geschlossen sind.
Beschrieben wird im Video, die benötigte Hardware und wie sie verdrahtet werden kann.
Das Auslesen der Werte aus dem IOBroker, das per Javascript automatisiert in die zuvor erstellten MQTT Knotenpunkte übertragen wird.
Sowie wie ein ESP-Microcontroller in den Tiefschlaf geschickt werden kann.
Diese Tiefschlafzeit ist begrenzt auf 4294967295 Microsekunden, also etwa 71 Minuten.
Zum Schluss ist noch zu sehen, das mit Tinkercad ein einfaches Gehäuse erstellt wurde und mit einem 3D Drucker erzeugt wurde.
Arbeitsumgebung in diesem Tutorial, ist ein Zigbee Magnet Sensor von Aqara der seine Werte über das Deconz Gateway an den IOBroker bereits mitteilt.
Hardware:
Test-Version | Version 5 Volt |
NodeMCU ESP8266 | ESP8266 D1 Mini |
Rote LED | Rote LED |
Widerstand 220 Ohm | Widerstand 220 Ohm |
Batteriehalterung | Batteriehalterung |
Mikroschalter rastend | |
Streifenrasterplatine |
Power Modes:
Um bei dieser mobilen Lösung die Lebensdauer der Batterie zu verlängern, wird der Deep-Sleep Mode aktiviert, in dem der Anschluss D0 mit RST verbunden wird.
Hier eine Übersicht der weiteren Modi beim ESP8266 und welche Bereiche dabei deaktiviert werden.
Modem – Sleep | Light – Sleep | Deep – Sleep | |
CPU | An | Pause | Aus |
System Clock | An | Aus | Aus |
Wi-Fi | Aus | Aus | Aus |
RealTimeClock | An | An | An |
Stromverbrauch | 15 mA | 0.9 mA | 20 µA |
Verdrahtung Test-Version:
Verdrahtung Version 5V:
Quellcode:
// MQTT ist im Status Qos 0
// Werte werden per Javascript bereitgestellt
// Abschließend als finale Version werden alle Serial.print deaktiviert
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "euer SSID Name";
const char* password = "Password";
const char* mqtt_server = "10.10.10.2";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
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.hostname("ESPStatusLED");
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("Message arrived [");
Serial.print(topic);//empfangener Wert
Serial.print("] ");
String Fensterstatus = "";
for (int i = 0; i < length; i++) { Fensterstatus = Fensterstatus + (char)payload[i];
}
Serial.print(Fensterstatus);
Serial.println();
if (Fensterstatus.equals("offen")) {
Serial.print("jetzt mach was");
digitalWrite(5, HIGH); // turn the LED on (HIGH is the voltage level)
delay(10000); // wait for a second
digitalWrite(5, LOW); // turn the LED off by making the voltage LOW
delay(1000);
}
ESP.deepSleep(5e6); hier 5 Sek Tiefschlaf / maximum ist 4294967295us, etwa 71 Minuten
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-BKF";
clientId += String(random(0xffff), HEX);
// Attempt to connect
//if (client.connect(clientId.c_str())) {
if (client.connect("arduinoClientname", "mqttusername", "geheimespassword")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.subscribe("Fensterstatus/Bastelkellerfenster");
} 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() {
pinMode(5, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200); // wird in der Finalen Version deaktiert
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
Javascript im IOBroker:
on({id: "deconz.0.Sensors.11.open", change: "ne"}, function (obj) { UpdateLEDStatus(); });
function UpdateLEDStatus()
{
var Fensterstatus = "zu";
// Status Bastelkellerfenster
Fensterstatus = "zu";
if ( getState("deconz.0.Sensors.11.open").val == true ) { Fensterstatus = "offen"; }
setState('mqtt.0.Fensterstatus.Bastelkellerfenster', Fensterstatus );
}
Video:
Gehäuse:
Download der Gehäuse Print Datei unter Thingiverse
Nicht im Video zu sehen:
Signalgeber Version mit 3 Volt:
Mit dem im Video gesetzten Einstellungen, konnte diese Lösung etwa 48 Stunden laufen. Dann lieferten die AA-Akku´s (4×1,2Volt) nicht mehr ausreichend Spannung.
Mit Erhöhung der Tiefschlafzeit und Verringerung der Einschaltzeit der LED waren es dann fast 5 Tage.
Eine zweite 3Volt Variante mit einer Lithium CR123a Batterie, brachte keine wesentliche Verbesserung.

Mein privates Fazit: Diese Lösung verbraucht im Deep-Sleep Mode immer noch zu viel Strom.
Ich werde eventuell als nächstes mir ein ESP8266 in PCB Bauform besorgen und damit Testen.