NEWS
Автоматизация света и вытяжки в ванной по датчику движения и влажности (с использованием данных из sql)
-
Прошу помочь с написанием скрипта.
Идея такая - анализировать изменение показаний датчика влажности и пока значение повышается держать включенными освещение и вытяжной вентилятор, как только значения начнут уменьшаться через 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]
-
Прошу помочь с написанием скрипта.
Идея такая - анализировать изменение показаний датчика влажности и пока значение повышается держать включенными освещение и вытяжной вентилятор, как только значения начнут уменьшаться через 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] ``` `
-
Спасибо, но немного не то.
В моём случае я хочу чтобы включение происходило по росту влажности, а не по абсолютному значению.
Абсолютное значение по моим наблюдениям сейчас гуляет от 10 до 30%, летом думаю разбег будет ещё больше, но когда кто-то идёт в душ влажность по показаниям датчика в течении минуты повышается резко на 20-30%. По этому росту я хочу определять, что кто-то там ещё есть, несмотря на то, что от датчика движения нет сообщений, поскольку как только заходишь в душевую кабинку её стекла экранируют тепло от тела и датчик движения не работает.
-
Спасибо, но немного не то.
В моём случае я хочу чтобы включение происходило по росту влажности, а не по абсолютному значению.
Абсолютное значение по моим наблюдениям сейчас гуляет от 10 до 30%, летом думаю разбег будет ещё больше, но когда кто-то идёт в душ влажность по показаниям датчика в течении минуты повышается резко на 20-30%. По этому росту я хочу определять, что кто-то там ещё есть, несмотря на то, что от датчика движения нет сообщений, поскольку как только заходишь в душевую кабинку её стекла экранируют тепло от тела и датчик движения не работает. `
а с чего ты решил что влажность все время будет увеличиваться по 20% до 1000? Влажность поднимется практичски сразу и будет по немногу падать после включения вентилятора. -
а с чего ты решил что влажность все время будет увеличиваться по 20% до 1000? Влажность поднимется практичски сразу и будет по немногу падать после включения вентилятора. `
Какие ещё 1000? См. график во вложении. (График слишком сглаженный, т.к. показания снимались каждые 5 минут).В целом собираюсь реализовать такай сценарий:
1. чел входит в помещение душевой - срабатывает датчик движения, включает свет
2. пока чел в душевой кабине датчик движение не работает - но влажность увеличивается, значит кто-то есть, соответсвенно свет гасить не нужно
3. как только чел выходит из кабины - уже срабатывает датчик движения, а влажность постепенно начинает падать. За влажностью уже можно не следить - управлять светом по датчику движения.
4. вентилятор планирую включать уже после выхода чела из душевой кабины, скажем через 5 минут на 5 минут или при превышении некоего порога. Нужны дополнительные испытания.
Все эти телодвижения с влажностью нужны для учёта того, что кто-то есть в помещении.
Соответсвенно по п.2 я задумался как проанализировать скорость роста значения. Использовать значения истории видится наиболее логичным. Просто следить за скоростью роста показания влажности. Судя по анализу тех графиков что имею - если скорость роста более 2% за минуту - явно кто-то решил "подушиться".
Вобщем-то вроде процесс сдвинулся, если что - ещё спрошу.
5570_2018-02-25-br-hum.png -
Вот что получилось.
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]
-
Добрый день.
Кроме всего прочего, посмотрите в сторону микроволновых датчиков движения.
Для них стеклянная перегородка не препятствие.
-
Подниму старую тему. Актуально для тех кто пользует 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 часа, усредняет их по часовым интервалам и возвращает скорость изменения за последний час. Отричательные значения говорят о снижении показателя, положительные об увеличении.
-
Тем кто ставит вентилятор в квартире в отверстие естественной вентиляции (ЕВ) имейте ввиду что выключенный вентилятор уменьшает тягу ЕВ в ~10 раз. Если у вас всего 2 таких отверстия одно на кухне, другое в ванной и в одно их них поставить вентилятор то можно сказать что вы в среднем ухудшили вентиляцию (за счёт вытяжки) в 2 раза для квартиры в целом. Для ванной вентиляция при выключенном ухудшится в ~10 раз.
Это легко проверяется датчиками CO2. Чтобы проветрить квартиру придётся не просто приоткрывать окно на маленькую щель, а делать сквозное проветривание.Так как тяги 1 лишь кухонной вытяжки не хватает. А если и в кухонной вытяжке поставили только периодически работающий вентилятор - то вообще всё плохо будет.
-
У меня выключенный вентилятор крутиться от естественного потока (некоторые вентиляторы имеют клапан, да…)
-
У меня выключенный вентилятор крутиться от естественного потока (некоторые вентиляторы имеют клапан, да…) `
То что он крутится это не значит что пропускная способность канала не снизилась. А клапаны от ЕВ откроются только на сильном перепаде высот и в определённое время года. Если до крыши этажей меньше 4, а в доме теплей чем на улице менее 5 градусов - уверен что клапан даже не откроется.
Рассчитать это очень сложно, но замерив по факту производительность высокочувствительным датчиком потока или косвенно по уровню CO2 (при щелевом приоткрытом окне) - выводы делаются однозначные.
-
я имел в виду такой клапан:
бывают и другие, жесткие на пружинкахсовершенно бесполезная вещь, сразу снял
а так да, не спорю, естественная вентиляция через выключенную вытяжку хуже
тоже баловался с заданием разных условий, по факту остановился на таком режиме: горит свет - работает вытяжка