Умный дом: Domoticz.

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

Метки:
  1. platon2k

    platon2k Нерд

    Добрый вечер. Спасибо большое. Поменял тип счетчиков на "Счетчик"- RFXMeter counter-Water и Managed Counter. Заработало, как надо:
    upload_2019-7-22_23-27-15.png
     
    ИгорьК нравится это.
  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
    }
    и через виртуальный выключатель, всё равно выключает через некоторое время. Видимо логику работы понять не могу.