Nachdem der HUZZAH gezeigt hatte das er stabil läuft wollte ich ein erstes kleine Projekt erstellen. Ich wollte billige 433MHz Steckdosen schalten.
Schwierigkeit dabei ist es den Huzzah mit der geringen Spannung zu betreiben (der Spannungswandler auf dem HUZZAH verträgt zwar 3-12V wird aber warm) und den 433MHz Sender mit 12 Volt damit die Sendeleistung hoch ist. Zusätzlich wollte ich diesmal eine bessere Antenne haben. Die Spannungsversorgung ist also 12V und dann verwende ich einen Pololu 5V 600Ma Step-Down Converter für die Spannung Versorgung des Huzzah. Jetzt wird nichts warm und ich kann besser schlafen.
Als Sender für die 433 Mhz (434 Mhz) verwende ich den selben wie bei meinem Wohnzimmer Arduino.
Zusammengebaut habe ich alles auf einem Steckbrett
Der Arduino Sketch ist wie folgt:
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <RCSwitch.h> // ==== ESP8266WiFi ================================== const char* ssid = "bluehome"; const char* password = "PASSWORD"; WiFiClient wifiClient; // ==== PubSubClient ================================== byte MQTTserver[] = { 192, 168, 2, 2 }; PubSubClient MQTTClient(MQTTserver, 1883, callback, wifiClient); // ==== RC-Switch ===================================== RCSwitch RCsender = RCSwitch(); String rcID = ""; // Übermittelte ID String rcCommand = ""; // Übermittelter Befehl char rcID1[6]; // ID erster Teil char rcID2[6]; // ID zweiter Teil // ====================================================== // SETUP // ====================================================== void setup() { // ==== Allgemein ====================================== pinMode(0, OUTPUT); //Serial.begin(115200); delay(10); digitalWrite(0, HIGH); // ==== ESP8266WiFi ================================== wifiReconnect(); // ==== RC-Switch ===================================== RCsender.enableTransmit(4); // Verbunden mit PIN #4 RCsender.setRepeatTransmit(15); // Sende Wiederholungen } // SETUP // ====================================================== // LOOP // ====================================================== void loop() { // ==== ESP8266WiFi ================================== if (WiFi.status() != WL_CONNECTED) { digitalWrite(0, HIGH); //Serial.println("Verbindung verloren"); //Serial.println(); WiFi.disconnect(); wifiReconnect(); } // IF // ==== PubSubClient ================================== if (!MQTTClient.connected()) { if (MQTTClient.connect("ESP8266_wzRC")) { //Serial.println("MQTT Verbindung aufgebaut"); if (MQTTClient.publish("/openHAB/test","Hallo")){ //Serial.println("Publizierung in Ordnung"); MQTTClient.subscribe("/openHAB/wzRC/#"); } // if Publish else { //Serial.println("Publizierung fehlerhaft"); } } // if connect else { //Serial.println("MQTT Verbindung fehlerhaft"); } //Serial.println(); } // if connected MQTTClient.loop(); // Schleife für MQTT } // LOOP // ====================================================== // WiFi Reconnect // ====================================================== void wifiReconnect() { //Serial.println(); //Serial.println(); //Serial.print("Verbindungsaufbau zu SSID: "); //Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); //Serial.print("."); } // while digitalWrite(0, LOW); //Serial.println(""); //Serial.println("Verbunden"); //Serial.println("IP Adresse: "); //Serial.println(WiFi.localIP()); //Serial.println(); } // wifiReconnect // ====================================================== // MQTT CALLBACK // ====================================================== void callback(char* topic, byte* payload, unsigned int length) { // Zähler int i = 0; // Hilfsvariablen für die Convertierung der Nachricht in ein String char message_buff[100]; // Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0 for(i=0; i<length; i++) { message_buff[i] = payload[i]; } message_buff[i] = '\0'; // Konvertierung der nachricht in ein String String msgString = String(message_buff); String topString = String(topic); //Serial.println("Topic: " + topString); //Serial.println("Msg : " + msgString); // ====================================================== // ==== RC-Switch ===================================== // ====================================================== // Wenn das Topic mit "/openHAB/wzRC/" anfängt dann ID und Message ermitteln und schalten if (topString.startsWith("/openHAB/wzRC/")) { rcID = topString.substring(topString.lastIndexOf('/') + 1); rcCommand = msgString; } // if (topString.startsWith("/openHAB/wzRC/")) if (rcID.length() == 10) { rcID.toCharArray(rcID1,6); rcID = rcID.substring(5,10); rcID.toCharArray(rcID2,6); if (rcCommand == "ON") RCsender.switchOn(rcID1, rcID2); if (rcCommand == "OFF") RCsender.switchOff(rcID1, rcID2); rcID = ""; } // if (rcID.length() == 10) } // CALLBACK
Sehr übersichtlich – hat geholfen danke 🙂
Einen Fehler hab ich bekommen:
error: ‘callback’ was not declared in this scope
Lösung: ( davor den Funktions header )
…
// ==== PubSubClient ==================================
byte MQTTserver[] = { 192, 168, 2, 2 };
void callback(char* topic, byte* payload, unsigned int length); // *** function header
PubSubClient MQTTClient(MQTTserver, 1883, callback, wifiClient);
…
wahrscheinlich gehts auch in der headerdatei von PubSubClient.h direkt ?
VG ralphi
Was für eine Nachricht muss denn hier gepublished werden, damit die Steckdose tatsächlich schaltet?
Ich habe hier ganz normale 10DIP schalter dosen und der code läuft auf 01010 als hauscode und als 01000 als gerätecode. Damit kann ich normalerweise über einen rcsender.switchOn(“01010″,”01000”) die dose schalten. Hier müsste ich das ganze als MQTT-Command senden, damit die Werte in rcID1 und rcID2 gespeichert werden. Leider funktioniert es mit der Message “0101001000ON” die auf der topic /openHAB/wzRC/ gepublished wird nicht. Sie wird zwar empfangen, aber anscheinend werden nicht die richtigen werte übergeben. Kannst du da vielleicht kurz weiterhelfen?
Hallo Lukas,
da müsste ich nochmal nachschauen. Das ist lange her. Habe irgendwann alles duch ZWAVE ersetzt.
Viele Grüße,
Jörg