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

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

  1. ИгорьК

    ИгорьК Оракул Модератор

    Похоже, баг. Пожалуйста, выполните такой код:
    Код (Lua):
    a = "22.24234234"
    =string.find(a, ".")
    Что получится?
     
  2. woow

    woow Гик

    ИгорК, в этом форуме куда не ходи, кого не спрашивали всё ровно все дороги ведут к вам :) . Рискну ещё раз спросит про конфигурацию MQTT и OpenHAB. Опишу ситуацию в вкратце, что бы понят с чем я тут мучаюсь.
    Всё заряжаю в малину:
    Raspbian+апдейты
    Java8
    MQTT- одни источники указывают что нужно apt-get install mosquitto, другие apt-get install mosquitto-clients
    И третье что оба за инсталлировать один за другим.
    Потом тестирую
    Terminal window 1:
    mosquitto_sub -d -t hello/world
    Terminal window 2:
    mosquitto_pub -d -t hello/world -m "Greetings from Terminal window 2!"
    ответ есть, в этом варианте тест проходит.
    Не которые источники указывают что нужно ещё дополнит mosquitto.conf
    Дальше инсталлирую OpenHAB через apt-get
    /etc/openhab/configurations- удаляю и сюда copy+paste из OpenHAB.demo архива копирую configurations.
    В папку configurations копирую и файл openhab.cfg.
    Открываю и все его содержимое то что не нужно или за комментирую или удаляю, оставляю только это:
    ## MQTT Transport #####

    mqtt:mosquitto.url=tcp://localhost:1883
    mqtt:mosquitto.clientId=MyOpenHab


    Reboot
    Потом проверка openhab и mosquitto статусов, все активированы
    Даю команду:
    mosquitto_sub -d -t /myhome/#
    и такого сообщения, как описано в пункте 4.4 вашего описания, не получаю.
    Для такой проверки- теста уже должны быть настроены итемс и сите.мапс?
    Подключенных датчиков и устройств пока нет.
    Где что пропустил?
     
  3. ИгорьК

    ИгорьК Оракул Модератор

    Это правильные источники.
    Не надо - все работает.
    Именно так.

    И это верно - это уже исключено из конфигурации.

    Да, именно.
    Ничего не пропустили. Вообще все сделано верно.

    Теперь нужно добыть сигналы от датчиков и приаттачить их к итемам.

    Для этого в помощь нам нужен MqttSpy. Установлен?
    Создайте итем и поместите его на сайтмэп.
    Код (Java):
    // Это итем
    Number test "Тест [%d ]" { mqtt="<[MyOpenHab:test/01:state:default]" }
    // На сайтмэпе он будет выглядеть так:
    Text item=test
     
    Научитесь управлять им с помощью MqttSpy:
    spy.jpg

    В результате Вы должны через MqttSpy научиться выводить цифры в OpenHab.
    Научитесь - двинемся дальше.

    PS. Замечу, будучи брошенным, Вы уперлись и хорошо продвинулись дальше :) Респект.
     
    Последнее редактирование: 24 авг 2016
  4. ИгорьК

    ИгорьК Оракул Модератор

  5. ИгорьК

    ИгорьК Оракул Модератор

    38. Отправляем в OpenHab много данных. JSON. Шаблон.
    Продолжим шаблонирование. (См. раньше.)
    В прошлом посте предлагалось отправлять данные путем переработки таблицы в json-объект, а именно:
    Код (Lua):
    function now()
        function pub()
            local topic = "cellar"
            local info = cjson.encode(dat) --  dat - это таблица с данными
                print("Publish Topic: "..topic.." and Info: "..info)
                m:publish(topic.."/state",info,0,0, function() end)
        end
        pub()
    end
    На стороне OpenHab следует повозиться с расшифровкой. Повозился.
    Вот как будет это все выглядеть.
    Отправляемый объект:
    Код (Java):
    {"tIn":23.9,"hIn":42.9,"tOt":24,"hOt":43.8}
    Принимающие итемы:
    Код (Java):
    Group Cellar
    String    cellarGetAll { mqtt="<[mosquitto:cellar/state:state:default]" }
    String    cellarTempIn    "Температура [%s °C]"    <temperature> (Cellar)
    String    cellarHumIn        "Влажность [%s %%]"    <weather_humidity> (Cellar)
    String    cellarTempOut    "Температура [%s °C]"    <temperature> (Cellar)
    String    cellarHumOut    "Влажность [%s %%]"    <weather_humidity> (Cellar)
    Правило расшифровки:
    Код (Java):
    rule "MqttCellarDecript"
      when
        Item cellarGetAll received update
      then
        var String json = (cellarGetAll.state as StringType).toString
        // {"tIn":23.9,"hIn":42.9,"tOt":24,"hOt":43.8}
          var String tIn  = transform("JSONPATH", "$.tIn", json)
          var String hIn  = transform("JSONPATH", "$.hIn", json)
          var String tOt  = transform("JSONPATH", "$.tOt", json)
          var String hOt = transform("JSONPATH", "$.hOt", json)

          postUpdate(cellarTempIn,  tIn)
          postUpdate(cellarHumIn, hIn)
          postUpdate(cellarTempOut,   tOt)
          postUpdate(cellarHumOut,  hOt)
    end
    Уррраааа! Заработалааааа! ... но не совсем.
    Попробуйте отправить по mqtt следующее, ошибочное, сообщение:
    Код (Java):
    {"tI":23.9,"hIn":42.9,"tOt":24,"hOt":43.8}
    Ошибка в определении json объекта вводит OpenHab в ступор, причем до такого сосотяния, что он некоторое время не реагирует вообще ни на что, а потом просто не может отработать все вышесказанное до перезагрузки.

    UPD 26/09/2016. Описанное ниже работает, но не во всех случаях.
    Лучше, все-таки, контроллировать целостность json посредством проверки его crc на устройстве перед отправкой в OpenHab.


    Поэтому, расширим то, чему учат авторы. Правило будет следующим:
    Код (Java):
    rule "MqttCellarDecript"
      when
        Item cellarGetAll received update
      then
        var String json = (cellarGetAll.state as StringType).toString
        // {"tIn":23.9,"hIn":42.9,"tOt":24,"hOt":43.8}
          var String tIn = ""
          var String hIn = ""
          var String tOt = ""
          var String hOt = ""
          tIn  = tIn + transform("JSONPATH", "$.tIn", json)
          hIn  = hIn + transform("JSONPATH", "$.hIn", json)
          tOt  = tOt + transform("JSONPATH", "$.tOt", json)
          hOt  = hOt + transform("JSONPATH", "$.hOt", json)

            if (tIn !=Uninitialized){
                postUpdate(cellarTempIn,  tIn)
            }
            if (hIn !=Uninitialized){
                postUpdate(cellarHumIn, hIn)
            }
            if (tOt !=Uninitialized){
                postUpdate(cellarTempOut,   tOt)
            }
            if (hOt !=Uninitialized){
                postUpdate(cellarHumOut,  hOt)
            }
    end
     
    То есть, двойная защита от ошибок. Это работает надежно и OpenHab не валится на бок. В случае ошибки в объекте получается так:
    openhab01.jpg

    И еще итемы с участием выключателей.
    Код (Java):
    String    cellarGetMods { mqtt="<[mosquitto:cellarMods/state:state:default]" }
    Switch    cellarFan        "Вентилятор"         (Cellar)
    Switch    cellarWork        "Режим"             (Cellar)
    Switch    cellarFaF        "Принудительно"        (Cellar)
    String    cellarTarget    "Цель [%s °C]"    <temperature> (Cellar)
    Отправка json:
    Код (Java):
    {"mod":"ON","fan":"OFF","faF":"OFF","tg":4}
    И правило для них:
    Код (Java):
    rule "Mqtt Cellar Modes Decript"
      when
        Item cellarGetMods received update
      then
        var String json = (cellarGetMods.state as StringType).toString
        //  {"mod":"ON","fan":"OFF","faF":"OFF","tg":4}
          var String mod = ""
          var String fan = ""
          var String faF = ""
          var String tg = ""
          mod  = mod + transform("JSONPATH", "$.mod", json)
          fan  = fan + transform("JSONPATH", "$.fan", json)
          faF  = faF + transform("JSONPATH", "$.faF", json)
          tg  = tg + transform("JSONPATH", "$.tg", json)

            if (mod !=Uninitialized){
                postUpdate(cellarWork,  mod)
            }
            if (faF !=Uninitialized){
                postUpdate(cellarFaF, faF)
            }
            if (tg !=Uninitialized){
                postUpdate(cellarTarget,   tg)
            }
    end
    Итого, весь комплект:
    all.jpg

    Кино:



    А это пошли реальные данные из погреба.
    765358.jpg

    И дополнение от chibis : http://forum.amperka.ru/threads/arduino-esp8266-raspberry-pi-2-openhab-Умный-дом-азы-управления.5043/page-55#post-92285
     
    Последнее редактирование: 7 ноя 2016
    chibis, Securbond и alp69 нравится это.
  6. big_alex

    big_alex Гик

    Приветствую всех. Использую прошивку ESPEasy и MQTT.
    Статус GPIO приходит в виде:
    {
    "log": "",
    "plugin": 1,
    "pin": 12,
    "mode": "output",
    "state": 1
    }
    Подскажите как в OpenHAB перевести переключатель в соответствующее положение.
    Сейчас итем такой:
    Switch MQTTLED {mqtt=">[mosquitto:/openhabdemo/cmd:command:ON:GPIO,12,1],>[mosquitto:/openhabdemo/cmd:command:OFF:gpio,12,0], <[mosquitto:/openhabdemo/status:state:default]"}
    Возможно это сделать с REGEX или нужно создать правило?
     
  7. ИгорьК

    ИгорьК Оракул Модератор

    Вам надо добиться, чтобы ваша железка отправляла по mqtt то, что принимает OpenHab как переключатель.
    В вашем примере это топик
    Код (Java):
    /openhabdemo/status
    Причем приходить должно или ON или OFF.
    Что у Вас приходит (и приходит ли вообще) я не знаю. Смотрите что шлет железка через MqttSpy и принимайте решение что где менять.
     
    Последнее редактирование: 31 авг 2016
  8. big_alex

    big_alex Гик

    Кажется мне поможет Ваш пример выше, только мне нужно удалить символ переноса строки в ответе или нет? json-объект допускает перенос строк?
    Железка шлет
    Код (Text):
    {
    "log": "",
    "plugin": 1,
    "pin": 12,
    "mode": "output",
    "state": 1
    }
     
  9. ИгорьК

    ИгорьК Оракул Модератор

    Полагаю, ему по-фиг. Что мешает проверить?

    Делаем два итема:
    jsonAll - приемник объекта
    MQTTLED - свитч
    Добавится правило, типа
    Код (Java):

    rule "MqttMQTTLEDDecript"
      when
       Item jsonAll received update
      then
    var String json = (jsonAll.state as StringType).toString
    var String state = ""
       state  = state + transform("JSONPATH", "$.state", json)
    if (state == "1") {
      postUpdate( MQTTLED, ON)
    }
    if (state == "0" ) {
      postUpdate( MQTTLED, OFF)
    }
    end
     
     
    Последнее редактирование: 31 авг 2016
  10. big_alex

    big_alex Гик

    Пробовал такое правило:
    Код (Text):
    rule "ESPEasy MQTT status"
        when
            Item MQTTLED received update
    then
        var json = (MQTTLED.state as StringType).toString
        var st1 = new Integer(transform("JSONPATH","$.state",json))
       
        MQTTLED.postUpdate( if (st1 < 1) OFF else ON )  
    end
    не работает (
     
  11. ИгорьК

    ИгорьК Оракул Модератор

    Попробуйте то что я написал. Да, и лучше json объект вывести на отдельный итем, а выключатель сделать отдельно. Сделайте итем jsonAll и принимайте все на него, а с него распарсивайте. Подправил код.
    В if посмотрите нужны ли кавычки вокруг цифр. Возможно OpenHab меняет стринг на цифры. Я в Java не силен.
     
    Последнее редактирование: 31 авг 2016
  12. big_alex

    big_alex Гик

    Спасибо, работает.
    Код (Text):
    2016-08-31 16:59:11.271 [INFO ] [runtime.busevents             ] - jsonAll state updated to {
    "log": "",
    "plugin": 1,
    "pin": 12,
    "mode": "output",
    "state": 1
    }

    2016-08-31 16:59:11.371 [INFO ] [runtime.busevents             ] - MQTTLED state updated to ON
    только на вебинтерфейсе состояние выключателя не изменяется ( все ОК

    при старте выполняется
    Код (Text):
    rule "Initialize MQTT status"
        when
            System started
        then
            publish("mosquitto", "/openhabdemo/cmd", "status,gpio,12")
    end
     
    Последнее редактирование: 31 авг 2016
  13. Pochemushka

    Pochemushka Нерд

    ИгорьК огромное спасибо за проделанный вами титанический труд. Только благодаря вашим постам смог победить это зло под названием Openhab :)
    Правда на текущий момент имею следующую проблему, а именно приходиться работать в каком нить nano редакторе.hab designer и hamnin бунтуют на моем cubietruck. Сущность бунта такова: заходишь в habmin все item'ы и rules'ы я вижу и могу работать, а вот sitemap я в habmin вижу в списке слева, но справа внутренности sitemap не подгружаются. Если создать новый sitemap то все нормально до той поры или пока ты не выйдешь из habmin или пока не переключишься в списке на другой sitemap. Как только ты это сделал - все новый sitemap так же не "грузится". в редакторе все отлично редактируется ошибок нет, интерфейс работает.
    В логах openhab в момент нажатия на sitemap в habmin вываливается следующее:
    [ERROR] [.s.container.ContainerResponse] - The RuntimeException could not be mapped to a response, re-throwing to the HTTP container java.lang.NullPointerException: null.
    Куда копать не подскажите?
    А то приходиться чтобы подсмотреть как новый элемент создается и какими свойствами обладает создавать в openhab новый sitemap создавать элемент, потом лезть в редакторе подсматривать и перетаскивать в рабочий проект.
    спасибо.
     
  14. ИгорьК

    ИгорьК Оракул Модератор

    ОпенХаб - это хорошо и просто. Надо проникнуться.
    Не заходите в хабмин. Это зло и оно не поддерживается в последних версиях, о чем прямо указано на сайте.
    Вы должны пользоваться связкой WinSCP + openHAB Designer.
    Вы копируете себе на компьютер всю конфигурационную директорию ОпенХаба, редактируете ее в Дизайнере и синхронизируете на кубик при помощи WinSCP.
    2222.jpg
     
    Последнее редактирование: 7 сен 2016
  15. Pochemushka

    Pochemushka Нерд

    Спасибо за оперативный ответ.
    Мы хоть в деревне и щи лаптями хлебаем, но заветов бабушки и дедушки не забываем. А бабушка с дедушкой завещали всегда первые 10 страниц темы на форуме читать, чтобы в просак не попасть :)
    Ну раз не получилось с habmin прошу помочь со второй частью марлезонского балета. hab designer:
    error_hd.png
     
  16. alp69

    alp69 Форумчанин

    И я еще дилетантский вопрос задам. Есть ли возможность цвета линий в графиках самому назначать? Не перезакреплять, а именно назначать. Например не красный, зеленый, синий и т.д., а, допустим, фиолетовый, черный, оранжевый...
    Куда влезть?
     
  17. ИгорьК

    ИгорьК Оракул Модератор

    Это значит что в файле, который пытаетесь открыть, ошибки - не закрыты скобки или еще чтото сильно перепутано.
    Пробуйте написать его заново.
    Кстати, это следствие работы Хабмина.
     
  18. ИгорьК

    ИгорьК Оракул Модератор

    Не встречал.
     
    alp69 нравится это.
  19. Pochemushka

    Pochemushka Нерд

    однозначно проблема не в этом по двум причинам:
    все файлы рабочие и ошибок в логах openhab нет и даже если создать простой файл из одной сточки например items что то типа numer test - результат тот же. Одна и таже проблема со всеми файлами items, sitemap, rules. Создаешь пустой файл myhome2.items подсовываешь - картина та же :(
    кстати не один файл не создавался и не редактировался ранее в habmin, поэтому на него точно не грешу...
    Умахался уже несколько раз designer распаковываю. заново типа устанавливаю, java переустановил. Щас пойду у жены imac отожму туда hab desiger поставлю попробую.
     
  20. ИгорьК

    ИгорьК Оракул Модератор

    Обновили бы явку тогда. Оно на яве работает.
    Я верю в Вашу искренность, но я встречался с такой картинкой неоднократно именно в случае ошибок в конфигурационных файлах.
     
    Последнее редактирование: 8 сен 2016