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

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

  1. ИгорьК

    ИгорьК Победитель модулей

    Сначала кино: ESP8266 зажигает и гасит красный светодиодик кнопочкой (освещение яркое, поэтому сразу в глаза не бросается, смотреть внимательно), оповещая об этом сотовый телефон (не нравится светодиодик - установите реле и поливайте огород или включайте освещение). После чего, с сотового телефона идет управление тем же светодиодом.


    Код из этого видео находится в пункте 6.

    Оглавление.
    1. Установка.
    2. Зарезервировано (Да просто считать не умею!). => Общая информация для начинающих. И смотреть п. 19 про сборку прошивки даже если вам не нужен DHT. Также, важная информация о системном времени ESP-8266.
    3. Обзор установленного.
    4. Взаимодействие с Mosquitto.
    5. Отображение температуры DS18b20 с одного или нескольких датчиков через ESP8266.
    6. Выключатель на ESP8266.
    7. Управление отоплением на ESP8266.
    8. Разное. Примеры setpoint, http запросов, один выключатель на группу.
    9. Определение присутствия хозяев.
    10. Управление освещением по заходу солнца.
    11. Простое сопряжение ESP8266 - Arduino. Реакция на состояние пинов.
    12. Настройки локалей и временной зоны на Малине.
    13. Определение положения хозяев по координатам.
    14. Мониторинг сети и присутствия в ней устройств.
    15. Связка ESP8266 - Arduino по UART c двусторонней передачей данных.
    16. Управление ногами Raspberry Pi.
    17. nooLite - управление освещением через UART Raspbery Pi. Подключение UART/USB устройств.
    18. Отправка одному приемнику нескольких команд.
    19. Работа DHT-11/22 c ESP8266.
    20. DS18b20 + ESP866 на батарейках. Срок работы от АА - один месяц.
    21. Получение данных от датчика CO2 (AZ-7721), работа через UARТ.
    22. Общение с Telegram от Securbond.
    23. Данные о погоде в указанном месте.
    24. http-binding & RegEx на примере погоды Яндекса. Ветер от Netmaster. Новые данные Яндекса от igboris. Еще от kongen.
    25. nooLite MR1132.
    26. Логгирование редких событий.
    =====================
    Полезное в тему.

    Установка всего от kmaximv
    Хорошая аналогичная тема
    от kmaximv
    Пароль на Openhab от Securbond.
    Arduino && w5100 от Securbond.

    Тема про ESP866.
    Тема про Ардуино Мега Сервер - для адептов секты ардуинщиков.
     
    Последнее редактирование: 4 дек 2016
    faster_light, chibis, Влад_openhab и 4 другим нравится это.
  2. ИгорьК

    ИгорьК Победитель модулей

    27. nooLite MR1132 && ESP8266.
    28. nooLite MT1132 && Iskra JS.
    29. nooLite MR1132, MT1132 && ESP8266
    30. Шаблон. Связь с брокером MQTT. И от alp69.
    31. IskraJS, ESP8266, nooLite MR1132, nooLite MT1132.
    32. DS18b20 + ESP866 на батарейках. Вариант 2. И его модификация.
    33. Управление двумя нагрузками импульсными реле. Контроль состояния нагрузок. От alp69.
    б/н. Антидребезг ESP8266. Шаблончик.
    ESP8266 ESP-201 - распиновка для NodeMCU (Lua).
    34. Полив теплицы. Версия #2.
    35. Управление двумя нагрузками с помощью импульсных реле от alp69. Отдельный крутой проект.
    36. Работа с дисплеем Nextion.
    37. Отправляем много данных. Coroutine. Шаблон.
    38. Отправляем много данных. JSON. Шаблон.
    39. Заводим HC-12 в OpenHab. Через ESP-8266.
    40. Вентиляция погреба, подвала.
    41. Малиновая температура от Securbond.
    42. DHT под управлением OpenHab от Securbond.
    43. Читаем счетчики расхода воды.
    44. Читаем электросчетчик от alp69.
    б/н ИК управление на ESP-8266 от Smerlin.
    45. ESP-8266. Шаблон. Как узнать время. И еще вариант от dimm71.
    46. ESP-8266. Шаблон. Модуль для отправки данных на thingspeak.com.
    47. ESP-8266. Шаблон. Модуль отправки на narodmon.ru.
    48. ESP-8266. Шаблон. DS18b20.
    49. Перезагрузка роутера.
    50. Кольцевой фильтр.
    51. Фильтр Калмана. Примеры.
    52. PZEM-004t. Счетчик электричества.
    53. Очень красивые и информативные графики.
    54. Выбираем соединение между сетками.
    55. nooLite MTRF64.
    56. init.lua - злодейства.
    57. bme280.
    58. Антидребезг (сделано у нас).
    59. Перебираем сетки для подключения.
    60. Еще раз DS18b20.
    61. Авторизация в ОН2.

    Дополнительно:
    Если ничего не смыслите в Lua ESP-8266.
    GPIO ESP-8266.
    Устранение проблем с Дизайнером.
    Про mosquitto от Влад_openhab
    Сторожевые собаки для всего.
    Библиотеки для Iskra JS от Амперки.
    Немного иконок.
    О Графиках два поста подряд.
    Соединения от pighixxx. 1. 2.
    Смотрим логи так:
    Код (Bash):
    sudo tail -f -n 30 /var/log/openhab/events.log
    sudo tail -f -n 30 /var/log/openhab/openhab.log
    sudo tail -f -n 30 /var/log/mosquitto/mosquitto.log

    # openhab2
    sudo tail -f -n 30 /var/log/openhab2/openhab.log
    sudo tail -f -n 30 /var/log/openhab2/events.log
     
    Если после прошивки NodeMCU модуль не заводится - смотрим сюда.
    Про MOSFETы.
    Про ESP-8266.
    Rosetta Code.
    ESP-8266 Snippets.
    Telegram API in short.
    At Lua.
    Wiki OH1.
    Примеры конфигурации.
    https://openhab.ci.cloudbees.com/
    Сборка прошивки от dimm71.
    pyflasher
    Здесь FREE MQTT Brocker
    Если малина не выполняет apt-get update:
    Код (Bash):
    $ sudo apt-get install apt-transport-https ca-certificates
    $ sudo apt-get update
    InfluxFD && Grafana: Раз и Два.
    WiFi upload files.
    Малиновое!
    http://tracker.raspberrypi.org/raspbian/images/raspbian-2017-07-05/
     
    Последнее редактирование: 21 сен 2017
    faster_light, chibis и Влад_openhab нравится это.
  3. ИгорьК

    ИгорьК Победитель модулей

    0. Почему именно это и именно так.
    Раньше были темы с Arduino Yun: http://forum.amperka.ru/threads/arduino-yún-азы-Основы-построения-монитора-умного-дома.3562/ а также связанная с ней http://forum.amperka.ru/threads/arduino-yún-Народный-мониторинг-управление-отоплением-в-загородном-доме-через-Интернет.4098/
    ИМХО, это неплохое решение, поскольку Yun совмещала в себе возможности универсального входа в Интернет, в том числе по WiFi, а в Линкус части мало чем отличалась от Raspbrry Pi (1).

    Идет время и появляются новые железки.
    Их две: ESP8266 а также Raspberry Pi 2 , которую уже нельзя назвать недокомпютером.

    Тема на Yun выявила несколько задач, а именно:
    - "изготовление" удобного интерфейса и взаимодействия с ним. Его можно рисовать самостоятельно, пополняя знания Jquery, php, mysql, но лучше иметь готовое гибкое решение;
    - преодоление "серого" ip-адреса места автоматизации: что толку иметь интерфейс, если до него нельзя достучаться извне?
    Сказанное требовало поиска другого решения.

    Какие компоненты решил задействовать:
    - Arduino разных мастей - куда ж без нее :)
    - Raspberry Pi 2. (Для старых малинников - прочитать здесь.)
    - на нее устанавливается два приложения: openhab и mosquitt0.
    - как первый элемент системы, запрограммировал ESP8266 на управление нагрузкой как от кнопки, так и через интернет, о чем свидетельствует видео.
    - как следующий элемент, запрограммировал другой ESP8266 на передачу сведений температуры.

    =============
    Вот по этой сылке http://habrahabr.ru/post/227435/ автор продвигает свою разработку. Там же рассматриваются конкурирующие системы. Относительно недостатков Openhab сказано: рудиментарный интерфейс.

    Рудиментарный интерфейс OpenHab есть одно из главных достоинств.
    Умный дом - дом, который не требует управления и созерцания интерфейсов в стиле задницы попугая.
    Управление (минимальноее!) идет обычно со смартфона, а не с десктопа. На смарте же важны компактность, быстрота и мало байт из интернета в роуминге.
    ...а других недостатков то и не выявлено.

    1. Заряжаем Малину.
    (уверен, вы хорошо знаете что такое WinSCP и PuTTy) Нет?
    Посмотрите сюда. Важно.

    Новичкам, которые "я купил малину и датчик DS18b20. Программировать не умею. Хочу построить умный дом. Как мне это сделать".
    Входной билет в эту тему - самостоятельный запуск Малины, OpenHab и Mosquitto. Все необходимые ссылки даны. Оставляю за собой право не отвечать на вопросы, связанные с установкой.

    1.1. Устанавливаем на Малину стандартный Дебиан. Понятно, что отсюда: https://www.raspberrypi.org/downloads/. Дистрибутив называется Debian Wheezy. RASPBIAN JESSIE. О том как это делается существует туча инструкций. Повторять их нет смысла.
    1.2. Устанавливаем на Малину Mosquitto. Описания установок на любой вкус:
    Код (Bash):
        wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
        sudo apt-key add mosquitto-repo.gpg.key
        rm mosquitto-repo.gpg.key
        cd /etc/apt/sources.list.d/
        sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.list
        sudo apt-get update
        sudo apt-get install mosquitto mosquitto-clients
    Иногда требуется соорудить мост. Потом поймете зачем и куда.
    1. По адресу /usr/share/doc/mosquitto/examples/ находим файл mosquitto.conf.gz
    2. Распаковываем в директорию /etc/mosquitto/conf.d файл mosquitto.conf, читаем что там говорится в разделе Bridge.
    3. Сооружаем в нем такие строчки:
    Код (Bash):
    connection oldbridge
    address 192.168.1.28:8080
    topic # both // Это полный мост в обе стороны, можно указывать направления и отдельные топики
    1.3 Устанавливаем Openhab.
    ==========================
    UPD 17/02/2016.
    Перед установкой установите Java 8.
    OpenHab теперь устанавливается через apt-get install.
    Инструкция здесь.
    Также уважаемый kmaximv сделал хорошее описание установки здесь.

    Что такое OpenHab?
    UPD 16.03.2017
    . В связи с выходом OpenHab2(ОН2), для начинающих.

    ОН1 (первый ОН) представляет собой связанную вместе на языке Java комбинацию следующих элементов, (состояние которых меняется путем редактирования текстовых файлов):
    1. файл с расширением items - перечень устройств, которые есть у вас , и способа взаимодействия с каждым из них.
    2. файл с расширением sitemap - как эти устройства показаны на экране
    3. файл с расширением rules - правила. Если произошло "это" - сделать "то". Правила пишутся на языке Xtend, что есть диалект Java, и в этом определенная засада. Однако примеров туча на все (в основном :) ) случаи жизни.
    4. файл(ы) с расширением persist - способы отправки данных в выбранные вами базы данных, по одному на каждую базу, если их много.

    Кроме того (пункт 5), конфигурирование ОН1 предусматривает закачку специальных файлов биндинга для установления связи. Например, хотите делать запросы по http - закачайте специальный файл. Хотите shell команды? Закачайте еще один. Теперь вы можете их делать сколько угодно. Полный перечень находится здесь. Не верю, что у вас (у вас, а не абстрактно, в природе) есть что-то, что нельзя воткнуть в ОН.

    Все! Выше, всего пять пунктов, - рассказ о сути ОН1. Есть еще некоторые вещи, но они легко постигаются с началом применения ОН.

    Теперь об ОН2. С точки зрения пользователя, это то же самое, что ОН1, только с усложненной системой взаимодействия/интерфейса. Да, да! "Хотели как лучше - получилось как всегда".
    Он ничуть не стабильнее ОН1, а быстрее? Сложно сказать, я разницы не заметил.

    Нужно ли начинать с ОН2 сразу? Думаю - нет. Освойтесь с ОН1, наделайте ошибок, исправьте, набейте руку, стабилизируйте работу - тогда перейдете.
    Переход несложен, если не учесть разирательств с интерфейсом и новыми инструментами взаимодействия, которыми вы не будете пользоваться все равно, но которые поставят в тупик новичка обязательно.

    Конфигурирование ОН2, по сути, в полном объеме осуществляется теми же способами, что указано выше. А плюшки конфигурирования ОН2, может быть, доработают. Выйдет какой-нибудь ОН2.1 -посмотрим.

    Главное в ОН2 - сейчас он В ПОЛНОЙ МЕРЕ управляется так же как ти ОН1 - путем ручного конфигурирования тех же файлов. Все плюшки лишь частично пытаются упростить работу, но запутывают ситуацию сильно.

    Замечены определенные баги ОН2, а также, самое главное, - в настоящее время не поддерживается логин/пароль вход, вход - открытый. Полагаю, до исправления этой ситуации ОН2 для установки рекомендовать не имеет смысла.

    Все сказанное выше - ИМХО.

    ==============================
    1.4. UPD. Не нужен вам Habmin, пользуйтесь openHAB Designer! Хабмин перестал поддерживаться.
    UPD 16.03.2017. В версии ОН2 Хабин поддерживаться начал. Но все равно - пользуйтесь вместо него Eclipse SmartHome Designer - и будет вам счастье. Или, по крайней мере, избавление от ошибок.

    Ок. Малина заряжена!
     
    Последнее редактирование: 7 апр 2017
    9xA59kK нравится это.
  4. Tomasina

    Tomasina Иномирянин

  5. ИгорьК

    ИгорьК Победитель модулей

    №3. Что мы наустанавливали?
    Разберемся кратко в чем суть наших действий.

    3.1. Mosquitto
    представляет собой маленький сервер (называется - брокер) стандарта MQTT. Его задача - постоянно держать соединение с клиентами (подписчиками) и сообщать им о всех данных, переданных другими клиентами. Подписчики получают не все, а лишь то что им надо (на что они подписаны).
    Прелесть этого действа заключается еще в том, что достаточно одного компьютера, имеющего постоянный или переменный ip-адрес в интернете. Протокол позволяет устройствам, находящимся в серой зоне файрволов провайдеров, иметь постоянную связь с брокером. Уже одно это - необычайная ценность.
    Более подробно можно прочитать по адресу: http://www.hivemq.com/how-to-get-started-with-mqtt/
    А по-русски - здесь.

    Москит? MqttSpy - наше все! Загружаем и начинаем понимать его суть. Без него - ни шагу!

    3.2. Openhab
    - интегрированное решение управления домом. Неплохо на эту тему изложено здесь: http://habrahabr.ru/post/232969/ Неплохо, но как-то длинно.

    Коротко. Openhab представляет собой комбинацию следующих элементов:

    - итемы (items) - всякие оконечные устройства, описываемые предварительно, до того, как их можно будет задействовать в самой программе. То есть, у вас есть датчик - его надо сначала описать как очередной итем.
    - сайтмэп (sitemaps) - способ группировки устройств (итемов) для их отражения на странице.
    - биндинг (binding) - способ взаимодействия программы с конкретным физическим устройством. Биндинг есть, в итоге, программная связь итема и той настоящей железяки, которая связана с итемом.
    - правила (rules ) - программирование поведения итемов. То есть, если вас железки только исполнители и не имеют своей внутренней логики - можно ее добавить. А можно и не добавлять.
    - персистенсы (persistence) - описание взаимодействия программы с разныи базами данных.
    Для начала работы вполне хватит понимания трех первых элементов.

    Все эти элементы описываются в отдельных файлах, которые находятся в папке /opt/openhab/configurations/название папки и имеют соответствующее расширение.

    3.3. Habmin - графическое приложение, позволяющее, в большинстве случаев, быстро и просто управлять всем вышеизложенным. Понимая, что значат эти элементы, несложно разобраться и с Habminом.
     
    Последнее редактирование: 30 мар 2017
  6. ИгорьК

    ИгорьК Победитель модулей

    4. Заcтавим Openhab взаимодействовать с Mosquitto.
    Для этого... Читаем про MQTT здесь.
    4.1. Откроем файл /opt/openhab/configurations/openhab.cfg и внесем в него следующие изменения:
    Код (Bash):


    ################################# MQTT Transport ######################################

    mqtt:mosquitto.url=tcp://localhost:1883
    mqtt:mosquitto.clientId=MyOpenHab
     
    Что значит вышеуказанное?
    Вы определяете название и адрес mqtt брокера,

    4.2. Выполним команду перезапуска Openhab:
    Код (Text):
    service openhab restart
    (Если у нас не Малина 2 - офигеваем от времени перезагрузки)
     

    Вложения:

    • 1234.jpg
      1234.jpg
      Размер файла:
      8,2 КБ
      Просмотров:
      33.776
    Последнее редактирование: 24 мар 2017
  7. ИгорьК

    ИгорьК Победитель модулей

    5. Создадим item который отображает температуру.
    5.1. Пользуемся Habmin(ом) и делаем так:
    UPD. Не надо пользоваться Habmin(ом). Попробуйте разобраться с openHAB Designer!!!


    Что мы там вставили в окно из буфера обмена? вот это:
    Код (Text):
    <[mosquitto:/myhome/out/temperature001/state:state:default]
    И вот что мы получили в итоге. "В комнате" - новый итем, который будет показывать температуру. У меня он показывает, у вас - еще нет. Потому что впереди - запись кода в ESP8266.
    007.jpg
    5.2. Программируем ESP8266.
    К модулю подключен датчик DS18B20. Поэтому пользуемся соответствующей библиотекой, исправленной для отрицательной температуры и, затем, откомпилированной на вашей плате. Если у вас нет - приложу библиотеку.
    А также заливаем в плату следующий код, обозвав его thermoHab.lua:
    Код (Lua):

    pin = 4
    Broker="www.ВАШ_САЙТ.org"
    port=1883
    myClient="ESPThermo"
    name="ESPThermo"
    pass="password"

    m = mqtt.Client( myClient, 120, name, pass)
    m:lwt("/myhome/ESPThermo/", "By!", 0, 0)
    m:on("offline", function(con)
      print ("Mqtt Reconnecting.")
      tmr.stop(2)
      tmr.alarm(1, 120000, 1, function()
      print ("Try Reconnecting...")
      m:connect(Broker, port, 0, function(conn)
      print("Mqtt Connected to "..Broker)
      tmr.stop(1)
      tmr.start(2)
      end)
      end)
    end)

    function publish_data()
      local ds18b20 = require('ds18b20')
      ds18b20.setup(pin)
      local addres={}
      addres=ds18b20.addrs()
      local t = ds18b20.read(addres[1])
      if t ~= 85 then
      m:publish("/myhome/out/temperature001/state",t,0,0, function(conn)
      print("Temp "..t.." published!")
             ds18b20 = nil
             package.loaded["ds18b20"]=nil
             collectgarbage()
      end)
      end
    end

    function run_main_prog()
       print("Main  program starts!")
      tmr.alarm(2, 60000, 1, publish_data)
    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("Mqtt Connected to: " .. Broker)
      run_main_prog()
      end)
      end
    end)

     
    A также init.lua
    Код (Lua):
    do
    FileToExecute="thermoHab.lua"
    l = file.list()
    for k,v in pairs(l) do
      if k == FileToExecute then
        print("*** You have got 20 sec to stop timer 0 ***")
        print("*******    Execute: tmr.stop(0)    *******")
        tmr.alarm(0, 20000, 0, function()
          print("Executing ".. FileToExecute)
          dofile(FileToExecute)
        end)
      end
    end
    end
     
    Что в реальности сейчас работает:
    4442222.jpg

    232324444.jpg

    5544.jpg
     

    Вложения:

    Последнее редактирование: 20 дек 2016
    9xA59kK и alp69 нравится это.
  8. ИгорьК

    ИгорьК Победитель модулей

    5.3. А теперь, для тренировки и пользы для, программируем ESP8266 для передачи нескольких данных.
    Код (Lua):

    pin = 4
    Broker="www.ВАШ_САЙТ.org"
    port=1883
    myClient="ESPOffice03"
    login="logIn"
    password="passWord"

    m = mqtt.Client( myClient, 120, login, password)
    m:lwt("/myhome/dacha/tempMuv03/", "By!", 0, 0)
    m:on("offline", function(con)
      print ("Mqtt Reconnecting.")
      tmr.stop(2)
      tmr.alarm(1, 120000, 1, function()
      print ("Try Reconnecting...")
      m:connect(Broker, port, 0, function(conn)
      print("Mqtt Connected to "..Broker)
      tmr.stop(1)
      tmr.start(2)
      end)
      end)
     end)

     function publish_data()
      local ds18b20 = require('ds18b20')
      ds18b20.setup(pin)
      local addres={}
      addres=ds18b20.addrs()
      local t = ds18b20.read(addres[1])
      if t ~= 85 then
      m:publish("/myhome/dacha/tempMuv03/state",t,0,0, function(conn)
      print("Temp "..t.." published!")
             ds18b20 = nil
             package.loaded["ds18b20"]=nil
             collectgarbage()
             tmr.alarm(1, 10000, 0, function()
               m:publish("/myhome/dacha/tempMuv03/heap",node.heap(),0,0, function(conn)
               print("Heap published!")
               end)
             end)
      end)
      end
      collectgarbage()
    end

    function run_main_prog()
       print("Main  program starts!")
      tmr.alarm(2, 60000, 1, publish_data)
    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("Mqtt Connected to: " .. Broker)
      run_main_prog()
      end)
      end
     end)
     
    6. Изготовим выключатель.
    Вот еще кино для затравки:


    6.1. Создадим итем.
    Естественно, редактируем файл demo.item:
    Код (Bash):
    Switch    lamp1    "Моя лампа"    { mqtt=">[mosquitto:/myhome/lamp01/command:command:on:ON],>[mosquitto:/myhome/lamp01/command:command:off:OFF],<[mosquitto:/myhome/lamp01/state:state:default]" }
    Затем, с помощью Habmin, вытаскиваем его на свет Божий.
    Ну, или с помощью редактирования файла demo.sitemap:
    Код (Text):
    Switch item=lamp1
     
    Последнее редактирование: 28 янв 2016
    9xA59kK нравится это.
  9. ИгорьК

    ИгорьК Победитель модулей

    6.2. И заливаем такую программку:
    Код (Lua):

    gpio.mode(4,gpio.INPUT,gpio.PULLUP) -- Здесь конопочка
    gpio.mode(3,gpio.OUTPUT) -- А здесь релюшечка
    gpio.write(3,gpio.LOW)

    Broker="www.ВАШ_САЙТ.com"
    port=1883
    myClient="ESPSwitch"
    iogin="logIn"
    pass="passWord"

    m = mqtt.Client(myClient, 180, iogin, pass)
    m:lwt("/lwt", "ESPSwitch", 0, 0)
    m:on("offline", function(con)
      print ("reconnecting...")
      tmr.alarm(1, 120000, 1, function()
      m:connect(Broker, port, 0, function()
      tmr.stop(1)
      m:subscribe("/myhome/lamp01/command",0, function(conn)
      print("Subscribed!")
      end)
      end)
      collectgarbage()
      end)
    end)
    gpio.trig(4, "down",function (level)
      print(node.heap())
      local PinValue=gpio.read(3)
      if (PinValue==1) then
      gpio.write(3,0)
      m:publish("/myhome/lamp01/state","ON",0,0)
      else
      gpio.write(3,1)
      --print("Light was off, turn on")
      m:publish("/myhome/lamp01/state","OFF",0,0)
      end
    end)
    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON") then
      print("Enabling LED")
      gpio.write(3,gpio.LOW)
      m:publish("/myhome/lamp01/state","ON",0,0)
      elseif (data=="OFF") then
      print("Disabling LED")
      gpio.write(3,gpio.HIGH)
      m:publish("/myhome/lamp01/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(Broker, port, 0, function(conn)
      print("connected")
      m:subscribe("/myhome/lamp01/command",0, function(conn)
      print("Subscribed")
      end)
      end)
    end
    end)
     
    А теперь? Теперь жмем кнопочку и наблюдаем картинку из первого поста.
     
    Последнее редактирование: 28 янв 2016
    9xA59kK нравится это.
  10. ИгорьК

    ИгорьК Победитель модулей

    7. Дистанционное управление отоплением - разве можно упустить такой популярный вопрос?
    7.1.
    Берем ESP8266, к третьей ноге цепляем реле, к четвертой - DS18b20.
    7.2. Льем код:
    Код (Lua):

    pin=4 -- На этой ноге DS18b20
    gpio.mode(3,gpio.OUTPUT) -- Здесь реле
    gpio.write(3,gpio.LOW) -- Ногу вниз - реле включить
    tGet=21

    Broker="www.ВАШ_САЙТ.com"
    port=1883
    myClient="ESPSKOTEL"
    name="kotel"
    pass="password"

    m = mqtt.Client(myClient, 180, name, pass)
    m:lwt("/lwt", "ESPSKOTEL", 0, 0)
    m:on("offline", function(con)
       print ("reconnecting...")
      tmr.alarm(1, 90000, 1, function()
         m:connect(Broker, port, 0, function(conn)
           tmr.stop(1)
           m:subscribe("/myhome/dacha/kotel/command",0, function(conn)
             print ("Subscribed!")
           end)
         end)
      collectgarbage()
      end)
    end)

    tmr.alarm(2, 60000, 1, function()
      ds18b20 = require('ds18b20')
      ds18b20.setup(pin) -- На этой ноге DS18b20
      addres={}
      addres=ds18b20.addrs()
      local t = ds18b20.read(addres[1])
      ds18b20 = nil
      package.loaded["ds18b20"]=nil
      if t ~= 85 then
      if wifi.sta.status() == 5 then
           m:publish("/myhome/dacha/kotel/state",t,0,0, function(conn)
             print("Temp "..t.." and "..node.heap().." published!")
           end)
         end
         print("Get "..tGet)
      if t < (tGet-0.5) then
      gpio.write(3,gpio.LOW)
      end
      if t > (tGet+0.5) then
           gpio.write(3,gpio.HIGH)
      end
      end
      collectgarbage()
      print(node.heap())
    end)

    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
      data = tonumber(data)
       if (data > 15) and (data < 28) then
         tGet=data
         tmr.stop(2)
         m:publish("/myhome/dacha/kotel/get",tGet,0,0,
         function(conn)
           tmr.start(2)
         end)
       else
         print("Invalid - Ignoring")
       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("/myhome/dacha/kotel/command",0, function(conn)
             print("Subscribed!")
           end)
         end)
       end
    end)

     
    7.3. Готовим Openhab:...
     
    Последнее редактирование: 28 янв 2016
    9xA59kK нравится это.
  11. ИгорьК

    ИгорьК Победитель модулей

    7.3.0. Сначала Кино! ;)
    Краткое содержание фильма, поскольку он немой (возвращаемся к истокам кинемотографии :) ).
    Эпизод первый.
    В исходном состоянии OpenHAB отражает текущую температуру (24.06) и температуру, которая установлена как целевая (21.00). При этом, естественно, отопитель выключен. Путем нажатия мышкой на стрелочки в поле "Установить Цель" мы меняем циферки целевой температуры, а затем наблюдаем за полем "Отопление Цель", которое должно измениться через 12-15 секунд как закончится последний щелчок мышки. Это значит, что модуль управления отоплением принял команду.
    После чего терпеливо ожидаем изменения состояния отопителя, которое отображается лампочкой "Состояние Котла".
    Во втором эпизоде вы наблюдаете обмен командами между ESP8266 и OpenHAB (со стороны ESP8266). Модуль периодически отправляет информацию об окружающей температуре, целевой температуре и состоянии вкл/выкл отопитель. Затем он получает команду на изменение целевой температуры , подтверждает ее и включает отопитель.
    Приятного просмотра. Все раскладки и коды - чуть позже. (Ну ооооочень интересная задачка оказалась :) )



    Подумал, и оформил интерфейс по-другому. Все то же что и на видео, но только логичнее:
    51451345.jpg
     
    Последнее редактирование: 27 май 2015
    9xA59kK нравится это.
  12. ИгорьК

    ИгорьК Победитель модулей

    7.3.1. Создадим итемы:
    Код (Java):

    Number   Temperarure_Dacha_Kotel   "Текущая Температура [%.2f °C]"   <temperature>   { mqtt="<[mosquitto:/myhome/dacha/kotel/state:state:default]" }
    Switch   Kotel_Switched   "Состояние Отопителя"   <light>   (Kotel_Grupp)     { mqtt="<[mosquitto:/myhome/dacha/kotel/switch:state:default]" }
    Number   Dacha_Kotel_Show_Get   "Цель Отопителя [%.2f °C]"   <temperature>   { mqtt="<[mosquitto:/myhome/dacha/kotel/get:state:default]" }
    Number   Dacha_Kotel_Getting   "Отопление Скрытая Цель [%.2f °C]"   <temperature>   { mqtt="<[mosquitto:/myhome/dacha/kotel/get:state:default]" }
    Number   Dacha_Kotel_Proxy   "Отопление для команд [%.2f C]"   <temperature>   { mqtt=">[mosquitto:/myhome/dacha/kotel/command:command:*:default]" }


     
    7.3.2. Воткнем в сайтмэп:
    Код (Java):
    Frame  {
            Group label="Управление Отопителем" icon="garage"  {
                Text item=Temperarure_Dacha_Kotel    valuecolor=[>25="orange",>15="green",>5="orange",<=5="blue"]
                Switch item=Kotel_Switched
                Text item=Dacha_Kotel_Show_Get    
                Setpoint item=Dacha_Kotel_Getting label="Установить Цель [%.1f °C]" icon="temperature" valuecolor=[>25="red",>20="green",>5="orange",<=5="blue"] minValue=16 maxValue=29 step=0.5    
            }
        }    
    7.3.3. Напишем правило:
    Код (Java):
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*

    var Timer timer11 = null

    rule "change heating Dacha"

    when

            Item Dacha_Kotel_Getting changed

    then
            if (timer11 != null)
              timer11.cancel()
              timer11 = createTimer(now.plusSeconds(5)) [|
              {
                    sendCommand(Dacha_Kotel_Proxy, Dacha_Kotel_Getting.state.toString)
              }
            ]
    end
     
     
    Последнее редактирование: 1 июн 2015
    9xA59kK нравится это.
  13. ИгорьК

    ИгорьК Победитель модулей

    7.3.4. Теперь о логике созданного.
    Что делает каждый элемент.

    Temperarure_Dacha_Kotel- получает текущую температуру помещения, здесь, собственно мы ее и поддерживаем.
    Kotel_Switched - показывает состояние (вкл/выкл) управляемого отопителя.
    Dacha_Kotel_Show_Get - показывает ту температуру, которая НА ОТОПИТЕЛЕ установлена как целевая.
    Dacha_Kotel_Getting - этот элемент не показывается, но он как и предыдущий принимает информацию о целевой температуре отопителя. Предназначен для обеспечения работы сетпоинта. Об этом чуть позже.
    Dacha_Kotel_Proxy - тоже вспомогательный элемент. Его задача - отправить команду о температуре на управляемое устройство.
    ----------
    В сайтмэпе выводятся первые три (отмечены зеленым) элемента и добавляется сетпоинт:
    Setpoint item=Dacha_Kotel_Getting - он устанавливает целевую температуру.
     
    Последнее редактирование: 1 июн 2015
  14. ИгорьК

    ИгорьК Победитель модулей

    Как это взаимодействует.
    ESP8266 отправляет через MQTT информацию о температуре в помещении, целевой регулируемой температуре и состоянии котла (вкл./выкл.).
    Информация о целевой температуре принимается двумя итемами одновременно. Один постоянно показывается на экране (Dacha_Kotel_Show_Get), а другой (Dacha_Kotel_Getting) - источник информации для сетпоинта. Именно его и меняет сетпоинт, который сам дублирует его состояние.
    То есть, когда мы щелкаем по стрелкам, мы видим ручное изменение состояния Dacha_Kotel_Getting в копии сетпоинта.

    Как только мы перестали изменять сетпоинт, и он отличается от предыдущего состояния, срабатывает Правило. Правило передает показания сетпоинта - Dacha_Kotel_Getting на скрытый итем Dacha_Kotel_Proxy, который отправляет команду на ESP.

    Правило не совсем простое. Правило сбрасывает таймер в момент нажатия кнопок сетпоинта и тут же устанавливает его на пять секунд. То есть обеспечивается такой алгоритм, когда передача команды осуществляется по истечению 5 секунд после последнего нажатия.

    Пять секунд является очень интересным временем. После пяти секунд поле "Цель отопителя" должно измениться на вновь заданное. Или... сетпоинт должен вернуться в исходное состояние. Это не ошибка, это такая фича. Почему это иногда, не часто, происходит - можете поразмышлять самостоятельно. ;) (Замечу, что изменив кое-что в определении Dacha_Kotel_Getting , создав стартовое правило его установки, можно избежать этого эффекта. Но мне нравится именно так - котел показал что жив и здоров и отпинал меня обратно с моими пожеланиями. Ладно, не гордый - повторю еще раз :) На все то - пять секунд.)
    Надеюсь, указанных объяснений достаточно, чтобы повторить издевательства над OpenHAB.
    Однако, изложенное выше решение уже не будет работать с кодом, который приводил ранее. Тот код вполне рабочий, но не делает всего необходимого (а чем же я последнюю неделю то занимался ... ). Поэтому, впереди новый код. Даже не один :)
     
    Последнее редактирование: 1 июн 2015
  15. NE_XT

    NE_XT Гик

    За последнее время не могу повторить ни один проект, если он описан на русском языке.
    :0)
    Если проект нужно читать от начала до конца, слева-направо, внимательно каждую строку, то пишут с конца, справа-налево, в час по чайной ложке и еще между строк
    ;)
     
  16. ИгорьК

    ИгорьК Победитель модулей

    Спасибо за добрые слова и поддержку!
     
  17. NE_XT

    NE_XT Гик


    Пункт 4.2. Выполним команду перезапуска Openhab
    :
    а точнее вот это - (Если у нас не Малина 2 - офигеваем от времени перезагрузки)
    НАДА первым пунктом ставить :)
    Чтобы забросить этот проект, надо было мне сначала офигеть от тормозов :)
     
  18. ИгорьК

    ИгорьК Победитель модулей

    А заголовок темы слабо прочитать?
     
    Последнее редактирование: 1 июн 2015
  19. ИгорьК

    ИгорьК Победитель модулей

    Пункт 00736-182-ё142. О первой Малине.
    Для обладателей первой Малины, не исключая ученого нерда, обозначившегося выше и высоко ценящего чужой труд за неимением своего, замечу, что вся система OpenHAB работает на Java. Это значит, что перегружать малину надо не так часто. А именно:
    - при внесении изменений в файл openhab.cfg.
    - при установке Habmin. Возможно еще когда-то, но я не припомню.
    И процесс перезагрузки - это да, что-то... Действующее на нервы.
    Как и выполнение команды rpi-update и тому подобных.
    Но в остальном, OpenHAB очень некритичен к мощности железа и вполне шустро себе бегает.
    Потому всем кто имеет первую Малину все таки рекомендую с ним поиграться.
    Чтобы жизнь казалась проще, поделюсь приемом, который некоторым, может быть, и незнаком.
    1. Запускаем WinSCP, заходим на Малину с OpenHAB.
    2. Заходим в катaлог /opt/openhab и копируем на компьютер папку configurations.
    3. Входим в эти папки как на Малине, так и на компьютере.
    4. Жмем на клавиши Ctrl+U и получаем следующее изображение:
    531251345.jpg
    5. Жмем на кнопку "Начать" и начинаем... работать с файлами конфигурации OpenHAB на локальном компьютере. Изменения передаются на Малину, а Java подхватывает их налету.
    (6.) Еще можно использовать программку OpenHAB Designer с сайта. Подсвечивает код и, кое-что подсказывает. Главное запомнить две команды:
    - Ctrl+S - сохранить изменения;
    - Ctrl+Spase - вызывать помогальщика в место установки курсора.
    6462345.jpg
     
    Последнее редактирование: 2 июн 2015
    Sam нравится это.
  20. ИгорьК

    ИгорьК Победитель модулей

    7.3.5. Код для ESP8266, который НЕ БУДЕТ ЗАПУСКАТЬСЯ!
    upd 28.01.2016.
    Код (Lua):

    pin=4 -- На этой ноге DS18b20
    gpio.mode(3,gpio.OUTPUT) -- Здесь реле
    gpio.write(3,gpio.LOW) -- Ногу вниз - реле включить

    Broker="www.ВАШ_САЙТ.com"
    port=1883
    myClient="ESPSKOTEL"
    name="kotel"
    pass="password"

    function readTGet()
      file.open("data.txt","r")
      data = file.read()
      file.close()
      return tonumber(data)
    end
    function writeTGet(d)
      file.open("data.txt", "w+")
      file.write(d)
      file.close()
    end

    tGet=readTGet ()
    print("Get: "..tGet)

    m = mqtt.Client(myClient, 180, name, pass)
    m:lwt("/lwt", "ESPSKOTEL", 0, 0)
    m:on("offline", function(con)
       print ("reconnecting...")
      tmr.alarm(1, 90000, 1, function()
         m:connect(Broker, port, 0, function(conn)
           tmr.stop(1)
           m:subscribe("/myhome/dacha/kotel/command",0, function(conn)
             print ("Subscribed!")
           end)
         end)
      collectgarbage()
      end)
    end)

    tmr.alarm(2, 60000, 1, function()
      ds18b20 = require('ds18b20')
      ds18b20.setup(pin) -- На этой ноге DS18b20
      addres={}
      addres=ds18b20.addrs()
      local t = ds18b20.read(addres[1])
      ds18b20 = nil
      package.loaded["ds18b20"]=nil
      if t ~= 85 then
      if wifi.sta.status() == 5 then
           m:publish("/myhome/dacha/kotel/state",t,0,0, function(conn)
             print("Temp "..t.." and "..node.heap().." published!")
           end)
         end
         print("Get "..tGet)
      if t < (tGet-0.5) then
      gpio.write(3,gpio.LOW)
      end
      if t > (tGet+0.5) then
           gpio.write(3,gpio.HIGH)
      end
      end
      collectgarbage()
      print(node.heap())
    end)

    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
      data = tonumber(data)
       if (data > 15) and (data < 28) then
         tGet=data
         writeTGet(tGet)
         tmr.stop(2)
         m:publish("/myhome/dacha/kotel/get",tGet,0,0,
         function(conn)
           tmr.start(2)
         end)
       else
         print("Invalid - Ignoring")
       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("/myhome/dacha/kotel/command",0, function(conn)
             print("Subscribed!")
           end)
         end)
       end
    end)
     
     
    Последнее редактирование: 28 янв 2016