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
  MQTT Topic abbonieren? Steinspiel 32 845 21.01.2021 22:50
Letzter Beitrag: Tommy56
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 13 943 10.01.2021 14:18
Letzter Beitrag: nbk83
  Wo MQTT LogIn Daten einfügen? Steinspiel 10 644 28.12.2020 14:32
Letzter Beitrag: Tommy56
  433MHz Sendercode mit ESP-01 auslesen RaspiUser0815 24 1.387 28.12.2020 11:45
Letzter Beitrag: hotsystems
  Wifi Manager NeuHierAufDerSucheNachHilfe 1 305 21.12.2020 21:54
Letzter Beitrag: Tommy56
  Sensorausgabe mit MQTT publishen ? Steinspiel 14 924 16.12.2020 13:06
Letzter Beitrag: biologist
  Wifi Reconnect - nicht blockierend Arduino4Fun 6 585 29.11.2020 10:32
Letzter Beitrag: Arduino4Fun
  WiFi Verbindung zu lokalem Webserver wonk 4 506 21.11.2020 13:55
Letzter Beitrag: wonk
  Hilfe bei async-mqtt-client für ESP32 amshh 7 548 12.11.2020 09:19
Letzter Beitrag: amithlon
  DHT11 Daten via MQTT an Raspi senden Hanibal_Smith 5 495 10.11.2020 16:24
Letzter Beitrag: biologist

Gehe zu:


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