Как выключить свет?

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

Модератор: immortal

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

Re: Как выключить свет?

Сообщение Chainik » Сб фев 08, 2020 6:51 pm

lihodeev писал(а):
Сб фев 08, 2020 5:54 pm
Chainik писал(а):
Сб фев 08, 2020 3:07 pm

Я бы попробовал решить так. Заводим отдельное свойство, которое будет фиксировать первое срабатывание (OBJECT.pervoe_srabatyvanie).
А дальше прописываем логику:
... НО когда прописываю код в мотиондетектед датчика - при первом же срабатывании датчика включается свет. Не может ли датчик два раза менять свое состояние к ряду? В качестве бреда - может дребезг контактов??
ЗЫ датчик движения HC-SR501
Можно попробовать ввести период "нечувствительности" после первого срабатывания. Добавим еще одно свойство: OBJECT.DoNotReact.
И введем период, в течение которого после первого срабатывания не должен включаться свет, независимо от количества срабатываний в этот период.

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

//Проверяем, было ли уже первое срабатывание и активирован ли период "нечувствительности"
if ((gg('OBJECT.pervoe_srabatyvanie') == 1) && (gg('OBJECT.DoNotReact') == 0))  {
//Уже было первое срабатывание (текущее срабатывание не первое) и период "нечувствительности" истек (== "0")
//тут ДЕЙСТВИЕ по управлению светом (код)
} else {
if (gg('OBJECT.pervoe_srabatyvanie') <> 1)  {
//Ранее срабатываний не было, тогда текущее срабатывание является первым (зафиксируем это)
sg('OBJECT.pervoe_srabatyvanie', 1);
//Устанавливаем время, через которое произойдет новый эпизод, когда очередное срабатывание надо считать первым (обнулим свойство, допустим, через 15 секунд)
SetTimeOut("MyTimer_999","sg('OBJECT.pervoe_srabatyvanie', 0);",15);
//При значении свойства DoNotReact == "1" свет включаться не должен
sg('OBJECT.DoNotReact', 1);
//Задаем продолжительность периода "нечувствительности" к срабатываниям датчика движения (пусть будет 5 сек.)
SetTimeOut("MyTimer_555","sg('OBJECT.DoNotReact', 0);",5);
return"";
}
}
За это сообщение автора Chainik поблагодарил:
lihodeev (Сб фев 08, 2020 7:17 pm)
Рейтинг: 1.16%
lihodeev
Сообщения: 148
Зарегистрирован: Ср июл 25, 2018 10:37 pm
Благодарил (а): 43 раза
Поблагодарили: 8 раз

Re: Как выключить свет?

Сообщение lihodeev » Сб фев 08, 2020 7:22 pm

Chainik писал(а):
Сб фев 08, 2020 6:51 pm

Можно попробовать ввести период "нечувствительности" после первого срабатывания. Добавим еще одно свойство: OBJECT.DoNotReact.
И введем период, в течение которого после первого срабатывания не должен включаться свет, независимо от количества срабатываний в этот период.
это выход , код проверил, и работает, но все таки интересно разобраться откуда несколько срабатываний? Не из AMS часом? Потому что снепшоты по датчику движения из камеры в телеграмм мне приходит тоже в двух экземплярах, не мог понять почему, но похоже причина одна
Raspberry 3, AMS 16, arduinka 2560, Orange pi Zero, Broadlink RM3, Xiaomi Mi Robot Vacuum SKV4000GL
Jilber
Сообщения: 684
Зарегистрирован: Ср май 03, 2017 7:41 pm
Благодарил (а): 113 раз
Поблагодарили: 107 раз

Re: Как выключить свет?

Сообщение Jilber » Вс фев 09, 2020 12:23 pm

lihodeev писал(а):
Сб фев 08, 2020 6:37 pm
2020-02-08 17:34:39 0 /objects/?job=8348922
2020-02-08 17:34:32 1 /objects/?object=pirPRH&op=m&m=update&v=0
2020-02-08 17:34:31 0 /objects/?job=8348910
2020-02-08 17:34:29 1 /objects/?object=pirPRH&op=m&m=update&v=1
откуда может браться?
А перемычка в каком положении стоит ? Режим "H" — в этом режиме при срабатывании датчика несколько раз подряд на его выходе (на OUT) остается высокий логический уровень. Режим "L" — в этом режиме на выходе при каждом срабатывании датчика появляется отдельный импульс.
За это сообщение автора Jilber поблагодарил:
lihodeev (Вс фев 09, 2020 12:48 pm)
Рейтинг: 1.16%
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Как выключить свет?

Сообщение xor » Вс фев 09, 2020 1:11 pm

Chainik писал(а):
Сб фев 08, 2020 6:51 pm
lihodeev писал(а):
Сб фев 08, 2020 5:54 pm
Chainik писал(а):
Сб фев 08, 2020 3:07 pm

