Умный дом: Domoticz.

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

Метки:
  1. Securbond

    Securbond Гик

    Какой язык в node red ? пробую округлить число до 2 знаков, и нифига не выходит. пробовал и язык LUA и JavaScript.....
     
  2. ИгорьК

    ИгорьК Давно здесь

    JavaScript
    number.toFixed(n): http://learn.javascript.ru/properties-and-methods
     
  3. Securbond

    Securbond Гик

    Пробовал этот вариант ответ -
    Код (Text):
    "TypeError: msg.payload.toFixed is not a function"
     
  4. ИгорьК

    ИгорьК Давно здесь

    Ну, друже! Зачем ты стринг методом от number резать собрался? Включай творческий разум :)

    Вообще, JavaScript - не язык а прикол. Это тебе не элементарный Lua. Здесь все веселее :)
     
    Securbond нравится это.
  5. Securbond

    Securbond Гик

    :rolleyes::rolleyes::rolleyes::):):)
    Код (Java):
    var x = +msg.payload;
    zn = x.toFixed(2);
    Работает ))))
     
  6. ИгорьК

    ИгорьК Давно здесь

    Ишшо давай! В одну строку с одной переменной :)

    Код (Javascript):
    var x = (+msg.payload).toFixed(2);
    Так работает?
     
    Последнее редактирование: 6 янв 2018
    Securbond нравится это.
  7. Securbond

    Securbond Гик

    Попробую обязательно. другую проблему решаю ... Есть лампа с 3 мя состояниями On, Off, Noch Запускает три разных bash скрипта. Кнопками всё работает, а вот из LUA Пришлось поковыряться. Реализация через
    Код (Text):
    commandArray['Лампочка Коридор'] = 'Set Level 20'
    совсем не очевидная :confused:
     
  8. Securbond

    Securbond Гик

    Пример скрипта Domoticz - Включение 3-ёх режимного "Light/Switch/Selector" по датчику движения. Режим в зависимости от времени суток.
    Switch_Motion.JPG Switch_Set.JPG

    Код (Java):
    time = os.date('%X');

    commandArray = {}

    if devicechanged['Движение коридор'] == 'On' and (time >='06:30' and time <'23:00') then
            commandArray['Лампочка Коридор'] = 'Set Level 10'
    elseif devicechanged['Движение коридор'] == 'Off'  then
            commandArray['Лампочка Коридор']='Set Level 0'
        end
    return commandArray
    Код (Java):
    time = os.date('%X');

    commandArray = {}

    if devicechanged['Движение коридор'] == 'On'  and ((time >= '23:00' and time <= '23:59') or (time >='00:00' and time <'06:30')) then
    commandArray['Лампочка Коридор'] = 'Set Level 20'
    elseif devicechanged['Движение коридор'] == 'Off'  then
            commandArray['Лампочка Kоридор']='Set Level 0'
        end
    return commandArray
     
    Последнее редактирование: 6 янв 2018
    ИгорьК нравится это.
  9. Securbond

    Securbond Гик

    Игорь уже писал, но повторюсь на более простом примере.
    Итак имеем давно работающую погодную станцию, которая посылает данные на MQTT брокер
    Для примера заберём температуру и освещенность из двух топиков
    /pogoda/sensors/tempDS (температура)
    /pogoda/sensors/ls (освещенность)
    и отправим их в domoticz.
    1. Первым делом создадим новое Оборудование имя зададим - "ESP-WS" тип выберем Dummy (Does nothing, use for virtual switches only)

    ws0.PNG ws1.PNG
    2.
    Далее в созданном оборудовании создадим два виртуальных датчика. с типами "Температура" и "Освещённость". они появятся в списке устройств.
    ws2.PNG

    Нам нужно запомнить их Idx
    3.
    Ставим node-red https://nodered.org/docs/hardware/raspberrypi ,
    запускаем его вэбморду, и начинаем колдовать с топиками . Нам нужно 3 блока (у меня 4)
    - input / mqtt
    - output / mqtt
    - function / function

    red1.PNG
    Тапаем по первому (mqtt) и настраиваем подключение к своему брокеру, подписываемся на нужный топик

    mqtt1.PNG
    Последний блок mqtt out настраивается аналогично, только подписываемся на domoticz/in

    Теперь тапаем на функцию и пишем маленький скрипт, который за нас с вами уже написал уважаемый ИгорьК несколькими постами выше, а мы его только обрежем и подставим свои значения.
    Чтобы было понятнее, после подписки на брокер, мы можем забрать из него msg.topic (возвращает полный путь топика в которое прилетело сообшение) или msg.payload (от Англ. payload - полезная нагрузка, то есть то, что прилетело в топик ). Нам остаётся только взять данные и отрезать не изменный путь топика, оставив последнюю часть после кавычки tempDS или ls для этого считаем количество символов перед нашими топиками и избавляемся от них
    Код (Java):
    top = msg.topic.substring(16);
    , потом я ещё округлил данные и убрал лишние знаки после запятой, если число прилетело слишком длинное
    Код (Java):
    var zn = (+msg.payload).toFixed(2);
    , ну и остаётся сравнить название топиков и в зависимости от них отправить в домотикз данные на нужные устройства .
    Код (Java):
    var newmsg = {}
    var zn = (+msg.payload).toFixed(2);
    top = msg.topic.substring(16);
    function setTemp(idx, nm){
        var temppayload = '{"idx":' + idx +',"svalue":"' + nm + '"}';
        return temppayload;
    }
    switch (top) {
      case 'tempDS':
        newmsg.payload = setTemp(31, zn);
        return newmsg;
         case 'ls':
        newmsg.payload = setTemp(33, zn);
        return newmsg;
    }

    return null;

    ИТОГ :
    ИТОГ.PNG

    Ps. У меня сообщения летят слишком часто и я ограничил их блоком Delay
    delay.PNG
    Не знаю на сколько это верно, но работает.
    Надеюсь доступно всё разжевал ;)
     
    ИгорьК нравится это.
  10. Securbond

    Securbond Гик

    А вот вчера подарили ещё одну оффигенскую игрушку magic cube от Xiaomi. В Domoticz добавилась автоматом и количество вариантов для управления домом просто впечатляет.
    19817E91-5B2C-44BF-A8AB-0B351BE33E35.jpeg Cube2.PNG Cube.PNG
    Кручу верчу, запутать хочу. На каждое движение куба своя операция.
    Сижу придумываю что на него повесить.:rolleyes:

    Обзор с возможностями тут: https://mysku.ru/blog/china-stores/52219.html
     
    ИгорьК нравится это.
  11. ZAZ-965

    ZAZ-965 Гуру

    А потом отдать коту ;)
     
    Securbond нравится это.
  12. Securbond

    Securbond Гик

    Кто подскажет, как поменять в Domoticz иконку текстового поля? и можно ли передать в из NodRed в Domoticz еще и префикс ? например "мм.рт.ст" ?
    pres.JPG
     
  13. ИгорьК

    ИгорьК Давно здесь

    Насколько я понял, менять иконки можно только в выключателях.

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

    SmartSelectImage_2018-01-07-12-00-00.png
     
    Securbond нравится это.
  14. Securbond

    Securbond Гик

    Замучился уже. Пишу скрипт для охраны -
    Код (Java):
    commandArray = {}

    time = os.date('%X');
    token = "xxxxxxx"
    chatid = xxxxxxx
    message = time



    if (devicechanged['Входная дверь']=='Open' and devicechanged['Охрана']=='Locked') then
          commandArray['Secur'] = 'On'
          commandArray['Xiaomi Gateway Alarm Ringtone'] = 'Set Level 30'
          os.execute('curl --data chat_id='..chatid..' --data-urlencode "text='..message..'"  "https://api.telegram.org/bot'..token..'/sendMessage" ')
    elseif devicechanged['Охрана'] == 'Unlocked'  then
            commandArray['Xiaomi Gateway Alarm Ringtone'] = 'Off'
            commandArray['Secur'] = 'Off'
        end
    return commandArray
    По одному, условия работают а вместе (открылась дверь and стоит на охране) не хочет, хоть убейся.

    UPD:
    Код (Java):
    if    devicechanged['Входная дверь']=='Open' and otherdevices['Охрана']=='Locked' then
    Вот так оказывается нужно !:confused:
     
    Последнее редактирование: 7 янв 2018
  15. Securbond

    Securbond Гик

    Расскажу про одну особенность, которая потрепала мне немало нервов.
    есть устройство
    Sec.JPG
    sec2.JPG

    и нужно было всего то по определённой встряске кубика включать это устройство если выключено и выключать если включено. Мучился долго... оказалось так.
    Код (Java):
    commandArray = {}
    if  devicechanged['Cube'] == 'tap_twice' and otherdevices['Охрана']=='Locked'then
          commandArray['Охрана'] = 'Off'
          commandArray['Cube'] = 'Set Level 0'
    elseif devicechanged['Cube']=='tap_twice' and otherdevices['Охрана']=='Unlocked' then
           commandArray['Охрана'] = 'On'
           commandArray['Cube'] = 'Set Level 0'
        end
    return commandArray
    Что для меня странно и не понятно почему для проверки состояния нужно использовать "Locked" / "Unlocked"
    а для переключения On /Off ???? :confused::confused::confused: Зачем такая сложная неочевидная реализация. Было бы гораздо проще в обоих местах ставить "Locked" / "Unlocked" или On /Off.
     
  16. Securbond

    Securbond Гик

    Примеры скриптов: http://www.domoticz.com/wiki/LUA_commands

    Оставлю тут, для себя и других пользователей, как шпаргалку.

    Пора делать оглавление на 1 странице ;)
    P.s: ничего что я тут немного заспамил ветку?))):oops:
     
  17. ИгорьК

    ИгорьК Давно здесь

    Сделаю оглавление на следующей неделе. Если что лишнее/новогоднее - почищу :)
     
  18. gofk

    gofk Нерд

    Вопрос.
    Можно как-то в Domoticz манипулировать исходными данными (которые получаем от устройства), чтобы в интерфейсе видеть уже обработанные данные (значения датчиков и т.д.)?

    Поясню.
    Есть DHT21, есть ESP8266 под управлением ESPEasy. Есть Domoticz.
    Данные от датчика Domoticz принимает в формате:
    param=udevice&idx=IDX&nvalue=HUM&svalue=HUM_STAT, где HUM_STAT = Humidity_status (0 - норма, 1 - комфорт и т.д.).

    Проблема:
    От esp параметр HUM_STAT всегда приходит =0. Соответственно, в Domoticz влажность всегда нормальная.

    Пока не говорим о реализации на стороне ESP, с этим все понятно. Сейчас вводные именно такие. Например, я хочу границы (сухо/влажно) задать на стороне сервера по своему усмотрению. И менять их по желанию.

    Так вот, можно ли в Domoticz как-то перехватить HUM_STAT и в значение датчика подсунуть уже результат своего анализа?
     
  19. ИгорьК

    ИгорьК Давно здесь

    Можно. Принимаете на один датчик, перерабатываете значения для другого, который показываем.
     
  20. gofk

    gofk Нерд

    Хм
    А логично, спасибо :)