PROGRAMM

Das Programm:

Achtung: xxxxxxx im Programm sind sicherheitsrelevant und damit „ausge-x-t“.
Hier müssen die eigenen Daten eingegeben werden!

/*
WeMos D1 – MQTT Sensor Client by Thomas Krummer, 2017
*/

const byte LED1 = D6; // Ist eine Warn-LED die bei High-Signal des Bewegungssensors PIR1 eingeschalten wird
const byte PIR1 = D1; // Ist der Bewegungssensor PIR1
const byte LED2 = D7; // Ist eine Warn-LED die bei High-Signal des Bewegungssensors PIR2 eingeschalten wird
const byte PIR2 = D2; // Ist der Bewegungssensor PIR2
const byte LED3 = D8; // Ist eine Warn-LED die bei High-Signal des Bewegungssensors PIR3 eingeschalten wird
const byte PIR3 = D5; // Ist der Bewegungssensor PIR3
const byte BUZZER = D0; // Ist ein PiezoSummer und bei High-Signal einer der drei PIR-Sensoren angeschalten wird
int PIR1_Value = 0; // Merkt sich den Zustand von PIR1
int PIR2_Value = 0; // Merkt sich den Zustand von PIR2
int PIR3_Value = 0; // Merkt sich den Zustand von PIR3
int Statusaenderung = 0; // für die spätere Signalverarbeitung wichtig und gibt nur ein Kommando an MQTT, wenn eine Signaländerung zu verzeichnen ist
int Merker = 0; // merkt sich den ursprünglichen Zustand von „Signal“
int Signal = 0; // Flag für Alamton -> Signal = 1 ist BUZZER „on“

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

bool autoConnect;

const char *ssid = „KxxxxxxxxxWLAN“;
const char *password = „2xxxxxxxxxxxxxxxx“;
const char *mqtt_server = „192.168.178.xx“;

const char* inTopic = „fhem/devices/wemos1_sensor1/“;
const char* outTopic = „fhem/devices/wemos1_sensor1/set“;

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

void setup_wifi() {

int ret;

ESP.eraseConfig();
WiFi.mode(WIFI_STA); // Mode AP or Normal
delay(10);
// Get current autoconnect state from SDK
autoConnect = WiFi.getAutoConnect();
WiFi.begin(„DummySSID“, „whateverkeyjustdontconnect“);
uint8_t timeout = 10; // 10 * 500 ms = 5 sec time out
// 500ms loop
while ( ((ret = WiFi.status()) != WL_CONNECTED) && timeout ) {
Serial.print(„.“);
delay(500);
–timeout;
}
WiFi.begin(ssid, password);
// We start by connecting to a WiFi network
Serial.println();
Serial.print(„Connecting to „);
Serial.println(ssid);

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) {
int i = 0;
// create character buffer with ending null terminator (string)
for (i = 0; i < length; i++) {
message_buff[i] = payload[i];
}
message_buff[i] = ‚\0‘;

String msgString = String(message_buff);
Serial.println(„Message:“ + msgString);

}

void reconnect() {

// Loop until we’re reconnected
while (!client.connected()) {
Serial.print(„Attempting MQTT connection…“);
// Create a random client ID
String clientId = „ESP8266Client-„;
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println(„connected“);
// Once connected, publish an announcement…
client.publish(outTopic, „online“);
// … and resubscribe
client.subscribe(inTopic);
} 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() {

Serial.begin(9600);

setup_wifi();
client.setServer(mqtt_server, 1883);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(PIR1, INPUT);
pinMode(PIR2, INPUT);
pinMode(PIR3, INPUT);
client.setCallback(callback);
}

void loop() {

if (!client.connected()) {
reconnect();
}
PIR1_Value = digitalRead(PIR1);
PIR2_Value = digitalRead(PIR2); // inaktiv setzen
PIR3_Value = digitalRead(PIR3); // inaktiv setzen
digitalWrite(LED1,PIR1_Value);
digitalWrite(LED2,PIR2_Value); // inaktiv setzen
digitalWrite(LED3,PIR3_Value); // inaktiv setzen
if ((PIR1_Value == 1) || (PIR2_Value == 1) || (PIR3_Value == 1)) {Signal = 1;} else {Signal = 0;}
if (Merker != Signal) {Statusaenderung = 1;} else {Statusaenderung = 0;}
// Serial.print(PIR1_Value);
// Serial.print(PIR2_Value);
// Serial.print(PIR3_Value);
// Serial.print(Signal);
// Serial.print(Statusaenderung);
// Serial.println(„-„);
if (Statusaenderung == 1) { if (Signal == 1) {client.publish(outTopic, „on“); digitalWrite(BUZZER,1); delay (1000); digitalWrite (BUZZER,0);} else {client.publish(outTopic, „off“);} Merker = Signal;}
delay (1000);
client.loop();

}