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

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

  1. ИгорьК

    ИгорьК Гуру

    1. А каковы настройки openhab.cfg в связи с вопросом. Выкладывайте.

    2.
    А теперь самостоятельно сравните это с тем, что у меня по ссылке. ("Найди три отличия..." :) )
     
  2. dimm71

    dimm71 Нерд

    1. Что именно из openhab.cfg нужно выложить? Надеюсь не весь конфиг? :)
    2. Если Вы про /event: , то здесь https://github.com/openhab/openhab/wiki/Mqttitude-Binding написано, что в новых версиях OwnTrack (а у меня новая) нужно прописывать
    Код (C++):
    Manual Mode:          { mqttitude="<broker_id>:<mqtt_topic>" }
    Region Mode (old):    { mqttitude="<broker_id>:<mqtt_topic>:<region_description>" }
    Region Mode (new):    { mqttitude="<broker_id>:<mqtt_topic>/event:<region_description>" }
    что я и сделал. Хотя пробовал по разному.
     
  3. alp69

    alp69 Гуру

    Настроил сообщения по Telegram. Если из rules отправлять просто текст по событию - все летает. Но потом захотелось конкретики. Чтобы приходило сообщение (допустим) "В будке 68.5 градусов", а не просто "в будке жарко". Для этого взял с гитхаба цитату
    Код (Text):
    rule "Send telegram with Formatted Message"
    when
        Item Foo changed
    then
        sendTelegram("bot1", "item Foo changed to %s and number is %.1f", Foo.state.toString, 23.56)
    end
    Естественно поменял Foo на свой итем.
    Так вот с ОН, установленного по старинке, все приходит как надо. А вот с ОН 1.8.3, установленного через apt-get - фигвАм. Вообще ничего не приходит. Пока не удалишь из текста сообщения символы %s и от %.1f и далее. Но тогда и показания итема (тип - number) не отображаются.
    Аддоны стоят соответствующие сборке OH. Полагаю проблема в несоответствии типов данных. Но почему на разных сборках ОН разный результат? Какие мысли?
     
    Последнее редактирование: 19 сен 2016
  4. ИгорьК

    ИгорьК Гуру

    Оптимально: скоро выходит 1.9.0

    Можно отдельно сформировать стринг а потом его отправить.
     
    Последнее редактирование: 19 сен 2016
  5. ИгорьК

    ИгорьК Гуру

    Поразмышляйте. Что-то надо сделать с файлом конфигурации. Вот и выложите что Вы сделали. Если ничего - работать не будет.
    Я все таки предложил Вам найти отличия между Вашей реализацией и моей. Если Вы делали так же - чем я смогу помочь?
     
  6. alp69

    alp69 Гуру

    Глядел в этом направлении. Показалось несколько громоздко. Как думаете - если в топик числовые данные отправлять в том числе и стрингом, в Lua это элегантнее получится? Я имею ввиду преобразование float/string. Число будет попадать в видимый итем на сайтмэпе, а стринг - в скрытый итем. И rules настраивать на срабатывание по значению видимого итема, а в сообщение заталкивать строку из скрытого.
    Покритикуйте :rolleyes:
     
  7. ИгорьК

    ИгорьК Гуру

  8. dimm71

    dimm71 Нерд

    Вот openhab.cfg
    Код (C++):
    mqtt:mosquitto.url=tcp://localhost:1883
    mqtt:mosquitto.clientId=MyOpenHab
    Включил логирование в mosquitto.conf - данные приходят. По ощущениям openhab на них не реагирует.

    Что касается с Вашим примером - пробовал по всякому.
     
  9. ИгорьК

    ИгорьК Гуру

    Насколько я могу заметить с планшета, Вы сделали все также как и я когда-то.
    Надеюсь, Вы все таки делали итемы и так как я рекомендовал, то есть с идентификатором, который присваивает сотовый телефон.
    Тогда не представляю чем Вам помочь.
    Кроме одной мысли, которую я смогу проверить лишь завтра как доберусь до компьютера.
    Да, и аддоны там случаем не требуются? Я уж и не помню, проверьте.
     
    Последнее редактирование: 20 сен 2016
  10. ИгорьК

    ИгорьК Гуру

    А у Вас хоть что-то по mqtt работает?
     
  11. dimm71

    dimm71 Нерд

    Аддоны вроде есть, в папке addons есть org.openhab.binding.mqttitude-1.8.3.jar , а вот как подключить его? Если в rules , то на всякий случай прописал.
    Так как физического железа пока нет (жду заказ) решил попробовать подключить сервисы не требующие железа. Так что не знаю как проверить работает ли вообще MQTT. В логах mosquitto пишется:
    Код (C++):
    1474348436: Received PINGREQ from dimm71
    1474348436: Sending PINGRESP to dimm71
    1474348465: Received PINGREQ from MyOpenHab
    1474348465: Sending PINGRESP to MyOpenHab
    1474348481: Received PUBLISH from dimm71/mc90ds (d0, q1, r1, m53, 'owntracks/dimm71/mc90ds', ... (101 bytes))
    1474348481: Sending PUBACK to dimm71/mc90ds (Mid: 53)
    1474348481: Sending PUBLISH to dimm71 (d0, q0, r0, m0, 'owntracks/dimm71/mc90ds', ... (101 bytes))
    1474348481: Sending PUBLISH to dimm71/mc90ds (d0, q1, r0, m105, 'owntracks/dimm71/mc90ds', ... (101 bytes))
    1474348481: Received PUBACK from dimm71/mc90ds (Mid: 105)
    1474348482: Received PUBLISH from dimm71/mc90ds (d0, q1, r0, m54, 'owntracks/dimm71/mc90ds/event', ... (157 bytes))
    1474348482: Sending PUBACK to dimm71/mc90ds (Mid: 54)
    1474348482: Sending PUBLISH to dimm71 (d0, q0, r0, m0, 'owntracks/dimm71/mc90ds/event', ... (157 bytes))
    1474348482: Sending PUBLISH to dimm71/mc90ds (d0, q1, r0, m106, 'owntracks/dimm71/mc90ds/event', ... (157 bytes))
    1474348482: Received PUBACK from dimm71/mc90ds (Mid: 106)
    1474348496: Received PINGREQ from dimm71
    1474348496: Sending PINGRESP to dimm71
    1474348525: Received PINGREQ from MyOpenHab
    1474348525: Sending PINGRESP to MyOpenHab
    1474348556: Received PINGREQ from dimm71
    1474348556: Sending PINGRESP to dimm71
     
    Как я понимаю, данные приходят из OwnTrack, а вот доходят ли до Openhab?
    Да и соединение держит - постоянно пингует.
     
  12. dimm71

    dimm71 Нерд

    Всё. Стоп. Заработало. Решил ещё раз проинсталировать аддоны и сервер мне говорит, что нужно обновить
    openhab-addon-binding-mqttitude до версии 1.8.3. Странно конечно очень.
    Спасибо за помощь и что не бросили на произвол судьбы :)
     
  13. ИгорьК

    ИгорьК Гуру

    MqttSpy - наше все. Он и мониторит что приходит на брокер путем подписки, и может отправлять на брокер сообщения (эмулировать устройство).
    Сoздайте какой-нибудь switch, управляемый по mqtt, и научитесь управлять им с MqttSpy и ловить команды с него.
    Это очень важно.
     
    Последнее редактирование: 20 сен 2016
  14. ИгорьК

    ИгорьК Гуру

    39.1. Заводим HC-12 в OpenHab. ESP-8266.
    НС-12 - UART-трансивер на 433 МГц с неплохой дальностью связи. Он будет (почти)идеальным связником между оконечными устройствами, включая Arduino, и OpenHab.
    Предлагаю устройство, которое передает данные от железок с HС-12 в OpenHab в обе стороны.
    HC120001.jpg
    Пришедшие данные от оконечных устройств проверяются на верность crc8 и в случае успеха передаются на брокер mqtt. К командам, пришедшим от OpenHab, цепляется проверочный хвостик и они передаются на устройства (определение принадлежности и проверка подлинности осуществляется на устройствах).
    HC12.jpg

    Код (Lua):
    crc8 = require 'crc8'

    Broker="ВАШ_БРОКЕР"
    port=ВАШ_ПОРТ
    myClient="cellar"
    name=myClient
    pass="pass"
    publish = false

    m = mqtt.Client(myClient, 180, name, pass)
    m:lwt("/lwt", myClient, 0, 0)

    function connecting()
        function getConnect()
           if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
                m:connect(Broker, port, 0, 0,
                    function(conn)
                        tmr.stop(6)
                        publish = true
                        m:subscribe(myClient.."/#",0, function(conn)
                        end)
                end)
            end
        end
        getConnect()
        tmr.alarm(6, 90000, 1, function()
            getConnect()
        end)
    end

    m:on("offline", function(con)
        publish = false
        connecting()
    end)


    function publ(dt)
        dt = string.gsub(dt, "\n","")
        local data = crc8.decode(dt)
        if data == 'NoCRC' then
            return
        end
        local top = "/state"
        if string.find(data, "unit1") then  -- Устройства передают информацию о своем названии
            top = "/stateUnit1"      -- которая отлавливается и распрделяется по топикам
        end
        if string.find(data, "unit2") then
            top = "/stateUnit2"
        end
        if string.find(data, "{") and string.find(data, "}") then -- признак правильной информации - две скобки
            if publish == true then
              m:publish(myClient..top,data,0,0)
            end
        end
        collectgarbage()
    end

    uart.on("data",';',  -- данне от устройств должны завершаться ";"
        function(data)
            if string.find(data, ";") then -- нашли ";"
                data = string.gsub(data, ";","") -- удалили ";"
                data = string.gsub(data, "\n","") -- удалили перевод строки, если есть
                publ(data)
            end
    end, 0)

    m:on("message", function(conn, topic, data)
        if (string.find(topic, "state")) == nil then
            local top = string.gsub(topic, myClient.."/","")
            if top == "command" then -- топик для всех устройств общй: 'command'
                local dt = crc8.encode(data)
                print(dt..";")
            end
        end
        collectgarbage()
    end)

    connecting()

    Данные должны приходить (а команды - отправляться) в формате json + проверочный хвостик:

    data121.jpg

    Дополнительная информация о логике и модуль crc8 находится здесь.

    Внимание ардуинопоклонников! Если задело - вам сюда. Нет - вам в помощь вот этот замечательный топик. Как вы им будете пользоваться для работы с OpenHab - делитесь.
    У меня пока оконечник на Iskra JS. Как дойдут руки до Ардуино - сделаю и выложу код.



    Как это дешифровать в OpenHab смотрим в предыдущей заметке.

    Идем дальше.
     
    Последнее редактирование: 23 сен 2016
    Securbond и alp69 нравится это.
  15. alp69

    alp69 Гуру

    То есть долой wi-fi, переходим на радио-433?

    И еще вопрос. Можно ли esp настроить таким образом, чтобы данные уходили нескольким брокерам, физически расположенным в разных городах? Ключевая фраза "нескольким брокерам".
    Или придется делать последовательную трансляцию?
     
  16. ИгорьК

    ИгорьК Гуру

    Не до конца: все таки сам ESP то работает по wifi. В принципе можно - тогда HC-12 лепим к Малине. Но это отдельная песня.
    Полагаю, можно. Но именно на "уходили". Потому что прием (с постоянной привязкой) возможен только к одному брокеру. Одновременно двух брокеров ESP слушать не может.
     
  17. alp69

    alp69 Гуру

    Допустим так:
    Код (C++):
    Broker1="ВАШ_БРОКЕР1"
    Broker2="ВАШ_БРОКЕР2"
    port1=ВАШ_ПОРТ1
    port2=ВАШ_ПОРТ2
    myClient1="1"
    myClient2="2"
    name1=myClient1
    name2=myClient2
    pass1="pass1"
    pass2="pass2"
    publish = false

    m1 = mqtt.Client(myClient1, 180, name1, pass1)
    m1:lwt("/lwt", myClient1, 0, 0)

    m2 = mqtt.Client(myClient2, 180, name2, pass2)
    m2:lwt("/lwt", myClient2, 0, 0)
     
    Ну и дальше в том же духе.
     
  18. alp69

    alp69 Гуру

    С чем связано?
     
  19. ИгорьК

    ИгорьК Гуру

    Дык... шут его знает. Вы попробуйте да расскажите :) Может, действительно работает.
     
  20. alp69

    alp69 Гуру

    Тогда зачем он по uart еще и в трансивер сливает данные? Неясна логика схемотехнического решения.