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ß
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".
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
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
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!
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.
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..
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
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/
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