NEWS
[Adapter] CAN-Bus - Beschreibung, FAQ, Diskussionen, etc.
-
ioBroker.canbus
Aktuelle Version Aktuelle Testversion Installationen Github Link https://github.com/crycode-de/ioBroker.canbus Allgemeines
Der CAN-Bus (Controller Area Network) ist ein serielles Bussystem. Er kam ursprünglich vorrangig von Fahrzeugen zum Einsatz und ist inzwischen auch im Bereich der Heimautomatisierung recht verbreitet.
Dieser Adapter soll eine direkte Anbindung eines CAN-Interfaces (z.B.
can0
) an ioBroker ermöglichen.
Hierbei geht es um reine CAN-Nachrichten von bis zu 8 Byte Datenlänge. Aufgesetzte Protokolle wie z.B. CANOpen sind nicht vorgesehen.Unterstützt wird jede Hardware, die auf einem Linux-basierten Betriebssystem vom Kernel unterstützt wird und sich als CAN-Interface meldet. Aufgrund der zugrundeliegenden
socketcan
Library werden Windows-Systeme leider nicht unterstützt.
Features
- Empfangen und Senden von CAN-Nachrichten in Standard- und Extended-Frames
- Jede Nachricht kann einzeln zum Senden und/oder Empfangen konfiguriert werden
- Möglichkeit automatisch empfangene, aber noch nicht konfigurierte, CAN-Nachrichten hinzuzufügen
- Konfiguration von Parsern für die einzelnen CAN-Nachrichten zum Lesen/Schreiben von Daten von/in den Rohdaten-Buffer der Nachrichten
- Zahlentypen
- Boolsche Werte inkl. Bitmasken
- Strings in verschieden Encodings
- Eigene Scripte zum Lesen vom / Schreiben in den Buffer der Rohdaten
- Erweiterte Import/Export Funktionen
- Import von Nachrichtenkonfigurationen zur Erweiterung der bestehenden Konfiguration
- Import vor vordefinierten "bekannten" Konfigurationen von GitHub direkt im Admininterface
- Export und Import der Nachrichtenkonfigurationen als
json
odercsv
Dateien
- Optionale Verwendung der Datenlänge (DLC)
- Optionale Unterstützung des RTR-Flags
- Optionale Raw-States, welche die Rohdaten der empfangenen bzw. gesendeten/zu sendenden CAN-Nachrichten-Objekte beinhalten
- Optional automatisches Senden bestimmter Werte in einem vorgegebenen Intervall (z.B. um regelmäßig aktiv Daten abzufragen)
Anforderungen
- Linux Betriebssystem
- CAN-Hardware, die vom Kernel unterstützt wird und ein Interface wie beispielsweise
can0
bereitstellt - Kenntnisse über die CAN-Nachrichten auf dem Bus (nicht zwingend erforderlich, aber hilfreich)
Parser
Über die Parser können Daten aus den Rohdaten einer CAN-Nachricht extrahiert bzw. in diese hineingeschrieben werden.
Es gibt vordefinierte Parser für die nachfolgend aufgeführten Datentypen und zusätzlich die Möglichkeit eigene Scripte zum Lesen/Schreiben zu erstellen.
Zahlentypen im Big-Endian und Little-Endian Format
- Signed und Unsigned 8, 16 und 32 Bit Integer
- 32 Bit Float
- 64 Bit Double
Boolsche Werte
- 1 Byte inkl. Unterstützung von Bitmasken
Strings
- 1 bis 8 Byte Länge
- Encodings: ascii, base64, hex, latin1, utf8, utf16le
Eigene Skripte
Beim Parsertyp Custom können eigene Skripte zum Lesen/Schreiben der Werte genutzt werden.
Diese Skripte laufen in einer Sandbox (ähnlich den Skripten vom JavaScript Adapter).Folgende Features können in den Skripten genutzt werden:
- Die meisten Node.js Standardfunktionen
async
/await
- Log-Funktionen des Adapters:
log.warn('something')
,log.info('something')
,log.debug('something')
getStateAsync('id')
undgetObjectAsync('id')
, wobeiid
die vollständige ID des States/Objektes ist
Fehler in den Skripten werden vom Adapter abgefangen und ins Log geschrieben.
In beiden Skripen sind die Variablen
value
undbuffer
vordefiniert.buffer
enthält dabei jeweils die aktuellen Rohdaten der CAN-Nachricht als Node.js Buffer.value
sollte beim Lesen auf den gelesenen Wert gesetzt werden. Beim Schreiben enthältvalue
den zu schreibenden Wert.Weitere Details sind in der Readme auf GitHub zu finden.
Vordefinierte Konfigurationen
Für die folgenden Geräte sind im GitHub Repository des Adapters vordefinierte Konfigurationen vorhanden.
Diese sind mit Hilfe der Community entstanden und getestet.
Die Konfigurationen können direkt in der Adminoberfläche des Adapter geladen werden.Wärmepumpe Rotex HPSU Compact / Daikin Altherma
Auslesen und Setzen vieler Parameter der einzelnen Module der Wärmepumpe.
Keine speziellen Zugriffsrechte erforderlich.
Getestet mit Rotex HPSU compact 516 (Baujahr 2013/2017) und Altherma 3 ECH2O.Siehe extra Thema im Forum: Rotex HPSU / Daikin Altherma Wärmepumpe über ioBroker.canbus
Weitere
Wer mag kann mir gerne Exports seiner Konfiguration zukommen lassen, um diese in den Adapter aufzunehmen.
FAQ
Was sind Nachrichten?
Eine Nachricht ist ein auf dem Bus empfangenes oder zu sendendes Datenpaket.
Jede Nachricht hat eine eindeutige ID. Diese ID wird vom Adapter in hexadezimaler Schreibweise für ein Objekt vom Typ Kanal genutzt, z.B.canbus.0.1AA
Weiterhin enthält jede Nachricht null bis acht Byte an Daten. Die Daten werden als Array imjson
-State des jeweiligen Nachrichten-Kanals gespeichert.Was sind Parser?
Über Parser können aus den Rohdaten einer Nachricht Werte ausgelesen bzw. hineingeschrieben werden. Ein Parser übernimmt quasi die Übersetzung zwischen den ioBroker-States und den Datenbytes einer Nachricht.
In der Adminoberfläche des Adapters können zu jeder Nachricht beliebig viele Parser konfiguriert werden.
Jeder konfigurierte Parser erzeugt einen eigenen State im Nachrichten-Kanal, z.B.canbus.0.1AA.mein-parser
.Welche Hardware brauche ich?
Theoretisch geht alles, was vom Linux Kernel und SocketCAN unterstützt wird und somit ein Interface wie z.B.
can0
im System bereitstellt.
Zusammen mit einem Raspberry Pi funktionieren Module MCP2515 CAN-Controller meist sehr gut und zuverlässig. Diese sind oftmals als CAN-Hat fertig zu erwerben.
Weiter Infos zum CAN-Bus am Raspberry Pi gibt es hier.Kann ich einen ELM327 CAN-Adapter verwenden?
Kurz: Nein, da dieser kein wirklich eigenständiger CAN-Controller ist und nicht vom Linux Kernel unterstützt wird.
Es gibt jedoch den Linux SocketCAN driver for ELM327 auf GitHub, womit eine Einbindung über SocketCAN möglich sein soll. Hierzu kann ich aber keine Erfahrungen und auch keinen Support geben.Ich habe eine vordefinierte Konfiguration geladen, aber das sind mir jetzt zu viele Datenpunkte, die ich gar nicht brauche. Was kann ich tun?
Nicht benötigte Nachrichten oder auch einzelne Parser dieser Nachrichten können einfach in der Adminoberfläche gelöscht werden. Beim nächsten Start des Adapters werden dann auch die entsprechenden Datenpunkte gelöscht.
Warum werden von mir gelöschte Nachrichten immer wieder automatisch angelegt?
Das kann zwei Gründe haben:
a) Es wurden nur die Objekte im ioBroker gelöscht, aber nicht die entsprechenden Einträge in der Adapterkonfiguration. In diesem Fall werden die Objekte vom Adapter beim Start automatisch wieder angelegt.
b) In der Adapterkonfiguration ist der Haken bei Gesehene Nachrichten automatisch hinzufügen gesetzt. In diesem Fall werden automatisch Objekte für Nachrichten angelegt, die empfangen wurden, aber noch nicht konfiguriert sind.Woher bekomme ich die Informationen über die CAN-Nachrichten meines Gerätes?
Zu vielen Geräten mit CAN-Bus finden sich diese Informationen im Internet.
Teilweise ist es auch möglich von einem CAN-Dump, also einer Aufzeichnung der über den Bus empfangenen Nachrichten, etwas abzuleiten.
Bei der Übertragung in eine Adapterkonfiguration kann ich gerne unterstützen.
Diskussionen
Einige Diskussionen zum Adapter selbst und der Rotex HPSU Konfiguration sind bereits im Adapter-Test-Thema zu finden.
Alles weitere bitte hier in diesem Thema oder gegebenenfalls in einem extra Thema zu bestimmter Hardware.
-
@crycode
Hallo Crycode, vielen Dank für deinen Adapter lief auf Anhieb. -
@crycode Kurze Frage zum Adapter: ich hab unter der Empfangs ID 690 verschiedene Parser angelegt, teilweise nur zum Testen. Diese Test-Parser möchte ich jetzt wieder löschen. Beim Click auf den Papierkorb (und auch auf den Kopier-Button) passiert aber nichts. Was mache ich falsch?
Nachtrag am 14.08.: Ich hab natürlich alle in den FAQs aufgelisteten Punkte zum Löschen beachtet:
- Häkchen rausgenommen
- Objekte im iobroker gelöscht
Aber in der Adapter-Konfiguration kann ich zwar die gesamte ID 690 löschen, aber nicht einzelne Parser. Der Lösch-Button reagiert einfach nicht.
-
@dreman Huch, das klingt tatsächlich nach einem Bug in der Konfigurationsoberfläche. Kann ich nächste Woche mal bei mir testen.
Kannst du vlt. in der Zwischenzeit mal schauen, ob bei in der Browserconsole (F12 bei den meisten Browsern) beim Klick auf den Button ein Fehler geloggt wird? -
@crycode Problem ist, dass, wenn ich mit der Maus auf/über den Lösch-Button gehe, keine Hand erscheint, d.h. der Button wird nicht als solcher nicht erkannt und das Klicken bleibt folgenlos. Von daher auch kein Fehler in der Browser-Konsole.
-
@dreman Hab es grad mal auf die Schnelle getestet. Bei mir geht alles wie geplant. Welche Adapterversion und welchen Browser (Version?) benutzt du?
Beim Klick auf den Kopieren-Button sollte der Einfügen-Button daneben aktiv werden.
-
@crycode Adapterversion 1.3.1, Chrome und Firefox (aktuellste Version), probiert unter WIN8.1 und WIN10: immer gleiches Verhalten. Gehe mit der Mouse über Kopieren oder Löschen erscheint statt des Mousepfeil kein Handzeichen, d.h. ich kann wild rumklicken, aber es passiert nix. Macht es es Sinn, wenn ich meine Adapter-Konfig-Datei exportiere und dir (privat) schicke?
-
@dreman Mit der Adapterconfig kann das eigentlich nichts direkt zu tun haben, aber schick mir die gerne mal zur Sicherheit.
Welche Version von Admin hast du drauf? -
@crycode Admin 6.3.5, eben upgedated auf 6.8.0: keine Änderung.
-
@dreman Hab deine Config grad mal in meiner Testinstallation geladen. Klappt alles und ich kann auch die einzelnen Parser löschen.
Sind die Buttons bei dir blau hinterlegt (aktiv) oder grau (inaktiv)?
Versuch mal bitte folgendes:
- Auf der "Instanzen" Seite die Dev-Konsole vom Browser mittels F12 öffnen und dort den Reiter Konsole aktivieren.
- Die Einstellungen für den canbus Adapter öffnen.
- Zu dem zu löschenden Parser navigieren.
Dabei sollte in der Konsole eine Ausgabe ähnlich dieser geloggt werden:
Erscheinen bei dir dort Fehlermeldungen? -
Nur vorsichtshalber: es gibt ja auf der Seite 2 Kopier- und 2 Löschbuttons: einmal rechts oben für die komplette ID (bei mir 690) und einmal in der Mitte auf Parser-Höhe. Alle 4 Buttons sind bei bir aktiv. .
Reden wir beide von den beiden Buttons im Bild?In der Konsole sehe ich das identische Bild wie von dir gezeigt. Ich kann auch den zu löschenden Parser anklicken, wird dann mit einem Balken gezeigt. Aber wenn ich dann mit der Mouse auf den Kopier- bzw. Lösch-Button im Bild oben gehe, passiert nichts, es wird auch die Mouseover Hand nicht angezeigt. Und logischerweise ändert sich auch in der Konsole nix. Hilft womöglich nur Adapter löschen/neu installieren und alte Konfiguration laden. Vielleicht verschwindet das Problem dann ja.
-
@dreman Jup, genau die Buttons.
Dein Screenshot brachte mir grade die Erkenntnis, was da los ist und ich kann es bei mir nachstellen.
Da dein Fenster (Bildschirm?) recht schmal ist, sind die Buttons hinter dem Eingabefeld für den Namen. Damit sind sie zwar sichtbar, da das Eingabefeld einen transparenten Hintergrund hat, aber können nicht angeklickt werden.Als Workaround zwei Optionen für dich:
a) Das Browserfenster breiter ziehen, bis die Buttons neben dem Eingabefeld sind.
b) Die Seite mittels STRG+Minus oder STRG+Mausrad drehen verkleinern (heraus zoomen), bis die Buttons daneben sind.Ich werde das Problem zusammen mit der nächsten Adapterversion, die ich eh in den nächsten Wochen machen wollte, dann beheben.
-
@crycode Das war's . Ist halt noch ein alter Old School 4:3 Bildschirm :-).
Danke für die Geduld und Unterstützung. -
@dreman Immer gerne. Nur darüber können Bugs ja gefunden und behoben werden.
-
@crycode Nochmal eine Frage: die mit 'Senden' und 'Automatisch Senden' gekennzeichneten Frames kann ich ja auch über ein Script gezielt starten, die nur mit 'Empfang' definierten Frames lauschen jedoch kontinuierlich auf dem CAN-Bus (so mein Verständnis). Gibt es einen Trick, dieses kontinuierlich Lauschen bei einzelnen mit 'Empfang' definierten Frames zu unterbinden und diese (wie beim Senden möglich) nur gezielt (über ein Script) zu starten? Würde den Empfang von CAN-UDS-Multiframes erheblich erleichtern.
-
@dreman Nein, das geht nicht. Alles was zum Empfang definiert ist, lauscht permanent.
Wenn du Custom Parser nutzt, dann kannst da da drin das Objekt
sharedData
verwenden. Dieses ist in allen Custom Parsern das gleiche und kann von jedem Parser aus gelesen und geschrieben werden.Fiktives Beispiel...
Beim Senden:/* bisheriger Teil hier */ sharedData.requestXySend = true;
Beim Empfangen:
// prüfen ob die Anfrage gesendet wurde if (!sharedData.requestXySend) return; sharedData.requestXySend = false; /* bisheriger Teil hier */
-
@crycode Danke, das hilft mir weiter.