Mit HUZZAH(ESP8266) und MQTT eine 433MHz Steckdose schalten

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.

433mhz

Zusammengebaut habe ich alles auf einem Steckbrett

ESP8266_MQTT_433MHz

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

One Comment

  1. ralphi

    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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.