Nachdem es kein wirklich geeignetes Forum für allgemeine MQTT Software Sachen gibt, poste ich mal hier weil's ja für den Sonoff Basic gedacht ist.
Inspiriert durch diesen Thread >click<, dachte ich mir, es wäre doch ganz nett für kleine lokale Projekte (maximal 15 TCP verbindungen im STA und max 8 im AP Mode) einen MQTT Broker/Bridge auf einem Sonoff Basic am laufen zu haben.
Habe das Ganze basierend auf dem uMQTTBroker von martin-ger https://github.com/martin-ger/uMQTTBroker mal umgesetzt.
Anbei eine zip, die das Sketchbook und library zum kompilieren enthalten. Den Inhalt des entpackten Ordners einfach dementsprechend in den portable/sketchbook Ordner der Arduino IDE kopieren.
Im Sketch lassen sich einstellen:
- Wifi Client oder AccessPoint
- dhcp oder statische IP
- Hostname = MQTT Broker ID
- MQTT Port
- MQTT Bridging
- IP/Port des externen MQTT Servers
Die Grundfunktion wie Button toggelt das Relais, LED zeigt Schaltstatus, ist ebenfalls integriert um den Sonoff auch weiterhin als Schaltgerät nutzen zu können. Ebenfalls lässt sich das Relais des Sonoff-Brokers selbst über MQTT steuern.
cmnd/<HOSTNAME>/Power <on|off|toggle>
oder auch ein kleiner Status abfragen:
cmnd/<HOSTNAME>/Power
cmnd/<HOSTNAME>/Status 0
Einstellungen werden in der Datei confg.h vorgenommen:
// uMQTTBroker for Sonoff
//
// The program simply starts a broker and waits for any client to connect.
// maximal 15 TCP connections possible ( ~8 in AP Mode)
//
///////////////////////////////////////////////////////////////////////////////
//
//*****************************************************************************
//C O N F I G - B E G I N **
//*****************************************************************************
// Your WiFi config here: ********************************************
// **
bool WiFiAP = false; // Do yo want the ESP as AP? [false/true]
// **
char host[] = "ESP-MQTT"; // Hostname & SSID in AP-Mode
char ssid[] = "SSID"; // your network SSID (name)
char pass[] = "password"; // your network password
bool STATIC = true; // Static IP for STA Mode? [false/true]
IPAddress ip(192,168,1,200); // Static IP
IPAddress gw(192,168,1,1); // Static Gateway/DNS
IPAddress su(255,255,255,0); // Static Subnet Mask
// **
// Your MQTT Server config here: ********************************************
int MQPort = 1883; // MQTT Broker Port [1883]
int MaxSub = 15; // max subscription/Client [30]
int MaxRet = 15; // max retained Topics/Client [30]
int CLIENT = 15; // max MQTT/TCP Clients [15]
int RETAIN = 0; // enable retain [0/1]
// **
// Your MQTT Bridge config here: ********************************************
bool EXSERV = true; // bridge to a MQTT Server? [false/true]
char EXMQ[] = "192.168.1.82"; // extern MQTT Server
int EXMPRT = 1883; // extern MQTT Broker Port [1883]
//
// BUTTON/RELAY/LED Function **************************************************
bool BTN0FN = true; // Do you want Button use? [false/true]
//
//*****************************************************************************
//C O N F I G - E N D **
//*****************************************************************************
//
// Example ********************************************************************
bool EXAMPL = false; // Example Progamm on/off? [false/true]
// Example need rule in Test_1
// rule1 on power1#state=1 do publish stat/TEST_1/POWER TRUE endon on power1#state=0 do publish stat/TEST_1/POWER FALSE endon
//*****************************************************************************
// Example Programm: goto the loop void in MQTT_REP.ino
Alles anzeigen
Programme wie das schalten des Relais etc lassen sich in der MQTT_REP.ino in der loop Schleife erstellen ( ab Zeile 215)
Hier das Beispiel für eine invertierte Master(TEST_1)/Slave(TEST_2) Schaltung durch einen MQTT Status Meldung eines Sonoff's (TEST_1)
// Example Program **********************************************************
if (EXAMPL) {
if (RECEIVE.equals("stat/TEST_1/POWER FALSE")) {
myBroker.publish("cmnd/TEST_2/POWER", "ON");
}
if (RECEIVE.equals("stat/TEST_1/POWER TRUE")) {
myBroker.publish("cmnd/TEST_2/POWER", "OFF");
}
}
// End Example ***************************************************************
Zum kompilieren muss in der Arduino IDE das 2.4.1 Board verwendet werden, mit folgenden Einstellungen:
Zu beachten wäre vielleicht noch, das es natürlich NICHTS mit Tasmota zu tun hat, keine Weboberfläche, nichts wird im Sonoff gespeichert also auch kein Schaltzustand bei Neustart etc.
Aber als Insellösung für wenige Geräte mit einer MQTT APP und/oder für den einen oder anderen interessierten vielleicht ganz nice.
EDIT - 19.03.19
- config ausgelagert
- code überarbeitet
- MQTT Bridge integriert
EDIT - 31.10.19
neue Version MQTT_REP_V2
Da Tasmota Zeitprogramme ohne NTP nicht laufen wurde von mir ein NTP Server integriert.
(Nur bei Insellösung ohne Internetzugang nötig)
Die Uhrzeit (UTC) ist über MQTT stellbar oder wahlweise über HTTP (Browser)
Der NTP Server ist in der config zuschaltbar und ebenfalls auf Wunsch der HTTP-Server, um die Uhrzeit zu stellen.
Wie sich der HTTP Server in der Praxis dann bei Vollauslastung auf den Speicherbedarf auswirkt habe ich nicht getestet.
// NTP Server config here: ********************************************
bool NTP = false; // enable NTP & HTTP Server [false/true]
int NTP_PORT = 123; // NTP Port [123]
bool HTTP = false; // HTTP Server to Set Time [false/true]
int HTTP_PORT = 80; // HTTP Port [80]
// **
// Set Time by HTTP Server
// Set Time by MQTT Command: cmnd/<HOSTNAME>/TIMESET hhmmssDDMMYYYY
// Get Time by MQTT Command: cmnd/<HOSTNAME>/TIMEGET