Forum: Haus & Smart Home Hilfe zu MQTT Automatisierung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hämster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich habe eine Rollo Steuerung und möchte diese nun ins Netzwerk bringen.
Hierzu möchte ich verwenden.

Client:
Arduino + Ethernetshield
Esplorer Devboard (ESP8266)

Server
Linux (Fritzbox/PogoPlug/Fileserver mit Debian <-- Bin mir noch nicht 
schlüssig, aber Pinguin bestimmt)

Soweit ich nun MQTT verstanden habe benötige ich

1. Server (Broker)
2. Client (Pubslish / Subscribe)

Meine Clients bekommen zu ihren Themen die entsprechenden Nachrichten 
und Senden entsprechende bei
bestimmten Ereignissen.

Einfaches Beispiel

Arduino 1 sagt zum Thema Knopf "gedrückt" Broker schickt allen 
gemeldeten zum Thema Knopf, "gedrückt"
Adruino 2 hört "gedrückt" zum Thema Knopf und lässt LED blinken.

Nun zu meinem Problem:

Ich müsste am Server darauf reagieren wenn der Knopf gedrückt wurde

Arduino 1 sagt zum Thema Knopf "gedrückt" Broker schickt allen 
gemeldeten zum Thema Knopf, "gedrückt"
Server hört "gedrückt" zum Thema Knopf und sagt zum Thema LED "blinken"
Broker schickt allen gemeldeten zum Thema LED, "blinken"
Arduino 2 hört "blinken" zum Thema LED und lässt LED blinken.

  1. Kann der Broker dahingehen programmiert werden?

Ich habe bis jetzt nur die einachen Bsp durchgemacht mit LED an und Temp 
Sensor.
Bin noch nicht weiter druchgestiegen.

Benutze noch einen öffentlichen Broker.

  2. Kann ich die Regeln für den Server auch in einer Skriptsprache 
programmieren?

