Умный дом: 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 КБ
      Просмотров:
      59
  11. Mitrikh

    Mitrikh Нуб

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

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

    ИгорьК Гуру

    В Домотикз?

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

    Mitrikh Нуб

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