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

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Ivan_A
Сообщения: 25
Зарегистрирован: 05 мар 2015, 16:14

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

Сообщение Ivan_A » 23 мар 2015, 09:16

Да простит меня автор ветки, но задам свой вопрос здесь:
тоже пытаюсь подключить датчик движения. Логика работы должна быть следующая - по сработке датчика включается свет, а выключается через минуту после окончания сработки. Примерно такую же логику хочу прикрутить к вентиляции.
Проблема в том, что не знаю как реализовать именно задержку в скрипте. Установка всяких sleep работает, но при этом вызывается сценарий по умолчанию. Наверное как-то можно можно завершить работу скрипта, чтобы не срабатывал сценарий по умолчанию и запустить новый скрипт через заданное время. Но как - не знаю. Первый свой скрипт на PHP написал неделю назад, линукс тоже ковыряю впервые. Пытаюсь разобраться с аналогичной ситуацией в коде mod_megad.php, но пока для меня это полный разрыв мозга )) да, каждое событие фиксирую в SQL-таблице, пока в основном ради статистики.
Прошу помощи знатоков.
Также буду рад хорошим ссылкам (поисковики по запросу 'exec в php' выдают ссылки на описание команды, по которому нереально разобраться что значит например exec("php mod_megad.php \"light_garage_box\" > /dev/null &").)

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

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

Сообщение Ruslan » 23 мар 2015, 11:37

Ivan_A, у меня при решении аналогичной задачи родился такой тестовый скрипт (просьба специалистов не бить ногами сильно, поскольку по жизни к программированию не имею никакого отношения):

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

<?

//устанавливаем новый предел выполения php-скрипта (вместо стандартных 30 секунд)
set_time_limit(45);

$state = file_get_contents('http://192.168.0.14/sec/?pt=10&cmd=get');
$state9 = file_get_contents('http://192.168.0.14/sec/?pt=9&cmd=get');
$L = 0;
//задаем время в секундах, после которого происходит автоматическое отключение после прекращения фиксаци активности
$T = 15;
@unlink("stop_m22.txt");

if ( $_GET['pt'] == "1" )
{
if ( $state == "OFF" & $state9 == "OFF" )
{
file_get_contents("http://192.168.0.14/sec/?cmd=9:1");

//останавливаем уже запущенные php-скрипты
$f = fopen("stop_m22.txt","w");
sleep(1);
fclose($f);
@unlink("stop_m22.txt");

//запускаем цикл
do
{
$L = $L + 1;
sleep(1);


if (file_exists("stop_m22.txt")) exit;



}
while($L <> $T);
file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
}
else
{
file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
file_get_contents("http://192.168.0.14/sec/?cmd=10:0");
}
}


if ( $_GET['pt'] == "2" & $state == "OFF" & $state9 == "ON" )
{

//запускаем цикл
do
{
$L = $L + 1;
sleep(1);


if ($L < ($T - 4))
{
$f = fopen("stop_m22.txt","w");
}

if ($L == ($T - 2))
{
//file_get_contents("http://192.168.0.14/sec/?cmd=10:1");
//закрываем дескриптор fopen, иначе файл не удалится
fclose($f);
@unlink("stop_m22.txt");
//file_get_contents("http://192.168.0.14/sec/?cmd=10:0");
}

}
while($L <> $T);

if (file_exists("stop_m22.txt")) exit;

file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
}

?>
В качестве тестовой нагрузки к портам Меги 9 и 10 были подключены лампы накаливания. Выключатель (кнопка) подключен ко входу 1, а датчик движения - ко входу 2. Помнится, основная сложность, с которой пришлось столкнуться, состояла в том, что нужно было как-то "убивать" скрипт, ранее уже запущенный на сервере. В коде это сделано с помощью создания служебного файла "stop_m22.txt" и проверки его наличия. Писал код более года назад и с ходу, возможно, не поясню всю его логику. Но, во всяком случае, все успешно работало.

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

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

