MQTT Broker/Repeater für den Sonoff Basic

  • 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:

    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)

    Code
    // 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.

    Code
    // 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
  • JoergZ

    Arduino IDE das 2.4.2 Board verwendet

    Aktuell in Version 1.8.7

    Ich habe leider keine Erfahrung mit Atom, aber so wie ich das sehe lassen sich da ja auch die Tasmota Sketche (.ino files) einbinden. Also geht das, denke ich, mit dem hier auch.:)

    Ist daselbe wie Tasmota kompilieren.

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

  • mmh... unter Atom bekomme ich die Fehlermeldung

    Code
    No configuration to build this project exists.
    
    No eligible build target.: No configuration to build this project exists.
        at /home/jz/.atom/packages/build/lib/build.js:113:15
        at <anonymous>

    und wenn ich die Arduino Entwicklungsumgebung 1.8.7 unter Ubuntu 18.04 LTS benutze, findet sie diese drei Bibliotheken nicht:

    C
    #include "ESP8266WiFi.h"
    #include "uMQTTBroker.h"
    #include "espconn.h"

    Ich finde diese Dateien auf meinem System, allerdings nur die erste innerhalb des uMQTTBroker-Pfades, die beiden anderen ausgerechnet im versteckten .platformio Pfad. Selbst wenn ich die Dateien in das Verzeichnis kopiere, in dem die uMQTTBroker.ino liegt, findet die Arduino-IDE sie nicht.Dasselbe passiert, wenn ich in das build-script die absoluten Pfade auf die Dateien einschreibe. Hast du eine Idee, was da schief laufen könnte?. Auf welchem System und mit welchen Tools kompilierst du denn?

  • Ich kompiliere auch unter Linux allerdings Puppy-Linux.

    Ardunio hab ich dementspechend nicht über einen Paketmanager sondern manuell installiert.

    Also der sketch "uMQTTBroker.ino" muss is Verzichniss:

    arduino-1.8.7/portable/sketchbook/uMQTTBroker/

    die uMQTTBroker lib muss nach:

    arduino-1.8.7/portable/sketchbook/uMQTTBroker

    (so wie im zip file)

    Komisch ist das Du bei ESP8266WiFi.h eine Fehlermeldung bekommst das ist ja die Board Library selbst, die man hat wenn man im Boardverwalter auf Generic ESP8266 Board stellt.

    Die sind bei mir alle im Portable Ordner, Bsp.:

    arduino-1.8.7/portable/packages/esp8266/hardware/esp8266/2.4.2/libraries/ESP8266WiFi/src/ESP8266WiFi.h

    Edit:

    Du hast das Board wahrscheinlich nicht intsalliert:

    Datei -> Voreinstellungen:

    zusätzliche Boardverwalter URL: http://arduino.esp8266.com/stable/package…6com_index.json

    Dann:

    Werkzeuge -> Board -> Boardverwalter

    ganz runterscrollen zu ESP8266

    Version 2.4.2 Auswählen und installieren.

    Dann:

    Werkzeuge -> Board -> ziemlich weit unten Generic ESP8266 Modul wählen.

    Sketch und uMQTTBroker lib nach portable wie oben beschrieben und dann funzt es auch.

    Wenn Du nicht klar kommst, schick ich dir ne voreingestellte IDE als zip ;)

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

    2 Mal editiert, zuletzt von HoerMirAuf (14. Oktober 2018 um 16:19)

  • Ich mal wieder. Also bin-Datei wird ohne Fehler generiert und ohne Fehler hochgeladen. Habe alle Einstellungen aus deinem Bild in #1 übernommen. Doch das Gerät ist nicht ansprechbar. Reagiert nicht auf ping, mosquitto_sub oder mosquitto_pub melden beide "Error: no route to host". SSID, PW usw. stimmen alle. Gerät ist ein Basic. Fällt dir was dazu irgendetwas ein?

  • Hi

    Sollte eigentlich OOTB laufen...

    Code
    char host[] = "ESP-MQTT";           // Hostname and SSID for AP mode
    char ssid[] = "WLAN-SSID";          // your network SSID STA mode
    char pass[] = "PASSWORT";           // your network password AP and STA
    bool STATIC = false;                // Static IP for STA Mode?   [false/true]
    IPAddress ip(192,168,1,200);        // Static IP
    IPAddress gw(192,168,1,1);          // Gateway
    IPAddress su(255,255,255,0);        // Subnet
    bool WiFiAP = false;                // Do yo want the ESP as AP? [false/true]

    Du hast Deine WLAN ssid eingetragen: char ssid[] = "WLAN-SSID";

    Dein Passwort auch? Alles in Klammern gelassen? Woher kennst Du den die IP die Du anpingst? Oder hast du auf statisch umgestellt? Poste doch bitte mal den Abschnitt...

    EDIT: (Oke, dein wlan passwort darsft natürlich aus x-en ;))

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

  • Der entsprechende Abschnitt:

  • Ahhhh ... Du hast ne IP eingetragen: 192.168.178.71

    Auf die pingst du dann sicherlich auch. Dann musst Du natürlich auch Statische IP aktivieren;)

    Code
    bool STATIC = true;                // Static IP for STA Mode?   [false/true]

    Natürlich danach neu kompilieren und hochladen.

    EDIT:

    Der Broker ist sicher auch jetzt schon online nur eben mit ner IP die er vom Router hat. Könntest auch einfach dort nachsehen welche IP das ist und alles darauf ausrichten.

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

  • Es scheint ein zweites Problem zu geben: Ich bekomme den Basic nicht mehr auf Tasmota zurück geflasht. Auch hier behauptet ATOM in diesem Fall, dass die Datei erfolgreich übertragen worden ist, aber der Basic kommt einfach nicht mehr hoch. Alle paar Sekunden blinkt er vier Vielleicht doch ein Hardware-Probleme. Dem gehe ich erst einmal nach. Melde mich wieder....

  • Warum flasht Du nicht direkt in Arduino wenn Du die IDE schon am start hast?

    Also ich habe damit keine Probleme hin und her zu flashen ....

    Vielleicht einfach mal nur löschen bzw. ein leeres bin flashen....

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

  • Warum flasht Du nicht direkt in Arduino

    Aus irgendwelchen Gründen bin ich bei meinen Tasmota-Anfängen gleich bei Atom gelandet und es hat mehr oder weniger gleich funktioniert. Und der Editor ist richtig gut, meine Terminal-Skripte schreibe ich nur noch mit Atom. Aber bei Gelegenheit schaue ich mal, ob ich die Anleitung zur Nutzung der Arduino-IDE mit Tasmota umgesetzt bekomme.

    Es gab noch eine weitere Ursache für das teilweise erfolglose flashen: Ein schlampig eingelöteter VCC-Pin, wodurch Flash-Erfolge sowieso eher zufällig waren. Das ist nun korrigiert und ich kann den Basic mit Arduino-IDE auf MQTT-Broker flashen und mit ATOM wieder auf Tasmota - läuft... :)

    (Und das ich den Boot static =true; übersehen habe, ist mir immer noch peinlich.)

  • (Und das ich den Boot static =true; übersehen habe, ist mir immer noch peinlich.)

    Quatsch .... wir sind doch alle manchmal betriebsblind. ;)

    Schau dir mal neue uMQTTBroker.ino an, der EDIT im ersten Post.

    Sind ein paar Verbesserungen drin.

    Für das Beispiel brauchts aber ne Rule in einem Sonoff...

    benzino77 Tasmocompiler

    Gitpod Master Release

    Gitpod Development Release

    Sonoff-Basic / Sonoff-RF / Sonoff-Touch / Sonoff S20 / PowStro Basic / MagicHome / Sonoff-RF-Bridge mit diversen 433MHz RF Sender/Empfänger / Shelly_1 / ESP-WiFi-Dimmer / Gosund SP111 / ESP12E / WEMOS D1 Mini / ESP32Cam

    Sensoren: BME280/BMP280/HC-SR501/HC-SR04/ACS712/INA219/MHZ19B/DS3231

    Alexa Sprachsteuerung

    mosquitto/bash/html/cgi auf Wyse5070

  • HoerMirAuf 19. März 2019 um 10:37

    Hat den Titel des Themas von „MQTT Broker für/auf dem Sonoff Basic“ zu „MQTT Broker/Repeater für den Sonoff Basic“ geändert.
  • Hallo,

    danke sehr gute Arbeit, ich habe mein sonoff th für ein Test geflasht, fuktioniert tabellos. Ich nutze MQTT Dash und kann es steurn, nur den aktueller Status von Relais (GPIO12) bekomme ich nicht in MQTT Dash, wenn ich MQTT Dash getrennt habe und dann der Status Relais ist geändert wird per Taste und wieder mit dem MQTT Dash verbinde, wird noch alter Zustand angezeigt.

    ich habe in config.h so angestellt:

    int RETAIN = 1; // enable retain [0/1]


    und beim publish RETAIN hinzugefügt, leider fuktioniert es nicht. Ist das falsch? ich dachte Broker speichert mit Retain Flag message.

    Gruß

    Eduard

  • Nur ganz schnell geguckt (und nicht geprüft!)... Du musst wahrscheinlich

    Code
    #define MQTT_POWER_RETAIN      false             // [PowerRetain] Power status message may send retain flag (false = off, true = on)

    (zusätzlich/alternativ) setzen.

  • Sorry, ich kann mich da im Moment nicht wirklich hinein vertiefen. So weit ich es verstehe, benutzt du einen Java Wrapper, um mit/über mqtt zu kommunizieren. Die Änderung, die ich angesprochen habe, bezieht sich allerdings auf Tasmota und den Flash auf dem Gerät. Es soll beeinflussen, was vom Broker retained wird. Üblicherweise ist das nur das topic LWT und darin die Werte online bzw. offline. Im beschriebenen Fall sollte eben der letzte Power-Zustand aufbewahrt werden. Der Client (MqttDash) müsste dann die retained message beim Verbinden und Abrufen des Geräte-Topics +/TH10/# (als Symboldarstellung) die Power-Meldung liefern, denke ich. Ich weiß allerdings nicht genau.in welchem Topic das aufbewahrt wird: tele oder stat.

  • Hallo Jörg,

    hier ist die richtige Syntax, es muss noch QOS auf 0 setzen, dann funktioniert RETAIN mit MQTT.h client

    Code
     myBroker.publish("stat/"+(String)host+"/POWER", "OFF", 0, RETAIN);

    bei void setup () noch hinzugefügt:

    Code
     GPIO_Stat(); // EHT read relais status 
     Puplish_Stat(); // EHT sent MQTT message RETAIN to begin

    Gruß

    Eduard