INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
433MHz-WiFi-MQTT-Sender
30.12.2020, 17:38 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2020 17:45 von nbk83.)
Beitrag #1
433MHz-WiFi-MQTT-Sender
Moin Zusammen,
da hier ja der ein oder andere daran werkelt, seine 433MHz-Steckdosen/Markise o.Ä. über die Heimautomation zu steuern, möchte ich hier mal mein kleines Projekt zur Verfügung stellen.
Aufgebaut ist es mit einem D1mini-clone und einem 433MHz-Sender, versorgt wird es über Micro-USB.
Da ich im Keller noch ein Sammelsurium an Funksteckdosen habe, wollte ich einen Sender bauen, der verschiedene Steckdosen schalten kann.
In meinem IOBroker setze ich zum Schalten einfach den entsprechenden Dezimalcode im MQTT-Topic. Pro Steckdosensystem gibt es ein Topic.
Der Sketch an sich basiert auf den Beispielen der angegebenen Bibliotheken und eigenem Hirnschmalz.
Ich hoffe, die Kommentare helfen, den Sketch an Euer Netzwerk und Eure Steckdosen anzupassen.
Code:
/*
  Sketch zum Versenden von 433MHz-Signalen
  für verschiedene handelsübliche Funksteckdosen (nicht alle)
  per MQTT im Dezimalcode
  Die Codes, Angaben zu Bits, Protokoll und Pulslänge werden zuvor
  von der Fernbedienung mit dem Beispiel ReceiveDemo_Advanced.ino
  der RCSwitch-Bibliothek ausgelesen.
*/
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi
#include <PubSubClient.h> //https://github.com/knolleary/pubsubclient
#include <RCSwitch.h> //https://github.com/sui77/rc-switch

// Hier eigene Daten für WiFi und MQTT-Broker angeben
const char* ssid = "dgjkfdvh";
const char* password = "jlogdysdhjk20";
const char* mqtt_server = "192.168.178.200";
unsigned int port = 1883;
#define mqttclient "433mhzwozi"

//Hier den Pin am D1mini angeben, an dem Signal zum Sender angeschlossen ist
#define senderpin D0

// Hier pro Fernbedienung ein Topic und Einstellungen für Protokoll, Bits und Pulslänge angeben
#define topic_1 "433mhzwozi/Fernbedienung_1"
#define prot_1 6
#define bits_1 20
#define pulse_1 650

#define topic_2 "433mhzwozi/Fernbedienung_2"
#define prot_2 5
#define bits_2 24
#define pulse_2 510

WiFiClient Fernbedienung;
PubSubClient client(Fernbedienung);
RCSwitch mySwitch = RCSwitch();

// Hier nichts machen
void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
// für weitere Fernbedienungen siehe unten
void callback(char* topic, byte* payload, unsigned int length) {
  long int payloadsend = 0;
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    payloadsend = payloadsend + (payload[i] - '0') * pow(10, (length - i));
  }
  payloadsend = payloadsend / 10;
  Serial.println();
  Serial.println(payloadsend);

  if (strcmp(topic, topic_1) == 0) {
    mySwitch.setProtocol(prot_1);
    mySwitch.setPulseLength(pulse_1);
    mySwitch.send(payloadsend, bits_1);
    Serial.println("Befehl gesendet");
  }
  if (strcmp(topic, topic_2) == 0) {
    mySwitch.setProtocol(prot_2);
    mySwitch.setPulseLength(pulse_2);
    mySwitch.send(payloadsend, bits_2);
    Serial.println("Befehl gesendet");
  }
  // Hier weitere Fernbienungen gem. obigem Beispiel angeben

}

// für weitere Fernbedienungen siehe weiter unten
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(mqttclient)) {
      Serial.println("connected");
      client.subscribe(topic_1);
      client.subscribe(topic_2);
      // Hier weitere Fernbedienungen angeben
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

// Hier nichts machen
void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, port);
  client.setCallback(callback);
  mySwitch.enableTransmit(senderpin);

}

//Hier nichts machen
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

Viel Spass damit, konstruktive Kritik ist ausdrücklich erwünscht.

Grüße Jan

p.s.: Wenn das eher unter Projekte passen sollte, dann bitte verschieben
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.12.2020, 10:55
Beitrag #2
RE: 433MHz-WiFi-MQTT-Sender
Hallo Jan,

