Forum: Haus & Smart Home HS-Parameter am PC über MQTT einstellen


von Tom (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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?!

von mqtt-sn (Gast)


Lesenswert?

Hmm,
suchst du so etwas wie  MQTT- "Retained Messages"?

von Conny G. (conny_g)


Lesenswert?

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.

von Conny G. (conny_g)


Lesenswert?

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.

von Jack (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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)

von Timo R. (tire)


Lesenswert?

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?!?

von Conny G. (conny_g)


Lesenswert?

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.

von Timo R. (tire)


Lesenswert?

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?

von Conny G. (conny_g)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von Marco H. (damarco)


Lesenswert?

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.

: Bearbeitet durch User
von Conny G. (conny_g)


Lesenswert?

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.

von Timo R. (tire)


Lesenswert?

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!

von Jack (Gast)


Lesenswert?

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

von Marco H. (damarco)


Lesenswert?

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.

: Bearbeitet durch User
von Fortschritt? (Gast)


Lesenswert?

Marco H. schrieb:
> Per Ajax fragt du alle 1sec den Status des Themas ab.

... also primitivstes Polling mit sinnloser Verschwendung von 
Kanalkapazität

von Marco H. (damarco)


Lesenswert?

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.

: Bearbeitet durch User
von Jack (Gast)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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

von Marco H. (damarco)


Lesenswert?

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.

: Bearbeitet durch User
von Thomas (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.