Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. Автоматизация света и вытяжки в ванной по датчику движения и влажности (с использованием данных из sql)

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Автоматизация света и вытяжки в ванной по датчику движения и влажности (с использованием данных из sql)

    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      hawkeye last edited by

      Прошу помочь с написанием скрипта.

      Идея такая - анализировать изменение показаний датчика влажности и пока значение повышается держать включенными освещение и вытяжной вентилятор, как только значения начнут уменьшаться через 2 минуты всё выключить.

      Т.е. в моём понимании нужно взять два последних измерения, усреднить, сравнить с текущим значением, если текущее больше среднего за последние два раза - включить..

      Ну и видимо придётся по крону раз в минуту проверять и если началось снижение - выключить.

      Может быть уже такое написано - тогда очень прошу ткнуть куда смотреть.

      Сейчас я взять из доков функцию

      `var end = new Date().getTime();
      sendTo('sql.0', 'getHistory', {
        id: 'megadd.0.p31_P31_humidity',
        options: {
          start: end - 600000,
          end: end,
          аggregate: 'm4' // or 'none' to get raw values
        }
      }, function (result) {
        for (var i = 0; i < result.result.length; i++) {
          //console.log(result.result[i].id + ' Л ' + new Date(result.result[i].ts).toISOString());
          console.log('Rows: ' + JSON.stringify(result.result));
        }
      });`
      Но, поскольку я js дел не имел - сразу споткнулся с тем как взять из result цифровые значения....[/i][/i]
      
      1 Reply Last reply Reply Quote 0
      • I
        instalator last edited by

        @hawkeye:

        Прошу помочь с написанием скрипта.

        Идея такая - анализировать изменение показаний датчика влажности и пока значение повышается держать включенными освещение и вытяжной вентилятор, как только значения начнут уменьшаться через 2 минуты всё выключить.

        Т.е. в моём понимании нужно взять два последних измерения, усреднить, сравнить с текущим значением, если текущее больше среднего за последние два раза - включить..

        Ну и видимо придётся по крону раз в минуту проверять и если началось снижение - выключить.

        Может быть уже такое написано - тогда очень прошу ткнуть куда смотреть.

        Сейчас я взять из доков функцию

        `var end = new Date().getTime();
        sendTo('sql.0', 'getHistory', {
          id: 'megadd.0.p31_P31_humidity',
          options: {
            start: end - 600000,
            end: end,
            аggregate: 'm4' // or 'none' to get raw values
          }
        }, function (result) {
          for (var i = 0; i < result.result.length; i++) {
            //console.log(result.result[i].id + ' Л ' + new Date(result.result[i].ts).toISOString());
            console.log('Rows: ' + JSON.stringify(result.result));
          }
        });`
        Но, поскольку я js дел не имел - сразу споткнулся с тем как взять из result цифровые значения....
        
        >! ~~[spoiler]~~`~~[code]~~/////////////Вентилятор в ванной/////////////////////////////
        var flag_ventilator;
        var timer_ventilator;
        setState('mqtt.0.myhome.Bathroom.Ventilator', false);
        on('mqtt.0.myhome.controller.DHT_humidity', function (obj) { //Влажность в ванной
            if (obj.newState.val > 58 && obj.oldState.val <= 58){
                setState('mqtt.0.myhome.Bathroom.Ventilator', true);
                flag_ventilator = true;
                log('Включаем вентилятор по влажности on');
            }
            else if (obj.newState.val < 54 && obj.oldState.val >= 54 && flag_ventilator){
                setState('mqtt.0.myhome.Bathroom.Ventilator', false);
                flag_ventilator = false;
                log('Выключаем вентилятор по влажности off');
            }
        });
        on('mqtt.0.myhome.Bathroom.Ventilator', function (obj) {
            if (!flag_ventilator  && (obj.newState.val === true || obj.newState.val === 'true')){
                log('Включаем вентилятор вручную');
                timer_ventilator = setTimeout(function() {setState('mqtt.0.myhome.Bathroom.Ventilator', false);log('Выключаем вентилятор по времени');}, 900000);
            }
            else if (obj.newState.val === false || obj.newState.val === 'false'){
                clearTimeout(timer_ventilator);
            }
        });[/code]`[/spoiler][/i][/i]
        ``` ` 
        1 Reply Last reply Reply Quote 0
        • H
          hawkeye last edited by

          Спасибо, но немного не то.

          В моём случае я хочу чтобы включение происходило по росту влажности, а не по абсолютному значению.

          Абсолютное значение по моим наблюдениям сейчас гуляет от 10 до 30%, летом думаю разбег будет ещё больше, но когда кто-то идёт в душ влажность по показаниям датчика в течении минуты повышается резко на 20-30%. По этому росту я хочу определять, что кто-то там ещё есть, несмотря на то, что от датчика движения нет сообщений, поскольку как только заходишь в душевую кабинку её стекла экранируют тепло от тела и датчик движения не работает.

          1 Reply Last reply Reply Quote 0
          • I
            instalator last edited by

            @hawkeye:

            Спасибо, но немного не то.

            В моём случае я хочу чтобы включение происходило по росту влажности, а не по абсолютному значению.

            Абсолютное значение по моим наблюдениям сейчас гуляет от 10 до 30%, летом думаю разбег будет ещё больше, но когда кто-то идёт в душ влажность по показаниям датчика в течении минуты повышается резко на 20-30%. По этому росту я хочу определять, что кто-то там ещё есть, несмотря на то, что от датчика движения нет сообщений, поскольку как только заходишь в душевую кабинку её стекла экранируют тепло от тела и датчик движения не работает. `
            а с чего ты решил что влажность все время будет увеличиваться по 20% до 1000? Влажность поднимется практичски сразу и будет по немногу падать после включения вентилятора.

            1 Reply Last reply Reply Quote 0
            • H
              hawkeye last edited by

              @instalator:

              а с чего ты решил что влажность все время будет увеличиваться по 20% до 1000? Влажность поднимется практичски сразу и будет по немногу падать после включения вентилятора. `
              Какие ещё 1000? См. график во вложении. (График слишком сглаженный, т.к. показания снимались каждые 5 минут).

              В целом собираюсь реализовать такай сценарий:

              1. чел входит в помещение душевой - срабатывает датчик движения, включает свет

              2. пока чел в душевой кабине датчик движение не работает - но влажность увеличивается, значит кто-то есть, соответсвенно свет гасить не нужно

              3. как только чел выходит из кабины - уже срабатывает датчик движения, а влажность постепенно начинает падать. За влажностью уже можно не следить - управлять светом по датчику движения.

              4. вентилятор планирую включать уже после выхода чела из душевой кабины, скажем через 5 минут на 5 минут или при превышении некоего порога. Нужны дополнительные испытания.

              Все эти телодвижения с влажностью нужны для учёта того, что кто-то есть в помещении.

              Соответсвенно по п.2 я задумался как проанализировать скорость роста значения. Использовать значения истории видится наиболее логичным. Просто следить за скоростью роста показания влажности. Судя по анализу тех графиков что имею - если скорость роста более 2% за минуту - явно кто-то решил "подушиться".

              Вобщем-то вроде процесс сдвинулся, если что - ещё спрошу.
              5570_2018-02-25-br-hum.png

              1 Reply Last reply Reply Quote 0
              • H
                hawkeye last edited by

                Вот что получилось.

                megadd.0.p31_P31 - датчик влажности

                megadd.0.p32_P32 - датчик движения

                megadd.1.p25_P25 - реле света

                megadd.0.p8_P8 - реле вытяжки

                `var timer_vanna;
                var timer_vanna_vent;
                var flag_motion_vanna = false;
                var flag_hum = false;
                
                on({id: 'megadd.0.p32_P32', change: 'any'}, function (obj) { 
                        if (obj.newState.val === false){
                            flag_motion_vanna = true;
                            flag_hum = false;
                            clearTimeout(timer_vanna);
                            if (getState('megadd.1.p25_P25').val === false) {
                                setState('megadd.1.p25_P25', true);
                            }
                        }else if (obj.newState.val === true)
                        {
                            timer_vanna = setTimeout(function() {
                                flag_motion_vanna = false;
                                if (getState('megadd.0.p32_P32').val === true && flag_hum === false) {
                                    setState('megadd.1.p25_P25', false); 
                                } 
                            }, 40000);
                        }
                });
                
                schedule({second: [0, 20, 40]}, function () {
                    var end = new Date().getTime();
                    var DT1;
                    var DT = 0;
                    sendTo('sql.0', 'getHistory', {
                        id: 'megadd.0.p31_P31_humidity',
                        options: {
                        end: new Date().getTime(),
                        count: 10,
                        aggregate: 'onchange'
                        //аggregate: 'm4' // or 'none' to get raw values
                        }
                    }, function (result) {
                    DT1=0;
                    for (var i = 0; i < result.result.length; i++) {
                        //console.log(result.result[i].id + ' D= ' + new Date(result.result[i].ts).toISOString()+' V=' +result.result[i].val);
                        Hprev = result.result[i].val;
                        DT1=DT1+result.result[i].val;
                        //console.log('Rows: ' + JSON.stringify(result.result));
                    }
                    DT1=DT1/10;
                    Htek=getState('megadd.0.p31_P31_humidity').val;
                    DT=Htek-DT1;
                    //console.log('DT='+DT+'('+ Htek+'-'+DT1+')');
                    if (DT>=2 && flag_hum === false){
                            flag_hum = true;
                            console.log('flag_hum=true DT='+DT+'>2');
                            if (getState('megadd.1.p25_P25').val === false) {
                                setState('megadd.1.p25_P25', true);
                                console.log('Был выключен - включаю');
                            }
                    }
                    else if (DT<-1 && flag_hum === true) { 
                        flag_hum = false; 
                        console.log('flag_hum=false DT='+DT+'<-1');
                        if (flag_motion_vanna === false) {
                            console.log('Запуск таймера на отключение света');
                            timer_vanna = setTimeout(function() {
                                if (getState('megadd.0.p32_P32').val === true && flag_hum === false) {
                                    setState('megadd.1.p25_P25', false); 
                                }
                            }, 40000);
                        }
                    }
                    if (DT<-2) { 
                        console.log('DT='+DT+' Запуск таймера на выключение вытяжки');
                        setState('megadd.0.p8_P8', true); 
                        clearTimeout(timer_vanna_vent);
                        timer_vanna_vent = setTimeout(function() {
                            setState('megadd.0.p8_P8', false); 
                        }, 185000);
                    }
                    });
                });` [/i][/i][/i][/i][/i]
                
                1 Reply Last reply Reply Quote 0
                • P
                  Palko last edited by

                  Добрый день.

                  Кроме всего прочего, посмотрите в сторону микроволновых датчиков движения.

                  Для них стеклянная перегородка не препятствие.

                  1 Reply Last reply Reply Quote 0
                  • A
                    algar last edited by

                    Подниму старую тему. Актуально для тех кто пользует InfluxDB.

                    Для себя проблему идентификации повышения\понижения температуры (ну или других показателей) и скорости таких изменений решил следующим скриптом

                    function getRate(id) {
                        var rate = 0;
                    
                        sendTo('influxdb.0', 'query', 'SELECT DERIVATIVE(mean(value), 1h) FROM \"'+id +'\" WHERE time > now() - 2h GROUP BY time(1h) fill(linear)', function (result) {
                        if (result.error) {
                            console.error(result.error);
                            rate=0;
                        } else {
                             var res=JSON.parse(JSON.stringify(result.result[0]));
                             if (typeof res[0]=="undefined") {rate=0} else {rate = Math.round(res[res.length-1].derivative*100)/100;} 
                             setState(id+'.tempDir1h', rate, true);
                        }
                    });
                    
                    }
                    
                    

                    данный скрипт использует стандартную функцую influxDB DERIVATIVE, которая возвращает скорость изменения показателя за указанный в параметре промежуток времени.

                    Скрипт берет данные из базы за последние 2 часа, усредняет их по часовым интервалам и возвращает скорость изменения за последний час. Отричательные значения говорят о снижении показателя, положительные об увеличении.

                    1 Reply Last reply Reply Quote 0
                    • A
                      andrey99986 last edited by

                      Тем кто ставит вентилятор в квартире в отверстие естественной вентиляции (ЕВ) имейте ввиду что выключенный вентилятор уменьшает тягу ЕВ в ~10 раз. Если у вас всего 2 таких отверстия одно на кухне, другое в ванной и в одно их них поставить вентилятор то можно сказать что вы в среднем ухудшили вентиляцию (за счёт вытяжки) в 2 раза для квартиры в целом. Для ванной вентиляция при выключенном ухудшится в ~10 раз.

                      Это легко проверяется датчиками CO2. Чтобы проветрить квартиру придётся не просто приоткрывать окно на маленькую щель, а делать сквозное проветривание.Так как тяги 1 лишь кухонной вытяжки не хватает. А если и в кухонной вытяжке поставили только периодически работающий вентилятор - то вообще всё плохо будет.

                      1 Reply Last reply Reply Quote 0
                      • P
                        Pooh last edited by

                        У меня выключенный вентилятор крутиться от естественного потока (некоторые вентиляторы имеют клапан, да…)

                        1 Reply Last reply Reply Quote 0
                        • A
                          andrey99986 last edited by

                          @Pooh:

                          У меня выключенный вентилятор крутиться от естественного потока (некоторые вентиляторы имеют клапан, да…) `

                          То что он крутится это не значит что пропускная способность канала не снизилась. А клапаны от ЕВ откроются только на сильном перепаде высот и в определённое время года. Если до крыши этажей меньше 4, а в доме теплей чем на улице менее 5 градусов - уверен что клапан даже не откроется.

                          Рассчитать это очень сложно, но замерив по факту производительность высокочувствительным датчиком потока или косвенно по уровню CO2 (при щелевом приоткрытом окне) - выводы делаются однозначные.

                          1 Reply Last reply Reply Quote 0
                          • P
                            Pooh last edited by

                            я имел в виду такой клапан:
                            2689_klapan.jpg
                            бывают и другие, жесткие на пружинках

                            совершенно бесполезная вещь, сразу снял

                            а так да, не спорю, естественная вентиляция через выключенную вытяжку хуже

                            тоже баловался с заданием разных условий, по факту остановился на таком режиме: горит свет - работает вытяжка

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            909
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            6
                            12
                            5660
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo