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