Добрый день!
Просьба написать инструкцию по подключению нового датчика на базе интерфейса USB в ПО wirenboard. В линуксе к датчику есть драйвер - необходимо прописать новый датчик в метаданных wiren и сделать обвязку для работы с MQTT. Датчик, например, такой
Искал на вики - не нашёл нужной информации.
Спасибо!
А в линуксе через что вы показания читайте? Инструкции в общем виде такой не бывает, со всеми по разному.
Можете посмотреть на https://github.com/contactless/wb-mqtt-co2mon и https://github.com/contactless/wb-mqtt-bmp085
Благодарю!
В линуксе всё более менее стандартно - есть устройство /dev/xxx чтение из него и обработка программой/скриптом даёт человеческие показания датчика. Этот случай покрывает добрую половину всех вариантов. Можно ли для этого случая описать процесс добавления нового датчика в платформе wiren?
Подумаем про это, но прямо сейчас ресурсов на подробную инструкцию нет, да и мне собственно не очень понятен адресат такой инструкции.
Собственно “драйвер” для нового датчика должен делать две вещи:
- отправлять при старте в MQTT метаинформацию с названием устройства и типом каналов
- отправлять периодически данные в какой-то канал.
Самые простые способы это сделать, это либо написать скрипт/программу на любимом языке программирования (например шелл-скрипт) и поставить его в автозагрузку, либо реализовать как скрипт в системе правил на 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)