1-wire - устройства в Linux исторически поддерживуются двумя способами: через ядерные драйверы и через юзерспейсовую штуку под названием owfs. Ядерные драйвера идеологически правильнее, owfs ест больше ресурсов, имеет своеобразную архитектуру и поддерживает больше девайсов и возможностей.
owfs имеет возможность работать поверх ядерного мастера шины 1-wire. Пакет owfs есть в Debian, в ядро вкомпилена поддержка, так что вы можете его поставить и попробовать работать.
В ядерном драйвере 1-wire есть общая поддержка любых w1-устройств, а также специфичный код для разных типов устройств.
Общая (generic) поддержка предоставляет файл в директории /sys/bus/w1/(директория девайса)/rw
, через который из юзерспейса можно совершать операции чтения/записи с соответствующим девайсом. Соответственно, появляется возможность написать в userspace поддержку почти любого чипа, но нужно читать даташиты на чипы.
Пример реализации работы с разными чипами через rw
можно посмотреть например в домотиксе: https://github.com/contactless/domoticz/blob/master/hardware/1Wire/1WireByKernel.cpp
Специфичные для отдельных типов устройств (family) драйвера в ядре предоставляют более высокоуровневый интерфейс в виде всё тех же файлов в sysfs. Например, позволяют напрямую запрашивать температуру у 1-wire термометров через чтение файла w1_slave
.
Список поддерживаемых высокоуровнево устройств и описание можно посмотреть тут http://lxr.free-electrons.com/source/drivers/w1/slaves/
и тут http://lxr.free-electrons.com/source/Documentation/w1/slaves/ . Список поддерживаемых девайсов естественно растёт с увеличением версии ядра. У нас сейчас 3.13, но если что, то нужные драйвера можно портировать и из более свежего ядра.
Текущий “драйвер” для MQTT/Homa для 1-wire-термометров работает через высокоуровневый ядерный интерфейс, его исходники тут: https://github.com/contactless/wb-homa-drivers/blob/master/wb-homa-w1/sysfs_w1.cpp
Соответственно, чтобы поддержать какой-то чип в MQTT/Homa надо сначала каким-то образом научиться обмениваться информацией с чипом.
В порядке убывания “правильности”:
- Либо через высоуровневый ядерный интерфейс, если такая поддержка есть в ядре. Если нужно, то можно попробовать портировать драйвер из более свежей версии.
- Либо через низкоуровневыйц ядерный интерфейс, через файл
rw
- Либо через owfs, используя какой-нибудь из нескольких способов общения с owfs
После этого вам надо или (в том же порядке):
- Добавить соответствующий код в wb-homa-w1
- Написать простой скрипт на любимом языке программирования (хоть на bash), который взаимодействует с mqtt в соответствии с конвенциями.