Помогите девушке разобраться)

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Mixman
Сообщения: 395
Зарегистрирован: 17 фев 2013, 23:49
Откуда: Волгодонск, Ростовская обл.
Контактная информация:

Re: Помогите девушке разобраться)

Сообщение Mixman » 28 мар 2015, 18:51

Ivan_A, флаги в базе. Это состояние выхода. У Андрея в демоинтерфейсе только 0 и 1, а я расширил. :)

Да, все одним скриптом рулится. Паузы через sleep, только в цикле с проверкой условия. В частности проверяется в базе время включения света.

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 29 мар 2015, 16:42

Ivan_A, раз уж Вы сейчас активно со всем разбираетесь, хочу поделиться на мой взгляд небесполезной идеей и работающим скриптом к ней. Называется "множественные нажатия". Если при использовании компьютерной мыши мы привыкли, что в программах одинарное, двойное, тройное нажатие на клавишу могут вызывать разные действия, то почему нельзя применить этот прием в домашней автоматизации? Выкладываю работающий код для трех нажатий.

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

<?
//множественные нажания на кнопку (разная реакция в зависимости от кол-ва нажатий)

//вводим условие, при котором выполнение скипта происходит только при срабатывании входа "1"
if ( $_GET['pt'] == "1" )
{

$L = 0;

//Останавливаем выполнение всех ранее запущенных скриптов
$f_stop = fopen("stop_m31.txt", "w");
usleep(600000);
fclose($f_stop);
@unlink("stop_m31.txt");

//Создаем файл-счетчик
//$f_counter = fopen("counter.txt","w");
//fclose($f_counter);

//Читаем содержимое файла-счетчика и записываем его в переменную
@$val_counter = file_get_contents("counter.txt");

//Если переменная = "", то пишем в файл-счетчик "1"
if ($val_counter == "")
{
$f_counter = fopen("counter.txt","a+");
sleep(0.05);
fwrite($f_counter, "1");
fclose($f_counter);

do
{
$L = $L + 1;
sleep(0.1);
if (file_exists("stop_m31.txt")) exit;
}
while($L < 10);

goto action;
}

//Если переменная = "1", то пишем в файл-счетчик "2"
if ($val_counter == "1")
{
$f_counter = fopen("counter.txt","a+");
sleep(0.05);
fwrite($f_counter, "2");
fclose($f_counter);

do
{
$L = $L + 1;
sleep(0.1);
if (file_exists("stop_m31.txt")) exit;
}
while($L < 10);

goto action;
}

//Если переменная = "12", то пишем в файл-счетчик "3"
if ($val_counter == "12")
{
$f_counter = fopen("counter.txt","a+");
sleep(0.05);
fwrite($f_counter, "3");
fclose($f_counter);

do
{
$L = $L + 1;
sleep(0.1);
if (file_exists("stop_m31.txt")) exit;
}
while($L < 10);

goto action;
}

action:
//Читаем содержимое файла-счетчика и записываем его в переменную
@$val_counter = file_get_contents('counter.txt');

//Если переменная = "1", то выключаем все выходы
if (@$val_counter == "1")
{
file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
file_get_contents("http://192.168.0.14/sec/?cmd=10:0");
}

//Если переменная = "12", то включаем выход 9
if (@$val_counter == "12")
{
file_get_contents("http://192.168.0.14/sec/?cmd=9:1");
}

//Если переменная = "123", то включаем выходы 9 и 10
if (@$val_counter == "123")
{
file_get_contents("http://192.168.0.14/sec/?cmd=9:1");
file_get_contents("http://192.168.0.14/sec/?cmd=10:1");
}

//Удаляем файл-счетчик
@fclose($f_counter);
@unlink("counter.txt");

//Удаляем стоп-файл
@fclose($f_stop);
@unlink("stop_m31.txt");

}

?>
В качестве тестовой нагрузки к выходам Меги 9 и 10 у меня присоединены лампы накаливания. Одинарное нажатие на кнопку выключает весь свет, двойное - включает свет на выходе 9, а тройное - включает весь свет (запитывает нагрузку на выходах 9 и 10). Следует заметить, что как и в случае с компьютерной мышкой, нужно совершать именно множественное нажатие, т.е. пауза между нажатиями не должна быть слишком большой, иначе скрипт воспримет каждое нажатие как отдельные команды.
Предвижу вопрос, какую пользу все это принесет народному хозяйству? Можно придумать разные варианты: например, можно экономить на выключателях.

