Начнем с ESP8266. Да, соединить напрямую с MR1132 его не удалось, а вот с Iskra JS — запросто. Помним, что Iskra имеет на борту шесть UART, в том числе один — толерантный к 5 вольтам.
В ESP8266 зальем универсальную программу, которая предназначена для соединения источника/приемника данных с брокером MQTT. Программа, в нашем случае, называется UARTEspruino001002.lua. Не возбраняется скомпилировать ее до UARTEspruino001002.lc.
Broker="ВАШ САЙТ"
port=1883
myClient="ESPRUINO02"
name=myClient
pass="ВАШ ПАРОЛЬ"
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)
-- print ("Subscribed!")
end)
end)
collectgarbage()
end)
end)
uart.on("data","\n",
function(input)
if wifi.sta.status() == 5 then
-- print("Received from UART:", input)
local topic
local info
topic, info = string.match(input, "(%d+):(%d+%.?%d?%d?)")
if topic ~= nil then
-- print("Publish Topic: "..topic.." and Info: "..info)
if topic == "99" and info == "99" then
node.restart()
end
m:publish(myClient.."/"..topic.."/state",info,0,0)
end
topic = nil
info = nil
collectgarbage()
end
end, 0)
m:on("message", function(conn, topic, data)
if (string.find(topic, "state")) == nil then
local top = string.gsub(topic, myClient.."/","")
-- print("To MR1132 -> ")
print(top..":"..data)
end
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)
print ("Subscribed!")
end)
end)
end
end)
Принцип работы кода таков:
- устанавливается соединение с брокером, реквизиты указаны в начале кода;
- обмен сообщениями с Iskra JS осуществляется в формате (почти JSON) «цифра:цифра(можно с дробной частью)«.
Не забываем предварительно выполнить на ESP8266 следующие команды:
wifi.setmode(wifi.STATION)
wifi.sta.config("ВАША_СЕТЬ","ВАШ_ПАРОЛЬ")
wifi.sta.autoconnect(1)
Их выполнение обеспечивает работу модуля в сети wifi и самостоятельный реконнект. Больше соединять ESP8266 c сетью никаким иным способом не требуется.
После этого, соединяем IskraJS, ESP8266 и MR1132 следующим образом:
Пора и в Искру добавить скрипт. Вот он:
var cmd="";
var message = [];
var command = "";
var inByte = "";
var serial = Serial2;
serial.setup(9600);
Serial6.setup(9600);
// Прием данных от MR1132.
Serial6.on('data', function (data) {
//print(data.charCodeAt(0));
cmd+=data; // Формируем стринг
if(cmd == "OK\r\n") { // Сравниваем с ОК
print("Got OK!");
cmd = "";
}
var idx = cmd.indexOf("\xAA");
while (idx>=0) {
// print("cmd.length = "+cmd.length);
sendTo(cmd);
cmd = "";
idx = cmd.indexOf("\xAA");
}
});
// Отправка данных о командах и информации nooLite
var sendTo = function(mydata) {
print("\nGot Data!");
var counter = 0;
var summ = 0;
while (counter < 11) {
message[counter] = mydata.charCodeAt(counter);
// print("message["+counter+"] = "+message[counter]);
if(counter < 9) {
summ = summ + message[counter];
// print("summ = "+summ);
}
counter++;
}
summ = summ & 0xFF;
// print("summ & 0xFF = "+summ);
if(message[9] == summ+1){
print("Summ is Good. Publishing Data!");
if (message[3] != 21) { // Для недатчиков
serial.write(""+message[2]+":"+message[3]+"\n");
print("From item "+message[2]+ " got message "+message[3]);
if (message[3] === 15) { // Если прошел биндинг - возвращаем модуль
print("Stop Binding Now!"); // в рабочее состояние
Serial6.write("bind_mode_off\003\n");
}
}
else {
var byteHigh = message[6]; // Высчитываем температуру
var byteLow = message[5];
byteHigh = byteHigh & 0x0F;
byteHigh = byteHigh << 8; var temptemp = byteHigh + byteLow; if (temptemp > 0x7ff) {
temptemp = temptemp - 0x1000;
}
temptemp = temptemp * 0.1;
print("From item " +message[2] + " got temperture "+temptemp);
serial.write(""+message[2]+":"+temptemp+"\n");
if(message[7] !== 0) {
print("From item " +message[2] + " got humi "+message[7]+"%");
serial.write("10"+message[2]+":"+message[7]+"\n");
}
}
}
else {
cmd = "";
}
};
// Обработка команд, пришедших из ESP8266
serial.on('data', function(data) {
inByte = data;
// print("InByte = "+inByte+" And Char Code is: "+inByte.charCodeAt(0));
if (inByte.charCodeAt(0) !== 10 && inByte.charCodeAt(0) !== 13) {
command += inByte;
}
if(inByte.charCodeAt(0) == 0x0A || inByte.charCodeAt(0) == 0x0D) {
if(inByte.charCodeAt(0) == 0x0A) {
print("Command = "+command);
comToNoo(command);
command = "";
}
}
});
// Команды на модуль MR1132
var comToNoo = function(messToNoo){
var sendto = "";
var indOfDiv = messToNoo.indexOf(":");
var top = messToNoo.substring(0,indOfDiv);
var data = messToNoo.substring(indOfDiv+1);
print("top is "+top+" && data is "+data);
if (top == "1") {sendto = sendto+"clear_all_cell";}
else if (top == "2") {sendto = sendto+"clear_one_cell_"+data;}
else if (top == "3") {sendto = sendto+"bind_mode_cell_"+data;}
else if (top == "4") {sendto = sendto+"bind_mode_off";}
else {
print ("Unknown Command!");
return;
}
sendto = sendto+"\003\n";
print(sendto);
Serial6.write(sendto);
};
// Запуск скрипта на ESP8266
setTimeout(function() {
serial.write('dofile("UARTEspruino001002.lc")\n');
setTimeout(function(){
command = ""; // Через пять секунд очистим от мусора все
cmd = ""; // что возникает при запуске ESP8266
print('Command Set at "" By Timer');
},5000);
}, 5000);
// Обнуление буфера команд от ESP8266
setInterval(function(){
if(serial.available() === 0) {
command = "";
// print('Command Set at "" By Serial');
}
}, 5000);
В коде основные пояснения даны. Что же из всего этого следует?
Соединив наши устройства и запрограммировав их указанным выше образом, мы получаем возможность как приема информации от MR1132, так и отправки ему команд на биндинг с железом от nooLite. Как это выглядит?
Здесь картинка нормальной работы устройства:
Как происходит биндинг:
Подведем итоги.
По моему скромному мнению, умным домом является тот, который принимает решения за Вас самостоятельно и не беспокоит необходимостью нажимать какие-либо кнопки на экране компьютера/смартфона. (В частности, вот это — не умный дом, а решение для усложнения жизни. Какая разнице, где приходится нажимать кнопку — на смартфоне или на стене?) Элементы умного дома не должны управляться из единого центра, а могут, лишь оповещать его о своем состоянии, либо принимать команды на изменение режима работы. Управление элементами из единого центра — есть зло.
Система nooLite, очень хорошо соответствует такому подходу. В связи с этим, пара слов об участниках эксперимента.
Датчик температуры и влажности и датчик температуры имеют два принципиально разных режима работы: как управляющие устройства и как информационные.
Как информационные, они проявились в данной статье итемами 2 и 3, оповещая нас о текущих показателях. Инженеры Ноотехники придумали классное решение, которое позволяет экономить батарейки: если показатели не изменяются более чем на 0,5 градуса, датчики будут срабатывать один раз в час, иначе — чуть более чем один раз в минуту. Эти показания мы научились принимать и отправлять в OpenHab по протоколу mqtt.
Вместе с тем, в управляющем режиме устройства обеспечивают, посредством команд на силовые блоки, поддержание заданной температуры и влажности. В определенных случаях, это даже более важная функция. При помощи MR1132 мы будем знать, в каком состоянии находятся исполнительные устройства, и это есть реальный умный дом — дом, не достающий нас вопросами о том, что ему делать.
Вместе с тем, в управляющем режиме блоки не сообщают о состоянии температуры. Уверен, что отправка информации о состоянии температуры одновременно с командами на включение/выключение исполнительных устройств технически не сложна, и когда-нибудь будет добавлена в систему. Совместимость от этого вряд ли пострадает. Как только это случится, мы изменим код для разбора ситуации.
Более того, оба этих датчика имеют возможность выступать и датчиками протечки! Для этого требуется небольшой навык работы с паяльником, но о такой возможности забывать не следует.
Что касается датчика движения, он имеет три регулировки: по времени, освещенности и чувствительности. При написании статьи я выставил чувствительность и освещенность на максимум, время включения — на минимум (чтобы он участвовал в моих экспериментах).
И датчик из коридорного повелителя света превратился в датчик охраны. Раз мы принимаем сигналы с него, когда в помещениях хозяев нет, мы имеем полноценную охранную сигнализацию.
Безусловно, в таком режиме датчик в присутствии хозяев находиться не может. Поэтому видятся два пути: или вы, уезжая надолго, снимаете его и перестраиваете режим работы, либо Ноотехника добавит в него маленькую кнопочку и позволит с ее помощью быстро «включать» в датчике режим охраны. Согласитесь, вещь простая — главное до нее додуматься.
В системе OpenHab появилась возможность проталкивать сообщения о критических событиях на абонентов Telegram, и просто глупо не воспользоваться такой возможностью: дополнительная сигнализация нам не помешает.
Теперь о самом герое — модуле MR1132.
Глубоко убежден, что не смотря на простоту работы (см. пример), приемник теми, кому он, вроде бы, предназначался (Ардуино), востребован не будет. Обратите внимание и на объем кода в примере — многовато.
Не исключаю, что передатчик MT1132, в определенных случаях, применяется истинными ардуинщиками, но приемник — маловероятно. На мой взгляд, его наличие востребовано в более мощных решениях, но, как ни странно, модуль для этого не рассмотрен производителем. Для такого применения требуется, пусть и копеечный, согласователь уровней, лишние провода и пайка. Пойди же ты найди еще этот согласователь: даже в Москве я на скорую руку его не нашел. Надо заказывать из Поднебесной.
Тем не менее, в управления домашними устройствами, полагаю, MR1132 является просто необходимым элементом. В этой группе статей мы соединили его с великолепной платой Iskra JS и получили возможность видеть текущее состояние силовых блоков и датчиков, а также дистанционно присоединять и отсоединять новые устройства. Iskra JS, по своим возможностям, с легкостью «вытянет» и UART передатчик MT1132. Ранее мы присоединяли его к Raspberry Pi, на которой установлен OpenHab. Такое решение кажется мне не очень удобным, не исключаю, что в скором времени оба модуля сосредоточатся в Искре.
Как и у многих из вас, мои исполнительные устройства находятся в двух местах — дома и на даче. Значит, как только у меня появится еще один приемник и согласователь уровней — буду делать второе приемное устройство: ESP8266+MR1132, чем, обещаю, сразу поделиться.
Всего доброго, и успехов в домашней автоматизации. Вопросы лучше задавать на форуме Амперки.