
Адаптер шины 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
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/)