Nach dem endlich mein [definition='25','0'][definition='25','0'][definition='25','0']Sonoff[/definition][/definition][/definition] Touch EU Lichtschalter eingebaut wurde, wollte ich mal etwas probieren.
Raus gekommen ist: zweimal klopfen und es werde Licht
Hier der Vorgeschmack als Video:
Folgende Bauteile werden benötigt:
SW-420
Nodemcu
5V Netzteil ( Oder andere 5V Quelle in der nähe )
Jumper-Kabel ( female-female)
Kleinen Schraubendreher zum Einstellen
Holzschrauben
In meinem Fall habe ich IoBroker mit eingebunden um den Status meines Lichtschalters abzufragen, Script weiter unten!
Folgender Arduino-Code:
Diese Bibliotheken werden benötigt:
ESP8266WiFi.h ( Verbindungen ins Netzwerk )
PubSubClient.h ( MQTT )
Bitte Bibliotheken installieren!
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
int vibr_Pin =D1;
int zaehle = 0;
int stat = 1;
int interval=4000;
unsigned long previousMillis=0;
char tmp[100];
char ssid[] = "NETZWERKNAME"; // Deine SSID (name)
char pass[] = "PASSWORT"; // Dein WLAN PASSWORT
const char* mqtt_server = "192.168.178.62"; //Broker IP Address
const char* mqttUser = "iobroker"; //ANMELDENAME IOBROKER
const char* mqttPassword = "PASSWORT"; //IOBROKER PASSWORT
WiFiClient espClient;
PubSubClient client(espClient);
void connect_to_MQTT() {
client.setServer(mqtt_server, 1886);//MQTT SERVER + PORT
client.setCallback(callback);
if (client.connect("Esstisch" , mqttUser, mqttPassword)) {
Serial.println("Verbinde zum MQTT Server");
client.subscribe("tisch/sensor"); // TROPIC
} else {
Serial.println("zu MQTT Server nicht verbunden ");
}
}
void setup(){
Serial.begin(9600); //init serial 9600
connect_to_MQTT();
// Verbinden
Serial.print("Verbinde zu ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
pinMode(vibr_Pin, INPUT); //SENSOR AUF INPUT
}
void loop(){
unsigned long currentMillis = millis();
client.loop();
if (!client.connected()) {
Serial.println("Keine Verbindung zum MQTT Server....");
connect_to_MQTT();
}
// Setze Variablen auf 0 wenn 4 Sekunden nichts passiert ist
if ((unsigned long)(currentMillis - previousMillis) >= interval){
zaehle = 0;
previousMillis = currentMillis;
//Serial.println("Zaehle ist nun 0"); // teste
}
long measurement =TP_init();
delay(10);
// Serial.print("measurment = ");
if (measurement > 300) {
zaehle++;
}
if(zaehle == 2 ){
//Sende MQTT Tropic zum IoBroker
client.publish("tisch/sensor/status",dtostrf(stat, 1, 2, tmp));
// Setze Variable auf 0
zaehle = 0;
// Zähle die Variable hoch
stat++;
delay(4000);
// Serial.println("Status gesendet und auf 0 gesetzt"); // teste
}
//Serial.println(measurement); // Testausgabe
}
long TP_init(){
delay(10);
long measurement=pulseIn (vibr_Pin, HIGH); //wait for the pin to get HIGH and returns measurement
return measurement;
}
void callback(char* topic, byte* payload, unsigned intlength)
{
Serial.print("Messageved in topic: ");
Serial.println(topic);
}
Alles anzeigen
Bitte passt das Arduino-Script an!
Jetzt das ganze auf euer [definition='27','0'][definition='27','0']NodeMCU[/definition][/definition] Flashen, mittel Arduino-IDE.
Somit wäre der erste Teil geschafft.
Jetzt müssen wir alles zusammen bauen, hier mal ein Bild von meiner Installation.
Hab es bewusst ohne Gehäuse verbaut, so dämpft es nicht die Vibration!
Ich habe mehrere Steckdosen unter meinem Esstisch, so habe ich eine direkte Stromquelle für meinen Controller!
Der Tisch ist selbst gebaut, daher ist es unter dem Tisch ein „wenig wüsst“
Aber von außen nicht ersichtlich!
IoBroker Script:
<xml xmlns="http://www.w3.org/1999/xhtml">
<block type="on" id="zp-:.fCRlJq.*if8G7nQ" x="-312" y="-162">
<field name="OID">mqtt.0.tisch.sensor.status</field>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="!-j~60Az^}6F%K-g:i|[">
<mutation elseif="1"></mutation>
<value name="IF0">
<block type="logic_compare" id="cje|pozzx2[6sNN94iV}">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="wS!.d8qPGi[a|?+Zyro}">
<field name="ATTR">val</field>
<field name="OID">[definition='84','0'][definition='84','0']sonoff[/definition][/definition].0.DVES_C6DA21.POWER</field>
</block>
</value>
<value name="B">
<block type="logic_boolean" id="r%lyF}(9^,3/YNPWwk.e">
<field name="BOOL">FALSE</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="request" id="TF)ENiVZ-qCG4#SR]M4y">
<mutation with_statement="false"></mutation>
<field name="WITH_STATEMENT">FALSE</field>
<field name="LOG"></field>
<value name="URL">
<shadow type="text" id="Mtu@:]#=CCIS:a68~W0,">
<field name="TEXT">http://192.168.178.54/cm?user=&password=@@@WCF_LITERAL_AMP@@@cmnd=Backlog%20Power%20on</field>
</shadow>
</value>
</block>
</statement>
<value name="IF1">
<block type="logic_compare" id="8Sjb4mMO{-??#O}@^rhQ">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="Y]_}%+4*X[P{[e12B#=~">
<field name="ATTR">val</field>
<field name="OID">[definition='84','0'][definition='84','0']sonoff[/definition][/definition].0.DVES_C6DA21.POWER</field>
</block>
</value>
<value name="B">
<block type="logic_boolean" id="3.nCS631HIg^A(n`9IO_">
<field name="BOOL">TRUE</field>
</block>
</value>
</block>
</value>
<statement name="DO1">
<block type="request" id="c3dPpQIk*P/XE+8}`9FE">
<mutation with_statement="false"></mutation>
<field name="WITH_STATEMENT">FALSE</field>
<field name="LOG"></field>
<value name="URL">
<shadow type="text" id="?+T{nKLY%..HhQx@m}6k">
<field name="TEXT">http://192.168.178.54/cm?user=@@@WCF_LITERAL_AMP@@@password=@@@WCF_LITERAL_AMP@@@cmnd=Backlog%20Power%20off</field>
</shadow>
</value>
</block>
</statement>
</block>
</statement>
</block>
</xml>
Alles anzeigen
Dieses Script muss natürlich für euren Lichtschalter, Controller + Relais etc angepasst werden.
Ist der Wert „wahr ( true )“ so schaltet das Script auf „aus“
Ist der Wert „falsch ( false )“ so schaltet das Script auf „an“
unabhängig wie der Status gerade ist.
Grüße