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
    717

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

  • 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.
  • H Offline
    H Offline
    hawkeye
    wrote on last edited by
    #1

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

    Идея такая - анализировать изменение показаний датчика влажности и пока значение повышается держать включенными освещение и вытяжной вентилятор, как только значения начнут уменьшаться через 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
    0
    • 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

                          399

                          Online

                          32.7k

                          Users

                          82.6k

                          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