Страница 1 из 2
Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 4:40 am
Kumehtar
Всем привет!
Есть 2 устройства, подключенных по MQTT. При нажатии на кнопку нужно чтобы они переключались между собой каждые несколько секунд, пока не поступит команда прерваться.
Создаю на сцене элемент "выключатель" и привязываю к объекту "switcher" типа SRelays для отображения статуса. Выполнить при клике в состоянии "off" пишу код:
Код: Выделить всё
callMethod('switcher.switch'); //переключаю состояние объекта switcher
//чтобы состояние отобразилось на выключателе
$status0=gg('switcher.status');
if ($status0 == 1)
{
while (true) // бесконечный цикл
{
callMethod('CEB00F_test.turnon'); // включить первое устройство
callMethod('Living_room_f.turnoff'); // выключить второе устройство
clearTimeOut("lightOffTimer");
SetTimeOut("lightOffTimer","callMethod('CEB00F_test.turnoff');
callMethod('Living_room_f.turnon');",3);
// через 3 с. переключить устройства
if ($status0 <> 1)
{
break; // если выключатель поменял состояние ("выключен") выйти из цикла
}
}
}
Выполнить при клике в состоянии "on":
Код: Выделить всё
callMethod('switcher.switch');
callMethod('CEB00F_test.turnoff');
callMethod('Living_room_f.turnoff');
Уже пробовал разные циклы, вставлял их в разные места. При включении выключателя Мажордомо зависает и не реагирует ни на что.
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 8:31 am
tarasfrompir
Kumehtar писал(а): ↑Чт ноя 28, 2019 4:40 am
Уже пробовал разные циклы, вставлял их в разные места. При включении выключателя Мажордомо зависает и не реагирует ни на что.
а вставить между моргалками - $status0=gg('switcher.status');
ато у тебя в цикле никак не поменять твой статус...
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 10:59 am
Kumehtar
tarasfrompir писал(а): ↑Чт ноя 28, 2019 8:31 am
а вставить между моргалками - $status0=gg('switcher.status');
перед вторым if? тоже не идет. Я подозреваю, что на выключатель такой код вешать нельзя. Видимо, он забирает ресурсы на себя, пока не закончится код. А т.к. цикл бесконечный, то система виснет надолго.
Может как-то можно по-другому организовать перемигивание?
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 11:09 am
freesh
Kumehtar писал(а): ↑Чт ноя 28, 2019 10:59 am
tarasfrompir писал(а): ↑Чт ноя 28, 2019 8:31 am
а вставить между моргалками - $status0=gg('switcher.status');
перед вторым if? тоже не идет. Я подозреваю, что на выключатель такой код вешать нельзя. Видимо, он забирает ресурсы на себя, пока не закончится код. А т.к. цикл бесконечный, то система виснет надолго.
Может как-то можно по-другому организовать перемигивание?
А если попробовать банально повесить на onNewSecond?
т.е. типа
$status0=gg('switcher.status');
if ($status0 == 1)
{
if (gg('CEB00F_test.status')==0) {callMethod('CEB00F_test.turnon');} else {callMethod('CEB00F_test.turnoff');}
if (gg('Living_room_f.status')==0) {callMethod('Living_room_f.turnon');} else {callMethod('Living_room_f.turnoff');}
}
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 12:15 pm
tarasfrompir
freesh писал(а): ↑Чт ноя 28, 2019 11:09 am
Kumehtar писал(а): ↑Чт ноя 28, 2019 10:59 am
tarasfrompir писал(а): ↑Чт ноя 28, 2019 8:31 am
а вставить между моргалками - $status0=gg('switcher.status');
перед вторым if? тоже не идет. Я подозреваю, что на выключатель такой код вешать нельзя. Видимо, он забирает ресурсы на себя, пока не закончится код. А т.к. цикл бесконечный, то система виснет надолго.
Может как-то можно по-другому организовать перемигивание?
А если попробовать банально повесить на onNewSecond?
т.е. типа
$status0=gg('switcher.status');
if ($status0 == 1)
{
if (gg('CEB00F_test.status')==0) {callMethod('CEB00F_test.turnon');} else {callMethod('CEB00F_test.turnoff');}
if (gg('Living_room_f.status')==0) {callMethod('Living_room_f.turnon');} else {callMethod('Living_room_f.turnoff');}
}
Не надо никуда ничего вешать - это есть нехорошо
Дело в том что логика в цикле очень хромает
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 12:20 pm
tarasfrompir
Код: Выделить всё
while (true) // бесконечный цикл
{
$status0=gg('switcher.status');
if ($status0 <> 1){
break; // если выключатель поменял состояние ("выключен") выйти из цикла
}
callMethod('CEB00F_test.turnon'); // включить первое устройство
callMethod('Living_room_f.turnoff'); // выключить второе устройство
sleep(3);
$status0=gg('switcher.status');
if ($status0 <> 1){
break; // если выключатель поменял состояние ("выключен") выйти из цикла
}
callMethod('CEB00F_test.turnoff'); // включить первое устройство
callMethod('Living_room_f.turnon'); // выключить второе устройство
sleep(3);
}
Вот так будет просто и надежно
Но это для старта - а там уже логику можна и на таймеры повесить
НО ТОЛЬКО ВСЕ СДЕЛАТЬ ПО ДРУГОМУ.... а не так как сделано
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 1:16 pm
Kumehtar
tarasfrompir писал(а): ↑Чт ноя 28, 2019 12:20 pm
Вот так будет просто и надежно
Но это для старта - а там уже логику можна и на таймеры повесить
НО ТОЛЬКО ВСЕ СДЕЛАТЬ ПО ДРУГОМУ.... а не так как сделано
Так вообще не запускается =(
freesh писал(а): ↑Чт ноя 28, 2019 11:09 am
А если попробовать банально повесить на onNewSecond?
А так, вроде, работает. Но "повесил" пока на onNewMinute. Теперь понять, как сделать что-то типа onNewSecond
(как тут:
viewtopic.php?t=386#p1932)
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 1:22 pm
tarasfrompir
Kumehtar писал(а): ↑Чт ноя 28, 2019 1:16 pm
tarasfrompir писал(а): ↑Чт ноя 28, 2019 12:20 pm
Вот так будет просто и надежно
Но это для старта - а там уже логику можна и на таймеры повесить
НО ТОЛЬКО ВСЕ СДЕЛАТЬ ПО ДРУГОМУ.... а не так как сделано
Так вообще не запускается =(
freesh писал(а): ↑Чт ноя 28, 2019 11:09 am
А если попробовать банально повесить на onNewSecond?
А так, вроде, работает. Но "повесил" пока на onNewMinute. Теперь понять, как сделать что-то типа onNewSecond
(как тут:
viewtopic.php?t=386#p1932)
Подожди ану ка расскажи как ты запускаеш сам этот метод...
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 1:28 pm
freesh
Kumehtar писал(а): ↑Чт ноя 28, 2019 1:16 pm
tarasfrompir писал(а): ↑Чт ноя 28, 2019 12:20 pm
Вот так будет просто и надежно
Но это для старта - а там уже логику можна и на таймеры повесить
НО ТОЛЬКО ВСЕ СДЕЛАТЬ ПО ДРУГОМУ.... а не так как сделано
Так вообще не запускается =(
freesh писал(а): ↑Чт ноя 28, 2019 11:09 am
А если попробовать банально повесить на onNewSecond?
А так, вроде, работает. Но "повесил" пока на onNewMinute. Теперь понять, как сделать что-то типа onNewSecond
(как тут:
viewtopic.php?t=386#p1932)
Да, решение от tarasfrompir получше и должно работать, видимо пускаешь неправильно. Грубо говоря по нажатию кнопки - если перешло в режим ВключитьПеремигивание - в switcher.status должна записаться 1 а при выключении должна туда записаться 0
@tarasfrompir а сам цикл лучше запихнуть в StatusUpdated?
Re: Циклическое выполнение команды
Добавлено: Чт ноя 28, 2019 1:33 pm
tarasfrompir
freesh писал(а): ↑Чт ноя 28, 2019 1:28 pm
Kumehtar писал(а): ↑Чт ноя 28, 2019 1:16 pm
tarasfrompir писал(а): ↑Чт ноя 28, 2019 12:20 pm
Вот так будет просто и надежно
Но это для старта - а там уже логику можна и на таймеры повесить
НО ТОЛЬКО ВСЕ СДЕЛАТЬ ПО ДРУГОМУ.... а не так как сделано
Так вообще не запускается =(
freesh писал(а): ↑Чт ноя 28, 2019 11:09 am
А если попробовать банально повесить на onNewSecond?
А так, вроде, работает. Но "повесил" пока на onNewMinute. Теперь понять, как сделать что-то типа onNewSecond
(как тут:
viewtopic.php?t=386#p1932)
Да, решение от tarasfrompir получше и должно работать, видимо пускаешь неправильно. Грубо говоря по нажатию кнопки - если перешло в режим ВключитьПеремигивание - в switcher.status должна записаться 1 а при выключении должна туда записаться 0
Я бы добавил сюда + запускать этот же метод при изменении свойства status
Или добавить в логиактион этот кусок кода