Smart Wechselschalter mit ESP8266, ioBroker und MQTT

Wir können die Beleuchtungsschalter in unserem Haus schlauer machen mit diese ESP8266 Schaltung, so wenn etwas schief geht(z. B. wenn kein WLAN vorhanden ist oder der Server heruntergefahren wird), funktioniert es Weiter als ein normaler Schalter.

Smart Wechselschalter mit ESP8266
Smart Wechselschalter mit ESP8266

Die für das Projekt verwendeten Dinge können beispielsweise auf amazon.de erworben werden:

NodeMCU Lolin V3 Modul ESP8266 ESP-12F Wifi

Widerstandssatz 525 Stk., 0 Ohm -1 M Ohm

AC DC 220V bis 5V Stromversorgungsmodul

AC DC 220V bis 3,3V Stromversorgungsmodul

Relaismodul mit 5V Optokoppler

PC817C Optokoppler

Wenn Sie etwas nicht selbst tun möchten und nach einer einfachen Lösung suchen, empfehle ich dies: Shelly und ioBroker



Beachtung!

Teile der folgenden Schaltung arbeiten mit 230V. Netzspannung ist kein Spielzeug, sie kann einen tödlichen Stromschlag oder einen Brand verursachen! Nur auf eigenes Risiko und nur wenn Sie wissen, was Sie tun!

Der in der folgenden Abbildung rot markierte Bereich ist unter 230 Volt!


Mal sehen, die Schaltung. Ich habe versucht, es verständlich zu zeichnen, ich hoffe, es ist mir gelungen.

Smart Wechselschalter mit ESP8266 - Schematische Abbildung
Smart Wechselschalter mit ESP8266 – Schematische Abbildung

Zusätzlich zum herkömmlichen Wechselschalter muss das Relaismodul so installiert werden, als wäre es ein weiterer Wechselschalter . Dieses Relaismodul verfügt über einen Optokoppler, sodass der Mikrocontroller ESP8266 vollständig optisch isoliert ist.

In der Abbildung ist der obere schwarze Würfel ein Schaltnetzteil mit 230 V bis 3,3 V. Sein 230V-Eingang ist mit der Lampe verbunden, sein Ausgang wird über einen Optokoppler (pc817) zum ESP8266 D2-Pin geleitet. Dies wird verwendet, um zu überwachen, ob die Lampe leuchtet. Der Eingang D2 muss mit einem Pull-up-Widerstand auf 3,3 V geschaltet werden.

Der untere schwarze Würfel ist ein 230V-5V-Schaltnetzteil, das den Niederspannungsteil der Schaltung mit Strom versorgt.

Wechselschaltung Schaltplan
Wechselschaltung Schaltplan

Der Mikrocontroller ESP8266 muss programmiert sein, damit die Schaltung funktioniert. Öffne Arduino und kopiere diese Skizze. Schreiben Sie das für die WLAN-Verbindung erforderliche SSID- und Kennwortpaar und die IP-Adresse des MQTT-Servers neu. Wenn Sie fertig sind, laden Sie den Code auf ESP8266 hoch.

/**************************************/
//  https://myhomethings.eu           //
//  Wechselschalter - ESP8266         //
//  Board: NodeMCU 1.0 ESP-12E        //
/**************************************/

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

const char* ssid = "SSID";
const char* password = "Passwort";
const char* mqtt_server = "192.168.x.xxx";

WiFiClient espClient;
PubSubClient client(espClient);

int relayPin = D5;
int lightControllPin = D2;
long previousMillis = 0;
int relayState = 1;
int switchState = 0;
int switchFlag = 0;


void setup_wifi() 
{
  delay(100);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
  }
  randomSeed(micros());
}

void reconnect() 
{
  while (!client.connected()) 
  {
    String clientId = "ESP8266-Wechselschalter";
    
    if (client.connect(clientId.c_str()))
    {
      client.subscribe("Lampe_topic");
    } 
    else 
    {
      delay(6000);
    }
  }
}

