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

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

Модератор: immortal

Ответить
Diesel
Сообщения: 31
Зарегистрирован: Вс май 20, 2018 7:45 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

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

Сообщение 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 условия в этой ситуации.
Logrus
Сообщения: 2084
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Вс май 20, 2018 8:21 pm

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

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
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

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

Сообщение fandaymon » Вс май 20, 2018 8:23 pm

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
Благодарил (а): 5 раз
Поблагодарили: 2 раза

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

Сообщение Diesel » Вс май 20, 2018 8:49 pm

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

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

Сообщение fandaymon » Вс май 20, 2018 9:28 pm

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

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

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

Сообщение Chainik » Вс май 20, 2018 10:15 pm

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

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

Сообщение 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 в пустой комнате)
За это сообщение автора Diesel поблагодарил:
overdosed (Вт июл 17, 2018 7:40 pm)
Рейтинг: 1.16%
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

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

Сообщение fandaymon » Пн май 21, 2018 10:58 am

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');
Чтобы свет не выключился по таймеру, который был запущен до нажатия на выключатель
За это сообщение автора fandaymon поблагодарили (всего 2):
overdosed (Вт июл 17, 2018 7:40 pm) • Kostosso (Пн мар 18, 2019 1:11 pm)
Рейтинг: 2.33%
Diesel
Сообщения: 31
Зарегистрирован: Вс май 20, 2018 7:45 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

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

Сообщение Diesel » Пн май 21, 2018 12:35 pm

Спасибо, добавил.
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Пн май 21, 2018 12:57 pm

Для "спасибо" предусмотрена специальная кнопочка (в виде жеста, выражающего знак одобрения). В правом верхнем углу сообщения.
За это сообщение автора Chainik поблагодарил:
Diesel (Пн май 21, 2018 7:07 pm)
Рейтинг: 1.16%
Ответить