Сообщение Ivan_A » 23 мар 2015, 14:12

Ruslan, спасибо за ответ.
Если я правильно понимаю логику работы вашего кода, то кнопка включает на 15 секунд/выключает 9 выход, а датчик движения продлевает время горения на 14 секунд. При сработке датчика движения создается файл, который останавливает предыдущий скрипт.
Ваш код работает, но каждый раз при нажатии кнопки (сработке датчика) параллельно скрипту (через 1-2 секунды) отрабатывается сценарий по умолчанию.

Продолжаю ломать голову...

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

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

Сообщение Ivan_A » 23 мар 2015, 14:16

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

Taurus
Сообщения: 56
Зарегистрирован: 23 мар 2015, 14:15

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

Сообщение Taurus » 23 мар 2015, 14:25

Ivan_A
Обсуждалось уже sleep и иже с ним.
viewtopic.php?p=11024#p11024
ИМХО все эти пляски с бубном - один из главных недостатков проповедуемого автором подхода на основе скриптовых языков. Подход конечно прост, понятен и может быть самостоятельно осилен большинством неподготовленных последователей. Но ставить всю домашнюю автоматизацию в зависимость от связки апача и интерпретатора php я бы не стал.

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

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

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

2Taurus : Спасибо!!!
Оба кода по вашей ссылке работают, но первый код с той же проблемой. Стоит заменить тайм нанослип на слип(5), как отрабатывает сценарий по умолчанию. Второй код работает нормально!!!

zelevova
Сообщения: 90
Зарегистрирован: 30 авг 2013, 12:03
Откуда: Краснодарский край

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

Сообщение zelevova » 23 мар 2015, 16:23

Для того что бы не срабатывал сценарий по умолчанию нужно меге что нибудь оперативно ответить, иначе она думает что сервер весит и рулит сама.
Самый простой вариант в начало скрипта добавить:

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

flush();

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

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

Сообщение Ivan_A » 23 мар 2015, 16:49

zelevova, спасибо. Проверил - все так, как вы и написали.
Код заработал, однако если в течени работы sleep активировать вход повторно, происходит непонятно что - порт гаснет раньше срока. Видимо, запускаются новые скрипты, а предыдущие продолжают работать и гасят выход раньше последних.
Пожалуй теперь у меня достаточно информации чтобы написать что-нибудь работающее ;) спасибо всем ответившим!!
А что посылает команда flush на мегу?

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

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

Сообщение Andrey_B » 23 мар 2015, 17:22

Ivan_A, я у себя использую специальный скрипт mod_megad_exec.php, который вызывается функцией exec и работает в режиме CLI (то есть не под Web-сервером).
Дело в том, что увеличивать максимальное время выполнения скрипта из соображений отказоустойчивости сервера не хочется. А иногда требуется делать паузы по 5 минут.
Чтобы скрипты не конфликтовали друг с другом можно придумать какую-нибудь систему флагов (через файлы или БД).
А можно все задания такого рода записывать в таблицу в БД и написать скрипт, который бы обрабатывал эти данные и выполнял задания.

Taurus, а можно сказать, что писать на С++ - это ставить всю домашнюю автоматизацию в зависимость от связки компилятора и линковщика. Только ASM.
Нужно понимать в каком разрезе мы тут обсуждаем проблему. Например, скрипт управления отоплением у меня хотя и написан на PHP никакого отношения к Apache не имеет. А что не так с интерпретатором PHP? Он что, 2+2 как-то иначе считает?
Apache + PHP появляется, когда мы начинаем обрабатывать сообщения от устройств, работающих по HTTP. Ибо это очень удобный механизм для домашней автоматизации. Но и здесь задача Apache разгрузить программу от всех этих сетевых и протокольных штук, давая возможность думать только про алгоритмы. Да и в этом случае скрипт, работающий под Apache, должен лишь принять сообщений, записать данные куда следует и/или вызвать уже CLI-скрипты.
И что не так с сервером Apache?

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

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

