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

Вопросы и информация о скриптах для ioBroker
Antworten
hawkeye
starter
Beiträge: 11
Registriert: 27.01.2018, 17:49

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

Beitrag von hawkeye » 24.02.2018, 09:37

Прошу помочь с написанием скрипта.
Идея такая - анализировать изменение показаний датчика влажности и пока значение повышается держать включенными освещение и вытяжной вентилятор, как только значения начнут уменьшаться через 2 минуты всё выключить.
Т.е. в моём понимании нужно взять два последних измерения, усреднить, сравнить с текущим значением, если текущее больше среднего за последние два раза - включить..
Ну и видимо придётся по крону раз в минуту проверять и если началось снижение - выключить.
Может быть уже такое написано - тогда очень прошу ткнуть куда смотреть.
Сейчас я взять из доков функцию

Code: Alles auswählen

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 цифровые значения....
Zuletzt geändert von hawkeye am 04.03.2018, 11:31, insgesamt 1-mal geändert.

Benutzeravatar
instalator
guru
Beiträge: 1264
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Использование данных из sql в скриптах

Beitrag von instalator » 24.02.2018, 09:51

hawkeye hat geschrieben:Прошу помочь с написанием скрипта.
Идея такая - анализировать изменение показаний датчика влажности и пока значение повышается держать включенными освещение и вытяжной вентилятор, как только значения начнут уменьшаться через 2 минуты всё выключить.
Т.е. в моём понимании нужно взять два последних измерения, усреднить, сравнить с текущим значением, если текущее больше среднего за последние два раза - включить..
Ну и видимо придётся по крону раз в минуту проверять и если началось снижение - выключить.
Может быть уже такое написано - тогда очень прошу ткнуть куда смотреть.
Сейчас я взять из доков функцию

Code: Alles auswählen

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: Show hidden text

Code: Alles auswählen

/////////////Вентилятор в ванной/////////////////////////////
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);
    }
});
Высокий уровень Децибел вреден для здоровья!
Мой блог

hawkeye
starter
Beiträge: 11
Registriert: 27.01.2018, 17:49

Re: Использование данных из sql в скриптах

Beitrag von hawkeye » 24.02.2018, 13:39

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

Benutzeravatar
instalator
guru
Beiträge: 1264
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Использование данных из sql в скриптах

Beitrag von instalator » 25.02.2018, 14:53

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

hawkeye
starter
Beiträge: 11
Registriert: 27.01.2018, 17:49

Re: Использование данных из sql в скриптах

Beitrag von hawkeye » 25.02.2018, 18:53

instalator hat geschrieben: а с чего ты решил что влажность все время будет увеличиваться по 20% до 1000? Влажность поднимется практичски сразу и будет по немногу падать после включения вентилятора.
Какие ещё 1000? См. график во вложении. (График слишком сглаженный, т.к. показания снимались каждые 5 минут).
В целом собираюсь реализовать такай сценарий:
1. чел входит в помещение душевой - срабатывает датчик движения, включает свет
2. пока чел в душевой кабине датчик движение не работает - но влажность увеличивается, значит кто-то есть, соответсвенно свет гасить не нужно
3. как только чел выходит из кабины - уже срабатывает датчик движения, а влажность постепенно начинает падать. За влажностью уже можно не следить - управлять светом по датчику движения.
4. вентилятор планирую включать уже после выхода чела из душевой кабины, скажем через 5 минут на 5 минут или при превышении некоего порога. Нужны дополнительные испытания.
Все эти телодвижения с влажностью нужны для учёта того, что кто-то есть в помещении.
Соответсвенно по п.2 я задумался как проанализировать скорость роста значения. Использовать значения истории видится наиболее логичным. Просто следить за скоростью роста показания влажности. Судя по анализу тех графиков что имею - если скорость роста более 2% за минуту - явно кто-то решил "подушиться".
Вобщем-то вроде процесс сдвинулся, если что - ещё спрошу.
Dateianhänge
2018-02-25-br-hum.png
2018-02-25-br-hum.png (12.83 KiB) 406 mal betrachtet

hawkeye
starter
Beiträge: 11
Registriert: 27.01.2018, 17:49

Re: Использование данных из sql в скриптах

Beitrag von hawkeye » 27.02.2018, 16:26

Вот что получилось.
megadd.0.p31_P31 - датчик влажности
megadd.0.p32_P32 - датчик движения
megadd.1.p25_P25 - реле света
megadd.0.p8_P8 - реле вытяжки

Code: Alles auswählen

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);
    }
    });
});


Palko
starter
Beiträge: 12
Registriert: 06.10.2017, 04:20

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

Beitrag von Palko » 05.03.2018, 13:05

Добрый день.
Кроме всего прочего, посмотрите в сторону микроволновых датчиков движения.
Для них стеклянная перегородка не препятствие.
iobroker+Beckhoff_BC9000+...

Antworten