Инструкция по созданию нового датчика на базе usb-устройства

Добрый день!
Просьба написать инструкцию по подключению нового датчика на базе интерфейса USB в ПО wirenboard. В линуксе к датчику есть драйвер - необходимо прописать новый датчик в метаданных wiren и сделать обвязку для работы с MQTT. Датчик, например, такой
Искал на вики - не нашёл нужной информации.
Спасибо!

А в линуксе через что вы показания читайте? Инструкции в общем виде такой не бывает, со всеми по разному.

Можете посмотреть на https://github.com/contactless/wb-mqtt-co2mon и https://github.com/contactless/wb-mqtt-bmp085

Благодарю!
В линуксе всё более менее стандартно - есть устройство /dev/xxx чтение из него и обработка программой/скриптом даёт человеческие показания датчика. Этот случай покрывает добрую половину всех вариантов. Можно ли для этого случая описать процесс добавления нового датчика в платформе wiren?

Подумаем про это, но прямо сейчас ресурсов на подробную инструкцию нет, да и мне собственно не очень понятен адресат такой инструкции.

Собственно “драйвер” для нового датчика должен делать две вещи:

  1. отправлять при старте в MQTT метаинформацию с названием устройства и типом каналов
  2. отправлять периодически данные в какой-то канал.

Самые простые способы это сделать, это либо написать скрипт/программу на любимом языке программирования (например шелл-скрипт) и поставить его в автозагрузку, либо реализовать как скрипт в системе правил на JS.

Для того, чтобы сделать по первому способо по-моему достаточно прочитать http://contactless.ru/wiki/index.php/MQTT и посмотреть исходники https://github.com/contactless/wb-mqtt-bmp085/blob/master/wb-mqtt-bmp085 . Если останутся вопросы - пишите сюда, постараемся помочь.

Если еще не решили вопрос, то напишите в личку почту, кину пример с MQTT.

А напишите пожалуйста лучше здесь.

Суть такая. На ваш контроллер пишутся данные Modbus мастером. Данные публикуются. И их можно увидеть на вебке и перехватывать через СМС (это второй модуль). Обратная связь тоже работала
Таким же способом создавал модуль работы с GSM модемом. Данные о его работе (прием СМС, качество сети) публикуются в вебке.
Не претендую на красивую реализацию. Но это работало. Сейчас правда переделал . Теперь Wiren мастер а не слэйв
Скрипт на Питоне

import mosquitto
import modbus_tk
import modbus_tk.defines as mdef
from modbus_tk import modbus_rtu
import serial
import time

# modbus addreses 
class controlledDev : 
	 def __init__(self):	#		0         1      2         3            4			5
							# [ mqtt addr , value, ratio , modbus addr , write mask, type ]		
		self.TempSensor = [ "/devices/IndoorTemp/controls/Sensor1" , "N/D" , 10,     0, "w" , "f"]
		self.BoilerONOFF = [ "/devices/Rel_Boiler/controls/OnOff" , "N/D", 1,          11, "r", "i"]
		self.Alarm = [ "/devices/Rel_Boiler/controls/Alarm" , "N/D", 1,                15, "w" , "i"]
		self.BoilerTempSet = [ "/devices/Rel_Boiler/controls/TempSet" , "N/D", 10,      3, "r" , "i"]
		self.VentONOFF = [  "/devices/Ventilation/controls/OnOff" , "N/D", 1,          10, "r" , "i"]
devices = controlledDev()
list = [devices.TempSensor, devices.BoilerONOFF , devices.BoilerTempSet , devices.VentONOFF, devices.Alarm]



logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")

server = modbus_rtu.RtuServer(serial.Serial('/dev/ttyNSC0', 9600, timeout=2))

#creates a slave with id 1 ?
#add 2 blocks of holding registers
slave1 = server.add_slave(1)
slave1.add_block("a", mdef.HOLDING_REGISTERS, 0, 20)#address 0, length 20

server.start()

def is_number(str):
    try:
        float(str)
        return True
    except ValueError:
        return False

def on_message(mosq, obj, msg):
	for i in range(len(list)):
		if list[i][0] == msg.topic :
				list[i][1] = str(msg.payload)
				print list[i]
    
mqttc = mosquitto.Mosquitto()
mqttc.on_message = on_message
#mqttc.on_connect = on_connect
#mqttc.on_publish = on_publish
#mqttc.on_subscribe = on_subscribe
mqttc.connect("localhost", 1883, 60)
mqttc.subscribe([(list[0][0], 0), (list[1][0], 0), (list[2][0], 0), (list[3][0], 0), (list[4][0], 0)])
mqttc.loop_start()

while 1 :
			for elem in list :
						if elem[4] == "w" : 
									if elem[5] == "f" :
												val = float(slave1.get_values("a", elem[3])[0]) / elem[2]
									elif elem[5] == "i" : 
												val = slave1.get_values("a", elem[3])[0] / elem[2]
									if str(val) != elem[1] :
												mqttc.publish( elem[0], val)
						elif elem[4] == "r" :
									if elem[1] != "N/D" :   #if is_number(elem[1]) 
												slave1.set_values("a", elem[3], int(float(elem[1]) * elem[2]))
			time.sleep(2)