{"id":10410,"date":"2019-05-29T22:10:21","date_gmt":"2019-05-29T20:10:21","guid":{"rendered":"https:\/\/pi3g.com\/?p=10410"},"modified":"2019-05-29T22:10:21","modified_gmt":"2019-05-29T20:10:21","slug":"mqtt-topic-tree-design-best-practices-tips-examples","status":"publish","type":"post","link":"https:\/\/pi3g.com\/de\/mqtt-topic-tree-design-best-practices-tips-examples\/","title":{"rendered":"MQTT Topic Tree Design - bew\u00e4hrte Verfahren, Tipps und Beispiele"},"content":{"rendered":"<h1>Generischer MQTT-Hintergrund<\/h1>\n<p>Bei MQTT wissen Sender und Empf\u00e4nger nichts voneinander - der Broker \u00fcbernimmt die Nachrichten\u00fcbermittlung. Dadurch k\u00f6nnen die Nachrichten r\u00e4umlich, zeitlich und in ihrer Intensit\u00e4t voneinander getrennt werden. Der Sender kann mit der von ihm gew\u00fcnschten Geschwindigkeit und zum gew\u00fcnschten Zeitpunkt senden. Der Empf\u00e4nger kann die Nachrichten in der von ihm gew\u00fcnschten Geschwindigkeit und zum gew\u00fcnschten Zeitpunkt abrufen. Sender und Empf\u00e4nger m\u00fcssen sich nicht kennen, und es muss keine direkte Verbindung zwischen ihnen bestehen (wie z. B. bei einer Telefonleitung). MQTT erm\u00f6glicht den einfachen Aufbau von Multicast-Konfigurationen, bei denen ein Sender an viele abonnierte Empf\u00e4nger senden kann.<\/p>\n<ul>\n<li>Die Clients wissen nicht, wer die Nachricht urspr\u00fcnglich ver\u00f6ffentlicht hat - es sei denn, dies geht aus dem Thema (und m\u00f6glicherweise durch ACLs beim Broker erzwungen) oder aus dem Inhalt der Nachricht (m\u00f6glicherweise mit HMAC signiert) hervor.<\/li>\n<li>MQTT ist f\u00fcr die Kommunikation mit geringem Stromverbrauch und niedriger Latenzzeit konzipiert (HMAC usw. kann teuer sein)<\/li>\n<li>Sie k\u00f6nnen keine Liste aller Themen von einem Broker erhalten. Der Broker verwirft Nachrichten (und Themen), die niemand abonniert hat (m\u00f6glicherweise nur dann vollst\u00e4ndig wahr, wenn das Retain-Flag nicht gesetzt ist)<\/li>\n<li>Sie wissen nicht, wer ein Thema abonniert hat (verwenden Sie ACLs, um Abonnements von nicht autorisierten Clients zu begrenzen)<\/li>\n<\/ul>\n<h2>letzter Wille und Testament \/ am Leben erhalten<\/h2>\n<p>Die Clients k\u00f6nnen eine Verbindung herstellen, eine Nachricht ver\u00f6ffentlichen und die Verbindung beenden oder eine dauerhafte Verbindung zum Server aufrechterhalten. Im Falle einer dauerhaften Verbindung werden Keepalives gesendet. Wenn der Client innerhalb des beim Verbindungsaufbau vereinbarten Zeitrahmens keine Keepalives sendet, kann der Server (Broker) eine so genannte Last-Will-and-Testament-Nachricht senden, die der Client beim Verbindungsaufbau \u00fcbermittelt hat. Diese Nachricht kann beliebig sein und kann ver\u00f6ffentlicht werden an <b>ein einziges Thema pro Verbindung<\/b>. Der Broker sendet sie an alle Kunden, die sich f\u00fcr dieses Thema angemeldet haben.<\/p>\n<p>Wenn der Kunde die Verbindung ordnungsgem\u00e4\u00df beendet, wird das Testament nicht ver\u00f6ffentlicht.<\/p>\n<p>Die Funktion \"Keep Alive\" ist vor allem f\u00fcr mobile Clients n\u00fctzlich, bei denen die Verbindung unterbrochen werden kann (z. B. bei schlechten Netzwerken, Tunneln usw.).<\/p>\n<h2>Siehe auch:<\/h2>\n<p><a href=\"http:\/\/www.steves-internet-guide.com\/checking-active-mqtt-client-connections\/\" target=\"_blank\">http:\/\/www.steves-internet-guide.com\/checking-active-mqtt-client-connections\/<\/a><\/p>\n<p><a href=\"http:\/\/www.steves-internet-guide.com\/mqtt-last-will-example\/\" target=\"_blank\">http:\/\/www.steves-internet-guide.com\/mqtt-last-will-example\/<\/a><\/p>\n<p><a href=\"https:\/\/owntracks.org\/booklet\/tech\/mqtt\/\" target=\"_blank\">https:\/\/owntracks.org\/booklet\/tech\/mqtt\/<\/a><\/p>\n<h2>Kunden-ID \/ Kunden\u00fcbernahme<\/h2>\n<p>Jeder Client, der sich mit einem MQTT-Broker verbindet, sollte eine eindeutige Client-ID haben. Clients, die sich mit der gleichen Client-ID verbinden, beenden die vorherige Verbindung und \u00fcbernehmen die neue. Wenn Sie zwei Clients mit der gleichen Client-ID haben, kann dies zu einem Ping-Pong von getrennten Verbindungen f\u00fchren.<\/p>\n<h2>Zur\u00fcckbehaltene Nachrichten<\/h2>\n<p>Die<b> zuletzt<\/b> Eine erhaltene Nachricht an ein Thema wird gespeichert und an alle neuen Abonnenten dieses Themas zugestellt. Dies kann f\u00fcr die Kommunikation von Ger\u00e4testatus \/ Konfiguration \/ etc. verwendet werden.<\/p>\n<p>Sie setzen den Aufbewahrungszustand als Kennzeichen pro Nachricht.<\/p>\n<p>Zur\u00fcckgehaltene Nachrichten k\u00f6nnen f\u00fcr viele interessante Dinge verwendet werden, z. B. zur Erleichterung der automatischen Suche (siehe Vorschlag 4 unten).<\/p>\n<h2>Dienstg\u00fcte \/ QoS<\/h2>\n<p>Es gibt drei Stufen der Dienstg\u00fcte, die bestimmen, wie viel Overhead bei der Verarbeitung einer Nachricht anf\u00e4llt. Je h\u00f6her die Stufe, desto mehr Overhead. <\/p>\n<ul>\n<li>0: keine Garantien jeglicher Art<\/li>\n<li>1: die Nachricht wird mindestens einmal gesendet (Duplikate m\u00f6glich)<\/li>\n<li>2: die Nachricht wird genau einmal gesendet (keine Duplikate m\u00f6glich)<\/li>\n<\/ul>\n<p>Die QoS kann f\u00fcr jede an den Broker gesendete Nachricht und w\u00e4hrend des Abonnements festgelegt werden. Der niedrigere der beiden Werte wird f\u00fcr die tats\u00e4chliche Zustellung der Nachricht verwendet.<\/p>\n<p>Weitere Einzelheiten finden Sie hier:<\/p>\n<p><a href=\"https:\/\/www.eclipse.org\/paho\/files\/mqttdoc\/MQTTClient\/html\/qos.html\" target=\"_blank\">https:\/\/www.eclipse.org\/paho\/files\/mqttdoc\/MQTTClient\/html\/qos.html<\/a><\/p>\n<h1>Themen<\/h1>\n<h2>Fakten zu den Themen<\/h2>\n<p>Bei Themennamen wird zwischen Gro\u00df- und Kleinschreibung unterschieden, und es handelt sich um UTF-8-Strings. Es ist ratsam, sich auf druckbare ASCII-Zeichen zu beschr\u00e4nken, um die Fehlersuche zu erleichtern.<\/p>\n<p>Themennamen m\u00fcssen aus mindestens einem Zeichen bestehen, um g\u00fcltig zu sein. <\/p>\n<p>\/<\/p>\n<p>ist bereits ein Themenname<\/p>\n<p>Die <b>$SYS<\/b> ist f\u00fcr die Broker-Nutzung\/Statistik gedacht.<\/p>\n<p>Sie haben die Wahl, ob Sie die Informationen in der Themenstruktur oder in der Nachricht unterbringen. Eine JSON-Struktur f\u00fcr die Nachricht hilft Ihnen dabei, sie mit weiteren Daten zu erweitern.<\/p>\n<p>Bedenken Sie, dass bei jedem Aufruf des Brokers das Topic in der Nutzlast des MQTT-Pakets mitgeschickt wird - versuchen Sie daher, unn\u00f6tige L\u00e4ngen zu vermeiden.<\/p>\n<h4>Verwendung von Platzhaltern ber\u00fccksichtigen<\/h4>\n<ul>\n<li># <b>stimmt mit allem \u00fcberein, was f\u00fcr eine beliebige Stufentiefe ab der aktuellen Stufe gilt<\/b> (mehrstufiger Platzhalter, kann nur am Ende eingef\u00fcgt werden) <\/li>\n<li><b>+ <\/b>passt zu allem auf der aktuellen Ebene<b> <\/b>(einstufiger Platzhalter)<b><\/b><\/li>\n<\/ul>\n<p>Wenn Sie z. B. mehrere Temperatursensoren haben, k\u00f6nnen Sie problemlos Nachrichten f\u00fcr alle von ihnen abonnieren, wenn Sie Ihren Themenbaum richtig gestalten.<\/p>\n<p>Wild Cards sind nur f\u00fcr Abonnenten gedacht, <b>sie sind nicht zur Ver\u00f6ffentlichung zugelassen.<\/b><\/p>\n<p>Sie k\u00f6nnen alle Themen abonnieren mit <b>#<\/b><\/p>\n<p>mit Ausnahme des Themas $SYS. Verwenden Sie $SYS\/#, um alle Themen f\u00fcr $SYS zu abonnieren <b> <\/b><\/p>\n<p>M\u00f6glicherweise k\u00f6nnen Sie durch die Verwendung des Teils \"Funktion\" vor der Ger\u00e4tekennung bestimmte Kan\u00e4le leichter abonnieren.<\/p>\n<p>Wenn Sie zum Beispiel Ihre Pfade wie folgt definieren <i>tele\/room1\/sensorname1 tele\/room2\/sensorname2<\/i> usw. und <i>stat\/room1\/sensorname1 stat\/room1\/sensorname2<\/i> Abonnements sind m\u00f6glich auf:<\/p>\n<p>tele\/#<\/p>\n<p>stat\/#<\/p>\n<p>Wenn Sie es andersherum machen, mit <i>Sensor1\/Stat <\/i>und<i> sensor2\/stat<\/i>usw. k\u00f6nnen Sie verwenden <\/p>\n<p>+\/stat <\/p>\n<p>um Statistiken zu abonnieren, aber nicht in beliebiger Tiefe wie im vorherigen Beispiel. Das hei\u00dft, der Pfad zu Ihrem Sensor muss aus genau einer Komponente bestehen. <\/p>\n<p>Wenn Sie die Aktion vorwegnehmen, werden Ihre Pfade konsistenter sein.<\/p>\n<p>Siehe zum Beispiel <a href=\"https:\/\/stevessmarthomeguide.com\/setting-up-the-sonoff-tasmota-mqtt-switch\/\" target=\"_blank\">https:\/\/stevessmarthomeguide.com\/setting-up-the-sonoff-tasmota-mqtt-switch\/<\/a><\/p>\n<h2>Nicht<\/h2>\n<p>- Verwenden Sie keinen vorangestellten Schr\u00e4gstrich (z. B. \/mytopics ), um Ihren Themenbaum zu beginnen - das ist ein zus\u00e4tzlicher Aufwand, der keinen Wert hat. <\/p>\n<p>- Nicht verwenden <b>$SYS<\/b> als Startthema, dies ist dem Makler vorbehalten<\/p>\n<p>- Verwenden Sie keine Leerzeichen im Thema<\/p>\n<p>- Verwenden Sie keine nicht druckbaren Zeichen im Thema<\/p>\n<p>- ein MQTT-Topic f\u00fcr Nachrichten mit unterschiedlicher Bedeutung verwenden - verschiedene Topics f\u00fcr sie erstellen<\/p>\n<h2>Vorschl\u00e4ge \/ Tun<\/h2>\n<p>- Client-ID in den Themenbaum einbetten<\/p>\n<p>- spezifische Themen f\u00fcr die individuelle Adressierung (z.B. von Sensoren) erstellen, anstatt alle Werte \u00fcber ein Thema zu senden - <b>dadurch wird vermieden, dass Nachrichten an Empf\u00e4nger gesendet werden, die sie nicht ben\u00f6tigen<\/b><\/p>\n<p>- Versuchen Sie, die Themennamen kurz zu halten (da sie bei jeder Ver\u00f6ffentlichung und Nachricht gesendet werden) <\/p>\n<p>- \u00fcberlegen, welche Daten wie oft gesendet werden m\u00fcssen<\/p>\n<p>o z.B. erw\u00e4gen, Metadaten in ein eigenes Thema auszugliedern und mit einem \"Retain\"-Flag zu ver\u00f6ffentlichen<\/p>\n<p>- Befehls-\/Cmd- und Statusthemen f\u00fcr ein Ger\u00e4t trennen - auf diese Weise wird eine bidirektionale Kommunikation m\u00f6glich, und das Ger\u00e4t muss seine eigenen Nachrichten nicht filtern.<\/p>\n<p>- eine testamentarische Nachricht verwenden, um auf eine unerwartete Trennung des Kunden hinzuweisen<\/p>\n<h2>Mehrmandantenf\u00e4higkeit und Bridging ber\u00fccksichtigen<\/h2>\n<p>M\u00fcssen Sie mehrere Kunden \/ Organisationen \/ unabh\u00e4ngige Anwendungen unterst\u00fctzen? Es gibt die M\u00f6glichkeit, z. B. mit VerneMQ, verschiedene Mountpoints zu verwenden. Eine weitere Alternative besteht darin, die Mehrmandantenf\u00e4higkeit in Ihren Themenbaum aufzunehmen (durch Verwendung eines entsprechenden Pr\u00e4fixes am Anfang des Themenbaums).<\/p>\n<p>Ich bevorzuge den ersten Weg, da er eine zus\u00e4tzliche Ebene der ACL-Trennung bietet - und weniger M\u00f6glichkeiten, etwas zu \"vermasseln\".<\/p>\n<p>Au\u00dferdem m\u00f6chten Sie vielleicht mehrere MQTT-Broker miteinander verbinden und einen Teil ihrer Themenb\u00e4ume (wie durch ihre ACLs definiert) gemeinsam nutzen. <\/p>\n<p>Weitere Informationen zur \u00dcberbr\u00fcckung finden Sie unter https:\/\/owntracks.org\/booklet\/guide\/bridge\/. <\/p>\n<h2>Verschl\u00fcsselung erw\u00e4gen<\/h2>\n<p>MQTT kann \u00fcber verschl\u00fcsselte Netzwerke (z.B. \u00fcber Websockets \/ TLS verschl\u00fcsselt) oder \u00fcber unverschl\u00fcsselte Kan\u00e4le betrieben werden. Zus\u00e4tzlich k\u00f6nnen Sie die Nutzlast Ihrer Daten verschl\u00fcsseln und\/oder signieren.<\/p>\n<h4>Auffindbarkeit ber\u00fccksichtigen<\/h4>\n<p>Erw\u00e4gen Sie, Themen einzubauen, die die Auffindbarkeit von Diensten und F\u00e4higkeiten Ihrer Ger\u00e4te erleichtern, z. B. durch die Verwendung gespeicherter Nachrichten.<\/p>\n<h4>R\u00fcckmeldungen \u00fcber Befehle ber\u00fccksichtigen<\/h4>\n<p>Wenn Sie einen Befehl ver\u00f6ffentlichen, haben Sie keinen unmittelbaren R\u00fcckkanal. Daher k\u00f6nnte es sinnvoll sein, eine Hierarchie f\u00fcr spezifische R\u00fcckmeldungen zu bestimmten Befehlen einzurichten - ob das Ger\u00e4t den Befehl erhalten hat und ausf\u00fchren konnte, um dem Benutzer eine R\u00fcckmeldung geben zu k\u00f6nnen.<\/p>\n<p>Ein Muster, das ich hier anzuwenden gedachte, war die Vergabe eindeutiger Befehlskennungen als Teil der Nutzlast der Nachricht, die im R\u00fcckkanal mit einem Statuscode referenziert werden.<\/p>\n<h2>Multicast-Szenarien ber\u00fccksichtigen<\/h2>\n<p>M\u00f6chten Sie, dass mehrere Ger\u00e4te auf eine einzige von Ihnen ver\u00f6ffentlichte Nachricht reagieren? Denken Sie daran, dass Sie keine Platzhalterthemen ver\u00f6ffentlichen k\u00f6nnen - Sie k\u00f6nnen sie nur abonnieren. In diesem Fall sollten zus\u00e4tzliche Themen erstellt werden, die es den Clients erm\u00f6glichen, auf Multicast-Szenarien zu reagieren. Alle Clients \/ alle Clients einer bestimmten Gruppe w\u00fcrden das Multicast-Thema abonnieren und auf die Nachrichten reagieren.<\/p>\n<p>Kombiniert man dies mit meinem obigen Vorschlag zur R\u00fcckmeldung \/ Bezugnahme auf die Befehls-ID, wird eine neue Anforderung an die Client-ID als Nutzlast im (generischen) R\u00fcckmeldekanal eingef\u00fchrt. Eine andere M\u00f6glichkeit ist, die Ger\u00e4te auf ihren individuellen R\u00fcckmeldekan\u00e4len antworten zu lassen - wobei die Ger\u00e4te-ID bereits Teil des Pfades ist. (Das hei\u00dft, sie empfangen einen Befehl auf dem Multicast-Pfad, antworten aber in ihrer eigenen exklusiven Nachrichtenhierarchie).<\/p>\n<h2>Ber\u00fccksichtigung von Verkehr und Datenschutz, Sensortypen<\/h2>\n<p>Wenn Sie ein kommerzielles System betreiben, das z. B. Sensordaten f\u00fcr Benutzer sammelt, m\u00f6chten diese vielleicht genau steuern k\u00f6nnen, welche Sensorwerte \u00fcberhaupt ver\u00f6ffentlicht werden.<\/p>\n<p>Au\u00dferdem erh\u00f6ht die automatische Ver\u00f6ffentlichung aller Sensormesswerte den Datenverkehr und die Belastung Ihres Servers bzw. Ihrer Server.<\/p>\n<p>Daher ist es m\u00f6glicherweise nicht die beste Wahl, einfach alle verf\u00fcgbaren Sensorwerte an Ihren MQTT-Broker zu senden. Eine M\u00f6glichkeit besteht darin, ein \"Retained Topic\" mit einer Konfiguration zu erstellen, die der Client abonnieren kann. Wenn der Client eine Verbindung herstellt, empf\u00e4ngt er automatisch die Konfiguration im Retained Topic und kann die Werte, die er ver\u00f6ffentlicht, entsprechend der Konfiguration anpassen. Au\u00dferdem kann er auf Konfigurations\u00e4nderungen reagieren, indem er auf alle zus\u00e4tzlichen Nachrichten reagiert, die in diesem Konfigurationsthema eingehen.<\/p>\n<p>Au\u00dferdem ist es wichtig zu ber\u00fccksichtigen, dass es verschiedene Arten von Sensoren gibt. Bei einem T\u00fcrsensor w\u00e4ren Sie beispielsweise an einer Status\u00e4nderung (geschlossen vs. offen) interessiert, w\u00e4hrend Sie bei einem Temperatursensor vielleicht kontinuierliche Messwerte erhalten m\u00f6chten. Es ist wichtig, dass Sie bei Ihrem Entwurf ber\u00fccksichtigen, welche Art von Werten die Teilnehmer erhalten, wenn der f\u00fcr die Sensormesswerte zust\u00e4ndige Client die Verbindung trennt. Denken Sie daran, dass Sie einen letzten Willen nur f\u00fcr ein Thema festlegen k\u00f6nnen (bei Multisensorger\u00e4ten). Im Falle einer Verbindungsunterbrechung k\u00f6nnten zur\u00fcckbehaltene Nachrichten einen falschen Eindruck vermitteln (z. B. dass die T\u00fcr offen ist, obwohl sie in Wirklichkeit geschlossen ist, aber nicht aktualisiert wurde usw.). <\/p>\n<p>Wenn jedoch beispielsweise Ihr Webinterface, das den Client steuert, erst verbunden wird, nachdem der T\u00fcrsensor-Client bereits eine Weile verbunden war, und Sie nicht gespeicherte Nachrichten verwenden, wird die Nachricht \u00fcber die letzte Aktualisierung des T\u00fcrstatus verpasst; <\/p>\n<p>Hier gibt es zwei M\u00f6glichkeiten: <\/p>\n<ul>\n<li>aktiv eine Aktualisierung des T\u00fcrstatus anzufordern (z. B. durch Verwendung eines eigenen Get-Themas)<\/li>\n<li>Verwendung von aufbewahrten Nachrichten und Verwendung der clientseitigen Logik der Webschnittstelle, um den letzten Wert zu verwerfen, falls der Client selbst nicht verbunden ist \/ <b>als veraltet markieren<\/b><\/li>\n<\/ul>\n<p>In jedem Fall sollte der Benutzer darauf hingewiesen werden, ob einem Sensormesswert vertraut werden kann oder ob er m\u00f6glicherweise aufgrund eines nicht verbundenen Sensor-Clients falsch ist.<\/p>\n<p>Siehe auch <a href=\"http:\/\/www.steves-internet-guide.com\/mqtt-sensors-traffic-observations\/\" target=\"_blank\">http:\/\/www.steves-internet-guide.com\/mqtt-sensors-traffic-observations\/<\/a><\/p>\n<ul>\n<li>Steve merkt an, dass die Kombination von Sensordaten mehrerer Sensoren in einer JSON-kodierten Nutzlast den Datenverkehr nicht verringert, sondern ihn sogar leicht erh\u00f6hen kann (im Vergleich zu einer nicht kodierten Nutzlast!)<\/li>\n<\/ul>\n<h2>semantischer vs. physischer Themenpfad<\/h2>\n<p><b>Dinge, die f\u00fcr einen Menschen von Bedeutung sind, bilden die Themenstruktur: (\"semantischer Ansatz\")<\/b><\/p>\n<p>Haus\/Bad\/Luftfeuchtigkeit<\/p>\n<p><b>Ger\u00e4tepfade (an welche Ger\u00e4te sind die Sensoren angeschlossen, wie werden sie angesprochen?) erstellen die Themenstruktur: (\"physikalischer Ansatz\")<\/b><\/p>\n<p>pi\/00000234898324734\/i2c\/10\/pressure<\/p>\n<p>(die Zahlen symbolisieren die BCM-Seriennummer bzw. die I2C-Adresse).<\/p>\n<p><b>Neuver\u00f6ffentlichung<\/b><\/p>\n<p>Bei dieser Idee w\u00fcrden Sie beide Ans\u00e4tze kombinieren und einen zus\u00e4tzlichen Dienst schaffen, der zwischen den beiden Welten vermittelt.<\/p>\n<p>Siehe: <a href=\"https:\/\/tinkerman.cat\/post\/mqtt-topic-naming-convention\" target=\"_blank\">https:\/\/tinkerman.cat\/post\/mqtt-topic-naming-convention<\/a><\/p>\n<h1>\u00dcbersicht der Online-Designvorschl\u00e4ge<\/h1>\n<h2>Vorschlag 1: Himbeer-Tal<\/h2>\n<p>von: <a href=\"https:\/\/raspberry-valley.azurewebsites.net\/MQTT-Topic-Trees\/\" target=\"_blank\">https:\/\/raspberry-valley.azurewebsites.net\/MQTT-Topic-Trees\/<\/a><\/p>\n<p>ger\u00e4tekategorie\/ger\u00e4te-id\/zahllast-kontext\/zahllast-differentiator<\/p>\n<ul>\n<li>Ger\u00e4tekategorie: z. B. \"pi\", \"arduino\", usw.<\/li>\n<li>Ger\u00e4te-ID: z. B. BCM seriell<\/li>\n<li>Nutzlast-Kontext: z.B. Temperatur<\/li>\n<li>Nutzlast-Unterscheidungsmerkmal: z. B. vorne\/hinten (Hinzuf\u00fcgen einer Messebene f\u00fcr einen bestimmten Kontext)<\/li>\n<\/ul>\n<p>Beachten Sie die Symmetrie zwischen Ger\u00e4tekategorie\/Ger\u00e4te-ID und Nutzlast-Kontext\/Nutzlast-Unterscheidungsmerkmal (allgemein-&gt; spezifisch; allgemein-&gt; spezifisch)<\/p>\n<h2>Vorschlag 2: Steve<\/h2>\n<p>(Von Steve): <a href=\"http:\/\/www.steves-internet-guide.com\/mqtt-topic-payload-design-notes\/\" target=\"_blank\">http:\/\/www.steves-internet-guide.com\/mqtt-topic-payload-design-notes\/<\/a><\/p>\n<p>Sie k\u00f6nnen die folgenden Elemente in Ihren Themenbaum aufnehmen:<\/p>\n<ul>\n<li>Vorrichtungen zur Gruppierung von Themen auf hoher Ebene<\/li>\n<li>zugewiesener Sensorname<\/li>\n<li>Funktion (z.B. set \/ status \/ get \/ cmd )<\/li>\n<\/ul>\n<p>Steves Ansatz:<\/p>\n<ul>\n<li>Verwendung des Themennamens f\u00fcr ein einzelnes Ger\u00e4t (z. B. einen Sensor)<\/li>\n<li>Nutzdaten \/ JSON-Daten f\u00fcr Attribute dieses Sensors verwenden<\/li>\n<li>getrennte Bereiche f\u00fcr Daten und Befehle verwenden<\/li>\n<\/ul>\n<h2>Vorschlag 3: MQTT-Smarthome<\/h2>\n<p>MQTT Smarthome Vorschlag<\/p>\n<p><a href=\"https:\/\/github.com\/mqtt-smarthome\/mqtt-smarthome\" target=\"_blank\">https:\/\/github.com\/mqtt-smarthome\/mqtt-smarthome<\/a><\/p>\n<p>Ein Pfad sieht in diesem Vorschlag wie folgt aus:<\/p>\n<p>toplevelname\/funktion\/item<\/p>\n<p>knxgateway1\/status\/K\u00fcche\/Lichter\/Vorne links<\/p>\n<ul>\n<li>erste Ebene (knxgateway1) = Toplevelname, das konkrete Gateway, das angesprochen wird<\/li>\n<ul>\n<li>bei mehreren \u00e4hnlichen Gateways muss dieser Name einstellbar sein, um Kollisionen im Namensraum zu vermeiden<\/li>\n<\/ul>\n<li>zweite Ebene (Status) = Funktion<\/li>\n<li>dritte Ebene, und weitere Ebenen -&gt; individuelle Adresshierarchie des jeweiligen Gateways (Item)<\/li>\n<\/ul>\n<p>Das Interessante sind die Funktionen und ihre Position <b>vor<\/b> die tieferen Pfade (beachten Sie die Platzhalter f\u00fcr das Abonnement - auf diese Weise k\u00f6nnen Sie alle Ger\u00e4testatusberichte einfach abonnieren!)<\/p>\n<p>Verf\u00fcgbare \/ definierte Funktionen in diesem Vorschlag:<\/p>\n<ul>\n<li>status - zum Abrufen von Statusberichten<\/li>\n<li>set - f\u00fcr die Anforderung von Zustands\u00e4nderungen<\/li>\n<li>get - (optional) f\u00fcr die aktive Anforderung einer Statusaktualisierung (f\u00fcr Gateways, die dies unterst\u00fctzen)<\/li>\n<ul>\n<li>wird das Ergebnis des Lesevorgangs im Internet ver\u00f6ffentlicht. <b>Status<\/b> Hierarchie.<\/li>\n<\/ul>\n<\/ul>\n<p>Die nachfolgenden Hierarchien f\u00fcr die einzelnen Verben sollten einander entsprechen, so dass Sie dasselbe Ger\u00e4t \/ denselben Knoten \/ Parameter ansprechen w\u00fcrden.<\/p>\n<p>Es gibt ein spezielles Thema \"verbunden\" pro Gateway, das es dem Kunden erlaubt, eine testamentarische Nachricht zu setzen <\/p>\n<p>toplevelname\/verbunden <\/p>\n<p>sind f\u00fcr dieses Thema einfache Werte definiert:<\/p>\n<ul>\n<li>0 = nicht mit dem Makler verbunden (als letzter Wille eingestellt)<\/li>\n<li>1 = mit MQTT verbunden, von der Hardware abgekoppelt<\/li>\n<li>2 = verbunden mit MQTT und Hardware (voll funktionsf\u00e4hig)<\/li>\n<\/ul>\n<p>Beachten Sie, dass der Wert 0 nicht zwischen freiwilligen Verbindungsabbr\u00fcchen oder einem Verbindungsabbruch (bei dem die Keepalives eine Zeit\u00fcberschreitung aufweisen) unterscheidet. <\/p>\n<p>Es gibt auch Vorschl\u00e4ge f\u00fcr die Nutzlast:<\/p>\n<p>Die JSON-Kodierung der Nutzdaten ist optional.<\/p>\n<p>Im Falle der JSON-Kodierung befindet sich der Wert immer im Schl\u00fcssel \"val\". Zus\u00e4tzlich, <\/p>\n<p>ts : Zeitstempel (Zeitstempel, Millisekunden seit Epoch)<\/p>\n<p>lc : letzte \u00c4nderung des Wertes (Zeitstempel, Millisekunden seit Epoch)<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image001.png\"><img loading=\"lazy\" decoding=\"async\" width=\"282\" height=\"207\" title=\"clip_image001\" style=\"display: inline; background-image: none;\" alt=\"clip_image001\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image001_thumb.png\" border=\"0\"><\/a><\/p>\n<h2>Vorschlag 4: Tinkerman<\/h2>\n<p><a href=\"https:\/\/tinkerman.cat\/post\/mqtt-topic-naming-convention\" target=\"_blank\">https:\/\/tinkerman.cat\/post\/mqtt-topic-naming-convention<\/a><\/p>\n<p>\u00dcberlegen Sie, ob Sie einen \"semantischen\" Ansatz (z. B. Dinge, die f\u00fcr den Menschen von Bedeutung sind) oder einen \"physischen\" Ansatz (z. B. tats\u00e4chliche Ger\u00e4tepfade, an die Ihr System angeschlossen ist) w\u00e4hlen.<\/p>\n<p>Der physische Ansatz ist maschinenfreundlicher.<\/p>\n<p>(Bitte beachten Sie, dass Tinkermans und mein Verst\u00e4ndnis von Mountpoints und deren Verwendung voneinander abweichen - f\u00fcr mich sind Mountpoints komplett getrennte Themenb\u00e4ume, z.B. f\u00fcr Multi-Tenancy)<\/p>\n<p>Metadaten k\u00f6nnen als Postfix-Pfade kodiert werden.<\/p>\n<p>z.B.. <\/p>\n<p>\/home\/schlafzimmer\/temperatur -&gt; 21<\/p>\n<p>\/home\/Schlafzimmer\/Temperatur\/Einheiten -&gt; \u00b0C<\/p>\n<p>\/home\/bedroom\/temperature\/timestamp -&gt; 2012-12-10T12:47:00+01:00<\/p>\n<p>Hinweis: Da es unwahrscheinlich ist, dass sich die Einheiten und einige andere Metadaten \u00e4ndern, k\u00f6nnen sie als beibehaltene Themen gesendet werden.<\/p>\n<p>Ein interessanter Teil dieses Vorschlags ist auch die Aggregation (Ger\u00e4teseite):<\/p>\n<p>\/home\/bedroom\/temperature\/last -&gt; letzter Temperaturwert<\/p>\n<p>\/home\/schlafzimmer\/temperatur\/letzter\/zeitstempel<\/p>\n<p>\/home\/bedroom\/temperature\/last24h\/max -&gt; H\u00f6chstwert in den letzten 24h <\/p>\n<p>\/home\/bedroom\/temperature\/last24h\/max\/timestamp -&gt; Zeitstempel, an dem die Temperatur so hoch war<\/p>\n<p>\/home\/schlafzimmer\/temperatur\/last24h\/min<\/p>\n<p>\/home\/bedroom\/temperature\/ever\/max -&gt; die absolut h\u00f6chste jemals gemessene Temperatur<\/p>\n<p>Auch diese Werte k\u00f6nnten als beibehaltene Themen eingestellt werden (insbesondere \"immer\"), um Netzwerkverkehr zu sparen - das empfangende System k\u00f6nnte \u00e4ltere beibehaltene Werte verwerfen (wenn der Sensor nicht mehr angeschlossen ist, was durch ein anderes Thema ersichtlich sein sollte - m\u00f6glicherweise durch Testament &amp; Testament eingestellt), oder das System k\u00f6nnte sie als \"veraltete\" Werte anzeigen. <\/p>\n<p>Dies ist ein interessantes Design (f\u00fcr die Aggregation) und k\u00f6nnte als Inspiration dienen, um diese Art von Flexibilit\u00e4t zu erm\u00f6glichen.<\/p>\n<h2>Vorschlag 5: Homie IoT Convention<\/h2>\n<p><a href=\"https:\/\/homieiot.github.io\/\" target=\"_blank\">https:\/\/homieiot.github.io\/<\/a><\/p>\n<p>Home IoT konzentriert sich auf die Auffindbarkeit von Knoten in der IoT-Heimautomatisierungsumgebung. Homie verwendet keine JSON-kodierten Nachrichten, sondern eine direkte Darstellung der Nutzdaten f\u00fcr jeden Knoten. Siehe dieses Beispiel:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image003.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"606\" height=\"240\" title=\"clip_image003\" style=\"display: inline; background-image: none;\" alt=\"clip_image003\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image003_thumb.jpg\" border=\"0\"><\/a><\/p>\n<p>Homie definiert einen strengen Zeichensatz, den Sie f\u00fcr die Benennung Ihrer Knoten verwenden d\u00fcrfen, da Sonderzeichen (z.B. $ und der Unterstrich _) f\u00fcr besondere Zwecke verwendet werden.<\/p>\n<p>Sie definiert Datentypen, die als (beibehaltene) Metadaten (\"Attribute\") zu $datatype der einzelnen Eigenschaft ver\u00f6ffentlicht werden (siehe unten f\u00fcr die Definition von Eigenschaft): <\/p>\n<ul>\n<li>Zeichenfolge<\/li>\n<li>Integer<\/li>\n<li>Schwimmer<\/li>\n<li>Boolesche<\/li>\n<li>Enum<\/li>\n<li>Farbe<\/li>\n<\/ul>\n<p>(beachten Sie die Verwendung des $ zur Kennzeichnung besonderer Themen).<\/p>\n<p>Letzter Wille wird verwendet, um das Ger\u00e4t als verloren zu markieren:<\/p>\n<p>Homie\/<i>deviceID<\/i>\/$state -&gt; verloren<\/p>\n<p>Homie definiert 6 m\u00f6gliche <b>Staaten<\/b> f\u00fcr das Ger\u00e4t:<\/p>\n<ul>\n<li>init -&gt; das Ger\u00e4t hat sich mit MQTT verbunden, aber noch nicht alle notwendigen Homie-Nachrichten ver\u00f6ffentlicht<\/li>\n<li>bereit -&gt; das Ger\u00e4t ist angeschlossen und hat die Einrichtung abgeschlossen - alle erforderlichen Nachrichten wurden gesendet<\/li>\n<li>abgetrennt -&gt; das Ger\u00e4t wurde auf saubere Weise abgetrennt<\/li>\n<li>Schlafen -&gt; selbstbeschreibend<\/li>\n<li>verloren -&gt; das Ger\u00e4t hat sich unerwartet abgemeldet (testamentarisch festgelegt)<\/li>\n<li>Alarm -&gt; das Ger\u00e4t ist verbunden, aber etwas stimmt nicht, ein menschliches Eingreifen ist erforderlich<\/li>\n<\/ul>\n<p>Homie empfiehlt die Verwendung von <b>QoS 1<\/b> (da die Natur von Homie es sicher f\u00fcr doppelte Nachrichten macht).<\/p>\n<p>Eine R\u00fcckstellung f\u00fcr <b>Erweiterungen<\/b> wird mit einer umgekehrten Dom\u00e4nennamensyntax erstellt, z. B. org.mycompany.homie-extension<\/p>\n<p><b>Knotenpunkte und Ger\u00e4te<\/b><\/p>\n<p>In Homie-parlance, einem <b>Ger\u00e4t<\/b> ist die grundlegende Hardware-Einheit. Zum Beispiel ein Raspberry Pi, eine Kaffeemaschine, ein Auto.<\/p>\n<p>A <b>Knoten<\/b> ist eine logische, unabh\u00e4ngige Einheit des Ger\u00e4ts. Ein Auto kann beispielsweise einen Knoten \"R\u00e4der\", einen Knoten \"Motor\" und einen Knoten \"Beleuchtung\" haben. <\/p>\n<p><b>Eigenschaften<\/b> stellen grundlegende Eigenschaften des Knotens\/Ger\u00e4ts dar. Ein Auto k\u00f6nnte z. B. eine Eigenschaft \"Geschwindigkeit\" und eine Eigenschaft \"Temperatur\" f\u00fcr den Motorknoten haben. Eigenschaften k\u00f6nnen beibehalten werden und\/oder einstellbar sein.<\/p>\n<ul>\n<li>beibehalten + nicht einstellbar: z. B. Temperatursensor<\/li>\n<li>retained + settable: Knoten kann eine Eigenschaft ver\u00f6ffentlichen und Befehle f\u00fcr die Eigenschaft empfangen (z.B. Lampenleistung)<\/li>\n<li>nicht festgehalten + nicht einstellbar: z. B. eine T\u00fcrklingel (momentane Ereignisse)<\/li>\n<li>non-retained + settable: Knoten kann Befehle f\u00fcr die Eigenschaft empfangen, z.B. Kaffee br\u00fchen<\/li>\n<\/ul>\n<p><b>Attribute: <\/b><\/p>\n<p>die Attribute sind wichtig f\u00fcr die Homie-Autodiscovery, sie sind spezifiziert und beginnen mit einem $, um ihre besondere Bedeutung anzuzeigen \/ Kollisionen zu vermeiden. Sie werden zum Speichern und Aktualisieren von Metadaten verwendet.<\/p>\n<p>Zum Beispiel ver\u00f6ffentlicht das Ger\u00e4t eine zur\u00fcckgehaltene Nachricht auf<\/p>\n<p>homie\/Ger\u00e4te-ID\/$nodes<\/p>\n<p>mit einer kommagetrennten Liste der Knoten. Um anzugeben, dass es sich bei einem Knoten um ein Array handelt (kann verwendet werden, um z. B. die Vorder- und R\u00fccklichter eines Autos zu gruppieren), wird der Name mit eckigen Klammern am Ende angegeben, z. B. <\/p>\n<p>Lichter[]<\/p>\n<p>Ein Beispiel f\u00fcr den Teilbaum device id:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image004.png\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"290\" title=\"clip_image004\" style=\"display: inline; background-image: none;\" alt=\"clip_image004\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image004_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Homie gibt standardm\u00e4\u00dfig verschiedene Statistiken f\u00fcr das Ger\u00e4t an, die meisten davon optional (au\u00dfer der Betriebszeit). Zum Beispiel:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image005.png\"><img loading=\"lazy\" decoding=\"async\" width=\"573\" height=\"146\" title=\"clip_image005\" style=\"display: inline; background-image: none;\" alt=\"clip_image005\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image005_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Bei Knoten wird wiederum die automatische Erkennung von Eigenschaften erm\u00f6glicht, indem diese im Attribut $properties angegeben werden:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image006.png\"><img loading=\"lazy\" decoding=\"async\" width=\"578\" height=\"100\" title=\"clip_image006\" style=\"display: inline; background-image: none;\" alt=\"clip_image006\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image006_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Auf diese Weise m\u00fcssen Sie als Abonnent nicht alle Ereignisse erraten\/abonnieren, sondern k\u00f6nnen selektiv die Ereignisse abonnieren, die Sie interessieren.<\/p>\n<p>In Homie werden die Metadaten (Attribute) als Suffix zum Pfad ver\u00f6ffentlicht. Z.B. f\u00fcr eine bestimmte Eigenschaft:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image007-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"187\" title=\"clip_image007\" style=\"display: inline; background-image: none;\" alt=\"clip_image007\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image007_thumb-1.png\" border=\"0\"><\/a><\/p>\n<p><b>Kontrolle in Homie<\/b><\/p>\n<p>Homie ist zustandsbasiert. Das bedeutet, dass Sie nicht \"das Licht einschalten\", sondern den Stromstatus eines Ger\u00e4ts auf \"ein\" setzen.<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image008.png\"><img loading=\"lazy\" decoding=\"async\" width=\"577\" height=\"78\" title=\"clip_image008\" style=\"display: inline; background-image: none;\" alt=\"clip_image008\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image008_thumb.png\" border=\"0\"><\/a><\/p>\n<p>dann aktualisiert das Ger\u00e4t seinen Stromversorgungszustand, um mitzuteilen, dass der Befehl ausgef\u00fchrt wurde:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image009.png\"><img loading=\"lazy\" decoding=\"async\" width=\"579\" height=\"81\" title=\"clip_image009\" style=\"display: inline; background-image: none;\" alt=\"clip_image009\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image009_thumb.png\" border=\"0\"><\/a><\/p>\n<p><b>Sendung<\/b><\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image010.png\"><img loading=\"lazy\" decoding=\"async\" width=\"586\" height=\"77\" title=\"clip_image010\" style=\"display: inline; background-image: none;\" alt=\"clip_image010\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image010_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Alarm ist eine willk\u00fcrliche Wahl - die \u00dcbertragung kann zu jedem anderen Thema erfolgen, nach dem die Ger\u00e4te filtern k\u00f6nnen. Die Nachrichten werden an alle Ger\u00e4te gesendet - die Ger\u00e4te k\u00f6nnen darauf reagieren, wenn sie dies wollen.<\/p>\n<p>Dies ist die vollst\u00e4ndigste Spezifikation, die ich bei meiner Online-Recherche finden konnte. Ich pers\u00f6nlich finde, dass er sehr elegant konstruiert ist.<\/p>\n<p>Lesen Sie mehr:<\/p>\n<p><a href=\"https:\/\/homieiot.github.io\/specification\/\" target=\"_blank\">https:\/\/homieiot.github.io\/specification\/<\/a><\/p>\n<h2>Vorschlag 6: Eigene Tracks<\/h2>\n<p><a href=\"https:\/\/owntracks.org\/booklet\/tech\/json\/\" target=\"_blank\">https:\/\/owntracks.org\/booklet\/tech\/json\/<\/a><\/p>\n<p><a href=\"http:\/\/owntracks.org\/booklet\/guide\/topics\/\" target=\"_blank\">http:\/\/owntracks.org\/booklet\/guide\/topics\/<\/a><\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image012.png\"><img loading=\"lazy\" decoding=\"async\" width=\"436\" height=\"328\" title=\"clip_image012\" style=\"display: inline; background-image: none;\" alt=\"clip_image012\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image012_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Owntracks ist eine Open-Source-Anwendung, mit der Sie Ihren eigenen Standort verfolgen und mit Freunden teilen k\u00f6nnen. Der Standort wird \u00fcber HTTP oder MQTT ver\u00f6ffentlicht, <b>idealerweise zu Ihrem eigenen Makler<\/b>. <\/p>\n<p><em>\" Es kann auch erkennen, wenn Sie eine bestimmte Region betreten oder verlassen, f\u00fcr die Sie einen so genannten Wegpunkt festgelegt haben. Damit kann man z. B. einen Aspekt des Hausautomationssystems steuern. (Alle haben das Haus verlassen? Wir k\u00f6nnen das Licht ausschalten.)\"<\/em><\/p>\n<p>Wenn Sie mehr \u00fcber OwnTracks erfahren m\u00f6chten, besuchen Sie diese Website: https:\/\/owntracks.org\/booklet\/<\/p>\n<p><b>\u00dcber das owntracks-Thema Design: <\/b><\/p>\n<p><a href=\"https:\/\/owntracks.org\/booklet\/guide\/topics\/\" target=\"_blank\">https:\/\/owntracks.org\/booklet\/guide\/topics\/<\/a><\/p>\n<blockquote>\n<p>\"Die Grunds\u00e4tze bei der Entwicklung des OwnTracks-Themenbenennungssystems waren<\/p>\n<ul>\n<li>menschliche Lesbarkeit<\/li>\n<li>Verkehrsminimierung<\/li>\n<li>granulare Zugangskontrolle<\/li>\n<\/ul>\n<p>\u201c<\/p>\n<\/blockquote>\n<p>Name des Basisthemas (andere sind m\u00f6glich): <\/p>\n<p>owntracks\/peter\/iPhone<\/p>\n<p>hier ist owntracks ein Pr\u00e4fix, um anderen Anwendungen kollisionsfreie Zugriffe auf den MQTT-Broker zu erm\u00f6glichen.<\/p>\n<p>peter ist der Besitzer von Ortungsger\u00e4ten, und das iPhone ist eines seiner Ger\u00e4te.<\/p>\n<p>Befehle an Ger\u00e4te werden gesendet an: owntracks\/peter\/iPhone\/cmd<\/p>\n<p>die Ausgabe der Befehle wird z.B. in relativen Themennamen ver\u00f6ffentlicht <i>Schritt<\/i>, <i>abladen<\/i> usw.<\/p>\n<p>einige andere Themen werden definiert (Info, Wegpunkt, Ereignis). Ereignisse werden z. B. ver\u00f6ffentlicht, wenn ein Benutzer einen bestimmten Bereich betritt.<\/p>\n<p>Auf diese Weise k\u00f6nnen Sie durch das Abonnieren von owntracks\/+\/+\/event sehen (f\u00fcr Benutzer, f\u00fcr die Sie berechtigt sind, sie zu sehen), wann sie einen bestimmten Bereich betreten oder verlassen.<\/p>\n<p>Owntracks ver\u00f6ffentlicht seine Nachrichten im JSON-Format:<\/p>\n<p><a href=\"https:\/\/owntracks.org\/booklet\/tech\/json\/\" target=\"_blank\">https:\/\/owntracks.org\/booklet\/tech\/json\/<\/a><\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image013.png\"><img loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"194\" title=\"clip_image013\" style=\"display: inline; background-image: none;\" alt=\"clip_image013\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image013_thumb.png\" border=\"0\"><\/a><\/p>\n<p>wie Sie sehen k\u00f6nnen, sind die Funktionen <b>nach<\/b> das Ger\u00e4t.<\/p>\n<p>Da es eine feste \"Tiefe\" f\u00fcr Benutzer\/Ger\u00e4te gibt, die im Voraus bekannt ist, kann das Abonnement f\u00fcr mehrere Benutzer und Ger\u00e4te mit Platzhaltern erfolgen:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image014.png\"><img loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"152\" title=\"clip_image014\" style=\"display: inline; background-image: none;\" alt=\"clip_image014\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image014_thumb.png\" border=\"0\"><\/a><\/p>\n<p>In der JSON-Datei wird die <b>Typ<\/b> des jeweiligen JSON wird in der Nachricht mitgegeben:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image015.png\"><img loading=\"lazy\" decoding=\"async\" width=\"241\" height=\"93\" title=\"clip_image015\" style=\"display: inline; background-image: none;\" alt=\"clip_image015\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image015_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Das ist eine gute Idee! Auf diese Weise k\u00f6nnen Sie \u00fcberpr\u00fcfen, ob Ihre Anwendung das Ereignis richtig versteht, Typpr\u00fcfungen durchf\u00fchren kann usw.<\/p>\n<p>Die einzelnen Elemente werden in nicht-verbaler Form angegeben. Dies hilft, Datenverkehr zu sparen, insbesondere bei Nachrichten, die h\u00e4ufig ver\u00f6ffentlicht werden.<\/p>\n<p>z.B.:<\/p>\n<ul>\n<li>acc: Genauigkeit der gemeldeten Position in Metern (ohne Einheit)<\/li>\n<\/ul>\n<p>viele der Elemente sind fakultativ.<\/p>\n<p>Interessanterweise ist der Ortstyp f\u00fcr verschiedene Ger\u00e4te definiert, die unterschiedliche Elemente unterst\u00fctzen.<\/p>\n<p>Eine einfache testamentarische Nachricht wird ver\u00f6ffentlicht. Sie enth\u00e4lt lediglich den Zeitstempel tst, zu dem das Ger\u00e4t erstmals verbunden wurde.<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image016.png\"><img loading=\"lazy\" decoding=\"async\" width=\"203\" height=\"113\" title=\"clip_image016\" style=\"margin: 0px; display: inline; background-image: none;\" alt=\"clip_image016\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image016_thumb.png\" border=\"0\"><\/a><\/p>\n<p>tst ist ein Unix-Epochen-Zeitstempel. <\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image017.png\"><img loading=\"lazy\" decoding=\"async\" width=\"244\" height=\"102\" title=\"clip_image017\" style=\"margin: 0px; display: inline; background-image: none;\" alt=\"clip_image017\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image017_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Ein interessanter Aspekt dieses Ereignistyps\/Nutzlasttyps ist, dass mehrere Zeitstempel angegeben sind:<\/p>\n<ul>\n<li>wtst: Zeitstempel der Wegpunkt-Erstellung<\/li>\n<li>tst: Zeitstempel, zu dem das Ereignis eingetreten ist.<\/li>\n<\/ul>\n<p>Ein Wegpunkt ist ein Punkt von Interesse, z. B. Ihre Garage - wenn Sie Ihre Garage betreten oder verlassen, wird ein \u00dcbergangsereignis ausgel\u00f6st:<\/p>\n<ul>\n<li>Ereignis: (Eintritt|Austritt)<\/li>\n<\/ul>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image018.png\"><img loading=\"lazy\" decoding=\"async\" width=\"244\" height=\"105\" title=\"clip_image018\" style=\"margin: 0px; display: inline; background-image: none;\" alt=\"clip_image018\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image018_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Ein Konfigurationsereignis. Wenn diese Option aktiviert ist, akzeptieren die Anwendungen auch Fernkonfigurationsmeldungen.<\/p>\n<p>Dieses Ereignis enth\u00e4lt viele m\u00f6gliche Elemente, die ausf\u00fchrlicher sind (z.B. validatecertificatechain) - dies ist sinnvoll, da die Konfiguration als JSON gespeichert werden kann (! -&gt; dies kann als MQTT-Nachricht weitergegeben und gespeichert werden!), und auch, da es nicht oft gesendet wird, ist Ausf\u00fchrlichkeit kein gro\u00dfes Problem, sondern eher ein Vorteil f\u00fcr die Benutzer.<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image020.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"637\" height=\"210\" title=\"clip_image020\" style=\"display: inline; background-image: none;\" alt=\"clip_image020\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image020_thumb.jpg\" border=\"0\"><\/a><\/p>\n<p>z.B. wird eine Aktion mit der \"action\": \"dump\" eine Ver\u00f6ffentlichung der Konfigurationsnachricht unter dem relativen Pfad dump ausl\u00f6sen<\/p>\n<p>F\u00fcr eine Aktion k\u00f6nnen optionale Unterparameter angegeben werden, z. B. ein zu betrachtender Zeitrahmen:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image021.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"113\" title=\"clip_image021\" style=\"display: inline; background-image: none;\" alt=\"clip_image021\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image021_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Eine weitere interessante Design-Idee ist, dass durch eine bestimmte Variation dieser cmd-Meldung ein Browser zu einer bestimmten URL ge\u00f6ffnet werden kann. Wenn man z.B. die Garage betritt, k\u00f6nnte eine Garagenkontrollseite ge\u00f6ffnet werden, ...<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image022.png\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"65\" title=\"clip_image022\" style=\"display: inline; background-image: none;\" alt=\"clip_image022\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image022_thumb.png\" border=\"0\"><\/a><\/p>\n<p>eine <b>Array<\/b> eines anderen Nachrichtentyps kann \/ muss hier als Parameter \u00fcbergeben werden.<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image023.png\"><img loading=\"lazy\" decoding=\"async\" width=\"244\" height=\"106\" title=\"clip_image023\" style=\"display: inline; background-image: none;\" alt=\"clip_image023\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image023_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Das Interessante an dieser Nachricht ist, dass sie auch ein Feld f\u00fcr ein Base64-kodiertes PNG-Bild enth\u00e4lt:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image024.png\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"36\" title=\"clip_image024\" style=\"display: inline; background-image: none;\" alt=\"clip_image024\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image024_thumb.png\" border=\"0\"><\/a><\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image025.png\"><img loading=\"lazy\" decoding=\"async\" width=\"244\" height=\"104\" title=\"clip_image025\" style=\"margin: 0px; display: inline; background-image: none;\" alt=\"clip_image025\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image025_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Die interessante Idee dabei ist, dass eine optionale <b>Ersteller<\/b> mitgegeben werden, das die Entit\u00e4t identifiziert, die diese Wegpunkte erstellt hat.<\/p>\n<p>Beachten Sie auch, dass owntracks den Unterstrich _ f\u00fcr \"spezielle\" Parameter verwendet.<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image026.png\"><img loading=\"lazy\" decoding=\"async\" width=\"244\" height=\"106\" title=\"clip_image026\" style=\"display: inline; background-image: none;\" alt=\"clip_image026\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/05\/clip_image026_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Optional k\u00f6nnen alle diese Meldungen <b>verschl\u00fcsselt<\/b> f\u00fcr den Transport mit einem gemeinsamen symmetrischen Schl\u00fcssel. <\/p>\n<p>Die verschl\u00fcsselte Nutzlast (die urspr\u00fcngliche Nachricht) befindet sich im Element \"data\", Base64-kodiert.<\/p>\n<h3>Nachrichten<\/h3>\n<p>Die Nutzdaten der Nachrichten sind bin\u00e4r und k\u00f6nnen beliebig sein, es ist nicht erforderlich, dass die Nachrichten in UTF-8 g\u00fcltig sind. <\/p>\n<p>Daher k\u00f6nnen Sie auch digitale Daten, z.B. Bilder, als Nutzlast zu bestimmten Themen ver\u00f6ffentlichen. <\/p>\n<p>Viele aktuelle IoT-Dashboards verarbeiten Daten, die als JSON kodiert sind.<\/p>\n<p>Im Allgemeinen scheint es zwei Denkrichtungen zu geben: Nachrichten sind eigentlich Rohwerte, und Metadaten werden im Themenbaum kodiert, und JSON-kodierte Werte, die Metadaten als Nutzdaten enthalten. <\/p>\n<h4>Vorschl\u00e4ge<\/h4>\n<ul>\n<li>Verwendung des JSON-Formats f\u00fcr die Nutzdaten der Nachricht<\/li>\n<li>Attribute in Nachrichten b\u00fcndeln, anstatt einzelne Themen f\u00fcr sie zu erstellen <\/li>\n<li>umfassen:<\/li>\n<ul>\n<li>Nutzlastdaten<\/li>\n<li>Sensor-\/Ger\u00e4te-ID (falls nicht Teil des Themenbaums)<\/li>\n<li>Funktion <\/li>\n<li>Zeitstempel<\/li>\n<\/ul>\n<\/ul>\n<h1>Interessante Ressourcen<\/h1>\n<h2>Awesome MQTT: Sammlung von MQTT-bezogenen Links:<\/h2>\n<ul>\n<li>https:\/\/github.com\/hobbyquaker\/awesome-mqtt<\/li>\n<\/ul>\n<h2>einzelne Projekte:<\/h2>\n<p>twitter-to-mqtt - Ein Python-Daemon, der die Twitter Streaming API nutzt, um auf Tweets zuzugreifen und sie in einem MQTT-Topic zu ver\u00f6ffentlichen.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/knolleary\/twitter-to-mqtt\">https:\/\/github.com\/knolleary\/twitter-to-mqtt<\/a><\/li>\n<\/ul>\n<p>fritz2mqtt - FRITZ!Box mit MQTT verbinden.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/akentner\/fritz2mqtt\">https:\/\/github.com\/akentner\/fritz2mqtt<\/a><\/li>\n<\/ul>\n<h1>Ref:<\/h1>\n<ul>\n<li><a href=\"https:\/\/raspberry-valley.azurewebsites.net\/MQTT-Topic-Trees\/\">https:\/\/raspberry-valley.azurewebsites.net\/MQTT-Topic-Trees\/<\/a><\/li>\n<li><a href=\"https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-5-mqtt-topics-best-practices\/\">https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-5-mqtt-topics-best-practices\/<\/a><\/li>\n<li><a href=\"https:\/\/homieiot.github.io\/\">https:\/\/homieiot.github.io\/<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/homieiot\/convention\">https:\/\/github.com\/homieiot\/convention<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mqtt-smarthome\/mqtt-smarthome\">https:\/\/github.com\/mqtt-smarthome\/mqtt-smarthome<\/a><\/li>\n<li><a href=\"http:\/\/www.steves-internet-guide.com\/mqtt\/\">http:\/\/www.steves-internet-guide.com\/mqtt\/<\/a><\/li>\n<li><a href=\"http:\/\/www.steves-internet-guide.com\/understanding-mqtt-topics\/\">http:\/\/www.steves-internet-guide.com\/understanding-mqtt-topics\/<\/a><\/li>\n<li><a href=\"http:\/\/www.steves-internet-guide.com\/mqtt-topic-payload-design-notes\/\">http:\/\/www.steves-internet-guide.com\/mqtt-topic-payload-design-notes\/<\/a><\/li>\n<li><a href=\"https:\/\/stevessmarthomeguide.com\/setting-up-the-sonoff-tasmota-mqtt-switch\">https:\/\/stevessmarthomeguide.com\/setting-up-the-sonoff-tasmota-mqtt-switch<\/a><\/li>\n<li><a href=\"https:\/\/tinkerman.cat\/post\/mqtt-topic-naming-convention\">https:\/\/tinkerman.cat\/post\/mqtt-topic-naming-convention<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mqtt-smarthome\/mqtt-smarthome\/blob\/master\/howtos\/homematic.md\">https:\/\/github.com\/mqtt-smarthome\/mqtt-smarthome\/blob\/master\/howtos\/homematic.md<\/a> (zeigt den Fluss mit Node RED)<\/li>\n<li><a href=\"https:\/\/owntracks.org\/booklet\/tech\/json\/\">https:\/\/owntracks.org\/booklet\/tech\/json\/<\/a><\/li>\n<\/ul>\n<h2>Wiederver\u00f6ffentlichung:<\/h2>\n<ul>\n<li><a href=\"https:\/\/lodge.glasgownet.com\/2012\/09\/23\/mqtt-republishing-itch\/\">https:\/\/lodge.glasgownet.com\/2012\/09\/23\/mqtt-republishing-itch\/<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kylegordon\/mqtt-republisher\">https:\/\/github.com\/kylegordon\/mqtt-republisher<\/a><\/li>\n<\/ul>\n<h2>Signal K f\u00fcr die Verwendung in der Marine (als m\u00f6gliche Inspiration f\u00fcr das JSON-Format):<\/h2>\n<ul>\n<li><a href=\"http:\/\/signalk.org\/specification\/1.3.0\/doc\/signalk.pdf\">http:\/\/signalk.org\/specification\/1.3.0\/doc\/signalk.pdf<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Generischer MQTT-Hintergrund Bei MQTT wissen Sender und Empf\u00e4nger nichts voneinander - der Broker \u00fcbernimmt die Nachrichten\u00fcbermittlung. Dadurch k\u00f6nnen die Nachrichten r\u00e4umlich, zeitlich und in ihrer Intensit\u00e4t voneinander getrennt werden. Der Sender kann mit der von ihm gew\u00fcnschten Geschwindigkeit und zum gew\u00fcnschten Zeitpunkt senden. Der Empf\u00e4nger kann die Nachrichten abholen, wann er will...<\/p>","protected":false},"author":830,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[402,608],"tags":[619,623,620,622,621,599,626,588,625,618,624],"class_list":["post-10410","post","type-post","status-publish","format-standard","hentry","category-development","category-vernemq","tag-best-practices","tag-dashboard","tag-design","tag-iot","tag-messages","tag-mqtt","tag-payload","tag-protocol","tag-protocol-design","tag-topic-tree","tag-transport"],"_links":{"self":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/10410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/users\/830"}],"replies":[{"embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/comments?post=10410"}],"version-history":[{"count":1,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/10410\/revisions"}],"predecessor-version":[{"id":10411,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/10410\/revisions\/10411"}],"wp:attachment":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/media?parent=10410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/categories?post=10410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/tags?post=10410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}