Циклическое выполнение команды

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

Модератор: immortal

Kumehtar
Сообщения: 12
Зарегистрирован: Вт окт 01, 2019 8:30 am
Благодарил (а): 3 раза
Поблагодарили: 0

Циклическое выполнение команды

Сообщение Kumehtar » Чт ноя 28, 2019 4:40 am

Всем привет!
Есть 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');
Уже пробовал разные циклы, вставлял их в разные места. При включении выключателя Мажордомо зависает и не реагирует ни на что.
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Циклическое выполнение команды

Сообщение tarasfrompir » Чт ноя 28, 2019 8:31 am

Kumehtar писал(а):
Чт ноя 28, 2019 4:40 am
Уже пробовал разные циклы, вставлял их в разные места. При включении выключателя Мажордомо зависает и не реагирует ни на что.
а вставить между моргалками - $status0=gg('switcher.status');
ато у тебя в цикле никак не поменять твой статус...
Спасибо нам ПОМОЖЕТ..!
Kumehtar
Сообщения: 12
Зарегистрирован: Вт окт 01, 2019 8:30 am
Благодарил (а): 3 раза
Поблагодарили: 0

Re: Циклическое выполнение команды

Сообщение Kumehtar » Чт ноя 28, 2019 10:59 am

tarasfrompir писал(а):
Чт ноя 28, 2019 8:31 am
а вставить между моргалками - $status0=gg('switcher.status');
перед вторым if? тоже не идет. Я подозреваю, что на выключатель такой код вешать нельзя. Видимо, он забирает ресурсы на себя, пока не закончится код. А т.к. цикл бесконечный, то система виснет надолго.
Может как-то можно по-другому организовать перемигивание?
freesh
Сообщения: 189
Зарегистрирован: Сб окт 12, 2019 2:10 pm
Благодарил (а): 6 раз
Поблагодарили: 30 раз

Re: Циклическое выполнение команды

Сообщение 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');}
}
Raspberry pi3, xiaomi, sonoff rf.
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Циклическое выполнение команды

Сообщение tarasfrompir » Чт ноя 28, 2019 12:15 pm

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');}
}
Не надо никуда ничего вешать - это есть нехорошо
Дело в том что логика в цикле очень хромает
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Циклическое выполнение команды

Сообщение tarasfrompir » Чт ноя 28, 2019 12:20 pm

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

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);
	}

Вот так будет просто и надежно
Но это для старта - а там уже логику можна и на таймеры повесить
НО ТОЛЬКО ВСЕ СДЕЛАТЬ ПО ДРУГОМУ.... а не так как сделано
Спасибо нам ПОМОЖЕТ..!
Kumehtar
Сообщения: 12
Зарегистрирован: Вт окт 01, 2019 8:30 am
Благодарил (а): 3 раза
Поблагодарили: 0

Re: Циклическое выполнение команды

Сообщение 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
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Циклическое выполнение команды

Сообщение tarasfrompir » Чт ноя 28, 2019 1:22 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)
Подожди ану ка расскажи как ты запускаеш сам этот метод...
Спасибо нам ПОМОЖЕТ..!
freesh
Сообщения: 189
Зарегистрирован: Сб окт 12, 2019 2:10 pm
Благодарил (а): 6 раз
Поблагодарили: 30 раз

Re: Циклическое выполнение команды

Сообщение 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

@tarasfrompir а сам цикл лучше запихнуть в StatusUpdated?
Raspberry pi3, xiaomi, sonoff rf.
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Циклическое выполнение команды

Сообщение tarasfrompir » Чт ноя 28, 2019 1:33 pm

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
Или добавить в логиактион этот кусок кода
Спасибо нам ПОМОЖЕТ..!
Ответить