Hallo zusammen,
ich baue gerade meine Haussteuerung und will die Parameter zu
Einstellungen von PC zu µC via MQTT und ESP8266 übertragen.
Soweit funktioniert das auch wunderbar (Webseite/PHP/MQTT).
ABER: Es gibt einige Parameter, die eigentlich vom µC ausgelesen und
dann auf der Webseite angezeigt und verändert werden sollen. Per
Definition ist das seitens MQTT so nicht gedacht (ist ja schließlich
keine klassische Datenbank).
Hat jemand eine Idee, wie ich das umsetzten kann, also Werte bei Bedarf
vom MQTT Broker zurücklesen, um diese anschließende z.B. von der
Webseite zu verändern?
Danke vorab!
Tom
Tom schrieb:> Hat jemand eine Idee, wie ich das umsetzten kann, also Werte bei Bedarf> vom MQTT Broker zurücklesen, um diese anschließende z.B. von der> Webseite zu verändern?
Der Broker vermittelt nur und soetwas wie "auslesen" gibt es bei MQTT
nicht. Du brauchst einen MQTT-Client, der die Werte zum Broker schickt
und der reicht sie dann an die Subscriber weiter.
Hi ,
mir ist bewusst, dass ich die Daten nicht klassisch zurücklesen kann und
per Default mein Problem sich so nicht lösen lässt.
Ich denke aber, dass so manch einer einen ähnlichen Ansatz hat und für
das gleiche Problem eine Lösung - wie auch immer diese aussieht. Diese
würde mich letztlich interessieren :-)
Das einzige was mir momentan einfällt, ist einen SQL Server zu nutzen,
auf dem die Parameter gespeichert werden (parallel zum publish Prozess)
und von dort bei Bedarf rückgelesen werden.
Oder alternativ: statt SQL in ein txt-File auf dem
Webserver/php-Server?!
Bei AWS IoT gibt es dafür Shadow Devices, die dem Status speichern.
Gefüttert werden sie mit MQTT oder Rest Updates.
Also irgendwo brauchst Du ein digitales Abbild, das gepflegt wird und
jede Änderung irgendwo wird per MQTT verteilt und dort festgehalten.
Nachtrag:
Liest sich danach als wolltest Du den ESP zum Server / Steuerzentrale
machen, das ist keine gute Idee. Der ist nicht dafür geeignet eine DB
von Shadow Devices / Zuständen mitzuführen, er ist nur als Client
geeignet.
Für so eine Management Konsole, die Stati über alles zu managen solltest
Du einen „richtigen“ Server nehmen, zB einen Raspberry Pi oder einen
richtigen PC.
Conny G. schrieb:> Nachtrag:> Liest sich danach als wolltest Du den ESP zum Server / Steuerzentrale> machen,
Mir ist ehrlich gesagt nicht ganz klar was er machen möchte. Wir haben
drei Spieler
>> PC ... µC ... ESP8266
Wer davon soll MQTT-Client, wer -Broker (Server) sein, und spielt ein
Gateway (Shadow, Proxy, ...) mit?
Ebenso ist mir nicht klar wer PUBLISHed, nur der Client/die Clients, nur
der Server? Denn technisch können beide publishen. Damit ist prinzipiell
eine Abfrage von Parametern möglich, wenn auch asynchron:
Client SUBSCRIBEd zu Server-Anfragen
Server PUBLISHed eine Anfrage
Client beantwortet Anfrage mit einem PUBLISH der gewünschten Werte
Statt Daten auf Anfrage zu liefern kann der Client natürlich auch
selbstständig Daten PUBLISHen wann immer es ihm gefällt.
Versteh das Problem auch nicht ganz...
Eventuell wirds anhand eines konkreteren Beispiels klarer, fiktives
Heizungsthermostat auf ESP-Basis:
Ein Topic:
wohnzimmer/heizung/soll
für den Soll-Wert (Retained)
und ein Topic
wohnzimmer/heizung/ist
für den Ist-Wert.
Ob ich den Soll-Wert nun per App, oder per Webseite, per selbstgebautem
Wand-Modul, per FHEM/OpenHAB-Uhrzeitregel oder sonstwie verstelle ist
doch egal, MQTT speichert ihn.
Wenn sich der MQTT-Server resettet: Kein Problem, er holt den letzten
Stand aus seiner persistence-Datei.
Wenn sich der Thermostat-ESP resettet: Kein Problem, der MQTT-Server
liefert ihm sofort seinen Soll-Wert.
Wenn sich das Bedien-Modul resettet, Webseite neu geladen wird, App
geöffnet wird: auch kein Problem, MQTT kennt schließlich den zuletzt
eingestellten Soll-Wert.
Ich wüsste nicht, an welcher Stelle man da sinnvoll eine
PHP(-Textfile)-Datenbank o.Ä. mit einbauen könnte, außer zu
Visualisierungs-Zwecken (rrdtool &co)
Hallo zusammen,
also was ich momentan mache:
- Webseite bei einem Hoster
- MQTT läuft bei einem CloudMQTT
- kein RasPi o.ä. eingebunden
- der µC kontrolliert Haus und kommuniziert mit ESP
- ESP ist auf die MQTT Messages abonniert; werden Daten empfangen,
leitet dieser sie nur weiter (kein Webserver)
- Rolladen können direkt angesteuert werden (setzte Wert in MQTT), geht
gut
- für Rolladenprogramme sollen Zeiten eingestellt werden. Hier kommt
meine Problem in's Spiel:
* die Zeiten werden eingestellt und dann published
* bevor ich was eingebe, wäre es gut, die aktuellen Settings zu sehen
Hoffe, das hilft beim Verständnis
@ mqtt-sn: Ich weiß jetzt nicht genau, was "retained messages" macht,
muß ich mal nachlesen
[https://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages]
Scheint fast zu machen was ich brauche?!?
Timo R. schrieb:> - für Rolladenprogramme sollen Zeiten eingestellt werden. Hier kommt> meine Problem in's Spiel:> * die Zeiten werden eingestellt und dann published> * bevor ich was eingebe, wäre es gut, die aktuellen Settings zu sehen
Da gibt's jetzt zwei Möglichkeiten.
a) Jedesmal vom UI einen Request für die Parameter schicken und auf die
Antwort warten
b) Irgendwo die Settings speichern, z.B. in einem Shadow Device, das die
UI im Zugriff hat.
Das Shadow Device gibt Dir jederzeit den Gesamtstatus eines Geräts, ohne
dass Du mit dem Gerät direkt sprechen müsstest.
Conny G. schrieb:> a) Jedesmal vom UI einen Request für die Parameter schicken und auf die> Antwort warten
Ja, aber genau das bietet MQTT von Haus aus nicht (war nicht dafür
gedacht) - oder liege ich da falsch?
Timo R. schrieb:> Conny G. schrieb:>>> a) Jedesmal vom UI einen Request für die Parameter schicken und auf die>> Antwort warten>> Ja, aber genau das bietet MQTT von Haus aus nicht (war nicht dafür> gedacht) - oder liege ich da falsch?
Kann man sicher so machen, aber es ist schon vom Architekturansatz her
ungünstig.
Man würde über eine Strecke, die für asynchrone Kommunikation konzipiert
ist quasi-synchron kommunizieren. Und das viel häufiger als man es über
eine MQTT Strecke machen will.
Müsste man immer alle Parameter von allen Geräten ad hoc abfragen,
würden sich riesige Datenübertragungsmengen ergeben, da sieht man schon
das das nicht im Sinne des Konzepts ist.
Timo R. schrieb:> Ja, aber genau das bietet MQTT von Haus aus nicht (war nicht dafür> gedacht) - oder liege ich da falsch?
Doch, genau das kann MQTT. Es muss aber beim Senden des Werts mitgeteilt
werden, dass es sich um einen "aufhebenswerten Wert" handelt, nicht beim
Abonieren des Topics.
kein Problem du abonnierst das Thema und der Broker sendet dir die
letzte gespeicherte Messages. Du musst also mit deiner Anfrage das Thema
abonnieren -> der Broker sendet die letzten Werte und wieder
abbestellen. So kommst du an die Werte.
Das mit den Schatten funktioniert nur im AWS und da braucht man bloß per
GET sich den Schatten holen. Was im übrigen extra kosten verursacht.
Marco H. schrieb:> kein Problem du abonnierst das Thema und der Broker sendet dir die> letzte gespeicherte Messages. Du musst also mit deiner Anfrage das Thema> abonnieren -> der Broker sendet die letzten Werte und wieder> abbestellen. So kommst du an die Werte.
Kann man machen, ist aber Lösungstyp "Hack".
> Das mit den Schatten funktioniert nur im AWS und da braucht man bloß per> GET sich den Schatten holen. Was im übrigen extra kosten verursacht.
Das war als Lösungskonzept gemeint, nicht als konkrete Lösung, das im
AWS zu machen. Aber die Shadows ist wie es gemeinhin gemacht wird, auch
bei Apple Homekit oder bei Homematic.
Habe nun die "retained messages" Option in einem anderen Projekt
ausprobiert und scheint mir bei meinem Problem zu helfen, sprich darauf
kann ich bauen (hoffentlich!)
Danke allen!
Timo R. schrieb:> Conny G. schrieb:>>> a) Jedesmal vom UI einen Request für die Parameter schicken und auf die>> Antwort warten>> Ja, aber genau das bietet MQTT von Haus aus nicht (war nicht dafür> gedacht) - oder liege ich da falsch?
Ließt du auch die Antworten die du bekommst?
Jack schrieb:> Client SUBSCRIBEd zu Server-Anfragen> Server PUBLISHed eine Anfrage> Client beantwortet Anfrage mit einem PUBLISH der gewünschten Werte
Er hat offenbar nicht verstanden das man mit zwei themen arbeiten kann.
Abonniert wird die diejenige wo das Device erfolgreich den Status
zurückmeldet. Per Publish auf dem Thema das des Device abonniert hat.
Du kannst per HTTP request nicht auf auf die Antwort warten. Den Status
mußt du per Javascript und GET immer wieder abfragen. Natürlich das in
ein json verpacken. Dynamische Webinhalte nennt man so etwas. Warum ?
weil der Status sich ja auch vom einen anderen Client ändern könnte. Per
Ajax fragt du alle 1sec den Status des Themas ab. Da deine Gateway das
Thema ja abonniert hat wird er eine Änderung auch mitbekommen.
Alternativ kann man das auch so Lösen wie im AWS mit dem Schatten. So
das dein Client auch mitbekommt wenn zwar ein Status gesetzt wurde aber
das Gerät nicht diesen zurückgemeldet hat.
Das Rücklesen des eigenen Themas bringt nicht sehr viel um zu wissen ob
das Gerät den Status auch erhalten hat.
Wie will ein HTTP Client sonst eine status Änderungen feststellen? In
dem der User die Seite neu lädt? Mit Header ist die Trafic auch gering
da ich ja sagte in json verpacken. Nicht die Seite neu laden.
Er kann auch per Websocket das Protokoll wechseln. MQTT über den Browser
fahren.
www.hivemq.com/demos/websocket-client
Schau bis zu dem Punkt in dem der Client äußert das Protokoll zu
wechseln ist das ein Webserver. Ob man das nun als Front-End oder als
Back-End einsetzt ist relativ Wurst. Per Javascript wird die Seite dann
dynamisch verändert wenn eine Abonnierte Message empfangen wird.
Probiere es aus das funktioniert auch mit einen lokalen Broker :).
Der Webserver stellt nur die Ressourcen zu verfügung und der Browser
führt das Javascript dann aus.
Fortschritt? schrieb:> Marco H. schrieb:>> Per Ajax fragt du alle 1sec den Status des Themas ab.>> ... also primitivstes Polling mit sinnloser Verschwendung von> Kanalkapazität
Man kann aus allem ein Drama machen. Er will Werte interaktiv über eine
Webseite verändern. Da kann man beim Laden der Webseite schon mal über
den Broker ein PUBLISH zum Client auslösen um asynchron (die Webseite
muss dann kurz warten) vom Client per PUBLISH über den Broker die
aktuellen Werte zurück zu bekommen.
Hallo Tom,
viel Gdönse und hin oder her... Viel Programmieren und Gedanken....
MQTT Auf ESP ok
Befehle an den ESP Status immer zurück publish'en
Dann nimm NodeRed zum steuern, da ist dann alles drinnen mit Datenbank
usw. https://nodered.org/
Wenn du es noch schöner haben willst IObroker ...
Der hat dann auch noch viele Adapter(Software-Adapter) zu vielen anderen
Systemen ... www.http://iobroker.org/
Da kannst du dein Haus als Hintergrund-Bild reinlegen und deine
Steuerelemete
dazu erzeugen.... Mein Haus habe ich mit SweetHome3D nachgezeichnet
http://www.sweethome3d.com/de/
Node Red und IOBroker setzen auf Node.JS auf
Funktioniert sogar auf Windows... Besser ist aber Linux.
Alles in die Cloud .. damit auch schön alle zuhören und mitschauen
können .... ne nicht bei mir ...
Kleiner Linux PC der zugleich Datenserver zuhause ist fertig ....
VPN Tunnel wenn ich von Unterwegs was machen will. Etwas sicherheit
sollte schon sein
Gruß Thomas
Marco H. schrieb:> Mit iobroker habe ich am Anfang experimentiert und der MQTT Teil war> grauenhaft. Es kam einige mal Müll zurück der zu anderen Modulen> gehörte.
Genau deshalb benutze ich mosquitto ausserhalb vom IO brocker...
Node Red (stammt von IBM) für die Logischen Sachen....
Gruß Thomas