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".
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
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/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.