Ivan_A
Сообщения: 25
Зарегистрирован: 05 мар 2015, 16:14

Re: Помогите девушке разобраться)

Сообщение Ivan_A » 31 мар 2015, 11:15

Mixman, спасибо, я так и сделал. И флагов на самом деле у меня еще больше ;)
Ruslan, спасибо за код и комментарии к нему. В коде разобрался, и вроде бы он должен работать, но у меня не работает (( мне вообще-то не нравится идея использования вспомогательных файлов, если встанет встанет аналогичная задача, то я напишу код для работы с базой данных и флагов.
Пусть флаг 0 - нет нажатия, 1 - однократное нажатие, 2 - двукратное нажатие.
Алгоритм вижу такой: по нажатию на клавишу обращаюсь к БД и проверяю, нет ли флага двукратного нажатия. Если есть (значит уже произошло тройное нажатие) - выполняю действие и обнуляю флаг. Если нет, увеличиваю флаг, жду секунду (или другой таймаут) и смотрю, не изменился ли флаг. Если изменился, значит было еще нажатие - заканчиваю скрипт. Если не изменился - выполняю соответствующее действие и обнуляю флаг.
Мне кажется, что это должно работать стабильнее. И, главное, быстрее - трехкратный клик обработается сразу. Можно, конечно, флаги хранить и в файле, по крайней мере мой алгоритм позволит не использовать один из служебных файлов stop_m31.txt.
Но в любом случае - СПАСИБО!!

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 01 апр 2015, 15:17

Да, действительно, скрипт с отработкой множественных нажатий перестал работать. Очень странно, ведь ничего не менял, кроме того, что вместо интерфейсного модуля Меги вер.5.0 релиз прошивки 3.08 поставил модуль вер.5.1 (прошивка 3.23). Но не понимаю, как это могло повлиять. Если в конце скрипта закомментировать строку с командой, удаляющей файл-счетчик ( @unlink("counter.txt"); ), то один раз скрипт срабатывает. Для повторного срабатывания в этом случае, естественно, нужно вручную удалить файл-счетчик. Буду разбираться, что пошло не так...

Ivan_A
Сообщения: 25
Зарегистрирован: 05 мар 2015, 16:14

Re: Помогите девушке разобраться)

Сообщение Ivan_A » 02 апр 2015, 07:52

Может сразу накатить прошивку 3.30? так, на всякий случай.
ЗЫ я на ней экспериментирую

Mixman
Сообщения: 395
Зарегистрирован: 17 фев 2013, 23:49
Откуда: Волгодонск, Ростовская обл.
Контактная информация:

Re: Помогите девушке разобраться)

Сообщение Mixman » 02 апр 2015, 10:47

Ruslan А ставите паузы после запросов на наличие файла? Возможно прошивка стала шустрее работать и скрипт не успевает понять, есть ли файл или считать данные с базы.

Я когда писал свой скрипт обработки нажатий, точнее переписывал под себя, очень долго не мог понять, почему работает не так как мне нужно. Потом дошло, что нужно вставлять хотя бы полсекундные паузы, а там где не критично, то побольше. Глазу человека полсекунды роли не сыграют, а для автоматики это нужно.

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 03 апр 2015, 09:28

Mixman, спасибо за совет. Добавил паузы, увеличил продолжительность существования стоп-файла и скрипт заработал. Однако, на мой взгляд, получается уж слишком большая пауза между нажатиями. При уменьшении времени существования стоп-файла (в надежде сократить допустимые паузы между нажатиями) скрипт перестает работать. Могу предположить, что, возможно, что-то поменялось в прошивке 3.23 по сравнению с релизом 3.08 в плане каких-нибудь задержек или в отработке дребега контактов. Буду дальше экспериментировать...

Mixman
Сообщения: 395
Зарегистрирован: 17 фев 2013, 23:49
Откуда: Волгодонск, Ростовская обл.
Контактная информация:

Re: Помогите девушке разобраться)

Сообщение Mixman » 04 апр 2015, 10:34

Уменьшите паузы между нажатиями, например usleep().
У меня в megad.php использую и usleep(10000); - перед записью или после чтения из БД. и usleep(100000); - для отслеживания нажатий в цикле.

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 06 апр 2015, 22:08

Mixman, увы, уменьшение пауз не вылечило скрипт. Но направление, в котором нужно "копать", похоже, нащупать удалось. Думаю, дело в прошивке (3.23).
Вот, например, нижеследующий скрипт выполняется мгновенно, как бы часто не происходили нажатия на кнопку.

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