Сообщение Ivan_A » 24 мар 2015, 08:32

Andrey_B писал(а):Ivan_A, я у себя использую специальный скрипт mod_megad_exec.php, который вызывается функцией exec и работает в режиме CLI (то есть не под Web-сервером).
О, кажется начинаю что-то понимать )) 8-)
Andrey_B писал(а):Дело в том, что увеличивать максимальное время выполнения скрипта из соображений отказоустойчивости сервера не хочется. А иногда требуется делать паузы по 5 минут.
В вашем скрипте mod_megad_exec.php вижу цикл, который может повториться максимум 4 раза и в котором есть sleep(240). То есть я правильно понимаю, что нет ничего страшного в большом времени выполнения скрипта, если он вызван контроллером или другим скриптом?
Andrey_B писал(а):Чтобы скрипты не конфликтовали друг с другом можно придумать какую-нибудь систему флагов (через файлы или БД).
У меня идея пока такая - поскольку я все события заношу в БД, то перед тем как скрипт выключит освещение я проверю по БД не было ли новых срабатываний датчика движения. Если были, скрипт просто завершит работу и не помешает более позднему. Сейчас буду писать скрипт :shock:
Andrey_B писал(а):А можно все задания такого рода записывать в таблицу в БД и написать скрипт, который бы обрабатывал эти данные и выполнял задания.
А этот скрипт как должен работать и вызываться? Кроном каждую минуту или вообще перманентно крутиться на сервере и через какую-то паузу постоянно проверять БД на предмет наличия там заданий?

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

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

Сообщение Andrey_B » 24 мар 2015, 12:01

Скрипт - это такая же программа, которая может работать сколь угодно долго.
Но когда мы говорим о PHP-скрипте, то следует уточнить, как именно он вызывается.
Если скрипт вызван через mod_php Web сервером Apache, то скорее всего для него было задано максимальное время выполнения скрипта (задается в php.ini). И это время по умолчанию что-то около 30 секунд.
Мы можем увеличить это время до 300, 3000 или 30000000 секунд или указать 0 (что значит без ограничений). В части домашней автоматизации это вполне допустимо. Но все же учитывая специфику работы Web-сервера будет лучше оставить ограничение.
А вот скрипты, которые вызываются из системы или через функцию exec() не имеют этого ограничения.

Что касается планировщика, то, думаю, наилучшим вариантом был бы перманентный скрипт, который бы выполнял задания.
Может показаться, что проверка таблицы в БД каждую секунду не выглядит изящным решением, но это проще всего и вряд ли создаст хоть сколько-нибудь ощутимую нагрузку на сервере.
Другой вариант - передача с помощью какого-нибудь механизма межскриптового взаимодействия информации о появлении нового события/задания.

ILGAS
Сообщения: 21
Зарегистрирован: 06 мар 2013, 22:48

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

Сообщение ILGAS » 24 мар 2015, 13:04

Andrey_B писал(а):nyasha, ваш вопрос есть в FAQ.
Если коротко, то любые симисторы малой и средней мощности почти мгновенно выходят из строя в случае хорошего КЗ. Мощные симисторы могут потерпеть, но недолго.
Тепловой расцепитель (он же автомат) предотвратить процесс выхода симистора из строя не всегда может. Он слишком медленный для этого. Спасти симистор от гибели может только плавкий предохранитель. Причем не каждый, а сверхбыстрой серии.

В MegaD-328-S Kit 5 релиза используются симисторы BT137S-600E
Это не что-то редкое. Можно заменить на какой-нибудь аналог, в том числе при желании для монтажа в отверстия.
Заменить его на порядок проще, чем реле.

