Страница 1 из 1

Еще раз об автоматизации освещения

Добавлено: Вс май 20, 2018 8:07 pm
Diesel
Доброго времени суток. Есть задача автоматизировать управление освещением, основной код работает, но есть одно "НО"...
Система "живет" на raspberry pi 3, в системе присутствует модуль MegaD и с десяток NodeMCU (там, где кабель уложить невозможно) с прошивкой Wifi-IOT.
В системе существует один сенсор освещенности (Sensor_light01), согласно показателям которого в сумеречное и темное время суток в кабинетах по движению должен загораться свет. Каждый кабинет (в зависимости от расположения) калибруется отдельно, согласно текущей освещенности в нем (но все относительно показателей сенсора).
Код для датчиков движения получился следующий:

Код: Выделить всё

if (getGlobal("Sensor_light01.value") > 100) {
  if (getGlobal("Motion03.status")) {
    callMethod("Relay05.turnOn");
   setTimeOut("svet2", "callMethod('Relay05.turnOff');",10);
  }
}
Все работает хорошо, но до того момента, как нужно включить свет с помощью выключателя или браузера (бывают случаи, когда нужно, чтобы он просто горел без автоматики). В данном же случае, каким бы способом свет не включался - при появлении движения в комнате запускается таймер.

На ум приходит добавить проверку состояния выключателя - если он уже включен - то скрипт не выполняется, и соответственно не запускается таймер и нет авто отключения. Для этого в первую строчку казалось бы логичным добавить следующее:

Код: Выделить всё

