CAN-Bus

Интеграция с шиной CAN

Текущий релиз
2.3.1
Разработчик
Peter Müller
Лицензия
CC-BY-NC-SA-4.0

Логотип

Адаптер шины CAN для ioBroker

Этот адаптер подключает ioBroker к сети контроллеров (CAN-шине).

Этот адаптер использует библиотеки Sentry для автоматического сообщения разработчикам об исключениях и ошибках в коде. Более подробную информацию, а также инструкции по отключению отправки сообщений об ошибках см. в документации Sentry-Plugin ! Система отчетности Sentry используется начиная с js-controller 3.0.

Функции

  • Приём и отправка необработанных сообщений с использованием стандартных и расширенных кадров.
  • Каждое сообщение может быть настроено для приема и/или отправки данных.
  • Возможность автоматического добавления объектов для увиденных CAN-сообщений, которые еще не настроены.
  • Настройте парсеры для каждого сообщения, чтобы они считывали/записывали данные из/в буфер необработанного сообщения.
    • Числовые типы
    • Логические значения, включая поддержку битовых масок.
    • Строки в разных кодировках символов
    • Пользовательские скрипты для чтения/записи из/в буфер необработанных данных
  • Расширенные функции импорта/экспорта
    • Импортируйте конфигурации сообщений, чтобы расширить существующую конфигурацию.
    • Импортируйте предопределенные "общеизвестные" конфигурации из GitHub через административный интерфейс.
    • Экспортируйте и импортируйте конфигурации сообщений следующим образом: json или csv файлы
  • Дополнительная поддержка фиксированной длины данных (DLC)
  • Дополнительная поддержка флага RTR
  • Дополнительные необработанные состояния, содержащие необработанные объекты сообщений CAN.
  • Дополнительная опция: автоматическая установка определенного значения в заданном интервале для каждого парсера (полезно для опроса данных).

Требования

  • Операционная система Linux (из-за использования библиотеки socketcan)
  • CAN-оборудование, поддерживаемое ядром, создает интерфейс, подобный... can0
  • Некоторые сведения о сообщениях, передаваемых по шине CAN.

Парсеры

С помощью парсеров можно считывать данные из буфера сообщений CAN или записывать в него данные.

Для следующих типов данных предусмотрены предопределенные парсеры.
Кроме того, вы можете писать собственные скрипты для чтения/записи значений с помощью пользовательского парсера .

Числовые типы в представлении с порядком байтов big-endian и little-endian

  • Знаковые и беззнаковые 8, 16 и 32-битные целые числа
  • 32-битное число с плавающей запятой
  • 64-битное число с плавающей запятой

Логический

  • 1 байт, включая поддержку битовой маски

Нить

  • длина от 1 до 8 байт
  • Кодировка: ascii , base64 , hex , latin1 , utf8 , utf16le

Обычай

Для создания собственного парсера вам потребуется предоставить собственный скрипт для чтения и записи.
Эти скрипты должны быть написаны на чистом JavaScript и будут работать в ограниченном объеме памяти.

В скриптах вы можете использовать следующие функции:

  • Глобальные 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
  • Функции логирования адаптера log.warn('something'), log.info('something'), log.debug('something')
  • getStateAsync('id'), getObjectAsync('id'), setStateAsync('id', 'value', ack) где id это частичный идентификатор состояния/объекта, расположенного ниже текущего экземпляра адаптера.
  • getForeignStateAsync('id'), getForeignObjectAsync('id') и setForeignStateAsync('id', 'value', ack) где id это полный идентификатор состояния/объекта.
  • Функция wait(ms) возвращает Promise, который выполняется по истечении заданного времени.
  • Объект sharedData который используется всеми пользовательскими скриптами экземпляра адаптера.

Ошибки в скриптах будут регистрироваться адаптером.

В обоих скриптах переменные buffer и value являются предопределенными.
buffer Всегда содержит текущее содержимое CAN-сообщения в виде буфера Node.js.

Он sharedData Объект по умолчанию пуст и может использоваться для обмена некоторыми данными между несколькими вызовами одного пользовательского парсера или даже между несколькими пользовательскими парсерами.

Пользовательский скрипт чтения

В скрипте чтения вам нужно прочитать value из buffer переменная.

В начале пользовательского скрипта чтения, buffer будет копия данных полученного/текущего CAN-сообщения (как в .json состояние). value будет undefined и должен быть установлен скриптом.

Содержание value Переменная в конце пользовательского скрипта чтения будет использована в качестве нового значения для состояния.
Если value является undefined Это будет проигнорировано. Используя это, вы можете фильтровать сообщения в пользовательском скрипте чтения по частям данных.

Пример пользовательского скрипта чтения

Проверьте первые три байта в полученном буфере на соответствие фиксированным значениям.
Если совпадение найдено, считайте 16-битное знаковое целое число из байтов 3 и 4 буфера и разделите его на 10.

if (buffer[0] === 0xC2 && buffer[1] === 0x10 && buffer[2] === 0x0F) {
  value = buffer.readInt16BE(3) / 10;
}

Причина value Значение устанавливается только в том случае, если первые три байта совпадают; все остальные данные игнорируются и не устанавливают новое значение для состояния.

Пользовательский скрипт для написания

При написании скрипта необходимо изменить (или заменить) следующий код: buffer переменная.

В начале пользовательского скрипта записи, buffer будет копия текущих данных сообщения CAN (как в .json состояние). value устанавливается значение состояния, которое должно быть записано в buffer.

Содержание buffer Переменная в конце пользовательского скрипта записи будет использоваться в качестве новых данных для сообщения CAN.

Вы также можете отменить запись, позвонив по указанному номеру телефона. return false; в пользовательском скрипте записи. Это позволяет предотвратить запись, если не выполняются определенные условия.

Пример пользовательского скрипта для записи

Подготовьте новый буфер с фиксированными значениями.
Запишите значение состояния в буфер в виде 16-битного знакового целого числа, начиная с пятого байта в буфере.

buffer = Buffer.from([0x30, 0x00, 0xFA, 0x06, 0x7E, 0x00, 0x00]);
buffer.writeInt16BE(value, 5);

Новый buffer Затем будет установлено значение .json состояние.
Если для сообщения включена функция автоматической отправки , сообщение будет отправлено автоматически.

Использование в скриптах

Вы можете управлять/изменять это. <messageId>.json или <messageId>.<parserId> состояния в ваших скриптах.

Кроме того, вы можете использовать raw.received и raw.send состояния, если они включены в конфигурации адаптера.
Они хранят строковые JSON-данные сообщения и могут использоваться для обработки каждого полученного или отправленного сообщения независимо от настроенных сообщений. Запись JSON-данных в них осуществляется путем raw.send Укажите, что вы можете отправлять CAN-сообщения, содержащие любые данные по вашему желанию.

Пример объекта необработанного сообщения

{
  "id": 42,
  "ext": false,
  "data": [0, 13, 37, 255],
  "rtr": false
}

ext и rtr являются необязательными и по умолчанию установлены false.

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/)