nooLite: MR1132. Песня и пляски. ч. 4. Оптимистическая.

Начнем с 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 следующим образом:

iskrajsAndModules

Пора и в Искру добавить скрипт. Вот он:

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. Как это выглядит?

Здесь картинка нормальной работы устройства:

NormalWorks

Как происходит биндинг:

binding1

Подведем итоги.

По моему скромному мнению, умным домом является тот, который принимает решения за Вас самостоятельно и не беспокоит необходимостью нажимать какие-либо кнопки на экране компьютера/смартфона. (В частности, вот это — не умный дом, а решение для усложнения жизни. Какая разнице, где приходится нажимать кнопку — на смартфоне или на стене?)  Элементы умного дома не должны управляться из единого центра, а могут, лишь оповещать его о своем состоянии, либо принимать команды на изменение режима работы. Управление элементами из единого центра — есть зло.

Система nooLite, очень хорошо соответствует такому подходу. В связи с этим, пара слов об участниках эксперимента.

Датчик температуры и влажности и датчик температуры имеют два принципиально разных режима работы: как управляющие устройства и как информационные.

Как информационные, они проявились в данной статье итемами 2 и 3, оповещая нас о текущих показателях. Инженеры Ноотехники придумали классное решение, которое позволяет экономить батарейки: если показатели не изменяются более чем на 0,5 градуса, датчики будут срабатывать один раз в час, иначе — чуть более чем один раз в минуту. Эти показания мы научились принимать и отправлять в OpenHab по протоколу mqtt.

Вместе с тем, в управляющем режиме устройства обеспечивают, посредством команд на силовые блоки, поддержание заданной температуры и влажности. В определенных случаях, это даже более важная функция. При помощи MR1132 мы будем знать, в каком состоянии находятся исполнительные устройства, и это есть реальный умный дом — дом, не достающий нас вопросами о том, что ему делать.

Вместе с тем, в управляющем режиме блоки не сообщают о состоянии температуры. Уверен, что отправка информации о состоянии температуры одновременно с командами на включение/выключение исполнительных устройств технически не сложна, и когда-нибудь будет добавлена в систему. Совместимость от этого вряд ли пострадает. Как только это случится, мы изменим код для разбора ситуации.

Более того, оба этих датчика имеют возможность выступать и датчиками протечки! Для этого требуется небольшой навык работы с паяльником, но о такой возможности забывать не следует.

Что касается датчика движения, он имеет три регулировки: по времени, освещенности и чувствительности. При написании статьи я выставил чувствительность и  освещенность на максимум,  время включения — на минимум (чтобы он участвовал в моих экспериментах).

И датчик из коридорного повелителя света превратился в датчик охраны.  Раз мы принимаем сигналы с него, когда в помещениях хозяев нет, мы имеем полноценную охранную сигнализацию.

Безусловно, в таком режиме датчик в присутствии хозяев находиться не может. Поэтому видятся два пути: или вы, уезжая надолго, снимаете его и перестраиваете режим работы, либо Ноотехника добавит в него маленькую кнопочку и позволит с ее помощью быстро «включать» в датчике режим охраны. Согласитесь, вещь простая — главное до нее додуматься.

В системе OpenHab появилась возможность проталкивать сообщения о критических событиях на абонентов Telegram, и просто глупо не воспользоваться такой возможностью: дополнительная сигнализация нам не помешает.

Теперь о самом герое — модуле MR1132.

Глубоко убежден, что не смотря на простоту работы (см. пример), приемник теми, кому он, вроде бы, предназначался (Ардуино), востребован не будет. Обратите внимание и на объем кода в примере — многовато.

Не исключаю, что передатчик MT1132, в определенных случаях, применяется истинными ардуинщиками, но приемник — маловероятно. На мой взгляд, его наличие востребовано в более мощных решениях, но, как ни странно, модуль для этого не рассмотрен производителем.  Для такого применения требуется, пусть и копеечный, согласователь уровней, лишние провода и пайка. Пойди же ты найди еще этот согласователь: даже в Москве я на скорую руку его не нашел. Надо заказывать из Поднебесной.

Тем не менее, в управления домашними устройствами, полагаю, MR1132 является просто необходимым элементом. В этой группе статей мы соединили его с великолепной платой Iskra JS и получили возможность видеть текущее состояние силовых блоков и датчиков, а также дистанционно присоединять и отсоединять новые устройства. Iskra JS, по своим возможностям, с легкостью «вытянет» и  UART передатчик MT1132. Ранее мы присоединяли его к Raspberry Pi, на которой установлен OpenHab. Такое решение кажется мне не очень удобным, не исключаю, что в скором времени оба модуля сосредоточатся в Искре.

Как и у многих из вас, мои исполнительные устройства находятся в двух местах — дома и на даче. Значит, как только у меня появится еще один приемник и согласователь уровней — буду делать второе приемное устройство: ESP8266+MR1132, чем, обещаю, сразу поделиться.

Всего доброго, и успехов в домашней автоматизации. Вопросы лучше задавать на форуме Амперки.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s