{"id":235,"date":"2020-11-07T13:58:15","date_gmt":"2020-11-07T12:58:15","guid":{"rendered":"http:\/\/blog.0link.net\/?p=235"},"modified":"2020-11-07T16:50:39","modified_gmt":"2020-11-07T15:50:39","slug":"eine-i2c-mqtt-schnittstelle","status":"publish","type":"post","link":"https:\/\/blog.0link.net\/index.php\/2020\/11\/07\/eine-i2c-mqtt-schnittstelle\/","title":{"rendered":"5. eine I2C-MQTT-Schnittstelle"},"content":{"rendered":"\n<p>Jetzt wird es langsam interessant, denn nun sollen Daten aus dem MQTT zum Ansteuern von LEDs und dem LCD-Display dienen und Taster am Arduino sollen entsprechend im MQTT signalisiert werden. Basierend auf meinen vorherigen Versuchen habe ich also in Python mit smbus und dem &#8222;Display-Treiber&#8220; begonnen ein Schnittstellen-Modul zu schreiben. F\u00fcr die Kommunikation mit dem MQTT-Broker kommt Bibliothek paho-mqtt zum Einsatz. <\/p>\n\n\n\n<h2>Anpassung der lcddisplay.py und i2c_lib.py<\/h2>\n\n\n\n<p>Da es mich schon zu Beginn st\u00f6rte, dass die Display-Beleuchtung immer eingeschaltet ist, habe ich mir mal den &#8222;LCD-Treiber&#8220; (lcddriver.py) genauer angeschaut. Dort werden im Wesentlichen Byte-Konstanten definiert und es folgt eine Umsetzung der Daten in Byte-Folgen und die Adressierung f\u00fcr das Display. <\/p>\n\n\n\n<p>Dieses Skript greift wiederum auf ein weiteres Skript im Paket zu (i2c_lib.py), dass eine Handvoll smbus-Funktionen in einer Klasse wrappt und die Device-Adresse des Displays festlegt. Erst hatte ich \u00fcberlegt das Skript komplett rauszuwerfen, habe mich dann aber dazu entschlossen diesen Wrapper zu erweitern, um Fehler bei der I2C-Kommunikation abzufangen und Retrys und Timeouts zu realisieren. Mit ein paar weiteren Anpassungen f\u00fcr die Adressierung beliebiger Slaves ist es nun mein I2C-Busmaster geworden.<\/p>\n\n\n\n<p>Im Display-Script habe ich auch noch ein paar Dinge umgebaut, so dass nun neben der Adressierung aufgrund der \u00c4nderung im I2C-Wrapper auch die Hintergrundbeleuchtung gesteuert werden kann.<\/p>\n\n\n\n<h2>Abfragen der Eing\u00e4nge, setzen der Ausg\u00e4nge und Anzeigen auf dem LCD<\/h2>\n\n\n\n<p>Nachdem die Verbindung zu den beiden I2C-Slaves (Display und Arduino) steht, wird eine LED angesteuert, wenn das Skript in der Main-Loop angekommen ist und auf dem Display erstmal die Uhrzeit angezeigt. Mit erstaunlich wenigen Befehlen werden zyklisch die Eing\u00e4nge am Arduino abgefragt und in lokale Variablen geschrieben. <\/p>\n\n\n\n<h2>Den Broker kontaktieren<\/h2>\n\n\n\n<p>Mit dem Paket paho-mqtt gestaltet sich auch die Kommunikation mit dem MQTT-Broker recht einfach. Ich lasse mein Schnittstellen-Skript eine Nachricht an den Broker senden, wenn es Einsatzbereit ist und mache einen subscribe auf ein paar Topics, die derzeit von der Node-RED-Pseudo-BMZ mit Daten bef\u00fcllt werden.<\/p>\n\n\n\n<p>Im ersten Schritt lasse ich eine LED als Alarmsignal leuchten und schreibe die vom MQTT kommende Alarmmeldung aufs Display. Im Ruhezustand erzeugt die Node-RED-BMZ eine Ausgabe der aktuellen Uhrzeit.<\/p>\n\n\n\n<p>Im zweiten Schritt sende ich Nachrichten an den Broker, wenn bestimmte Tasten am Arduino gedr\u00fcckt werden. Die weitere Verarbeitung l\u00e4uft dann allein im Node-RED.<\/p>\n\n\n\n<h2>Test mit MCP23017<\/h2>\n\n\n\n<p>Nachdem ich mich bei meiner Kommunikation zwischen Pi und Arduino an der Ansteuerung des MCP23017 orientiert habe, war es nun Zeit den Arduino eben durch den Portexpander zu ersetzen. Im Python musste ich noch den Befehl zur Initialisierung der Ein-Ausg\u00e4nge hinzuf\u00fcgen, da ich diese im Arduino hardcoded hatten.<\/p>\n\n\n\n<p>Nach Umstecken des I2C, der LEDs und Taster auf den MCP und Neustart des Skriptes funktionierte dieser sofort wie erwartet. Damit war die I2C-Schnittstelle f\u00fcr Display und ein paar erste LEDs und Taster funktional. Eine weitere Ausdehnung auf alle LEDs und Taster am FBF und FAT macht ohne entsprechende Hardware noch keinen Sinn, aber wo ein Portexpander funktioniert, funktionieren auch zwei \ud83d\ude09<\/p>\n\n\n\n<h2>Das Interface-Skript (nodebma_interface.py)<\/h2>\n\n\n\n<p>Das soeben gebaute Python-Interface zwischen MQTT und I2C kommt nun in eine screen-Session und wird als systemd-Service angelegt.<\/p>\n\n\n\n<p>Da ich ein Freund von Textausgaben auf der Konsole bin, nutze ich gerne screen, um bei Bedarf einfach mal schauen zu k\u00f6nnen, was mein Skript gerade so macht. Nat\u00fcrlich k\u00f6nnte ich auch ein Logging in eine Datei machen &#8211; vielleicht baue ich das noch mal um.<\/p>\n\n\n\n<h2>und wie immer noch ein Link dazu<\/h2>\n\n\n\n<p>paho-mqtt f\u00fcr Python | <a rel=\"noreferrer noopener\" href=\"https:\/\/pypi.org\/project\/paho-mqtt\/\" target=\"_blank\">Webseite<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jetzt wird es langsam interessant, denn nun sollen Daten aus dem MQTT zum Ansteuern von LEDs und dem LCD-Display dienen und Taster am Arduino sollen entsprechend im MQTT signalisiert werden. Basierend auf meinen vorherigen Versuchen habe ich also in Python mit smbus und dem &#8222;Display-Treiber&#8220; begonnen ein Schnittstellen-Modul zu schreiben. F\u00fcr die Kommunikation mit dem &hellip; <a href=\"https:\/\/blog.0link.net\/index.php\/2020\/11\/07\/eine-i2c-mqtt-schnittstelle\/\" class=\"more-link\"><span class=\"screen-reader-text\">5. eine I2C-MQTT-Schnittstelle<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6,7,3],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/235"}],"collection":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/comments?post=235"}],"version-history":[{"count":4,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/235\/revisions"}],"predecessor-version":[{"id":262,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/235\/revisions\/262"}],"wp:attachment":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/media?parent=235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/categories?post=235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/tags?post=235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}