CAN-Bus

CAN-Bus-Integration

Aktueller Release
2.3.1
Entwickler
Peter Müller
Lizenz
CC-BY-NC-SA-4.0

Logo

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 alsjson odercsv Dateien
  • 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 erstelltcan0
  • 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:

  • Globalsundefined ,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-Protokollfunktionenlog.warn('something') ,log.info('something') ,log.debug('something')
  • getStateAsync('id') ,getObjectAsync('id') ,setStateAsync('id', 'value', ack) Woid ist die partielle ID des Zustands/Objekts unterhalb der aktuellen Adapterinstanz.
  • getForeignStateAsync('id') ,getForeignObjectAsync('id') UndsetForeignStateAsync('id', 'value', ack) Woid ist die vollständige ID des Zustands/Objekts
  • Funktionwait(ms) das ein Promise zurückgibt, das nach der angegebenen Zeit aufgelöst wird.
  • Ein ObjektsharedData die 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 setStateAsync and setForeignStateAsync in custom parser scripts
  • (crycode-de) Allow setTimeout and clearTimeout in custom parser scripts (using the adapters setTimeout implementation)
  • (crycode-de) Added wait function 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/)