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

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Diesel
Сообщения: 31
Зарегистрирован: Вс май 20, 2018 7:45 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 условия в этой ситуации.
Logrus
Сообщения: 2113
Зарегистрирован: Пт апр 07, 2017 12:20 pm

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

Сообщение Logrus »

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

if (getGlobal("Sensor_light01.value") > 100 && getGlobal("Relay05.status") == 0) {
выше со скобками и потом с условием беда, а так вариантов масса
п.с. не понял зачем вторая строчка ведь дд и дергает зачем его еще проверять, а так описано не полностью, гадать бесполезно
Последний раз редактировалось Logrus Вс май 20, 2018 8:28 pm, всего редактировалось 1 раз.
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
fandaymon
Сообщения: 1576
Зарегистрирован: Сб янв 13, 2018 5:00 pm

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

Сообщение 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 и стираем таймер
Diesel
Сообщения: 31
Зарегистрирован: Вс май 20, 2018 7:45 pm

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

Сообщение Diesel »

Ну например добавить ещё свойство ко всем источникам света - timerOn.
Почему нельзя просто проверить статус? Зачем добавлять еще одно свойство, если эти данные уже есть в татусе?
fandaymon
Сообщения: 1576
Зарегистрирован: Сб янв 13, 2018 5:00 pm

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

Сообщение fandaymon »

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

Чтобы включать 2 разных режима работы света и нужно отдельное свойство. Чтобы система знала какой режим выбран и реагировала по разному
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение Chainik »

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

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

Сообщение 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 в пустой комнате)
fandaymon
Сообщения: 1576
Зарегистрирован: Сб янв 13, 2018 5:00 pm

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

Сообщение 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');
Чтобы свет не выключился по таймеру, который был запущен до нажатия на выключатель
Diesel
Сообщения: 31
Зарегистрирован: Вс май 20, 2018 7:45 pm

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

Сообщение Diesel »

Спасибо, добавил.
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение Chainik »

Для "спасибо" предусмотрена специальная кнопочка (в виде жеста, выражающего знак одобрения). В правом верхнем углу сообщения.
Ответить