Раз пошла такая… А почему бы не сделать устройство, с составом, вынесенным в заголовок?
Делаем! Делаем вот такое соединение:
Заливаем такой скрипт. Если в вашем браузере он перекорежился — смотрим здесь:
Broker="ВАШ_САЙТ"
port=ВАШ_ПОРТ
myClient="nooLite"
name=myClient
pass="ВАШ_ПАРОЛЬ"
summ = 0
udata =""
ttable = {}
counter = 0
function sendNooMT(channel, comm)
if((comm > 15 and comm < 32) or comm > 155) then
return;
end
local command = {85,80,0,0,0,0,0,0,0,0,0,170}
command[6] = channel
local tempcommand = comm
if (tempcommand < 16) then
command[3] = tempcommand
command[4] = 0
command[7] = 0
else
command[3] = 6
command[4] = 1
command[7] = tempcommand
end
local check = 0
for i = 1, 11 do
check = check + command[i]
end
check = bit.band(check, 0xFF)
command[11] = check;
for i = 1, 12 do
uart.write(0, command[i])
end
end
function clearAll()
udata = ""
ttable = {}
counter = 0
summ = 0
end
uart.on("data",1,
function(data)
udata = udata..data
table.insert(ttable, string.byte(data, 1))
counter = counter + 1
if(udata == "OK\r\n") then
print("bind_mode_off\03")
clearAll()
end
if counter == 1 then
tmr.alarm(0, 1000, 0, function()
clearAll()
end )
end
if counter < 10 then local d = ttable[counter] if d ~= nil then summ = summ + d end end if string.find(udata, "qqqq") ~= nil then node.restart() end if counter == 11 then if ttable[1] == 85 and ttable[11] == 170 and (ttable[10]-1) == bit.band(summ, 0xFF) then if ttable[4] ~= 21 then m:publish(myClient.."/"..ttable[3].."/state",ttable[4],0,0) else local temp = 0 local hempH = ttable[7] local hempL = ttable[6] temp = bit.lshift(bit.band(hempH, 0x0F),8) + hempL if (temp > 0x7FF) then
temp = temp - 0x1000
end
temp = temp * 0.1
m:publish(myClient.."/"..ttable[3].."/state",temp,0,0 )
if ttable[8] ~= 0 then
m:publish(myClient.."/".."10"..ttable[3].."/state",ttable[8],0,0)
end
end
end
clearAll()
end
end, 0)
m = mqtt.Client(myClient, 180, name, pass)
m:lwt("/lwt", myClient, 0, 0)
m:on("offline", function(con)
tmr.alarm(1, 120000, 1, function()
m:connect(Broker, port, 0, function(conn)
tmr.stop(1)
m:subscribe(myClient.."/#",0, function(conn)
end)
end)
collectgarbage()
end)
end)
m:on("message", function(conn, topic, data)
if (string.find(topic, "state")) == nil then
local top = string.gsub(topic, myClient.."/","")
local sendto = ""
if top == "91" then
sendto = sendto.."clear_all_cell"
elseif top == "92" then
sendto = sendto.."clear_one_cell_"..data
elseif top == "93" then
sendto = sendto.."bind_mode_cell_"..data
elseif top == "94" then
sendto = sendto.."bind_mode_off"
else
sendNooMT(tonumber(top), tonumber(data))
sendto = ""
return
end
sendto = sendto.."\03"
print(sendto)
end
sendto = ""
collectgarbage()
end)
tmr.alarm(0, 1000, 1, function()
if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
tmr.stop(0)
m:connect(Broker, port, 0, function(conn)
-- print("connected")
m:subscribe(myClient.."/#",0, function(conn)
end)
end)
end
end)
Итак, OpenHab начал получать через протокол mqtt информацию от MR1132, а также получил в свое распоряжение передатчик MT1132. Как же будем управляться со всем этим хозяйством?
Как отражать температуру и влажность, полагаю, понятно. Я это делаю создав следующие итемы:
Number Temperature_noo_4 "Температура nooLite(4) [%.2f°C]" (MyTest, Temperature) { mqtt="<[mosquitto:nooLite/4/state:state:default]" }
Number Humi_noo_4 "Влажность nooLite(4) [%d %%]" (MyTest, Humidity) { mqtt="<[mosquitto:nooLite/104/state:state:default]" }
Number Temperature_noo_5 "Температура nooLite(5) [%.2f°C]" (MyTest, Temperature) { mqtt="<[mosquitto:nooLite/5/state:state:default]" }
Как следует из кода, на 4 канале MR1132 у меня висит датчик температуры и влажности, на 5 — датчик температуры.
А для управления каждым выключателем придется создать по два итема на штуку. Вот моя ситуация.
В коридоре находится светильник.
Этот светильник управляется одновременно (у светильника три привязки):
- (К-1) датчиком движения (он отправляет на светильник команды 0 и 2)
- (К-2) пультом, который отправляет команды (4 или 5, если долго нажимать на сенсор).
- (П-1)первым каналом передатчика MT1132 (он может отправлять вообще что захотите/сумеете).
Итак, итемы:
Switch Dacha_Coridor "Коридор" (Dacha_group) { mqtt=">[mosquitto:nooLite/1:command:on:2],>[mosquitto:nooLite/1:command:off:0],<[mosquitto:nooLite/9/state:state:MAP(switchNooLite.map)]" }
Number Dacha_Coridor_Cannel "Коридор для анализа" (Dacha_group) { mqtt="<[mosquitto:nooLite/1/state:state:default]" }
Итем Switch Dacha_Coridor отправляет на передатчик MT1132 через mqtt две команды: on (команда 2) и off (команда 0).
Прием на этот итем осуществляется через MR1132 по его каналу 9 (от К-1) да с мэппингом. Что это значит?
В моем случае на 9 канал приемника забинден датчик движения (K-1), который управляет коридорным выключателем (мы «подслушиваем» команды от датчика). Датчик движения, при работе, выдает нормальные nooLite команды 0 и 2, которые напрямую принимаются выключателем, но обязаны быть переведены к понятным для итема значениям. Содержание файла switchNooLite.map простое:
0=OFF
2=ON
А сам файл находится в папке configurations\transform.
Итем Number Dacha_Coridor_Cannel забинден на канал 1 того же приемника MR1132 и ловит («подслушивает») сигналы от пульта(К-2).
Также нам необходимо создать правило (логика очень проста):
rule "When Coridor Light is changed by command 4"
when
Item Dacha_Coridor_Cannel received update 4
then
if (Dacha_Coridor.state == ON) {
postUpdate(Dacha_Coridor, OFF)
}
else {
postUpdate(Dacha_Coridor, ON)
}
end
Заметим, что на sitemap следует помещать (относительно выключателей) только один item: Dacha_Coridor. Item Dacha_Coridor_Cannel предназначен для организации реагирования на команды «4», которые отправляют выключатель (К-2). Путем приема информации на него и анализа через правило «When Coridor Light is changed by command 4» мы можем более менее верно организовать отражение текущей информации о состоянии выключателя.
Как это выглядит на картинке:
PS. Нда… Мне все это достаточно понятно. А вот с каким уровнем подготовки это понятно вам, уважаемые гости? В любом случае, если возникают вопросы, лучше задавать их мне на форуме Амперки. Там удобнее.