<?
//тест реакции на множественные нажатия

//вводим условие, при котором выполнение скипта происходит только при срабатывании входа "1"
if ( $_GET['pt'] == "1" )
{
file_get_contents("http://192.168.0.14/sec/?cmd=10:2");
//Если раскомментировать команду sleep(3), крипт перестает мгновенно отрабатывать
//   повторное нажатие (имитация множественного нажатия)
//sleep(3);
}
?>
А вот если в конце поставить 3-секундную паузу, то мгновенное исполнение повторного нажатия куда-то "улетучивается". Повторное нажатие начинает отрабатываться через паузу. Причем задержка не составляет 3 секунды. На мой взгляд запаздывание отработки повторного нажатия составляет 1-1,5 секунды.
Кто-нибудь может объяснить такое поведение Меги?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Помогите девушке разобраться)

Сообщение Andrey_B » 06 апр 2015, 22:31

Ruslan, прежде всего, обновите прошивку до последней версии.
Если проблема сохраняется, опишите подробнее что вы хотите сделать - я напишу работающий скрипт.

Dron
Сообщения: 207
Зарегистрирован: 08 мар 2013, 13:00

Re: Помогите девушке разобраться)

Сообщение Dron » 08 апр 2015, 10:45

Ruslan писал(а): А вот если в конце поставить 3-секундную паузу, то мгновенное исполнение повторного нажатия куда-то "улетучивается". Повторное нажатие начинает отрабатываться через паузу. Причем задержка не составляет 3 секунды. На мой взгляд запаздывание отработки повторного нажатия составляет 1-1,5 секунды.
Кто-нибудь может объяснить такое поведение Меги?
Всё просто. девайс ждёт ответа сервера ДВЕ секунды, после чего считает, что сервер недоступен, и выполняет команду, зашитую в него.
скрипт должен отдать 200, а потом уже можно вызывать другой скрипт, хоть через 10 сек, который отправит девайсу новую команду

и ещё особенность php
он отдаёт данные после завершения работы (если сильно упростить)

и в любом случае - паузы в скриптах - моветон. лучше сделайте бесконечно работающий скрипт, который будет выполнять всю работу по отправке отложенных команд девайсу.

UPD:
сильно упрощено. подразумевается, что в БД пишутся команды на выполнение в будущем

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

<?
set_time_limit(0);

while(1){
	if(is_file('тут путь к файлу. если файл есть, скрипт останавливается')) break;

	// тут запрос к бд
	$komanda = 'выбираем команды, timestamp которых меньше, чем сейчас';

	if($komanda) file_get_contents("http://192.168.0.14/sec/?cmd=".$komanda);
}

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 08 апр 2015, 22:48

Dron, спасибо за ответ. К сожалению, я пока не дошел до использования БД. Но если бы Мега каждый раз ждала 2 секунды, то не было бы мгновенной отработки скрипта при первом нажатии на кнопку. Вопрос в том, почему не происходит срабатывания того же скрипта при повторном нажатии, если это нажатие произошло в диапазоне до 1,5 секунд после первого нажатия? Ведь, по идее, в этом случае должен запускаться такой же скрипт с такой же реакцией Меги (как и при первом нажатии). А этого не происходит... Лечится закомментированием паузы (но в паузах то весь смысл).
При наличии в скрипте паузы, что-то препятствует повторному запуску того же скрипта в течение 1,5 секунд после его первого запуска.

Dron
Сообщения: 207
Зарегистрирован: 08 мар 2013, 13:00

Re: Помогите девушке разобраться)

Сообщение Dron » 09 апр 2015, 14:09

Ruslan писал(а):Но если бы Мега каждый раз ждала 2 секунды, то не было бы мгновенной отработки скрипта при первом нажатии на кнопку.
она ждёт ДО двух секунд. если команда поступает через 0,001 сек, она обрабатывается сразу, если позже, не обрабатывается вообще
Ruslan писал(а):Лечится закомментированием паузы (но в паузах то весь смысл).
При наличии в скрипте паузы, что-то препятствует повторному запуску того же скрипта в течение 1,5 секунд после его первого запуска.
повторюсь, паузы ни к чему
ещё пример (почти без кода, только алгоритм)

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

клик
 - читаем с файла
$время_клика (timestamp с сотыми секунды) / $количество
 - если $время_клика меньше секунды прошло, плюсуем $количество с обновлением $время_клика и пишем в файл
 - иначе пишем в файлик:
