nooLite: MR1132 && MT1132 && ESP8266

Раз пошла такая… А почему бы не сделать устройство, с составом, вынесенным в заголовок?

Делаем! Делаем вот такое соединение:

nooAll1


Заливаем такой скрипт. Если в вашем браузере он перекорежился — смотрим здесь:

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» мы можем более менее верно организовать отражение текущей информации о состоянии выключателя.

Как это выглядит на картинке:

scheme01

PS. Нда… Мне все это достаточно понятно. А вот с каким уровнем подготовки это понятно вам, уважаемые гости? В любом случае, если возникают вопросы, лучше задавать их мне на форуме Амперки. Там удобнее.

Оставьте комментарий