&& (getGlobal("Relay05.status") == 0) {
- но в таком случае система совсем перестает выполнять данный скрипт. Пробовал разные вариации с

Код: Выделить всё

&& if (getGlobal("Relay05.status") == 0) {
AND и т.д.
Подскажите пожалуйста как правильно прописать 2 условия в этой ситуации.

Re: Еще раз об автоматизации освещения

Добавлено: Вс май 20, 2018 8:21 pm
Logrus

Код: Выделить всё

if (getGlobal("Sensor_light01.value") > 100 && getGlobal("Relay05.status") == 0) {
выше со скобками и потом с условием беда, а так вариантов масса
п.с. не понял зачем вторая строчка ведь дд и дергает зачем его еще проверять, а так описано не полностью, гадать бесполезно

Re: Еще раз об автоматизации освещения

Добавлено: Вс май 20, 2018 8:23 pm
fandaymon
Diesel писал(а):
Вс май 20, 2018 8:07 pm
Доброго времени суток. Есть задача автоматизировать управление освещением, основной код работает, но есть одно "НО"...
Система "живет" на raspberry pi 3, в системе присутствует модуль MegaD и с десяток NodeMCU (там, где кабель уложить невозможно) с прошивкой Wifi-IOT.
В системе существует один сенсор освещенности (Sensor_light01), согласно показателям которого в сумеречное и темное время суток в кабинетах по движению должен загораться свет. Каждый кабинет (в зависимости от расположения) калибруется отдельно, согласно текущей освещенности в нем (но все относительно показателей сенсора).
Код для датчиков движения получился следующий:

Код: Выделить всё

if (getGlobal("Sensor_light01.value") > 100) {
  if (getGlobal("Motion03.status")) {
    callMethod("Relay05.turnOn");
   setTimeOut("svet2", "callMethod('Relay05.turnOff');",10);
  }
}
Все работает хорошо, но до того момента, как нужно включить свет с помощью выключателя или браузера (бывают случаи, когда нужно, чтобы он просто горел без автоматики). В данном же случае, каким бы способом свет не включался - при появлении движения в комнате запускается таймер.

На ум приходит добавить проверку состояния выключателя - если он уже включен - то скрипт не выполняется, и соответственно не запускается таймер и нет авто отключения. Для этого в первую строчку казалось бы логичным добавить следующее:

Код: Выделить всё

&& (getGlobal("Relay05.status") == 0) {
- но в таком случае система совсем перестает выполнять данный скрипт. Пробовал разные вариации с

Код: Выделить всё

&& if (getGlobal("Relay05.status") == 0) {
AND и т.д.
Подскажите пожалуйста как правильно прописать 2 условия в этой ситуации.
Ну например добавить ещё свойство ко всем источникам света - timerOn. Если оно равно 1, то таймер включаем по датчику движения, если 0, то не включаем.

Код: Выделить всё

if (getGlobal("Sensor_light01.value") > 100) {
  if (getGlobal("Motion03.status")) {
    if (gg('Relay05.timerOn')==1) {
     callMethod("Relay05.turnOn");
    setTimeOut("svet2", "callMethod('Relay05.turnOff');",10);
   } 
  }
}
Когда надо включить свет без таймера, просто устанавливаем свойство в 0 и стираем таймер

Re: Еще раз об автоматизации освещения

Добавлено: Вс май 20, 2018 8:49 pm
Diesel
Ну например добавить ещё свойство ко всем источникам света - timerOn.
Почему нельзя просто проверить статус? Зачем добавлять еще одно свойство, если эти данные уже есть в татусе?

Re: Еще раз об автоматизации освещения

Добавлено: Вс май 20, 2018 9:28 pm
fandaymon
Diesel писал(а):
Вс май 20, 2018 8:49 pm
Ну например добавить ещё свойство ко всем источникам света - timerOn.
Почему нельзя просто проверить статус? Зачем добавлять еще одно свойство, если эти данные уже есть в татусе?
В статусе есть только данные что свет включен, а чем он включен не понятно. Сейчас у вас таймер продлевается каждый раз когда фиксируется движение, а если вы будет смотреть ещё и статус, то лампочка будет мигать - таймер отработает и выключит лампочку до нового движения

Чтобы включать 2 разных режима работы света и нужно отдельное свойство. Чтобы система знала какой режим выбран и реагировала по разному

Re: Еще раз об автоматизации освещения

Добавлено: Вс май 20, 2018 10:15 pm
Chainik
Diesel писал(а):
Вс май 20, 2018 8:07 pm
...
Все работает хорошо, но до того момента, как нужно включить свет с помощью выключателя или браузера (бывают случаи, когда нужно, чтобы он просто горел без автоматики). В данном же случае, каким бы способом свет не включался - при появлении движения в комнате запускается таймер.
...
Вот тут решалась похожая задача (http://ab-log.ru/forum/viewtopic.php?f= ... 440#p28440). Правда таймер там запускается во всех случаях, чтобы обеспечить автовыключение "забытого" света. В вашем случае, таймер при "ручном" режиме можно просто сделать "длинным" по времени.

Re: Еще раз об автоматизации освещения

Добавлено: Пн май 21, 2018 10:41 am
Diesel
Спасибо за подсказку. Все вышло следующим образом:
В разделе "Простые устройства" открываем нужный нам датчик движения. В "действиях" пишем следующее:

Код: Выделить всё

if (getGlobal("Sensor_light01.value") > 100) {
  if (getGlobal("Motion03.status")) {
    if (getGlobal("Relay05.timerOn") == 0) {
     callMethod("Relay05.turnOn");
    setTimeOut("svet2", "callMethod('Relay05.turnOff');",10);
   } 
  }
 }
Далее в свойствах выключателя, которым мы управляем добавляем свойство timerOn.
Потом идем в методы. У меня светом управляют методы turnOn и turnOff.
В первый добавляем

Код: Выделить всё

setGlobal('Relay05.timerOn', 1);
Во второй

Код: Выделить всё

setGlobal('Relay05.timerOn', 0);
Таким образом при включении света с кнопки или веб интерфейса устанавливается значение Relay05.timerOn 1 и скрипт по датчику движения не срабатывает.

Еще планирую добавить более длинный таймер на ручное включение. (если вдруг останется влюченным на минут 30 в пустой комнате)

Re: Еще раз об автоматизации освещения

Добавлено: Пн май 21, 2018 10:58 am
fandaymon
Diesel писал(а):
Пн май 21, 2018 10:41 am
Спасибо за подсказку. Все вышло следующим образом:
В разделе "Простые устройства" открываем нужный нам датчик движения. В "действиях" пишем следующее:

Код: Выделить всё

if (getGlobal("Sensor_light01.value") > 100) {
  if (getGlobal("Motion03.status")) {
    if (getGlobal("Relay05.timerOn") == 0) {
     callMethod("Relay05.turnOn");
    setTimeOut("svet2", "callMethod('Relay05.turnOff');",10);
   } 
  }
 }
Далее в свойствах выключателя, которым мы управляем добавляем свойство timerOn.
Потом идем в методы. У меня светом управляют методы turnOn и turnOff.
В первый добавляем

Код: Выделить всё

setGlobal('Relay05.timerOn', 1);
Во второй

Код: Выделить всё

setGlobal('Relay05.timerOn', 0);
Таким образом при включении света с кнопки или веб интерфейса устанавливается значение Relay05.timerOn 1 и скрипт по датчику движения не срабатывает.

Еще планирую добавить более длинный таймер на ручное включение. (если вдруг останется влюченным на минут 30 в пустой комнате)
Ещё после setGlobal('Relay05.timerOn', 0); надо добавить ClearTimeOut('svet2');
Чтобы свет не выключился по таймеру, который был запущен до нажатия на выключатель

Re: Еще раз об автоматизации освещения

Добавлено: Пн май 21, 2018 12:35 pm
Diesel
Спасибо, добавил.

Re: Еще раз об автоматизации освещения

Добавлено: Пн май 21, 2018 12:57 pm
Chainik
Для "спасибо" предусмотрена специальная кнопочка (в виде жеста, выражающего знак одобрения). В правом верхнем углу сообщения.