$время_клика / 1
файлик никогда не стирается, просто обновляется строчка в нём.
а в вышеприведённом мной скрипте постоянно читаем этот файлик вместо БД и делаем нужные действия

по идее в этом файлике можно хранить и 10, и 500 строк с такими данными для соответственно 10 и 500 выключателей
ходя базы данных удобнее

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 09 апр 2015, 23:47

Dron писал(а):она ждёт ДО двух секунд. если команда поступает через 0,001 сек, она обрабатывается сразу, если позже, не обрабатывается вообще
Но все происходит как раз наоборот. Повторное нажатие в диапазоне от 0 до 1,5 секунд после первого нажатия и не думает отрабатываться.
Вот попробуйте на практике выполнить этот простейший скрипт

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

<?
//тест реакции на множественные нажатия

//вводим условие, при котором выполнение скипта происходит только при срабатывании входа "1"
if ( $_GET['pt'] == "1" )
{
file_get_contents("http://192.168.0.14/sec/?cmd=10:2");
sleep(3);
}
?>
По идее, что должно быть: происходит первое нажатие, запускается скрипт. Через секунду происходит второе нажатие, запускается тот же скрипт, только в другом процессе. Но на практике вот этот скрипт (дубль 2) либо вообще не запускается, либо не исполняется.
Если же повторное нажатие происходит после 1,5 секунд, то скрипт (дубль 2) отрабатывается нормально.
Ваш алгоритм с файлом вполне может работать. Но все-таки хочется разобраться с паузами (хотя я понимаю ограниченность такого решения).

Dron
Сообщения: 207
Зарегистрирован: 08 мар 2013, 13:00

Re: Помогите девушке разобраться)

Сообщение Dron » 10 апр 2015, 15:36

микроконтроллер в принципе не относится к устройствам, умеющим работать в многопоточном режиме. и моё предположение, что пока он ждёт ответа от сервера, он просто не может отправить другой пакет. другие команды -- да, но не ожидание ответа сервера. и это логично. а прошли 2 секунды, он понял, что ответа не будет, выполняет команду по умолчанию и готов к следующей команде.
но этот момент лучше уточнить у автора

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 10 апр 2015, 16:07

Согласен с Вами, Dron. Я тоже начинаю подозревать, что в прошивку заложена именно такая логика работы Меги. Т.е. Меге недостаточно просто получить какой-нибудь ответ от сервера (команду), она, видимо, ожидает еще некое сообщение от сервера об окончании выполнения скрипта. И если такое сообщение получает в пределах 1,5 секунд ожидания, становится готова отрабатывать следующее нажатие, а если не получает после 1,5 секунд - считает, что сервер недоступен и тоже готова штатно отработать очередное нажатие. Достоверно прояснить ситуацию сможет только автор.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Помогите девушке разобраться)

Сообщение Andrey_B » 10 апр 2015, 16:12

Ruslan, 6 апреля я писал вам в теме.
Дублирую: "Ruslan, прежде всего, обновите прошивку до последней версии. Если проблема сохраняется, опишите подробнее что вы хотите сделать - я напишу работающий скрипт."

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Помогите девушке разобраться)

Сообщение Ruslan » 10 апр 2015, 16:42

Да, Andrey_B, я помню. Спасибо за готовность помочь. Но с ходу обновить прошивку для "чайника" непростая задача. Пока вопрос с обновлением решить не удалось, попытки будут продолжены.

nyasha
Сообщения: 97
Зарегистрирован: 24 апр 2014, 14:53
Откуда: Тюмень

Re: Помогите девушке разобраться)

Сообщение nyasha » 02 май 2015, 14:14

Народ. Подумываю ради интереса в коридоре установить еще и датчик звука (датчик движения не всегда срабатывает. Вообще бесят меня эти пирониксы). Присмотрела на али вот такие http://ru.aliexpress.com/item/Free-Ship ... rue#extend Пишут, что они аналоговые. Значит его надо цеплять на порт АЦП? А дальше что? Замерить какой будет уровень сигнала при хлопке руками, например, и отталкиваться от него уже? Опять таки в описаниях датчика странности. Пишут, что он аналоговый и в то же время, что он выдает 0 или 1 на выходе. Это вроде бы как цифровые значения. Кто пробовал подобные датчики?

aurodionov
Сообщения: 213
Зарегистрирован: 16 авг 2011, 14:07
Откуда: Россия,Тюмень
Контактная информация:

Re: Помогите девушке разобраться)

Сообщение aurodionov » 02 май 2015, 14:38

Там скорей всего компаратор на ОУ ,на выходе уровни.

Ответить