Я бы попробовал решить так. Заводим отдельное свойство, которое будет фиксировать первое срабатывание (OBJECT.pervoe_srabatyvanie).
А дальше прописываем логику:
... НО когда прописываю код в мотиондетектед датчика - при первом же срабатывании датчика включается свет. Не может ли датчик два раза менять свое состояние к ряду? В качестве бреда - может дребезг контактов??
ЗЫ датчик движения HC-SR501
Можно попробовать ввести период "нечувствительности" после первого срабатывания. Добавим еще одно свойство: OBJECT.DoNotReact.
И введем период, в течение которого после первого срабатывания не должен включаться свет, независимо от количества срабатываний в этот период.

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

//Проверяем, было ли уже первое срабатывание и активирован ли период "нечувствительности"
if ((gg('OBJECT.pervoe_srabatyvanie') == 1) && (gg('OBJECT.DoNotReact') == 0))  {
//Уже было первое срабатывание (текущее срабатывание не первое) и период "нечувствительности" истек (== "0")
//тут ДЕЙСТВИЕ по управлению светом (код)
} else {
if (gg('OBJECT.pervoe_srabatyvanie') <> 1)  {
//Ранее срабатываний не было, тогда текущее срабатывание является первым (зафиксируем это)
sg('OBJECT.pervoe_srabatyvanie', 1);
//Устанавливаем время, через которое произойдет новый эпизод, когда очередное срабатывание надо считать первым (обнулим свойство, допустим, через 15 секунд)
SetTimeOut("MyTimer_999","sg('OBJECT.pervoe_srabatyvanie', 0);",15);
//При значении свойства DoNotReact == "1" свет включаться не должен
sg('OBJECT.DoNotReact', 1);
//Задаем продолжительность периода "нечувствительности" к срабатываниям датчика движения (пусть будет 5 сек.)
SetTimeOut("MyTimer_555","sg('OBJECT.DoNotReact', 0);",5);
return"";
}
}
зачем столько кода и свойств?

при срабатывании дд проверяем

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

if(timeoutexists('timer')){
 // уже не первое срабатывание, включим свет
 cm('включим свет');
 settimeout('timer','cm("выключим свет");',15);//перезапустим таймер
}else{
//таймера нет, значит первое срабатывание
// просто запустим таймер
  settimeout('timer','cm("выключим свет");',15);
}

За это сообщение автора xor поблагодарили (всего 2):
Chainik (Вс фев 09, 2020 1:51 pm) • lihodeev (Пн фев 10, 2020 12:58 am)
Рейтинг: 2.33%
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Как выключить свет?

Сообщение Chainik » Вс фев 09, 2020 1:56 pm

Там еще имеется некоторая проблемка с тем, что используемый датчик движения часто выдает сигнал о срабатывании (может выдавать чуть ли ни каждые пару секунд). У меня, к примеру, такой проблемы нет: датчики движения при обнаружении движения размыкают сигнальную цепь на 6 секунд, а последующее срабатывание происходит не раньше, чем через 4-5 секунд (т.е. минимальная периодичность срабатывания получается около 10 секунд).
Может действительно автору перемычку надо переставить, как написано выше.
Jilber
Сообщения: 684
Зарегистрирован: Ср май 03, 2017 7:41 pm
Благодарил (а): 113 раз
Поблагодарили: 107 раз

Re: Как выключить свет?

Сообщение Jilber » Вс фев 09, 2020 2:32 pm

Там есть ещё некоторые тонкости с наводками, заземлением, и т.д. В этой теме обсуждали.
lihodeev
Сообщения: 148
Зарегистрирован: Ср июл 25, 2018 10:37 pm
Благодарил (а): 43 раза
Поблагодарили: 8 раз

Re: Как выключить свет?

Сообщение lihodeev » Вс фев 09, 2020 3:35 pm

наводки- не думаю, поскольку если бы они были, то датчик срабатывал и без причины(воздействия), чего у меня нет, ложных срабатываний нет(хотя, были до того как на 2560 не поставил на входы RS цепочки). Я приводил лог, но мне не понятно "кто" дергает состояния ...
2020-02-08 17:34:39 0 /objects/?job=8348922
2020-02-08 17:34:32 1 /objects/?object=pirPRH&op=m&m=update&v=0
2020-02-08 17:34:31 0 /objects/?job=8348910
2020-02-08 17:34:29 1 /objects/?object=pirPRH&op=m&m=update&v=1
может служба или задача что то делает параллельно друг с другом? На счет перемычки - может быть, я не помню в каком положении она стоит(посмотрю). Хотя, код
$a=(gg('No.time'));
$b = $a+1;
sg('No.time',$b);
всегда правильное количество отрабатывает.. как бы ложных срабатываний пока не видел. В любом случае спасибо за принятое участие в моей хотелке :-) Перемычку попробую как доберусь, и отпишусь
Raspberry 3, AMS 16, arduinka 2560, Orange pi Zero, Broadlink RM3, Xiaomi Mi Robot Vacuum SKV4000GL
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Как выключить свет?

