Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Автоматизация света и вытяжки в ванной по датчику движения и влажности (с использованием данных из sql)

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    770

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    6.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

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

Scheduled Pinned Locked Moved ioBroker скрипты
12 Posts 6 Posters 6.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Offline
    I Offline
    instalator
    wrote on last edited by
    #2

    @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]
    ``` ` 

    Высокий уровень Децибел вреден для здоровья!

    http://blog.instalator.ru/

    1 Reply Last reply
    0
    • H Offline
      H Offline
      hawkeye
      wrote on last edited by
      #3

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

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

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

      1 Reply Last reply
      0
      • I Offline
        I Offline
        instalator
        wrote on last edited by
        #4

        @hawkeye:

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

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

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

        Высокий уровень Децибел вреден для здоровья!

        http://blog.instalator.ru/

        1 Reply Last reply
        0
        • H Offline
          H Offline
          hawkeye
          wrote on last edited by
          #5

          @instalator:

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

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

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

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

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

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

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

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

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

          1 Reply Last reply
          0
          • H Offline
            H Offline
            hawkeye
            wrote on last edited by
            #6

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

            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
            0
            • P Offline
              P Offline
              Palko
              wrote on last edited by
              #7

              Добрый день.

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

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

              iobroker+Beckhoff_BC9000+…

              1 Reply Last reply
              0
              • A Offline
                A Offline
                algar
                wrote on last edited by
                #8

                Подниму старую тему. Актуально для тех кто пользует 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
                0
                • A Offline
                  A Offline
                  andrey99986
                  wrote on last edited by
                  #9

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

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

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    Pooh
                    wrote on last edited by
                    #10

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

                    https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
                    https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
                    https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
                    https://www.timestope.com/freepooh - witness code: freepooh

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      andrey99986
                      wrote on last edited by
                      #11

                      @Pooh:

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

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

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

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        Pooh
                        wrote on last edited by
                        #12

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

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

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

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

                        https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
                        https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
                        https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
                        https://www.timestope.com/freepooh - witness code: freepooh

                        1 Reply Last reply
                        0

                        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                        With your input, this post could be even better 💗

                        Register Login
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        297

                        Online

                        32.8k

                        Users

                        82.7k

                        Topics

                        1.3m

                        Posts
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Home
                        • Recent
                        • Tags
                        • Unread 0
                        • Categories
                        • Unreplied
                        • Popular
                        • GitHub
                        • Docu
                        • Hilfe