Странное поведение свойств объектов.

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

Ответить
Аватара пользователя
maksimka
Сообщения: 23
Зарегистрирован: Сб апр 07, 2018 2:04 pm
Откуда: Новосибирск
Благодарил (а): 13 раз
Поблагодарили: 12 раз

Странное поведение свойств объектов.

Сообщение maksimka » Сб фев 16, 2019 12:35 pm

Добре, други! Выручайте.
Есть датчик движения, который каждый раз при фиксации движения передает 1 в свойство Motion07.status.
Есть скрипт, который выполняется, если Motion07.status = 1.
Проблема в том, что если в Motion07.status уже стоит 1, и срабатывает датчик, скрипт выполняется!
Как сделать так, чтобы срабатывание происходило только при ИЗМЕНЕНИИ свойства с 0 на 1, а не при обновлении с 1 на 1 как сейчас?
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Странное поведение свойств объектов.

Сообщение xor » Сб фев 16, 2019 1:23 pm

Это стандартная ситуация, жалко, что вы не поискали готовое решение. Если скрипт вызывается привязанным к изменению свойства методом, там есть параметры $params['NEW_VALUE']
$params['OLD_VALUE'], которые надо и проверять

Отправлено с моего Redmi 4X через Tapatalk

skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Странное поведение свойств объектов.

Сообщение skysilver » Сб фев 16, 2019 1:54 pm

А ноль в Motion07.status у тебя кто записывает?
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
maksimka
Сообщения: 23
Зарегистрирован: Сб апр 07, 2018 2:04 pm
Откуда: Новосибирск
Благодарил (а): 13 раз
Поблагодарили: 12 раз

Re: Странное поведение свойств объектов.

Сообщение maksimka » Сб фев 16, 2019 3:31 pm

xor писал(а):
Сб фев 16, 2019 1:23 pm
Это стандартная ситуация, жалко, что вы не поискали готовое решение. Если скрипт вызывается привязанным к изменению свойства методом, там есть параметры $params['NEW_VALUE']
$params['OLD_VALUE'], которые надо и проверять

Отправлено с моего Redmi 4X через Tapatalk
А можно подробнее? Там это где?
Перелопатил почти весь форум, но так и не наткнулся на подобное поведение у кого то. Возможно не то искал.
Аватара пользователя
maksimka
Сообщения: 23
Зарегистрирован: Сб апр 07, 2018 2:04 pm
Откуда: Новосибирск
Благодарил (а): 13 раз
Поблагодарили: 12 раз

Re: Странное поведение свойств объектов.

Сообщение maksimka » Сб фев 16, 2019 3:34 pm

skysilver писал(а):
Сб фев 16, 2019 1:54 pm
А ноль в Motion07.status у тебя кто записывает?
0 вписывает похоже сам датчик спустя ему одному ведомый таймаут (не связанный с Motion07.timeout). Ибо других источников 0 я не нашел ((
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Странное поведение свойств объектов.

Сообщение Chainik » Сб фев 16, 2019 4:05 pm

maksimka писал(а):
Сб фев 16, 2019 3:34 pm
skysilver писал(а):
Сб фев 16, 2019 1:54 pm
А ноль в Motion07.status у тебя кто записывает?
0 вписывает похоже сам датчик спустя ему одному ведомый таймаут (не связанный с Motion07.timeout). Ибо других источников 0 я не нашел ((
Если вы руководствовались этим примером

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

//Скрипт запускается при срабатывании датчика движения
$LimitValue = 50; //Пороговое значение
If (gg('SensorА.value') < $LimitValue && gg('SensorА.Silence') <> "1" && timeBetween('06:00', '22:59')) {
say("Шеф, все пропало! Гипс снимают, клиент уезжает...");
sg("SensorА.Silence", 1); //Пока свойство SensorА.Silence будет = 1, сообщение произноситься не будет
setTimeOut('myTimer_Silence','sg("SensorА.Silence", 0);',60*30); //через полчаса свойству SensorА.Silence будет присвоено значение = 0
}
то тут "0" записывается по окончании вот этого таймера

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

setTimeOut('myTimer_Silence','sg("SensorА.Silence", 0);',60*30);
через 1800 секунд, т.е. через полчаса.
Аватара пользователя
maksimka
Сообщения: 23
Зарегистрирован: Сб апр 07, 2018 2:04 pm
Откуда: Новосибирск
Благодарил (а): 13 раз
Поблагодарили: 12 раз

Re: Странное поведение свойств объектов.

Сообщение maksimka » Сб фев 16, 2019 4:39 pm

Вот этот пример я и брал за основу.

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

if (getGlobal('Motion07.KatTualet') == 1) {
say('Кыса ссыт...',1);
sg("Motion07.KatTualet", 1);
setTimeOut('myTimer_Silence','sg("Motion07.KatTualet", 0);',60*3);
}
Так вот вместо срабатывания раз в 3 минуты - "Кыса ссыт" звучит каждый раз как срабатывает датчик. И 0 свойству присваивается спустя 30 секунд примерно, а не через 60*3. Мистика короче )
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Странное поведение свойств объектов.

Сообщение Chainik » Сб фев 16, 2019 4:47 pm

Ну все правильно. В примере в условии If стоит "<>1". Сделайте также, т.е.

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

if (getGlobal('Motion07.KatTualet') <> 1)
и по идее все должно заработать.
Аватара пользователя
maksimka
Сообщения: 23
Зарегистрирован: Сб апр 07, 2018 2:04 pm
Откуда: Новосибирск
Благодарил (а): 13 раз
Поблагодарили: 12 раз

Re: Странное поведение свойств объектов.

Сообщение maksimka » Вс фев 17, 2019 2:42 pm

Chainik писал(а):
Сб фев 16, 2019 4:47 pm
Ну все правильно. В примере в условии If стоит "<>1". Сделайте также, т.е.

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

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

Re: Странное поведение свойств объектов.

Сообщение Chainik » Вс фев 17, 2019 2:57 pm

maksimka писал(а):
Вс фев 17, 2019 2:42 pm
...
при <>1 срабатывает при любом значении свойства, кроме 1. Что то тут еще надо..
На первый взгляд больше ничего не надо. Итак "при <>1 срабатывает при любом значении свойства, кроме 1":

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

if (getGlobal('Motion07.KatTualet') <> 1)
Поскольку значение <>1, произносится фраза:

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

say('Кыса ссыт...',1);
Свойству "Motion07.KatTualet" присваивается значение "1", при котором условие в If выполнятся не будет и, соответственно, будет тишина:

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

sg("Motion07.KatTualet", 1);
Через 3 минуты свойству "Motion07.KatTualet" присваивается значение "0", при котором произнесение фразы возобновится

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

setTimeOut('myTimer_Silence','sg("Motion07.KatTualet", 0);',60*3);
Нигде не увидел нарушения логики.
Ответить