Сообщение xor » Вс фев 09, 2020 8:13 pm

lihodeev писал(а):
Вс фев 09, 2020 3:35 pm
наводки- не думаю, поскольку если бы они были, то датчик срабатывал и без причины(воздействия), чего у меня нет, ложных срабатываний нет(хотя, были до того как на 2560 не поставил на входы RS цепочки). Я приводил лог, но мне не понятно "кто" дергает состояния ...
2020-02-08 17:34:39 0 /objects/?job=8348922
2020-02-08 17:34:32 1 /objects/?object=pirPRH&op=m&m=update&v=0
2020-02-08 17:34:31 0 /objects/?job=8348910
2020-02-08 17:34:29 1 /objects/?object=pirPRH&op=m&m=update&v=1
может служба или задача что то делает параллельно друг с другом? На счет перемычки - может быть, я не помню в каком положении она стоит(посмотрю). Хотя, код
$a=(gg('No.time'));
$b = $a+1;
sg('No.time',$b);
всегда правильное количество отрабатывает.. как бы ложных срабатываний пока не видел. В любом случае спасибо за принятое участие в моей хотелке :-) Перемычку попробую как доберусь, и отпишусь
судя по логу - вот эта вот запись с джоб - похоже на то, что после сработки дд запускается таймер сброса в 0
lihodeev
Сообщения: 148
Зарегистрирован: Ср июл 25, 2018 10:37 pm
Благодарил (а): 43 раза
Поблагодарили: 8 раз

Re: Как выключить свет?

Сообщение lihodeev » Чт фев 13, 2020 10:23 pm

lihodeev писал(а):
Вс фев 09, 2020 3:35 pm
Перемычку попробую как доберусь, и отпишусь
перемычку переставил, все работает уже отлично.
вторая хотелка - у меня в половине комнат стоят терминалы на апельсинках, решил немного модернизировать , и так -
добавляем в таблицу terminals поле LOCATION_ID

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

alter table terminals add LOCATION_ID text
я руками занес значения в поле LOCATION_ID из одноименного поля из таблицы devices в строки которые ответствуют IP терминалов
сделал шаблон поведения - выключи (.+)
с таким кодом

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

$point=$matches[1];
$terminal_rec=SQLSelectOne("SELECT * FROM terminals WHERE LOCATION_ID LIKE
'%".DBSafe($replyto)."%' ORDER BY LATEST_REQUEST_TIME DESC LIMIT 1");
$terminal=$terminal_rec[LOCATION_ID];

$terminal_dev=SQLSelectOne("SELECT * FROM devices WHERE LOCATION_ID='$terminal' AND TITLE='$point'");
$object=$terminal_dev[LINKED_OBJECT];
callMethod("$object.turnoff");
немного изменил названия в простых устройствах(что не очень понравилось) подсветка на подсветку вентиляция на вентиляцию. Теперь Алиса определяет с какой комнаты отдается команда и управляет устройством в этой комнате. Раньше надо было дать команду -включи свет в кухне - а сейчас просто - включи свет. Впрочем старые шаблоны я оставил для того, чтобы можно было выключить свет из прихожей в кухне. Вопрос - как можно сделать нормальные названия в простых устройствах? А код - может кто скажет что не так, или как можно проще сделать.
Raspberry 3, AMS 16, arduinka 2560, Orange pi Zero, Broadlink RM3, Xiaomi Mi Robot Vacuum SKV4000GL
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Как выключить свет?

Сообщение tarasfrompir » Чт фев 13, 2020 10:42 pm

lihodeev писал(а):
Чт фев 13, 2020 10:23 pm
Раньше надо было дать команду -включи свет в кухне - а сейчас просто - включи свет. Впрочем старые шаблоны я оставил для того, чтобы можно было выключить свет из прихожей в кухне. Вопрос - как можно сделать нормальные названия в простых устройствах? А код - может кто скажет что не так, или как можно проще сделать.
вопрос в том что это написано уже месяц как в ядре - мдм и использование локации терминала и устройства в той же локации.уже даже в мастер перенесено. так что обновляйся и пробуй.
И шаблон такой не нужен...
Также и сделано - и для названий устройств .
Только для того чтобы можно было включить свет в другой комнате используй альтернативное название.
ТОесть в зале делаеш устройство с названием свет и альтернативным названием свет в зале.
И если подаеш на терминал из локации зал - включи свет то включит свет в зале.
А если ты в спальне - то говоришь включи свет в зале... И включится свет в зале...
Ну как то так сумбурно и не доходчиво -
За это сообщение автора tarasfrompir поблагодарил:
lihodeev (Чт фев 13, 2020 10:56 pm)
Рейтинг: 1.16%
Спасибо нам ПОМОЖЕТ..!
Ответить