prima Projekt, ist sozusagen eine "Weiterentwicklung" / das Ziel zu meinem Problem https://www.arduinoforum.de/arduino-Thre...1-auslesen .
Da ich mit der ersten Anleitung https://tutorials-raspberrypi.de/nodemcu...n-steuern/ etwas auf der Stelle trete, interessiert mich dein "Rezept" um so mehr, da ist ja auch noch die MQTT / ioBroker Einbindung dabei !

Aber ...
- Ich habe zwei Steckdosen, also je 1x ON / OFF ... und wo gebe ich da im Sketch die 4 Dezimalcodes ein ?
- Und dann wäre "Markise raus", "Markise rein" jeweils eine weitere Fernbedienung, richtig ?
- Mein MQTT im ioBroker ist mit einem Passwort versehen. Das muss dann wohl auch noch in den Sketch bevor was geht, oder ?

Danke für die Ergänzungen.

Gruß Siggi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.12.2020, 14:14
Beitrag #3
RE: 433MHz-WiFi-MQTT-Sender
(31.12.2020 10:55)RaspiUser0815 schrieb:  Aber ...
- Ich habe zwei Steckdosen, also je 1x ON / OFF ... und wo gebe ich da im Sketch die 4 Dezimalcodes ein ?
- Und dann wäre "Markise raus", "Markise rein" jeweils eine weitere Fernbedienung, richtig ?
- Mein MQTT im ioBroker ist mit einem Passwort versehen. Das muss dann wohl auch noch in den Sketch bevor was geht, oder ?
...
Gruß Siggi
Moin Siggi,
schön, dass Du Interesse an dem Projektchen hast. Zu Deinen Fragen
1. Ich habe es extra so aufgebaut, dass man die Codes im Sketch gar nicht angeben muss, um sich den ganzen Abfragen/Vergleich-Krams sparen zu können. Die Dezimalcodes setze ich direkt im IOBroker. Sobald der D1mini die Topics aboniert, werden automatisch im IOBroker die Datenpunkte erzeugt, über die dann die Codes gesetzt werden können. ich hab dazu noch ein kleines Script erstellt, welches mir nach dem Senden den Datenpunkt wieder leert, damit die Befehle nicht andauernd gesendet werden. Im Anhang hab ich die entsprechenden Screenshots angehängt zur Verdeutlichung.
2. Genau, Du müsstest dann die originale Fernbedienung von der Markise auch einmal auslesen und entsprechend im Sketch hinzufügen.
3. Guck mal hier. Ich versuche später mal, den Sketch entsprechend zu erweitern.
Wenn Du noch Fragen hast, gerne melden. Auch wenn im Betrieb Probleme auftauchen sollten, die ich bisher nicht hatte.

Grüße Jan


Angehängte Datei(en) Thumbnail(s)
           
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 00:20
Beitrag #4
RE: 433MHz-WiFi-MQTT-Sender
Moin Zusammen,
hab den Sketch jetzt insofern erweitert, dass man auch User und Passwort für den Broker angeben kann, aber nicht muss.
Code:
/*
  Sketch zum Versenden von 433MHz-Signalen
  für verschiedene handelsübliche Funksteckdosen (nicht alle)
  per MQTT im Dezimalcode
  Die Codes, Angaben zu Bits, Protokoll und Pulslänge werden zuvor
  von der Fernbedienung mit dem Beispiel ReceiveDemo_Advanced.ino
  der RCSwitch-Bibliothek ausgelesen.
*/
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi
#include <PubSubClient.h> //https://github.com/knolleary/pubsubclient
#include <RCSwitch.h> //https://github.com/sui77/rc-switch

// Hier eigene Daten für WiFi und MQTT-Broker angeben
const char* ssid = "SSID";
const char* password = "PASSWORT";
const char* mqtt_server = "192.168.178.200";
unsigned int port = 1883;
const char* mqtt_user = "";       //Wenn kein Nutzer im Broker vergeben, dann so lassen
const char* mqtt_password = "";   //Wenn kein Passwort im Broker vergeben, dann so lassen
#define mqttclient "433mhzwozi"

//Hier den Pin am D1mini angeben, an dem Signal zum Sender angeschlossen ist
#define senderpin D0

// Hier pro Fernbedienung ein Topic und Einstellungen für Protokoll, Bits und Pulslänge angeben
#define topic_1 "433mhzwozi/Fernbedienung_1"
#define prot_1 6
#define bits_1 20
#define pulse_1 650

#define topic_2 "433mhzwozi/Fernbedienung_2"
#define prot_2 5
#define bits_2 24
#define pulse_2 510

WiFiClient Fernbedienung;
PubSubClient client(Fernbedienung);
RCSwitch mySwitch = RCSwitch();