void callback(char* topic, byte* payload, unsigned int length) 
{
  payload[length] = '
/**************************************/
//  https://myhomethings.eu           //
//  Wechselschalter - ESP8266         //
//  Board: NodeMCU 1.0 ESP-12E        //
/**************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "SSID";
const char* password = "Passwort";
const char* mqtt_server = "192.168.x.xxx";
WiFiClient espClient;
PubSubClient client(espClient);
int relayPin = D5;
int lightControllPin = D2;
long previousMillis = 0;
int relayState = 1;
int switchState = 0;
int switchFlag = 0;
void setup_wifi() 
{
delay(100);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) 
{
delay(500);
}
randomSeed(micros());
}
void reconnect() 
{
while (!client.connected()) 
{
String clientId = "ESP8266-Wechselschalter";
if (client.connect(clientId.c_str()))
{
client.subscribe("Lampe_topic");
} 
else 
{
delay(6000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) 
{
payload[length] = '\0';
String strTopic = String(topic);
String strPayload = String((char * ) payload);
if(strTopic == "Lampe_topic" && switchFlag == 0) 
{
if(strPayload == "false") 
{
if(digitalRead(lightControllPin) == LOW)
{
if(relayState == 1)
{
digitalWrite(relayPin, LOW);
relayState = 0;
}
else
{
digitalWrite(relayPin, HIGH);
relayState = 1;
}
}
}
if(strPayload == "true") 
{
if(digitalRead(lightControllPin) == HIGH)
{
if(relayState == 1)
{
digitalWrite(relayPin, LOW);
relayState = 0;
}
else
{
digitalWrite(relayPin, HIGH);
relayState = 1;
}
}
}
}
}
void setup() 
{
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(relayPin, OUTPUT);
pinMode(lightControllPin, INPUT);
digitalWrite(relayPin, HIGH);
}
void loop() 
{
unsigned long Millis = millis();
if (Millis - previousMillis >= 1000) 
{
previousMillis = Millis;
switchFlag = 0;
}
if (!client.connected()) 
{
reconnect();
}
client.loop();
if(digitalRead(lightControllPin) == LOW) 
{
if(switchState == 0)
{
client.publish("Lampe_topic", "true");
switchState = 1;
switchFlag = 1;
} 
}
if(digitalRead(lightControllPin) == HIGH) 
{
if(switchState == 1)
{
client.publish("Lampe_topic", "false");
switchState = 0;
switchFlag = 1;
}
}
}
'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "Lampe_topic" && switchFlag == 0) { if(strPayload == "false") { if(digitalRead(lightControllPin) == LOW) { if(relayState == 1) { digitalWrite(relayPin, LOW); relayState = 0; } else { digitalWrite(relayPin, HIGH); relayState = 1; } } } if(strPayload == "true") { if(digitalRead(lightControllPin) == HIGH) { if(relayState == 1) { digitalWrite(relayPin, LOW); relayState = 0; } else { digitalWrite(relayPin, HIGH); relayState = 1; } } } } } void setup() { setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); pinMode(relayPin, OUTPUT); pinMode(lightControllPin, INPUT); digitalWrite(relayPin, HIGH); } void loop() { unsigned long Millis = millis(); if (Millis - previousMillis >= 1000) { previousMillis = Millis; switchFlag = 0; } if (!client.connected()) { reconnect(); } client.loop(); if(digitalRead(lightControllPin) == LOW) { if(switchState == 0) { client.publish("Lampe_topic", "true"); switchState = 1; switchFlag = 1; } } if(digitalRead(lightControllPin) == HIGH) { if(switchState == 1) { client.publish("Lampe_topic", "false"); switchState = 0; switchFlag = 1; } } }

Erläuterung

In Zeile 41 geben wir die eindeutige ID des Geräts ein. Es lohnt sich, diese zu ändern, oder wir können eine weniger beredte generierte ID erstellen, indem wir sie in das folgende Codefragment ändern.

String clientId = "ESP8266ClientID-";
clientId += String(random(0xffff), HEX);

In Zeile 45 abonnieren wir „Lampe_topic“ auf dem MQTT-Server. Dies ist ein Datenpunkt, der den Status der Lampe enthält. Die „callback“ funktion überwacht Statusänderungen.

client.subscribe("Lampe_topic");

Wenn der Wert der Variablen „strTopic“ in Zeile 60 „Lampe_topic“ und der Wert von „switchFlag“ „0“ ist, gibt es eine Änderung auf dem MQTT-Server. Der Wert von „switchFlag“ ist „1“, wenn die Lampe mit dem herkömmlichen Schalter eingeschaltet wird. Dies ist in der Bedingung erforderlich, denn wenn wir die Lampe manuell einschalten, Der Wert der Lampe, auf dem MQTT-Server ändert sich, und die Bedingung ist aufgrund des Abonnements wieder erfüllt und das Relais wird wieder eingeschaltet

if(strTopic == "Lampe_topic" && switchFlag == 0)

Zeile 62: Der Wert von „strPayload“ (dieser Wert wird als Nutzlast bezeichnet) ist „false“. Dies bedeutet, dass die Lampe gemäß dem vom Server empfangenen Befehl ausgeschaltet werden muss.

if(strPayload == "false")

Zeile 64: Prüfen ob die Lampe leuchtet oder nicht. Wenn es nicht leuchtet, macht das Programm nichts. Es wäre nicht gut, die Lampe trotz des Befehls einzuschalten.

if(digitalRead(lightControllPin) == LOW) // eingeschaltet

Ein Wert von „LOW“ bedeutet, dass die Lampe eingeschaltet ist, da der D2-Pin standardmäßig auf 3,3 V gezogen wird, also „HIGH“. Der Optokoppler pc817 zieht ihn bei eingeschalteter Lampe auf GND herunter.

Wenn bisher alle Bedingungen erfüllt sind, muss der Status des Relais überprüft und entsprechend umgeschaltet werden.

if(relayState == 1)
{
  digitalWrite(relayPin, LOW);
  relayState = 0;
}
else
{
  digitalWrite(relayPin, HIGH);
  relayState = 1;
}

Zeile 124: Das Programm prüft, ob die Lampe leuchtet oder nicht. Wenn ja, und im folgenden Bedingung lautet der Status des Schalters „0“. Also war ausgeschaltet, dann erfolgte das manuelle schaltung. Diese muss mit der Funktion „client.publish ()“ an den MQTT-Server übermittelt werden, setzen den Datenpunkt „Lampe_topic“ auf „true“.

if(digitalRead(lightControllPin) == LOW) 
{
  if(switchState == 0)
  {
    client.publish("Lampe_topic", "true");
    switchState = 1;
    switchFlag = 1;
  } 
}

Das war die Erklärung des Codes, ich hoffe ich war verständlich.

Nach der Inbetriebnahme wird das neue Gerät im iobroker unter MQTT als neuer Datenpunkt angezeigt.

Wenn der IoT-Adapter installiert ist, können Sie mit Google Home oder Amazon Alexa verbinden und die Lampe auch mit Sprachbefehlen steuern. Zum Beispiel mit:

blank


Echo Dot 5. Generation Smarter Bluetooth Lautsprecher mit Alexa

Werbung – Der neue Echo Dot Smarter Lautsprecher mit Alexa von amazon.de

Weitere Beispiele für ESP8266 – ESP32 – Arduino finden Sie hier.


Klicken Sie auf, um einen Artikel über ioBroker und den MQTT-Adapter zu lesen.

Ich hoffe, Ihnen hat der Artikel gefallen und er war eine nützliche Information für Sie.


Sie könnten interessiert sein an:

werbung – amazon.de