Mit Java auf Linux hatte ich schon manchmal so meine Probleme, und bei 
Phyton versau ich mir immer die
Formatierung :(

Vll kann mir der ein oder andere meine zwei Fragen beantworten

Gruß

von Joachim S. (oyo)


Bewertung
0 lesenswert
nicht lesenswert
Hämster schrieb:
> Arduino 1 sagt zum Thema Knopf "gedrückt" Broker schickt allen
> gemeldeten zum Thema Knopf, "gedrückt"
> Server hört "gedrückt" zum Thema Knopf und sagt zum Thema LED "blinken"
> Broker schickt allen gemeldeten zum Thema LED, "blinken"
> Arduino 2 hört "blinken" zum Thema LED und lässt LED blinken.
>
>   1. Kann der Broker dahingehen programmiert werden?
>
>   2. Kann ich die Regeln für den Server auch in einer Skriptsprache
> programmieren?

Direkt in MQTT oder (dem in wohl 99% der Fälle verwendeten) MQTT-Broker 
"Mosquitto" sind derartige Regeln meines Wissens nach nicht vorgesehen.

Meiner Meinung nach ist das tatsächlich so mit die grösste Lücke, die 
MQTT in der Praxis hat, also dass es für so etwas noch keinen 
einheitlichen Standard gibt oder so, oder derartige Regeln sogar direkt 
vorgesehen sind.

Der wohl einfachste Ansatz wäre meiner Meinung nach, einen MQTT-Client 
in einer beliebigen Programmiersprache zu entwickeln, der sozusagen das 
Verhalten dieser Regeln implementiert.
Ich z.B. habe das ungefähr so gemacht: Jede derartige Regel entspricht 
einem Datensatz mit drei Feldern:
- Die "Eingangs-Topic" (entweder als reiner String oder als regulärer 
Ausdruck)
- Eine (bei mir: in Python geschriebene Lambda-) Funktion, die einen 
String auf einen anderen String abbildet
- Die "Ausgangs-Topic"

Mein in Python geschriebener Client, der nur für die Umsetzung dieser 
Regeln zuständig ist, verbindet sich mit dem MQTT-Broker, und subscribed 
auf sämtliche "Eingangs-Topics".
Immer wenn eine Nachricht eintrifft, werden alle Regeln abgearbeitet und 
überprüft, ob die Topic der Nachricht auf die Eingangs-Topic der 
entsprechenden Regel passt.
Wenn ja, wird der Text der Nachricht mittels der zu der Regel gehörenden 
Funktion auf einen transformiert/auf einen anderen String abgebildet.
Die auf diese Weise transformierte Nachricht wird an die in der Regel 
vermerkte "Ausgangs-Topic" "geforwarded".

von Oliver S. (phetty)


Bewertung
0 lesenswert
nicht lesenswert
MQTT ist das reine Message-Protokoll und hat deswegen mit einem 
darüberliegenden Regelwerk erstmal nichts zu tun.

Man kann sich allerdings recht einfach mit Node Red eine 
"Was-passiert-Dann-Maschine" bauen:

https://nodered.org/

Oder gleich als Film:

https://www.youtube.com/results?search_query=node+red+mqtt

von Michael A. (micha54)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich denke der MQTT sollte vernünftige Topics bekommen mit genau einem 
Publisher, also z.B.
Arduino1/Knopf = gedrückt, nicht gedrückt
Arduino1/Led   = blinken, aus
Arduino2/Knopf = gedrückt, nicht gedrückt
Arduino2/Led   = blinken, aus

Irgendwo muss die Logik implementiert werden, und es ist nicht Sache 
eines Information Brokers wie MQTT, eine Verarbeitung durchzuführen.

Deshalb brauchts einen eigenen Prozess, der die 4 Topics miteinander 
verknüpft.

Wenn man das Ganze auf eine Haussteuerung hochrechnet, so hat man viele 
Topics, die alle richtig weitergeleitet werden müssen.
Nur ein Teil davon geht an die Heizungssteuerung, die nach bestimmten 
Regeln abeitet, die ein MQTT nicht kennen kann.
Ein anderer Teil geht an einen Warnmelder-Prozess, der den 
Batteriestatus aller Geräte kontrolliert und ggf. ein Problem 
signalisiert.

Jeder Prozess und jedes Display oder jede Bedienungs-App hat nur die 
Topics abonniert, die auch wirklich verarbeitet oder angezeigt werden. 
Ist das Display aus, so braucht auch nix übertragen zu werden.

Aber ein regelbasierter Verarbeitungsprozess hätte was, insofern 
beobachte ich hier mal was sich weiter tut.

Gruß,
Michael

von Hämster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also nach deinem Beispiel dürfte ich dann nicht die Aktion übermittel 
sonder müsste die
Reaktion blinken senden.

Gerade für Hausautomatisierung macht es keinen Sinn wenn ich jeden 
Knoten sagen muss was
er aulösen muss, viel mehr Sinn ergibt sich dochh wenn jeder Knoten 
seinen Zustand sendet
und eine "ÜberLogik" die Sensoreingänge verknüpft und Aktoren anspricht.

Wie würde ich denn mit aktuellen mqtt folgendes Problem lösen?

Ich habe eine Balkontür mit Rollo
Es ist ein schöner Tag, Sonne pur Ich sitze auf dem Balkon.
Lichtschranke hat registriert das ich auf den Balkon gegangen bin.
Lichtsensor merkt oh ich habe seit 5min Dauersonne man sollte abdunkeln 
das Raum nicht
zuheiß wird.
Rolladen fahren nach unten.
Ich steh auf Balkon und muss warten bis Lichtsensor außen meldet es ist 
auf dauer dunkler geworden
Dass der Rollden hochfährt.

Ich versuch mich mal bitte korrigieren.
Ich habe dann somit Zwei Arten an Motorcontrollern

Lichtschranke regestriert Bewegung innen nach außen
Lichtschranke Meldet "Mensch|Außen"
Tür empfängt "Mensch|Außen" und geht in Lauschposition auf 
"Mensch|Innen"
LichsensorInnen misst über 5 min >= Schwellwert
LichtsensorInnen Meldet "Sonne|Innen"
Fenster empfängt "Sonne|Innen" fährt Rollo auf Endschalter
LichtsensorAußen misst über 20min <= Schwellwert
LichtsensorAußen Meldet "Sonne|nicht_mehr_so_stark"
Fenster empfängt "Sonne|nicht_mehr_so_stark" fährt Rollo wieder hoch

Wenn ich nun eine Änderung im Schwellwert vornehmen möchte muss ich an 
jeden Arduino und
muss die Änderung einpflegen.

Gäbe es eine Zentrale Logik würde ich nur Befhele senden auf ACK warten 
und fertig

von Guest (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Hämster schrieb:
> 1. Kann der Broker dahingehen programmiert werden?

Der Broker direkt nicht.
Du kannst aber einen Client connecten, der die Meldungen entsprechend 
umsetzt und neu sendet.
Schau dir mal Node-Red an. Der kann auch noch vieeeel mehr!

von Hämster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Node Red war für mich auf den ersten Blick Klicki Bundi Lego Kasten.

Muss mich da mal genauer einlesen.


Und ja ich müsste einen weiteren Client einbinden der, dass dann macht.
Wäre eben auch schön wenn es etwas in Skript Sprache geben würde um neue 
Regeln festzulegen.

Wäre eben schön gewesen wenn es der Broker machen könnte da er sowieso 
laufen muss.

von dunno.. (Gast)


Bewertung
1 lesenswert
nicht lesenswert
schau dir mal homeassistant an.

dort kann man solche aufgaben per skript automatisieren, für den raspy 
haben die ein fertiges image mit mosquitto..

eigentlich ist das eine website zur hausautomatisierung, kannst du aber 
ja sicher auch gebrauchen, für deine rollos..

von Hämster (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Gefällt mir auf Anhieb.
Macht auch nen besseren Eindruck als `FHEM´ in den ersten 20sec.

Hast du damit mqtt am laufen?
Wenn ja kannst du mir dazu ein ein einfaches Beispielskipt geben?
Oder vll ein einfaches Wenn Dann Skript schreiben?

Besten Dank schonmal

von dunno.. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe damit eine Wetterstation gebaut. ESP8266 senden Temperatur, 
Luftfeuchte und Luftdruck per Mqtt, die Website zeigt das an und loggt 
die verläufe.

Beispiele haben die selbst zu hauf in der doku, klick dich mal durch..

https://home-assistant.io/cookbook/python_component_mqtt_basic/

von dunno.. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
sorry für doppelpost, der link war quatsch

https://home-assistant.io/docs/automation/

von Hämster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jo sieht recht simple aus.
Da les ich mich dinitiv tiefer ein ^^

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.