Кстати (не в плане КЗ, конечно), планирую рассмотреть возможность использования в симисторных модулях более мощных симисторов. Возможно даже что-то из BTB24/T2535, хотя они существенно дороже.
Искал отечественную продукцию, но пока ничего кроме КУ617А не нашел (тут, конечно, важны габариты и корпус DPAK или TO-220). Может кто обладает секретными знаниями?
по ходу тоже спалил 2 симистора, перегорели лампочки (энергосберегающие), по какой то причине один индикатор горит слабо красным цветом и не реагирует на выключатель, другой порт срабатывает кликая по выключатею но выдает вместо 220 вольт 36 вольт :(
я хотел заменить симисторы на эти http://www.aliexpress.com/item/free-shi ... 80160.html, думаю что не фальшивка.

Andrey_B, у меня есть в запасе мега 5,2 а погорела 4,0 могу ли я заменить только исполнительный блок не меняя интерфейсный?

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

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

Сообщение Ivan_A » 24 мар 2015, 14:24

Andrey_B , спасибо за исчерпывающий ответ.
А как вам такой алогоритм:
1. Создаем скрипт, ежесекундно проверяющий базу на наличие заданий и в нужный момент времени запускающий задания (например check.php).
2. Скрипт, в котором есть ссылка на отложенные действия проверяет БД на наличие заданий, помещает задачу в базу и, если в базе до этого не было заданий, запускает chek.php
3. check.php выполнив все задания из базы завершает свою работу (удаляя из БД задачи по мере их выполнения).
?
Вроде и нет необходимости в перманентном скрипте...

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

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

Сообщение Andrey_B » 24 мар 2015, 16:09

ILGAS, да, можно. Они совместимы.

Ivan_A, можно и так, но тогда любой скрипт, который создает задание, должен запускать check.php, а тот в свою очередь должен проверять, не запущен ли он уже.

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

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

Сообщение Ivan_A » 24 мар 2015, 18:58

нет, не так. Скрипт, создающий задание, запускает check.php, только если в базе заданий нет.
Ivan_A писал(а): 2. Скрипт, в котором есть ссылка на отложенные действия проверяет БД на наличие заданий, помещает задачу в базу и, если в базе до этого не было заданий, запускает chek.php
Задания по мере выполнения будут удаляться. Либо задания можно не удалять, а просматривать с текущего времени. Но мне кажется лучше удалять.

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

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

Сообщение Mixman » 24 мар 2015, 22:09

Лично мне удобнее система флагов. Например состояния лампочки я кодирую как
0- выкл, 1 - вкл,
2 - вкл автомат, 3 - выкл автомат (если светом и устройствами управляет различная автоматика)
4 - выкл все (ставится режим, когда срабатывает скрипт выкл весь свет)
5 - вкл дат движ, 6 - выкл дат движ.

И все просто получается - мы знаем как и чем выключено.
Свет в прихожей включается от дат движ на 30 сек с условием, если 15 сек по 29-ю нет там повторного движения. Если все же с 15-ой по 29-ю секунду есть движение, то продлеваем на 2 минуты. Удобно, если нужно зайти в прихожую например за оставленным телефоном в куртке.

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

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

Сообщение Ivan_A » 25 мар 2015, 08:47

Mixman, флаги где хранятся? Данный алгоритм отрабатывается 1 скриптом? Паузы задаются функцией slеep?

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

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

Сообщение nyasha » 25 мар 2015, 20:38

Народ, че то я туплю) Если у меня порт P&R, как мне узнать в php когда он замкнулся, а когда разомкнулся?

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

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

Сообщение Andrey_B » 25 мар 2015, 22:11

nyasha,
http://ab-log.ru/smart-house/ethernet/megad-328-api

Параметр "m"
Этот параметр определяет по какому событию произошла отправка пакета на сервер. Если контакт замыкается, то на сервер отправляется сообщение без параметра "m". Если контакт размыкается, то значение параметр "m" равно "1"
Пример (произошло размыкание контакта, подключенного ко входу №5)
http://192.168.0.250/megad.php?pt=5&m=1

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

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

Сообщение nyasha » 26 мар 2015, 00:27

спасибо)

Ответить