// Hier nichts machen
void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
// für weitere Fernbedienungen siehe unten
void callback(char* topic, byte* payload, unsigned int length) {
  long int payloadsend = 0;
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    payloadsend = payloadsend + (payload[i] - '0') * pow(10, (length - i));
  }
  payloadsend = payloadsend / 10;
  Serial.println();
  Serial.println(payloadsend);

  if (strcmp(topic, topic_1) == 0) {
    mySwitch.setProtocol(prot_1);
    mySwitch.setPulseLength(pulse_1);
    mySwitch.send(payloadsend, bits_1);
    Serial.println("Befehl gesendet");
  }
  if (strcmp(topic, topic_2) == 0) {
    mySwitch.setProtocol(prot_2);
    mySwitch.setPulseLength(pulse_2);
    mySwitch.send(payloadsend, bits_2);
    Serial.println("Befehl gesendet");
  }
  // Hier weitere Fernbienungen gem. obigem Beispiel angeben

}

// für weitere Fernbedienungen siehe weiter unten
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(mqttclient, mqtt_user, mqtt_password)) {
      Serial.println("connected");
      client.subscribe(topic_1);
      client.subscribe(topic_2);
      // Hier weitere Fernbedienungen angeben
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

// Hier nichts machen
void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, port);
  client.setCallback(callback);
  mySwitch.enableTransmit(senderpin);

}

//Hier nichts machen
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

Grüße Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 13:17 (Dieser Beitrag wurde zuletzt bearbeitet: 03.01.2021 13:18 von RaspiUser0815.)
Beitrag #5
RE: 433MHz-WiFi-MQTT-Sender
Hallo Jan,

mit Hilfe deiner Hinweise aus #3 habe ich den Sketch angepaßt. Es war für mich schon ein kleines Erfolgserlebnis, dass ich hier alles richtig gemacht hatte und er so aussieht wie Du ihn jetzt überarbeitet reingestellst hast.

Aber das war's dann auch ...
Der ESP verbindet sich mit dem WLAN und MQTT, Publish und Subscribe funktioniert (scheinbar) auch, s. Screenshot. Aber die Steckdosen schalten nicht ... Die Codes haben in der ARDUINO Umgebung funktioniert, siehe "rfswitch.send"-Befehle. Also kann eigentlich nur mit dem ESP etwas nicht stimmen, aber was ?! Die Verkabelung ist ja recht übersichtlich mit DATA des Senders an D0. Welchen Anfängerfehler kannst Du erkennen oder vermuten ?

   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 13:21
Beitrag #6
RE: 433MHz-WiFi-MQTT-Sender
Hast du den Sender an den 5V Pin angeschlossen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 13:33
Beitrag #7
RE: 433MHz-WiFi-MQTT-Sender
(03.01.2021 13:21)nbk83 schrieb:  Hast du den Sender an den 5V Pin angeschlossen?
Ja, 3,3V hatte ich auch schon ...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 13:35
Beitrag #8
RE: 433MHz-WiFi-MQTT-Sender
hmm, könntest Du mal Deinen Sketch posten (SSID und Passwort löschen)?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Nano-nRF wie ESP für MQTT? AnFi 7 194 20.07.2021 21:09
Letzter Beitrag: hotsystems
  ESP32Cam und MQTT tenor 1 348 30.06.2021 21:00
Letzter Beitrag: tenor
  ESP32 und WS2812 funktioniert nicht mit WiFi Mirkan 24 2.699 05.06.2021 02:23
Letzter Beitrag: Mirkan
  Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden SoerenKaiser99 23 2.420 10.05.2021 21:25
Letzter Beitrag: SoerenKaiser99
  Relay über NFC und Wifi schalten, bitte um Hilfe bei der Programmierung Tirol-Daniel 28 2.588 17.04.2021 13:31
Letzter Beitrag: Tommy56
  Einer RGB-LED am ESP Werte aus MQTT zuweisen. Manny 2 662 15.04.2021 16:50
Letzter Beitrag: Manny
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 23 5.537 09.04.2021 16:15
Letzter Beitrag: amshh
  Suche Erfahrungen und Hilfe mit ESP32-CAM WiFi + Bluetooth Modul Kamera Modul esp32 Christian_Moba-Arduino 28 3.537 04.04.2021 08:24
Letzter Beitrag: amithlon
  BUILTIN_LED vom ESP mit MQTT und NodeRed schalten. Manny 7 1.046 22.03.2021 18:24
Letzter Beitrag: Manny
  Wifi-Modul für Netzteil RD6006 HWH 2 812 07.03.2021 16:50
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste