Arduino, ESP8266 Lua, Raspberry Pi 2 && OpenHab. Умный дом: азы управления.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 май 2015.

  1. ИгорьК

    ИгорьК Гуру

    7.3.5(1).

    upd 28.01.2016.

    В проекте NodMCU изменился способ "добычи" прошивки модуля, а именно. Теперь каждый может собрать прошивку самостоятельно на сайте http://nodemcu-build.com/index.php

    Для этого кода в прошивке DS18b20 не заказывать, а брать модуль датчика температуры из п. 5.

    До заливки кода, в окне ESPlorer выполнить такой код:
    Код (Lua):
    do
        function writeTGet(d)
           file.open("data.txt", "w+")
           file.write(d)
           file.close()
        end
        writeTGet(21)
    end
    Этот код создаст в модуле файл data.txt с первым целевым значением температуры, которое будет считываться при запуске модуля. Потом новое значение будет записываться в него же.

    В ESPlorer откомпилировать скрипт из предыдущего поста, и удалить файл с расширением lua.

    UPD 12/01/2018
    Проверил. Надо же. работает:
    upload_2018-1-12_10-18-42.png
     
    Последнее редактирование: 12 янв 2018
  2. NE_XT

    NE_XT Гик

    Спасибо за теплые слова в мой адрес ,
    кстати единственному вашему поклонику в этой ветке.
    :)
    итак повторим квест для новичков:
    Квест номер №1
    №1. Заряжаем Малину.
    (уверен, вы хорошо знаете что такое WinSCP и PuTTy)
    1.1. Устанавливаем на Малину стандартный Дебиан. Понятно, что отсюда:https://www.raspberrypi.org/downloads/. Дистрибутив называется Debian Wheezy. О том как это делается существует туча инструкций. Повторять их нет смысла.
    1.2. Устанавливаем на Малину Mosquitto. Лучший способ установки описан по этому адресу:http://mosquitto.org/2013/01/mosquitto-debian-repository/ .

    Лучшая инструкция, на свежем дебиане вам в конце выдаст :
    root@raspberrypi:~# apt-get install mosquitto
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:

    The following packages have unmet dependencies:
    mosquitto : Depends: libwebsockets3 (>= 1.2) but it is not installable
    E: Unable to correct problems, you have held broken packages.

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

     
    Nickson нравится это.
  3. NE_XT

    NE_XT Гик

    Квест №2 проходим легко:
    1.3 Устанавливаем Openhab.

    sudo apt-get update
    sudo apt-get upgrade
    sudo rpi-update
    sudo mkdir /opt/openhab
    cd /opt/openhab
    sudo wget https://openhab.ci.cloudbees.com/jo...arget/distribution-1.8.0-SNAPSHOT-runtime.zip
    sudo unzip distribution-1.8.0-SNAPSHOT-runtime.zip
    sudo rm distribution-1.8.0-SNAPSHOT-runtime.zip


    cd addons/
    sudo wget https://openhab.ci.cloudbees.com/jo...target/distribution-1.8.0-SNAPSHOT-addons.zip
    sudo unzip distribution-1.8.0-SNAPSHOT-addons.zip
    sudo rm distribution-1.8.0-SNAPSHOT-addons.zip

    cd /opt/openhab
    sudo wget https://openhab.ci.cloudbees.com/jo...n/target/distribution-1.8.0-SNAPSHOT-demo.zip
    sudo unzip distribution-1.8.0-SNAPSHOT-demo.zip
    sudo rm distribution-1.8.0-SNAPSHOT-demo.zip

    sudo chmod +x start.sh
    sudo ./start.sh
     
    Последнее редактирование: 2 июн 2015
  4. NE_XT

    NE_XT Гик

    Квест №3 проходим по другому пути:
    Чтобы запускать Openhab демоном, нужно следовать инструкции по адресу https://github.com/openhab/openhab/...igure-openhab-to-start-automatically-on-linux
    Но там есть две особенности.

    Лучше идти через немецкую инструкцию , они не поленились даже файлики прикрепить :
    https://openhabdoc.readthedocs.org/de/latest/Autostart/
     
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Путь там все тот же, а вот ссылка полезная. Завтра из нее кое-что извлечем на свет.
     
  6. ИгорьК

    ИгорьК Гуру

    8. Разное.

    8.1. Примеры работы setpoint.
    Из поста тов. NE_XT можно выудить, ИМХО, более полезную ссылку, которая показывает нам пример применения элемента setpoint для управления нагревательным прибором.
    Идем сюда: http://openhabdoc.readthedocs.org/de/latest/setpoint/
    Немецкие авторы утверждают, что это почти PID регулирование.
    Дело это спорное, поскольку перекладывает тяжесть принятия решения о включении/выключении нагревателя на OpenHAB и подвергает ситуацию бОльшему риску в плане надежности.
    Однако для менее ответственных ситуаций, типа включения уличных фонарей или открытия рольставней в зависимости от уровня освещенности может вполне подойти.
    Что из этой страницы можно однозначно забрать хорошего - приемы работы с setpoint. Чтобы было какое-то управление через сетпоинт, нужно:
    - Создать пару итемов:
    Код (Java):
    //Items

    Number My_Test_Item
    Switch My_Switch
    - Расположить переключатель на sitemap, а также создать сетпоинт с указателем на цифровой итем:
    Код (Java):
    sitemap  Example label="Пример Установки"
    {
        Frame label="Установка температуры" {
            Setpoint item=My_Test_Item label="Цель Нагревателя [%.1f °C]" step=0.5 minValue=1 maxValue=30
            Switch item=My_Switch label="Нареватель"
            }
    }
     
    Написать два правила, одно из которых инициализирует цифровой итем (а следовательно и сетпоинт), а второе - в зависимости от ситуации дает команду переключателю. от как это предлагают делать немецкие товарищи:
    Код (Java):
    Rules

    rule "Init virtual Items"
    when
        System started  // Когда система (OpenHAB) стартует
    then
        if (My_Test_Item.state == Uninitialized) { // Если итем не имеет значения
            My_Test_Item.postUpdate(22.5) // Установим ему некоторое значение
        }
    end

    rule "Compare and get"
        when
            Item My_Test_Item changed // Если мы изменили значение
        then
            var double wtsp=(My_Test_Item.state as DecimalType).doubleValue // создаем переменную с этим значением
            if (wtsp < 22.5){ // сравниваем с некоторой заранее установленной и даем команду на включение/выключение
    //          sendCommand(My_Switch, "ON") //такая аботает (часто в примерах), но следующее больше подходит объектно-ориентированного обозначения
                My_Switch.sendCommand(ON)
            }
            else {
    //          sendCommand(My_Switch, "OFF") //Также действует
                My_Switch.sendCommand(OFF)
            }
        end
     
    Все сказанное выше немецкими товарищами вполне работает. Но, замечу, что решение приведенное мной ранее с задержкой - тоже вполне себе ничего :)
    Также, я не инициализировал сетпоинт управления установкой температуры программно, а делаю это через получение информации от модуля. Полагаю это более правильным, поскольку в случае каких-то неисправностей на стороне модуля ESP8266, на OpenHAB они будут сразу видны, чего не скажешь о решении выше. (Именно поэтому иногда данные сетпоинта слетают: в момент, между прекращением изменения и отправкой команды (5 секунд) от модуля может прийти информация о текущей целевой температуре нагревателя и сбросит сетпоинт в исходное состояние. Полагаю, это небольшая проблема.)
     
    Последнее редактирование: 15 июн 2016
  7. ИгорьК

    ИгорьК Гуру

  8. Arduboy

    Arduboy Гик

    Я - полу Малина и полу Ардуина! :)
    У меня дома есть Ардуина! :)
    В магазине есть малина! :)
     
  9. ИгорьК

    ИгорьК Гуру

    8.2. Примеры HTTP binding.
    Видео из предыдущего поста. Если кратко - система подсветки работает на Аруино Yun. Линукс и AVR части взаимодействуют через таблицу Mysql. В ней всегда находится актуальная информация о текущем состоянии устройства. Воспользуемся ей, чтобы вывести ее на экран OpenHAB.
    Создадим файл getfromopenhab.php, который будет читать базу и делать только одно - выводить значение единственной цифры:
    Код (PHP):
    <?php
        require_once 'login.php';
        $db_server = mysql_connect($db_hostname, $db_username, $db_password);
        if(!$db_server) die ("Невозможно подключиться к MySql: " . mysql_error());
        //else print("Все включено - база найдена!");
        mysql_select_db($db_database)
        or die("Невозможно выбрать базу данных: " . mysql_error());
        $query = "SELECT * FROM homeStuff"; // Выборка из таблицы
        $result = mysql_query($query);
        if(!$result) die ("Сбой при доступе к базе данных: " . mysql_error);
        $query01 = mysql_result($result,0, 'arduStatus'); // Забор из выборки необходимого значения столбца

        echo ($query01);
        mysql_close($db_server);
    ?>
    Безусловно, в ту же директорию положим файл login.php
    Код (PHP):
    <?php // login.php
        $db_hostname = 'localhost';
        $db_database = 'home';
        $db_username = 'логин';
        $db_password = 'пароль';
    ?>
    Создадим итем:
    Код (Java):
    Number    Moscow_Lights01    "Подсветка Гостинной [%d]"    <rgb>    { http="<[http://192.168.0.152:81/myhome/getfromopenhab.php:3000:REGEX((.*))]" }
    Он биндится к нашей страничке по протоколу http, опрашивает ее каждые три секунды и как получил, так и отправляет в итем - об этом заботится выражение: (REGEX((.*))).
    <rgb> - эта запись значит, что я создал комплект изображений png с названием, начинающимся с rgb, а через дефис - номер состояния, и эти изображения динамически будут отображаться, в зависимости от состояния итема. Картинки прилагаю. Разархивированный комплект высыпается по адресу /opt/openhab/webapps/images/
    Ну а итем поместим куда-нибудь на сайтмэп, куда нравится.
     

    Вложения:

    • rgb.zip
      Размер файла:
      178,2 КБ
      Просмотров:
      436
    Последнее редактирование: 28 окт 2015
  10. ИгорьК

    ИгорьК Гуру

    8.3. Сделаем один выключатель на группу.
    Задачка : подходишь к дому - а он от радости расцвечивается, как Zadnitsa попугая! Все сразу. Давайте сделаем.
    8.3.1. Создадим группу в итемах, да с подвывертом:
    Код (Java):
    Group:Switch:OR(ON, OFF)    Zadnitsa   "Я: [(%d)]" (Moscow_group) // Moscow_group - вышестоящая группа для этой группы.
    Включим в эту группу те выключатели, которые должны будут включиться от радости. А заодно и выключиться, если что.
    В данном примере у меня два выключателя - подсветки и музыкального центра.
    А что, встреча с музыкой !
    Код (Java):
    Switch    Mos_Gost_100_101    "Включить"    <light>    (Moscow_Gos, Zadnitsa)        { http=">[ON:POST:http://192.168.0.152:81/myhome/click.php?command=101] >[OFF:POST:http://192.168.0.152:81/myhome/click.php?command=100]" }
    Switch   DenonPower       "Power"           (Denon, Zadnitsa)   { denon="avr2000#PW" }
     
    8.3.2. Да и воткнем ее куда-то в сайтмэп:
    Код (Java):
    Switch item=Zadnitsa mappings=[ON="Дома!", OFF="Ушел!"]    
    Это, собственно, все! Сейчас кино будет :)



    http://www.luafaq.org/#T1.5
     
    Последнее редактирование: 15 фев 2017
  11. ИгорьК

    ИгорьК Гуру

    9. Умный дом: добавим ума!
    Настолько ли он умен? Например, вы подходите к дому - узнает ли он вас? Сам? Без всяких кнопок и карточек? Попробуем научить!
    9.1. Создадим файл iamathome.sh в директории root со следующим содержанием:
    Код (Bash):
    #!/bin/sh
    PINGRESORCE1="192.168.0.177"
    if (! ping -q -c3 ${PINGRESORCE1} > /dev/null 2>&1)
    then
    echo 'Not At Home'
    mosquitto_pub -d -t /myhome/iam/state -m "OFF"
    else
    echo 'At Home'
    mosquitto_pub -d -t /myhome/iam/state -m "ON"
    fi
     
    Где: 192.168.0.177 - ip-адрес вашего смартфона!
    В чем мысль? В том, что когда вы подходите к жилищу, достаете ключ, открываете дверь - смартфон цепляет домашнюю сеть. Скрипт проверяет - пингуется ли смартфон и, в зависимости от ситуации, отправляет на MQTT брокер соответствующее сообщение.
    Безусловно, следует сделать еще три вещи:
    - добавить роутеру пендаля о выделении постоянного IP адреса вашему смартфону;
    - сделать скрипт исполняемым;
    - добавить задание на его запуск в cron и не раз в неделю, а раз в минуту.​
     
    Последнее редактирование: 28 окт 2015
    Vlad_L нравится это.
  12. ИгорьК

    ИгорьК Гуру

    9.2. Создадим итем:
    Код (Java):
    Switch I_At_Home "Дома?" <light> { mqtt="<[mosquitto:/myhome/iam/state:state:default]" }    
    Этот итем через MQTT как раз и ловит сигналы от скрипта.

    В принципе, итем можно никуда и не вставлять, а можно и вставить, чтобы иногда взглянув на него точно знать - дома ли вы или нет. Ок, вставим:
    Код (Java):
    Switch item=I_At_Home
    9.3. А теперь - пару правил:
    Код (Java):
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*
    // Создаем два таймера
    var Timer timerIATHome = null
    var Timer timerNotAtHome = null

    rule "I leave Home"
        when
            Item I_At_Home changed from ON to OFF
        then
            if(timerIATHome == null){
                if (timerNotAtHome != null)
                  timerNotAtHome.cancel()
                  timerNotAtHome = createTimer(now.plusSeconds(180)) [|
                  {
                    postUpdate(Gost_100_101, OFF) // Гасим нужный выключатель
                    sendCommand(Gost_100_101, OFF)
                    timerNotAtHome.cancel()
                    timerNotAtHome = null
                }
                ]
            }
        end

       
        rule "I got Home"
        when
            Item I_At_Home changed from OFF to ON
        then
            if  (timerIATHome == null) {
                postUpdate(Gost_100_101, ON) // Зажигаем свет
                sendCommand(Gost_100_101, ON)
                timerIATHome = createTimer(now.plusSeconds(60*60*6)) [|{
                    timerIATHome.cancel
                    timerIATHome = null
                }]
            }
        end
     
     
    Последнее редактирование: 28 окт 2015
  13. ИгорьК

    ИгорьК Гуру

    10. Солнце в начальники: включаем и выключаем освещение.
    Источник: https://github.com/openhab/openhab/wiki/Astro-binding
    OpenHAB позволяет связаться с Солнцем и поручить ему управление отдельными элементами, например - уличными лампами. Вы скажете: можно обойтись датчиком освещенности. Можно. Но, к сожалению, стандартный сенсор имеет маловато градаций яркости. Плюс, освещение на улице, обычно на закате и рассвете может изменяться существенным образом. Да, можно закатать некоторый гистерезис, но и он не обеспечит уверенной работы при малой градации.
    Вариант с солнечным диалогом тоже не без недостатков. И связаны они с теми же облаками.
    В общем, лучше иметь выбор.
    10.1. Установим начальные данные в openhab.cfg:

    Код (Bash):
        ################################# Astro Binding #######################################
        #
        # The latitude
        astro:latitude=55.103778
     
        # The longitude
        astro:longitude=36.997945
     
        # Refresh interval for azimuth and elevation calculation in seconds
        # (optional, defaults to disabled)
        astro:interval=600  
    А берем долготу и широту из google maps:
    33224465.jpg
     
    Последнее редактирование: 28 окт 2015
  14. ИгорьК

    ИгорьК Гуру

    10.2. Создадим итемы:
    Код (Java):
    Group    Astro
    Number    Azimuth      "Азимут На Солнце [%.2f °]"        (Astro)    {astro="type=AZIMUTH"}
    Number    Elevation    "Высота Над Горизонтом [%.2f °]"    (Astro)    {astro="type=ELEVATION"}
    DateTime  Sunrise_Time  "Восход [%1$tH:%1$tM]"            (Astro) {astro="type=SUNRISE_TIME"}
    DateTime  Noon_Time    "Средина Дня [%1$tH:%1$tM]"        (Astro) {astro="type=NOON_TIME"}
    DateTime  Sunset_Time  "Закат [%1$tH:%1$tM]"                (Astro) {astro="type=SUNSET_TIME"}

    Switch Sunrise_Event "Включить Освещение по солнцу"          (Astro) {astro="planet=sun, type=rise, property=start, offset=-30"} //  offset=-30 - Включаем за 30 минут до посадки. Можно и после, тогда offset=30, как нравится
    Switch Sunset_Event  "Выключить Освещение по солнцу"          (Astro) {astro="planet=sun, type=set, property=end, offset=-30"} // Итем для получения команды, а не для отражения
     
  15. ИгорьК

    ИгорьК Гуру

    10.3. Поместим итемы на сайтмэп:
    Код (Java):
    Frame label="Астрономия" {
            Group item=Astro icon="control_all_on_off" {
                Text item=Azimuth
                Text item=Elevation
                Text item=Sunrise_Time
                Text item=Noon_Time
                Text item=Sunset_Time
                Switch item=Sunrise_Event
                Switch item=Sunset_Event
            }
        }  
    10.4. Напишем правила:
    Код (Java):
    rule "Switch OFF Sun"
    when
        Item Sunrise_Event changed from OFF to ON
    then
        postUpdate(Sunset_Event, OFF)
        sendCommand(Sunset_Event, OFF)
    end

    rule "Switch ON Sun"
    when
        Item Sunset_Event changed from OFF to ON
    then
        postUpdate(Sunrise_Event, OFF)
        sendCommand(Sunrise_Event, OFF)
    end

     
     
  16. ИгорьК

    ИгорьК Гуру

    10.5. Что получилось и пояснения.
    Получилось вот что:


    Зачем там две кнопки? Они для проверки взаимосвязи включения и выключения. Когда поступает команда включения по заходу солнца - отменяется команда выключения по его восходу и наоборот.
    После проверки правильности работы, оставляем на сайтмэп только один итем. Теперь он будет включаться и выключаться по солнцу. А также, ничто не мешает включать и выключать его вручную.
    Вот так:
    90960.jpg
    Код (Java):
    Frame label="Астрономия" {
            Group item=Astro icon="control_all_on_off" {
                Text item=Azimuth
                Text item=Elevation
                Text item=Sunrise_Time
                Text item=Noon_Time
                Text item=Sunset_Time
                Switch item=Sunrise_Event
            //  Switch item=Sunset_Event
            }
        }  
     
    Последнее редактирование: 16 мар 2016
  17. ИгорьК

    ИгорьК Гуру

    11. Пора добавить в систему уже давно работающий элемент, а именно...
    Есть у меня на участке отдельно стоящий выключатель уличного фонаря, реализованный на модуле от мастер-кита. К нему прилагается вот такой брелок. (Эх, были же времена, когда это стоило...)
    Как учат Маркс, Энгельс и Сидоров, в работающие устройства лезть не стоит, поэтому будем исключительно добавлять и добавлять.
    Требуется:
    Arduino Pro Mini 3.3 v;
    ESP8266 ("Это мое любимое место! (ТриколорТВ)");
    комплект приемник и передатчик 433 мгц этот и этот;
    плата интерфейса; она останется потом на долгие годы. Покупать один раз.
    два резистора на 10 ком;
    нечто, что доставит всему этому 3.3 вольта питания;
    разъемы и провода - по вкусу.​
    Задача будет решаться в три этапа:
    1. Получение информации о кодах брелока;
    2. Тестирование управления 433 мгц реле от Ардуино:
    3. Сборка устройства и подключение к OpenHAB.

    11.1. Соберем вот такое устройство:
    Drawing1.jpg

    Библиотечку возьмем здесь: https://code.google.com/p/rc-switch/
    И закатаем в устройство вот такой код:
    Код (C):
    #include <RCSwitch.h>

    RCSwitch mySwitch = RCSwitch();

    void setup() {
      Serial.begin(9600);
      mySwitch.enableReceive(0);  // Приемник на прерывании 0 => что значит пин 2
    }

    void loop() {
      if (mySwitch.available()) {

        int value = mySwitch.getReceivedValue();

        if (value == 0) {
          Serial.print("Unknown encoding");
        } else {
          Serial.print("Received ");
          Serial.print( mySwitch.getReceivedValue() );
          Serial.print(" / ");
          Serial.print( mySwitch.getReceivedBitlength() );
          Serial.print("bit ");
          Serial.print("Protocol: ");
          Serial.println( mySwitch.getReceivedProtocol() );
        }
        mySwitch.resetAvailable();
      }
    }
     
    Понажимаем на кнопочки пульта и подивимся на результат. Результат показан, естественно, в мониторе сериал порта.
    Возьмем в руки что-нибудь пишущее и зафиксируем на бумаге коды, доставляемые каждой кнопкой. А их на пульте аж две.
     
    Последнее редактирование: 21 июн 2015
  18. ИгорьК

    ИгорьК Гуру

    11.2 Теперь соберем передатчик.
    Вот по этой картинке.
    Drawing2.jpg

    Пишем в Ардуинку скетч невероятной сложности:
    Код (C):

    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();

    #define ON_COMMAND  5592332  // Сюда вбиваем код, полученный при нажатии кнопки ON
    #define OFF_COMMAND 5592323  // А сюда - код от кнопки OFF
    void setup() {
      Serial.begin(9600);
      mySwitch.enableTransmit(10); // Дата от Ардуино висит на 10 ноге.
    }

    void loop() {

      mySwitch.send(ON_COMMAND, 24);
      Serial.println("Sent SwitchON");

      delay(30000);  // ДА! Тащусь от этой функции!

      mySwitch.send(OFF_COMMAND , 24);
      Serial.println("Sent SwitchOff");

      delay(30000); // И от этой функции тащусь тоже!
    }
     
    По результатам действа каждые три секунды дистанционное управление от Мастеркита должно включаться и выключаться.
    Если этого не происходит, возможны несколько вариантов:
    - включить мозги;
    - написать сообщение на форум;
    - забросить это дело.​
    Но я верю, что все получится.
     
  19. ИгорьК

    ИгорьК Гуру

    11.3. Готовое устройство будет выглядеть так:

    Это готовое устройство
    Drawing32.jpg

    Внимание! Программирование как Ардуино, так и ESP8266 , нужно осуществлять отдельно, поскольку на трехвольтовую Ардуинку при программировании подается 5 вольт.
    Если программировать Ардуино при соединенном модуле ESP8266, последний будет сожжен!
     
    Последнее редактирование: 21 июн 2015
  20. ИгорьК

    ИгорьК Гуру

    11.4.1. Но сначала запустим ESP8266 и убедимся в ее работоспособности.
    Соберем такую схемку:
    Drawing41.png
    Загрузим в нее программку:
    Код (Lua):
    gpio.mode(4,gpio.OUTPUT)
    gpio.mode(3,gpio.OUTPUT)
    gpio.write(4,gpio.HIGH)
    gpio.write(3,gpio.HIGH)
    m = mqtt.Client("ESPOutLights", 180, "OutLights", "OutLights")
    --m:lwt("/lwt", "ESPOutLights", 0, 0)
    m:on("offline", function(con)
        print ("reconnecting...")
        print(node.heap())
        tmr.alarm(1, 10000, 0, function()
              m:connect("ВАШ СЕРВЕР", 1883, 0)
            collectgarbage()
        end)
    end)

    m:on("message", function(conn, topic, data)
        print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON") then
              print("Enabling LED")
              gpio.write(4,gpio.HIGH)
              gpio.write(3,gpio.LOW)
              m:publish("/myhome/outlights/state","ON",0,0)
        elseif (data=="OFF") then
              print("Disabling LED")
              gpio.write(3,gpio.HIGH)
              gpio.write(4,gpio.LOW)
              m:publish("/myhome/outlights/state","OFF",0,0)
        else
              print("Invalid - Ignoring")
        end
        collectgarbage()
    end)

    tmr.alarm(0, 1000, 1, function()
    if wifi.sta.status() == 5 then
        tmr.stop(0)
          m:connect("ВАШ СЕРВЕР", 1883, 0, function(conn)
              print("connected")
              m:subscribe("/myhome/outlights/command",0, function(conn)
              end)
        end)
    end
    end)
     
     
    Последнее редактирование: 27 окт 2015