
CAN-Bus-Adapter für ioBroker
Dieser Adapter verbindet ioBroker mit einem Controller Area Network (CAN-Bus).
Dieser Adapter nutzt die Sentry-Bibliotheken, um Ausnahmen und Codefehler automatisch an die Entwickler zu melden. Weitere Details und Informationen zum Deaktivieren der Fehlerberichterstattung finden Sie in der Sentry-Plugin-Dokumentation ! Die Sentry-Berichterstattung wird ab js-controller 3.0 verwendet.
Merkmale
- Empfangen und Senden von Rohnachrichten mithilfe von Standard-Frames und erweiterten Frames
- Jede Nachricht kann für den Empfang und/oder das Senden von Daten konfiguriert werden.
- Möglichkeit, Objekte für erkannte CAN-Nachrichten automatisch hinzuzufügen, die noch nicht konfiguriert sind
- Konfigurieren Sie Parser für jede Nachricht, um Daten aus dem Rohnachrichtenpuffer zu lesen/in diesen zu schreiben.
- Numerische Typen
- Boolesche Werte einschließlich Bitmaskenunterstützung
- Zeichenketten in verschiedenen Zeichenkodierungen
- Benutzerdefinierte Skripte zum Lesen/Schreiben aus/in den Puffer von Rohdaten
- Erweiterte Import-/Exportfunktion
- Importieren Sie Nachrichtenkonfigurationen, um Ihre bestehende Konfiguration zu erweitern.
- Importieren Sie vordefinierte, „bekannte“ Konfigurationen von GitHub über die Admin-Oberfläche.
- Exportieren und importieren Sie Ihre Nachrichtenkonfigurationen als
jsonodercsvDateien
- Optionale Unterstützung für feste Datenlängen (DLC)
- Optionale Unterstützung für das RTR-Flag
- Optionale Rohzustände, die rohe CAN-Nachrichtenobjekte enthalten
- Optional: Automatische Festlegung eines bestimmten Werts in einem vorgegebenen Intervall für jeden Parser (nützlich für die Datenabfrage).
Anforderungen
- Linux-Betriebssystem (wegen der verwendeten socketcan-Bibliothek)
- CAN-Hardware, die vom Kernel unterstützt wird und eine Schnittstelle wie diese erstellt
can0 - Kenntnisse über die Nachrichten, die über den CAN-Bus gesendet werden
Parser
Mithilfe von Parsern können Sie Daten aus dem CAN-Nachrichtenpuffer lesen oder in diesen schreiben.
Für die folgenden Datentypen sind vordefinierte Parser vorhanden.
Darüber hinaus können Sie eigene Skripte schreiben, um Werte mit einem benutzerdefinierten Parser zu lesen/schreiben.
Numerische Datentypen in Big-Endian- und Little-Endian -Darstellung
- Vorzeichenbehaftete und vorzeichenlose 8-, 16- und 32-Bit-Ganzzahlen
- 32-Bit-Gleitkommazahl
- 64-Bit-Doppelbit
Boolescher Wert
- 1 Byte inklusive Bitmaskenunterstützung
Zeichenkette
- 1 bis 8 Byte Länge
- Kodierung: ASCII , Base64 , Hexadezimal , Latin-1 , UTF-8 , UTF-16LE
Brauch
Für einen benutzerdefinierten Parser müssen Sie Ihr eigenes Lese- und Schreibskript bereitstellen.
Diese Skripte sollten reines JavaScript sein und nur in einem begrenzten Bereich ausgeführt werden.
In den Skripten stehen Ihnen folgende Funktionen zur Verfügung:
- Globals
undefined,NaN,isNaN,Infinity,isFinite,atob,btoa,encodeURI,encodeURIComponent,decodeURI,decodeURIComponent,parseFloat,parseInt,JSON,Number,String,Array,BigInt,Blob,Boolean,Date,Map,Math,Object,RegExp,Set,Intl,Buffer,Promise,setTimeout,clearTimeout async/await- Adapter-Protokollfunktionen
log.warn('something'),log.info('something'),log.debug('something') getStateAsync('id'),getObjectAsync('id'),setStateAsync('id', 'value', ack)Woidist die partielle ID des Zustands/Objekts unterhalb der aktuellen Adapterinstanz.getForeignStateAsync('id'),getForeignObjectAsync('id')UndsetForeignStateAsync('id', 'value', ack)Woidist die vollständige ID des Zustands/Objekts- Funktion
wait(ms)das ein Promise zurückgibt, das nach der angegebenen Zeit aufgelöst wird. - Ein Objekt
sharedDatadie von allen benutzerdefinierten Skripten einer Adapterinstanz gemeinsam genutzt wird.
Fehler in den Skripten werden vom Adapter protokolliert.
In beiden Skripten sind die Variablenbuffer Undvalue sind vordefiniert.
buffer Enthält immer den aktuellen CAN-Nachrichteninhalt als Node.js-Puffer.
DersharedData Das Objekt ist standardmäßig leer und kann verwendet werden, um Daten zwischen mehreren Aufrufen eines einzelnen benutzerdefinierten Parsers oder sogar zwischen mehreren benutzerdefinierten Parsern gemeinsam zu nutzen.
Benutzerdefiniertes Leseskript
In einem Leseskript müssen Sie lesenvalue vonbuffer Variable.
Am Anfang des benutzerdefinierten Leseskripts,buffer wird eine Kopie der empfangenen/aktuellen CAN-Nachrichtendaten sein (wie in der.json Zustand).value wird seinundefined und sollte vom Skript festgelegt werden.
Der Inhalt desvalue Die Variable am Ende des benutzerdefinierten Leseskripts wird als neuer Wert für den Status verwendet.
Wennvalue Istundefined Sie wird ignoriert. Damit können Sie Nachrichten im benutzerdefinierten Leseskript nach Datenbestandteilen filtern.
Beispiel für ein benutzerdefiniertes Leseskript
Prüfen Sie, ob die ersten drei Bytes im empfangenen Puffer mit den festgelegten Werten übereinstimmen.
Wenn eine Übereinstimmung gefunden wird, wird aus den Pufferbytes 3 und 4 ein 16-Bit-Ganzzahlwert mit Vorzeichen gelesen und durch 10 geteilt.
if (buffer[0] === 0xC2 && buffer[1] === 0x10 && buffer[2] === 0x0F) {
value = buffer.readInt16BE(3) / 10;
}
Ursache vonvalue wird nur dann gesetzt, wenn die ersten drei Bytes übereinstimmen; alle anderen Daten werden ignoriert und setzen keinen neuen Wert für den Zustand.
Benutzerdefiniertes Schreibskript
In einem Schreibskript müssen Sie Folgendes ändern (oder ersetzen):buffer Variable.
Am Anfang des benutzerdefinierten Schreibskripts,buffer wird eine Kopie der aktuellen CAN-Nachrichtendaten sein (wie in der.json Zustand).value wird auf den Wert des Zustands gesetzt, der in die Datei geschrieben werden soll.buffer Die
Der Inhalt desbuffer Die Variable am Ende des benutzerdefinierten Schreibskripts wird als neue Daten für die CAN-Nachricht verwendet.
Sie können den Schreibvorgang auch stornieren, indem Sie anrufen.return false; im benutzerdefinierten Schreibskript. Dies ermöglicht es Ihnen, Schreibvorgänge zu verhindern, wenn bestimmte Bedingungen nicht erfüllt sind.
Beispiel für ein benutzerdefiniertes Schreibskript
Bereiten Sie einen neuen Puffer mit festen Werten vor.
Schreibe den Zustandswert als vorzeichenbehaftete 16-Bit-Ganzzahl in den Puffer, beginnend mit dem fünften Byte im Puffer.
buffer = Buffer.from([0x30, 0x00, 0xFA, 0x06, 0x7E, 0x00, 0x00]);
buffer.writeInt16BE(value, 5);
Das neuebuffer wird dann als die.json Zustand.
Wenn die Option „Automatisch senden “ für die Nachricht aktiviert ist, wird die Nachricht automatisch gesendet.
Verwendung in Skripten
Sie können die<messageId>.json oder<messageId>.<parserId> Zustände in Ihren Skripten.
Darüber hinaus können Sie dieraw.received Undraw.send Zustände, sofern diese in der Adapterkonfiguration aktiviert sind.
Sie enthalten die als JSON-String formatierten Nachrichtendaten und können verwendet werden, um jede empfangene oder gesendete Nachricht unabhängig von den konfigurierten Nachrichten zu verarbeiten. Durch das Schreiben von JSON-Daten in dieraw.send Sie erklären, dass Sie CAN-Nachrichten senden können, die beliebige Daten enthalten.
Beispiel für ein rohes Nachrichtenobjekt
{
"id": 42,
"ext": false,
"data": [0, 13, 37, 255],
"rtr": false
}
ext Undrtr sind optional und haben standardmäßig den Wertfalse Die
Changelog
2.3.1 (2025-10-25)
- (crycode-de) Updated Sentry DSN
2.3.0 (2025-10-03)
- (crycode-de) Support for Node.js 24
- (crycode-de) js-controller >= 6.0.11, Admin >= 7.6.17 required
- (crycode-de) Fixed issue with importing configurations
- (crycode-de) Updated dependencies
2.2.0 (2025-05-27)
- (crycode-de) Node.js >= 20 and <23, Admin >= 7.4.10 required
- (crycode-de) Optimized admin layout for smaller devices and added a warning on very small devices
- (crycode-de) Updated dependencies
2.1.1 (2024-11-04)
- (crycode-de) Fixed get/set functions in custom parser scripts
2.1.0 (2024-11-03)
- (crycode-de) Allow
setStateAsyncandsetForeignStateAsyncin custom parser scripts - (crycode-de) Allow
setTimeoutandclearTimeoutin custom parser scripts (using the adapters setTimeout implementation) - (crycode-de) Added
waitfunction to custom parser scripts
License
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Copyright (c) 2020-2026 Peter Müller peter@crycode.de (https://crycode.de/)