Умный дом: Domoticz.

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

Метки:
  1. platon2k

    platon2k Нерд

    Добрый вечер. Спасибо большое. Поменял тип счетчиков на "Счетчик"- RFXMeter counter-Water и Managed Counter. Заработало, как надо:
    upload_2019-7-22_23-27-15.png
     
    Sylex и ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Извлечение части топика в NodRed.
    Чтобы самому не забыть.
    Из MQTT топиков в NodeRed приходится извлекать значимую часть.
    Например, есть топик
    Код (C++):
    dacha/temper/sens01/ds18b20
    Из него надо извлечь только 'ds18b20'.
    NodeRed - он же JavaScript.
    Извлекаем:
    Код (Javascript):
    // msg.topic = 'dacha/temper/sens01/ds18b20'
    var ss = msg.topic.match(/\d\/(.+)$/i)[1];
    // ss => 'ds18b20' !!!
    Дополнительная литература: http://learn.javascript.ru/regexp-groups
    Тестирование: https://regex101.com

    Пример. Есть устройство, которое гонит в топик "poliv02/..." кучу информации.

    1. Создаем цепочку:

    upload_2019-8-21_18-10-25.png

    2. Подписка:

    upload_2019-8-21_18-11-5.png


    3. Функция:

    upload_2019-8-21_18-12-20.png


    Полное содержание функции:

    Код (Javascript):
    var newmsg = {}
    var ss = msg.topic.match(/\d\/(.+)$/i)[1];
    var com = 'Off';

    function setSwitch(idx, nm){
        var switchpayload = '{"command":"switchlight","idx":' + idx + ',"switchcmd":"'+ nm +'"}';
        return switchpayload;
    }

    function setTemp(idx, nm){
        nm = +nm;
        var temppayload = '{"idx":' + idx +',"svalue":"' + nm.toFixed(2) + '"}';
        return temppayload;
    }

    function setText(idx, nm){
        var temppayload = '{"idx":' + idx +',"svalue":"' + nm + '"}';
        return temppayload;
    }


    switch (ss) {
      case 't286B98EA050000CB':
          newmsg.payload = setTemp(200, msg.payload);
        return newmsg;

      case 't288B4CEB0500002C':
          newmsg.payload = setTemp(202, msg.payload);
        return newmsg;

      case 'boot':
          newmsg.payload = setText(201, msg.payload);
        return newmsg;

      case 'heap':
          newmsg.payload = setTemp(204, msg.payload);
        return newmsg;

      case 'iswatering':
          if (msg.payload == 'ON') {
                com = 'On';
            }
          newmsg.payload = setSwitch(203, com);
      return newmsg;

      case 'isTank':
          if (msg.payload == 'ON') {
          com = 'On';
          }
          newmsg.payload = setSwitch(199, com);
      return newmsg;

      case 'state':
            if (msg.payload == 'ON') {
                com = 'On';
            }
            newmsg.payload = setSwitch(197, com);
      return newmsg;

      case 'light':
          newmsg.payload = setTemp(205, msg.payload);
        return newmsg;

      case 'reg':
          newmsg.payload = setTemp(198, msg.payload);
        return newmsg;

      default:
        return null;
    }
    return null;
     
    Последнее редактирование: 29 авг 2019
  3. ИгорьК

    ИгорьК Гуру

    Извлечение двух частей топика.

    Бывает несколько типовых устройств. Например, у меня трое одинаковых часов с функциями определения движения, температуры, СО2.

    Организовал отправку данных в топике на брокер так:

    upload_2019-8-29_13-44-2.png
    Подписка, естественно, идет сразу на тип устройства 'mhz19b/#'.


    upload_2019-8-29_13-47-42.png

    Дальше, в блокеNodeRed функция выглядит так:

    Код (Javascript):
    var newmsg = {};
    var idx = 0;
    var ss = msg.topic.match(/\/(.+)\/(.+)$/i)[1];
    var topic = msg.topic.match(/\/(.+)\/(.+)$/i)[2];
    // Я знаю, что здесь можно дербанить массив, но мне лень.

    function setnvalue(dt) {
        var tp = '{"idx":' + idx +',"nvalue":' + dt + '}';
        return tp;
    }

    function setsvalue(dt) {
        var tp = '{"idx":' + idx +',"svalue":"' + dt + '"}';
        return tp;
    }


    function setmsg(){
        var temppayload = '';
        switch(ss) {
            case '0x5c240ac406de':
                switch(topic) {
                    case 'co2':
                        idx = 222;
                        temppayload = setnvalue(msg.payload);
                        break;
                    case 'ds18b20':
                        idx = 223;
                        temppayload = setsvalue(msg.payload);
                        break;
                    default:
                        break;
                }
                break;
            default:
            break;
        }
        return temppayload;
    }
    newmsg.payload = setmsg();
    if (idx !== 0) {
        return newmsg;
    }
    else {
        return null;
    }
     
    Последнее редактирование: 29 авг 2019
  4. Vladis_a

    Vladis_a Гик

    Всем привет! Искал в свое время скрипт, чтобы можно было управлять газовым котлом по температуре в другой комнате. Недавно случайно нашел. По ссылке все на английском, но там все понятно и есть готовый скрипт. Возможно, кому-нибудь пригодится.
    https://www.iot4.eu/wi…oticz_smart_thermostat
     
  5. Chanov

    Chanov Нерд

    Всем привет. Подскажите как правильно сделать включение света по датчику, по наличию людей в комнате. Сейчас получается что либо включаешь и не выключаешь, либо через некоторое количество времени домотикс выключает, игнорируя последующие срабатывания датчика движения. Как поднять правильно переменную какую то показывающую есть кто в комнате или нет? Пробовал такую конструкцию
    Код (C++):
    return {
        on = {  -- Это перечень idx устройств, изменение состояний которых приводит к запуску скрипта
            devices = {83  -- датчик движения
            },
        },

        execute = function(domoticz, device)
            local myTime = domoticz.time.rawTime --Сохраняем время в локальную переменную
            if domoticz.devices(83).state == 'On' and (myTime >='18:00' and myTime <'08:00') then --скрипт работает только ночью
                domoticz.devices(15).switchOn() -- включаем освещение
            elseif domoticz.devices(83).state == 'Off' then
                 domoticz.devices(15).switchOff().afterSec(1800) --если нет движения через 1800 секунд выключаем освещение
            end
        end
    }
    и через виртуальный выключатель, всё равно выключает через некоторое время. Видимо логику работы понять не могу.
     
  6. om1212

    om1212 Нерд

    В dzvents есть команда cancelQueuedCommands(), которая отменяет все запущенные на данный момент в отношении определённого устройства таймеры.
    У меня на кухне сделано так:
    Код (C++):
    return
    {
      on =
        {
            devices = { 'Motion Sensor Kitchen'},
        },
    logging = {level = domoticz.LOG_INFO, marker = "NightLightKitchen"},

    execute = function(domoticz, nightlightkitchen)
        local light = domoticz.devices('NightLight Kitchen Power Outlets')
        local motion = domoticz.devices('Motion Sensor Kitchen')
         
    -- выполняем условие
        if (motion.state == 'On') then
            light.cancelQueuedCommands()
            light.switchOn().checkFirst()
            light.switchOff().afterMin(5)
        end
    end
    }
    Каждый раз при срабатывании датчика движения команда light.cancelQueuedCommands() отменяет ранее установленный таймер и продлевает его снова с момента срабатывания, ну и т.д.
     
    ИгорьК нравится это.
  7. GGN

    GGN Нуб

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

    Не могу врубится как мне управлять нагрузкой (светодиодами) подключенной к ESP 01 используя только протокол MQTT? Куда вбивать топик
    Код (Javascript):
    {"command": "switchlight", "idx": 6, "switchcmd": "On"}
    или
    Код (Javascript):
    {"command": "switchlight", "idx": 6, "switchcmd": "Off"}


    Ниже более подробно
    Итак, на роутер TP-Link TL-MR3020 V3 установлена OpenWRT, подключена флешка перенесены системные разделы, поставлен Mosquitto и установлен Domoticz, а так же есть тестовая ESP 01 cподключенной нагрузкой к GPIO 0, 1, 2, 3, 4 это светодиоды, через MQTTlens управляю отправляю и получаю топики управляя нагрузкой (естественно на ESP сначала установлен скетч, а потом и прошивка ESPEasy и все настроено). Настраиваю и Domoticz MQTT. В Domoticz создаю переключатели и могу управлять светодиодами посылкой HTTP запросов типа:
    HTML:
    http://<ESPIPaddress>/control?cmd=GPIO,0,0
    или
    HTML:
    http://<ESPIPaddress>/control?cmd=GPIO,0,1
    вбивая их в действие при включении/выключении (адресная строка в выключателях)
    Могу так же управлять светодиодами отправляя в MQTTlens по адресу domoticz/in топики типа
    Код (Javascript):
    {"command": "switchlight", "idx": 6, "switchcmd": "On"}
    или
    Код (Javascript):
    {"command": "switchlight", "idx": 6, "switchcmd": "Off"}
    А как мне управлять светодиодами (нагрузкой) используя только протокол MQTT? Если можно пошагово, не могу понять куда пихать вот эти строчки {"command": "switchlight", "idx": 6, "switchcmd": "On"} или {"command": "switchlight", "idx": 6, "switchcmd": "Off"}
    Огромное спасибо! Простите за абсолютно тупой вопрос, но не могу понять логику работы (первая система)
     
  8. ИгорьК

    ИгорьК Гуру

    Отвечу, но как время появится. Писать много.
     
  9. ИгорьК

    ИгорьК Гуру

    Прочитал. Много буков, значит ничего не понятно.

    Та железка, что ESP-1 - она то что собой представляет?

    В общем случае, ESP-1 должна получить сообщение от брокера в том формате, который требует именно она сама. Этот формат Домотикз не обеспечивает, и в пару ему устанавливается NodeRed.
    Именно NodeRed "отлавливает" сообщения от Домотикза и превращает их в требуемый ESP-1 формат.

    mqttnodered.jpg

    Можно обойтись без NodeRed, но тогда надо самому писать код ESP-8266, чтобы он ловил и парсил сообщения от Домотикз, дело это возможное, но зряшное - Домотикз шлет на брокер столько данных, что ESP-8266 только и будет заниматься тем, что читать и вникать, ему или не ему это пришло.
     
    Последнее редактирование: 13 окт 2019
  10. Sylex

    Sylex Нуб

    Друзья! Помогите решить вопрос с подключением увлажнителя xiaomi smartmi humidifier (я так понимаю 1-й версии) к domoticz
    Делаю всё по этой инструкции: http://4pda.ru/forum/index.php?showtopic=794186&view=findpost&p=65399793
    по команде miio discover --sync увлажнитель видится, но токен ???
    Токен я определил с помощью альтернативной версии михом на эмуляторе андроида. Что с ним теперь делать?
    По команде node humidifier.js 192.168.1.91 status
    выходит ошибка:
    в тоже время таже команда с sudo принимается, но результат не выдаёт, просто снова возникает командная строка.
    Посоветовали решить вопрос с node-red, по этой ссылке https://flows.nodered.org/node/node-red-contrib-miio-humidifier
    я так понимаю это описана сам функция преобразования...
    но не понятно как должен выглядеть сам поток? из каких блоков?
     

    Вложения:

    • error-js.jpg
      error-js.jpg
      Размер файла:
      85,9 КБ
      Просмотров:
      63
  11. Mitrikh

    Mitrikh Нуб

    может кто подскажет, как сделать кнопку с регулятором температуры, чтобы потом передавать это значение в скрипт управлением реле

    [​IMG]
     
    Последнее редактирование: 26 дек 2019
  12. ИгорьК

    ИгорьК Гуру

    В Домотикз?

    Оно:
    SmartSelect_20191226-211330_Samsung Internet.jpg
     
    Последнее редактирование: 26 дек 2019
  13. Mitrikh

    Mitrikh Нуб

    Оно, И как так сделать?
     
  14. Securbond

    Securbond Гуру

    Управление люстрами Xiaomi Yeelight Led Ceiling из Domoticz

    Привет ВСЕМ. На днях наконец то собрался силами и отвязал управление люстрой Yeelight от косячных и тормознутых китайских серверов. Задача казалась элементарной, но в итоге пришлось покурить мануал и почитать форумы. Оказалось не страшно так что поехали.....

    1. Первым делом нужно не забывать включить режим работы по локальной сети в самой лампе иначе удачи не видать. мануалов по этому делу множество, понадобиться телефон на android и немного везения. Повторятся не буду вот ссылка на off источник https://www.yeelight.com/faqs/lan_control

    2. Теперь в Domoticz добавляем виртуальный выключатель с типом selector и назовём его например - Yeelight Ceiling Living (Настройка -> Устройства ....)

    New_selector.JPG
    Теперь отредактируем наш выключатель и добавим ему необходимых кнопок. (Вы можете придумать свои режимы, но не забывайте потом изменить их название в скрипте выключателя)

    SelectorLevel.JPG

    3. Выключатель создан, но он пока ничем не управляет, что бы он заработал идём в Настройки -> Дополнительно -> События , жмякаем "плюс" и создаём скрипт LUA для нашего выключателя.
    Для работы скрипта нам необходимо зайти в родное приложение MiHome и в настройках устройства (Люстры) посмотреть её IP адрес. ( Желательно в роутере прописать для нашего устройства статический адрес, если он вдруг измениться, скрипт перестанет работать).
    Код (Lua):

    -- Скрипт LUA для работы виртуального переключателя 'Yeelight Ceiling Living'
    -- Для его работы создаём виртуальный выключатель типа - Selector и добавляем в него уровни:
    -- Off, On, MaxLight, MinLight

    commandArray = {}
    DomDevice = 'Yeelight Ceiling Living'; -- Название Вашего виртуального переключателя
    IP = '192.168.0.166'; -- IP адрес Вашей люстры
    PORT = '55443' -- стандартный порт для команд

    if devicechanged[DomDevice] then
      if(devicechanged[DomDevice]=='Off') then -- Если нажали Off то
      DomValue = 0;
      runcommandoff = "sudo echo -ne '{\"id\":1,\"method\":\"set_power\", \"params\":[\"off\", \"smooth\", 1000]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Выключение люстры
      os.execute(runcommandoff); -- Эта команда передаёт сформированную строку параметров из переменной "runcommandoff" в нашу люстру

    elseif devicechanged[DomDevice]=='On' then -- Если нажали On то
        runcommand = "sudo echo -ne '{\"id\":1,\"method\":\"set_scene\", \"params\":[\"bright\", 15, 500]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Включение люстры с яркостью 15%
        os.execute(runcommand);
        runcommand = " sudo echo -ne '{\"id\":1, \"method\":\"set_scene\",\"params\":[\"ct\", 1700, 50]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Температура свечения Тёплый свет (1700)
        os.execute(runcommand);

    elseif devicechanged[DomDevice]=='MaxLight' then
         runcommand = "sudo echo -ne '{\"id\":1,\"method\":\"set_scene\", \"params\":[\"bright\", 100, 500]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Включение люстры с яркостью 100%
         os.execute(runcommand);
         runcommand = " sudo echo -ne '{\"id\":1, \"method\":\"set_scene\",\"params\":[\"ct\", 6000, 50]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Температура свечения Холодный свет (6000)
         os.execute(runcommand);

    elseif devicechanged[DomDevice]=='MinLight' then
         runcommand = "sudo echo -ne '{\"id\":1,\"method\":\"set_power\", \"params\":[\"on\", \"smooth\", 500, 5]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Включение люстры  в ночном режиме (... ,5]}...)
         os.execute(runcommand);
         runcommand = "sudo echo -ne '{\"id\":1,\"method\":\"set_scene\", \"params\":[\"bright\", 10, 500, 5]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Включение люстры с яркостью 10%
         os.execute(runcommand);
         runcommand = " sudo echo -ne '{\"id\":1, \"method\":\"set_scene\",\"params\":[\"ct\", 1700, 50, 5]}\\r\\n' | nc -w1 " ..IP.." " ..PORT..""; -- Температура свечения Тёплый свет (1700)
         os.execute(runcommand);

    end
    end
    return commandArray

    Код максимально закомментирован и добавить мне тут особо нечего, только оставлю ссылочку на официальный документ с возможными командами. Кто захочет, тот "покурит".
    https://www.yeelight.com/download/Yeelight_Inter-Operation_Spec.pdf

    Если всё сделали правильно, то теперь из domoticz можете порулить своей люстрой.

    Теперь в крации расскажу как прикрутить всё это безобразие к беспроводному выключателю Aqara
    Не будем расписывать тут как добавлять устройства от Xiaomi в Domoticz, по этой теме достаточно статей.
    Предположим что у нас уже добавлен выключатель с Idx = 52 (у Вас будет другой) и названием "Swich_Wall"
    И Idx переключателя который мы создавали выше = 70 (у Вас будет другой).

    Swich_Wall.JPG

    Теперь нам лишь нужно создать новый скрипт dzVents, для отработки реакций на нажатие кнопок на выключателе. Назовём его
    Код (Lua):
    -- В данном скрипте Idx 52 - выключатель в комнатею. Cоздаёт Domoticz по умолчанию при добавлении шлюза Xiaomi
    -- Idx 70 Виртуальный переключатель люстры который мы создали сами
    -- Idx 56 Выключатель люстры который создаёт Domoticz по умолчанию при добавлении люстры Yeelight

    return {
        on = {  -- Это перечень idx устройств, изменение состояний которых приводит к запуску скрипта
            devices = {52
            },
        },
        execute = function(domoticz, device)
            if domoticz.devices(52).state == 'RightKey'  then  -- если нажали правую клавишу
               if domoticz.devices(70).state == 'On' or  domoticz.devices(70).state == 'MaxLight' or domoticz.devices(70).state == 'MinLight' then -- если при нажатии правой кнопки свет уже горел, то выключаем люстру
                     domoticz.devices(70).switchSelector(0)
                     domoticz.devices(56).setState('Off')
               elseif domoticz.devices(70).state == 'Off' then -- если при нажатии правой кнопки свет был выключен то включаем люстру, режим On На виртуальном переключателе
                     domoticz.devices(70).switchSelector(10)
                     domoticz.devices(56).setState('On')
                end
             end
       
           if domoticz.devices(52).state == 'LeftKey'  then  -- если нажали левую клавишу, Включаем режим MaxLight На виртуальном переключателе
             domoticz.devices(70).switchSelector(20)
             domoticz.devices(56).setState('On')
         end
       
           if domoticz.devices(52).state == 'Both_Click' then  -- если нажали две клавиши , Включаем режим MinLight На виртуальном переключателе
             domoticz.devices(70).switchSelector(30)
             domoticz.devices(56).setState('On')
         end

    end
    }

    Не самый изящный код, но он работает. Можно к нему еще добавить зависимость от времени и тогда включение режимов будет разными в разное время суток. Всё в Ваших силах!
    Если нигде не накосячили наслаждаемся работой выключателя без китайских тормозов.

    НЕ ЗАБУДЬТЕ ВЫКЛЮЧИТЬ АВТОМАТИЗАЦИЮ ВЫКЛЮЧАТЕЛЯ В ПРИЛОЖЕНИИ MiHome !!!
     
  15. Kheamu

    Kheamu Нуб

    Всем доброго дня! Проблема такая - Домотикс не видит беспроводные переключатели Aqara Wireless remote switch одноклавишные и двухклавишные. Domoticz v.4.9700 установлен пакетом на OpenWRT роутер. При добавлении шлюза все зигби устройства подтянулись, кроме выключателей. В журнале роутера ошибок нет, в журнале Домотикса при активации выключателя строчка следующего характера:Switch() т.е. с пустыми скобками, типа неизвестного оборудования. Домотикс переустанавливал, пакет брался из официального opkg.Обучением авто - таймаут. Вручную - нет ни одного варианта переключателя. В то же время Домотикз на виндоуз видит переключатели со шлюза без проблем.