Can2mqtt

Aus c3RE.de
Wechseln zu: Navigation, Suche

Idee

Dat Programm soll bei uns in der Hütte eingesetzt werden um eine Brücke zwischen MQTT (IP, Universell,widespread) und CAN (Zuverlässig, low-level, minimalistisch) zu schlagen. So können wir Sensoren über einen CAN-Bus (der in der Theorie epische 4km lang sein kann!) wunderbar per MQTT/IP auswertbar machen.

Was bringt das?

Weltherrschafft was sonst? Nein longtermgoal is die Vernetzung von Sensoren und mehr flexibilität in der Auswertung. Die Zechenuhr soll auch eines Tages hierüber angesteuert werden. Wer einfach mal mit rumspielen möchte der kann mal am STM-Board auf dem Tisch am Drehknopf drehen und dabei den MQTT-Webclient öffnen. Unter dem Topic huette/clubraum/000/brett/sensors/drehknopp kann man den Wert des Drehreglers ablesen. Alles was man unter huette/clubraum/000/brett/actors/display postet kann man dann auf dem Display ablesen (wenn die Bridge und viele andere Dinge funktionieren ;-))

Bedienung

Zentraler Konfigurationspunkt der Software ist eine Datei mit dem Namen can2mqtt.csv. Sie liegt unter /etc/can2mqtt.csv und ist wie folgt aufgebaut: Es gibt 3 Spalten. Die Spalten sind durch ein einfaches Komma getrennt. In der ersten Spalte wird die CAN-ID dezimal angegeben. In der zweiten Spalte wird der Konvertierungsmodus angegeben. Mehr dazu weiter unten. In der dritten Spalte wird das MQTT-Topic angegeben. Eine ID darf nur einmal vorkommen. Ein Topic darf nur einmal vorkommen. Hier mal der aktuelle Inhalt(mal sehen wie lange der aktuell ist :P)

104,bytes2ascii,huette/serverraum/000/filebitch/sensors/ftp_diskusage_percent
112,bytes2ascii,huette/clubraum/000/brett/actors/display
101,byte2dec,huette/clubraum/000/brett/sensors/drehknopp

An der Stelle sei jedem lesenden auch folgender Artikel ans Herz oder ein anderes zum lesen notwendiges Organ gelegt: MQTT-Topics

Warum can2mqtt?

Und nicht mqtt2can? 1. Es lässt sich so viel schöner sprechen und 2. da nun durchgängig diese Schreibweise verwendet wird hilft es auch beim denken. Überall wo im Programm mit CAN und MQTT hantiert wird ist steht CAN auf der linken Seite und MQTT auf der Rechten Seite. Die Konvertmodi beispielsweise beziehen sich auf CAN->MQTT. Auf dem Rückweg wird automatisch der Konverter mit dem umgekehrten Namen verwendet. Bei byte2dec wäre das zum Beispiel dec2byte. Auch die Logfiles lassen sich so lesen. Links vom Pfeil (->) steht immer das CAN-Frame und Rechts davon die MQTT-Message.

Konvertmodi

Aktuell stehen folgende Konvertierungsmöglichkeiten zur Verfügung:

bytes2ascii

bytes2ascii nimmt auf der CAN Seite raw bytes entgegen und gibt Sie raw nach MQTT weiter. Warum dann der Name mit ascii? Wenn man CAN verwendet hantiert man ersteinmal mit bytes. Wenn man mit Go oder MQTT rumhantiert redet man ersteinmal von strings die nunmal ascii kodiert sind. von MQTT nach CAN wird auch nichts groß konvertiert. Wenn der String länger als 8 Zeichen ist wird der Rest verworfen.

byte2dec

byte2dec nimmt auf der CAN-Seite genau ein Byte entgegen (auch wenn 2-8 Byte mitgegeben werden) und parsed dieses zur Basis 10 und gibt das ergebnis in Ascii wieder aus. Andersherum funktionierts halt andersrum ;-)

Konfiguration

Der Start des Programms erfolgt speziell bei uns in der Hütte über systemd (geiles Teil). Hier die /etc/systemd/system/can2mqtt.service:

[Unit]
Description=Starts the can2mqtt bridge
After=syslog.target network-online.target

[Service]
ExecStart=/home/pi/go/bin/can2mqtt /etc/can2mqtt.csv can0 tcp://127.0.0.1:1883
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

Wie man sieht der Unitname lautet can2mqtt.service. Möchte man also eine neue Zeile in die /etc/can2mqtt.csv einfügen so sollte man can2mqtt danach mit

systemctl restart can2mqtt

Neustarten. Ein Reload (vielleicht sogar über inotify) ist auf der Featureliste.

Kann ich mitmachen?

Gernstens ;-) Gibt noch viel zu tun habs erst heute zum laufen bekommen und es sind noch viele Sachen zu tun. Der Code ist auf GitHub und ich werde jetz hier auch nicht alles reinschreiben was es noch zu machen gibt. Dafür mache ich Issues auf GitHub auf. Das Programm ist in Go geschrieben und es macht echt Bock damit zu programmieren. Also wer auch mal in den Genuss kommen will: Der Programmiere gerne mit.