Ankündigung
Einklappen
Keine Ankündigung bisher.
ESP8266 über WLAN an KNX
Einklappen
X
-
Zitat von ulistermclane Beitrag anzeigenden Sonnenstand kann man berechnen - also Globalstrahlungssensor sollte reichen?
Kommentar
-
Hab gestern nach dem Tipp mit stall.biz noch ein wenig gelesen....
Dieser Bausatz basiert vollständig auf dem ESP8266:
https://www.stall.biz/project/weathe...hausautomation
Entweder nutzt man die Software gleich mit (mir würde JSON schon reichen) oder man macht einen neuen Sketch mit KNX-Adressierung...
Kommentar
-
Moin moin,
da der ursprüngliche Beitrag ja mehr über die Anbindung eines ESP8266 an KNX ging, sich aber die Diskussion in Richtung Eigenbau-Wetterstation entwickelt hat, dachte ich mir, wir sollten das in einem eigenen Thread weiterführen:
Eigenbau Wetterstation mit Bus-Anbindung
Ich habe dort versucht schon das gröbste aus den letzten Beiträgen zusammenzufassen inkl. der zugehörigen Links.
Ich würde mich freuen, wenn wir da ein wenig die Daten zusammentragen könnten und vll. sogar am Ende was vorzeigbares bei rum kommt :-)
Gruß, Sven
- Likes 2
Kommentar
-
Hi,
Mein Sonoff 4ch pro ist die Woche gekommen. Hier mal ein erster lauffähiger Sketch. Ist zwar nicht schön, sollte aber funktionieren :-)
Code:/* * Sonoff 4ch Pro mit KNX Anbindung */ #include <esp-knx-ip.h> // WiFi config const char* ssid = "SSID"; //change to your SSID const char* pass = "PW"; //change to your PSK //GPIOs int Ch1_Pin = 12; int Ch2_Pin = 5; int Ch3_Pin = 4; int Ch4_Pin = 15; int Button1_Pin = 0; int Button2_Pin = 9; int Button3_Pin = 10; int Button4_Pin = 14; int LED_Pin = 13; //States int Button1State = 0; int Button2State = 0; int Button3State = 0; int Button4State = 0; int lastButton1State = 1; int lastButton2State = 1; int lastButton3State = 1; int lastButton4State = 1; int Ch1State = 0; int Ch2State = 0; int Ch3State = 0; int Ch4State = 0; //Groupadresses config_id_t Ch1Ack_GA; config_id_t Ch2Ack_GA; config_id_t Ch3Ack_GA; config_id_t Ch4Ack_GA; config_id_t Watchdog_GA; config_id_t hostname_id; void Ch1_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_WRITE: digitalWrite(Ch1_Pin, *data); knx.write1Bit(knx.config_get_ga(Ch1Ack_GA), *data); break; } } void Ch1State_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_READ: Ch1State = digitalRead(Ch1_Pin); knx.answer1Bit(knx.config_get_ga(Ch1Ack_GA), Ch1State); break; } } void Ch2_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_WRITE: digitalWrite(Ch2_Pin, *data); knx.write1Bit(knx.config_get_ga(Ch2Ack_GA), *data); break; } } void Ch2State_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_READ: Ch2State = digitalRead(Ch2_Pin); knx.answer1Bit(knx.config_get_ga(Ch2Ack_GA), Ch2State); break; } } void Ch3_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_WRITE: digitalWrite(Ch3_Pin, *data); knx.write1Bit(knx.config_get_ga(Ch3Ack_GA), *data); break; } } void Ch3State_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_READ: Ch3State = digitalRead(Ch3_Pin); knx.answer1Bit(knx.config_get_ga(Ch3Ack_GA), Ch3State); break; } } void Ch4_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_WRITE: digitalWrite(Ch4_Pin, *data); knx.write1Bit(knx.config_get_ga(Ch4Ack_GA), *data); break; } } void Ch4State_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_READ: Ch4State = digitalRead(Ch4_Pin); knx.answer1Bit(knx.config_get_ga(Ch4Ack_GA), Ch4State); break; } } void Watchdog_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_READ: knx.answer1Bit(knx.config_get_ga(Watchdog_GA), 1); break; } } void setup() { pinMode(LED_Pin, OUTPUT); pinMode(Ch1_Pin, OUTPUT); pinMode(Ch2_Pin, OUTPUT); pinMode(Ch3_Pin, OUTPUT); pinMode(Ch4_Pin, OUTPUT); pinMode(Button1_Pin, INPUT_PULLUP); pinMode(Button2_Pin, INPUT_PULLUP); pinMode(Button3_Pin, INPUT_PULLUP); pinMode(Button4_Pin, INPUT_PULLUP); Serial.begin(9600); // Register the callbacks knx.register_callback("Kanal 1 Schalten", Ch1_callback); knx.register_callback("Kanal 1 Rückmeldung", Ch1State_callback); knx.register_callback("Kanal 2 Schalten", Ch2_callback); knx.register_callback("Kanal 2 Rückmeldung", Ch2State_callback); knx.register_callback("Kanal 3 Schalten", Ch3_callback); knx.register_callback("Kanal 3 Rückmeldung", Ch3State_callback); knx.register_callback("Kanal 4 Schalten", Ch4_callback); knx.register_callback("Kanal 4 Rückmeldung", Ch4State_callback); knx.register_callback("Watchdog", Watchdog_callback); // Register the group addresses Ch1Ack_GA = knx.config_register_ga("Kanal 1 Rückmeldung"); Ch2Ack_GA = knx.config_register_ga("Kanal 2 Rückmeldung"); Ch3Ack_GA = knx.config_register_ga("Kanal 3 Rückmeldung"); Ch4Ack_GA = knx.config_register_ga("Kanal 4 Rückmeldung"); Watchdog_GA = knx.config_register_ga("Watchdog"); // And the config options hostname_id = knx.config_register_string("Hostname", 20, String("4CH_PRO")); // Load previous values from EEPROM knx.load(); // Init WiFi WiFi.hostname(knx.config_get_string(hostname_id)); WiFi.mode(WIFI_STA); WiFi.begin(ssid, pass); Serial.println(""); Serial.print("[Connecting]"); Serial.print(ssid); digitalWrite(LED_Pin, LOW); while (WiFi.status() != WL_CONNECTED) { digitalWrite(LED_Pin, HIGH); delay(500); Serial.print("."); digitalWrite(LED_Pin, LOW); } digitalWrite(LED_Pin, HIGH); // Start knx knx.start(); Serial.println(); Serial.println("Connected to wifi"); Serial.println(WiFi.localIP()); Serial.println(" "); } void loop() { // Process knx events, e.g. webserver knx.loop(); //Toggeln der Kanäle bei Positiver Flanke der Buttons Button1State = digitalRead(Button1_Pin); Ch1State = digitalRead(Ch1_Pin); if (Button1State != lastButton1State) { if (Button1State == LOW) { if (Ch1State == 1) { digitalWrite(Ch1_Pin, LOW); knx.write1Bit(knx.config_get_ga(Ch1Ack_GA), 0); } else if (Ch1State == 0){ digitalWrite(Ch1_Pin, HIGH); knx.write1Bit(knx.config_get_ga(Ch1Ack_GA), 1); } } } lastButton1State = Button1State; Button2State = digitalRead(Button2_Pin); Ch2State = digitalRead(Ch2_Pin); if (Button2State != lastButton2State) { if (Button2State == LOW) { if (Ch2State == 1) { digitalWrite(Ch2_Pin, LOW); knx.write1Bit(knx.config_get_ga(Ch2Ack_GA), 0); } else if (Ch2State == 0){ digitalWrite(Ch2_Pin, HIGH); knx.write1Bit(knx.config_get_ga(Ch2Ack_GA), 1); } } } lastButton2State = Button2State; Button3State = digitalRead(Button3_Pin); Ch3State = digitalRead(Ch3_Pin); if (Button3State != lastButton3State) { if (Button3State == LOW) { if (Ch3State == 1) { digitalWrite(Ch3_Pin, LOW); knx.write1Bit(knx.config_get_ga(Ch3Ack_GA), 0); } else if (Ch3State == 0){ digitalWrite(Ch3_Pin, HIGH); knx.write1Bit(knx.config_get_ga(Ch3Ack_GA), 1); } } } lastButton3State = Button3State; Button4State = digitalRead(Button4_Pin); Ch4State = digitalRead(Ch4_Pin); if (Button4State != lastButton4State) { if (Button4State == LOW) { if (Ch4State == 1) { digitalWrite(Ch4_Pin, LOW); knx.write1Bit(knx.config_get_ga(Ch4Ack_GA), 0); } else if (Ch4State == 0){ digitalWrite(Ch4_Pin, HIGH); knx.write1Bit(knx.config_get_ga(Ch4Ack_GA), 1); } } } lastButton4State = Button4State; delay(50); }
Gruß, SvenZuletzt geändert von OleDeluxe; 26.01.2018, 07:21.
- Likes 2
Kommentar
-
Klasse zu lesen, wie einfach es nun für dich war.
Wenn ich mir die Sonoff's anschaue, dann sind diese Produkte wirklich top zu gebrauchen und auch weit ab von Bastelprodukten.
Mit der knx-libary schafft man in Verbindung mit dem Sonoff's eine kostengünstige Lösung zum Nachrüsten, welche auch noch eine halbwegs brauchbare Sicherheit (Verschlüsselung) bietet. Habe mir gerade einfach Mal einen S20 bestellt, um damit für meine Frau eine schaltbare Steckdose zu schaffen, die einfach Plug'n'Play bedeutet.
Schöne Sache!
Kannst du kurz noch schreiben welches "Zubehör" zum Sonoff dazu benötigtest, um diesen zu flashen?!
Kommentar
-
Moin,
ja, ich denke für so kleinere Sachen sind die Sonoff gut zu gebrauchen. Eine S20 und ein Basic sind auch im Zulauf, werde den Code dann posten.
Will das 4ch pro für die Steuerung einer Gartenbewässerung mit 24v Ventilen nutzen, dazu ist das ideal.
Das Flashen ist im Tasmota Wiki recht gut beschrieben. Wobei das 4CH Pro scheint hier aber ein wenig "speziell" zu sein. Ich habe es zwar auf Anhieb in den Flashmode bekommen mittels Jumperkabeln direkt am ESP, allerdings hat das Flashen selbst dann eine Zeitlang erst mal nicht funktioniert. Ich flashe die ESP direkt aus der Arduino IDE.
Auf dem 4CH Pro habe ich eine Stiftleiste aufgelötet. Als Adapter habe ich einen billigen USB-TTL-Adapter von ebay verwendet, der in anderen Projekten schon funktioniert hat; beim 4CH allerdings nicht. Nach einigem hin und her habe ich dann einen Arduino Uno in den Resetmode gesetzt und in damit als Seriell-Adapter verwendet, damit hat es auch noch nicht direkt geklappt. Erst ein vertauschen der TX-RX Verbindung hat dann letztlich funktioniert. Scheinbar ist das nicht ganz sauber bei den Sonoff Modulen, da man hier öfters von vertauschten Leitungen liest. Danach lief es aber ohne Probleme durch. Das Hauptproblem war schätzungsweise, dass der USB-TTL-Adapter nicht genug Strom für das 4CH-Pro geliefert hat, der Uno hingegen schon. Ich habe noch ein paar Bilder angehangen.
Zum Sketch selber:
1) Das Sonoff steht direkt ohne Passwortschutz im WLAN. Das ist bei mir unkritisch, da die iOT Dinger alle in einem eigenen Wlan laufen. Vll. setzte ich da aber wenn ich Zeit habe noch einen Zugang drauf.
2) Es gibt eine GA, die man als Watchdog nutzen kann. Liest man diese GA aus, so liefert sie eine 1 als Antwort zurück, sofern das Sonoff erreichbar ist. Ich könnte hier wenn gewünscht noch einen Timer einbauen der dann eben alle X Sekunden auf die GA sendet, falls gewünscht. Ich selbst Frage über einen Timer in Edomi hierbei die GA ab.
3) Nach einem Schaltbefehl auf die Schalten-GA wird über die RM-GA der entsprechende Status gesendet.
4) Die Onboard-Tasten Toggeln jeweils den zugehörigen Kanal und senden dann auf die RM-GA den Status.
5) Der Status eines jeden Kanals ist über die RM-GA abfragbar.
6) Ein Sperr-Objekt gibt es derzeit nicht, könnte man aber realisieren.
7) Der Sketch geht sicher schlanker, aber da hier aktuell kein Speicherplatz-Problem herrscht langt das wohl auch so.
8) Das 4CH-Pro hat neben der Wlan Verbindung noch eine 433Mhz Funkverbindung. Diese nutze ich nicht und habe mich damit auch gar nicht beschäftigt. Das 4CH hatte diese Verbindung noch nicht, doch ist das 4CH-PRO von den Anschlüssen her einfach besser und daher zu bevorzugen. ( Hier am besten mal nachlesen... )
Gruß, SvenZuletzt geändert von OleDeluxe; 26.01.2018, 08:50.
- Likes 1
Kommentar
-
Ja, prinzipiell sollte es das sein. Noch eben gegenchecken, ob die GPIOs gleich sind, und ob die LED für den Kanal auch parallel zum Relais sitzt.
//Edit: Grad nachgeschaut, sollte so funktionieren, die GPIOs sind für den ersten Kanal gleich belegt. Anbei noch ein Bild mit der Pinbelegung.
Gruß, SvenAngehängte DateienZuletzt geändert von OleDeluxe; 26.01.2018, 09:29.
Kommentar
-
Sketch für Sonoff Basic und S20:
Code:/* * Sonoff Basic + S20 Socket mit KNX Anbindung */ #include <esp-knx-ip.h> // WiFi config const char* ssid = "SSID"; //change to your SSID const char* pass = "PW"; //change to your PSK //GPIOs int Ch1_Pin = 12; int Button1_Pin = 0; int LED_Pin = 13; //States int Button1State = 0; int lastButton1State = 1; int Ch1State = 0; //Groupadresses config_id_t Ch1Ack_GA; config_id_t Watchdog_GA; config_id_t hostname_id; void Ch1_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_WRITE: digitalWrite(Ch1_Pin, *data); knx.write1Bit(knx.config_get_ga(Ch1Ack_GA), *data); break; } } void Ch1State_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_READ: Ch1State = digitalRead(Ch1_Pin); knx.answer1Bit(knx.config_get_ga(Ch1Ack_GA), Ch1State); break; } } void Watchdog_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data) { switch (ct) { case KNX_CT_READ: knx.answer1Bit(knx.config_get_ga(Watchdog_GA), 1); break; } } void setup() { pinMode(LED_Pin, OUTPUT); pinMode(Ch1_Pin, OUTPUT); pinMode(Button1_Pin, INPUT_PULLUP); Serial.begin(9600); // Register the callbacks knx.register_callback("Kanal 1 Schalten", Ch1_callback); knx.register_callback("Kanal 1 Rückmeldung", Ch1State_callback); knx.register_callback("Watchdog", Watchdog_callback); // Register the group addresses Ch1Ack_GA = knx.config_register_ga("Kanal 1 Rückmeldung"); Watchdog_GA = knx.config_register_ga("Watchdog"); // And the config options hostname_id = knx.config_register_string("Hostname", 20, String("4CH_PRO")); // Load previous values from EEPROM knx.load(); // Init WiFi WiFi.hostname(knx.config_get_string(hostname_id)); WiFi.mode(WIFI_STA); WiFi.begin(ssid, pass); Serial.println(""); Serial.print("[Connecting]"); Serial.print(ssid); digitalWrite(LED_Pin, LOW); while (WiFi.status() != WL_CONNECTED) { digitalWrite(LED_Pin, HIGH); delay(500); Serial.print("."); digitalWrite(LED_Pin, LOW); } digitalWrite(LED_Pin, HIGH); // Start knx knx.start(); Serial.println(); Serial.println("Connected to wifi"); Serial.println(WiFi.localIP()); Serial.println(" "); } void loop() { // Process knx events, e.g. webserver knx.loop(); //Toggeln der Kanäle bei Positiver Flanke der Buttons Button1State = digitalRead(Button1_Pin); Ch1State = digitalRead(Ch1_Pin); if (Button1State != lastButton1State) { if (Button1State == LOW) { if (Ch1State == 1) { digitalWrite(Ch1_Pin, LOW); knx.write1Bit(knx.config_get_ga(Ch1Ack_GA), 0); } else if (Ch1State == 0){ digitalWrite(Ch1_Pin, HIGH); knx.write1Bit(knx.config_get_ga(Ch1Ack_GA), 1); } } } lastButton1State = Button1State; delay(50); }
Zuletzt geändert von OleDeluxe; 28.01.2018, 10:24.
- Likes 1
Kommentar
-
Einen Sonoff POW - also die Variante mit Strommessung - hat noch niemand in KNX eingebunden?
Ich habe schon öfter - auch in deutschen Foren, in denen ich unterwegs bin - von explodierenden Sonoffs gelesen. Anscheinend hat Sonoff da aber mittlerweile nachgerüstet. Problem war, dass die Geräte von vor ca. 1 Jahr keine 16A auf Dauer ausgehalten haben. Zu gering dimensionierte bzw schlecht nachgelötete Leiterbahnen...
Jedenfalls hab ich genau so einen Sonoff POW zuhausem, den ich ursprünglich für die Stromerfassung des Trockners oder der Waschmaschine verwenden wollte. Aber aufgrund der dort auftretenden hohen Ströme bin ich davon abgekommen. Vielleicht häng ich den vor den Kühlschrank, der zieht nur so um die 500 Watt. Das sollte dann kein Problem sein.
Aber inwieweit und ob das in den aktuellen Geräten geändert wurde, entzieht sich meiner Kenntnis.Zuletzt geändert von halloween; 26.01.2018, 09:55.
- Likes 1
Kommentar
-
Ich würde die Dinger auch nur für kleinere Sachen wie etwa die Bewässerungsgeschichte oder mal ne LED Lichterkette einsetzten.
Bezüglich POW:
Hier findet man ein paar Infos zum verwendeten HLW8012 Chip und wie man den in einem Arduino ausliest.
Die zusätzlichen GPIOs für den POW sind:
GPIO05 - SEL
GPIO13 - CF1
GPIO14 - CF
Die LED liegt dann auf GPIO15 statt 13.
Gruß, Sven
Kommentar
Kommentar