Возник еще вопрос.
В общем-то делаю скрипты по сливу и заполнению системы отопления.
Начнем со слива.
вот код:
В коде специально слишком много say и есть лимит, чтобы слышать и понимать процесс выполнения алгоритма.
Код: Выделить всё
$in9 = gg('in9.state'); // датчик уровня в расширительном бачке
$in10 = gg('in10.state'); // датчик минимального уровня
$in11 = gg('in11.state'); // датчик протока при сливе
$r5 = gg('r5.status'); // клапан на заполнение
$r6 = gg('r6.status'); // клапан на слив
$r7 = gg('r7.status'); // клапан расширительного бачка
$r8 = gg('r8.status'); // реле компрессора для продувки системы
if ($r5 == 1 && $r7 == 1) {
sg('r6.status', 0); // Точно 6 ставим в 0, проверяли то 5 и 7 ???
say('Идет слив системы отопления.', 2);
$flushFinished = false;
$flushStarted = (gg('in11.state') == 1); //датчик протока при сливе
$limit = 3; //Пробуем только 3 раза
while (true) {
$limit--;
$in11 = gg('in11.state'); // датчик протока при сливе
say('Проверяем слив: слив начался = ' . ($flushStarted ? 'false' : 'true') . ', закончился = ' . ($flushFinished ? 'true' : 'false') . ', новое состояние 11 = ' . ($in11), 2);
$flushStarted = $flushStarted || ($in11 == 1); //Станет true как только $in11 станет 1 первый раз, если еще не true
$flushFinished = $flushFinished || ($flushStarted && ($in11 == 0)); //Станет true как только $flushStarted true и $in11 станет 0
if ($flushFinished || ($limit < 0)) {
say('Прерываем цикл: состояние = ' . ($flushFinished ? 'true' : 'false') . ', лимит сработал = ' . ($limit < 0 ? 'true' : 'false'), 2);
break;
}
sleep(10); //Ждем еще
}
say('Слив завершен.', 2);
say('Перекрываю клапан расширительного бачка.', 2);
sleep(5);
sg('r7.status', 0); //Перекрываем клапан расширительного бачка
sleep(5);
}
say('Включаю компрессор', 2);
sleep(5);
sg('r8.status', 0);
sleep(10);
say('Выключаю компрессор', 2);
sleep(5);
sg('r8.status', 1);
sleep(10);
sg('r7.status', 1);
sg('r6.status', 1);
1. Проверяем закрыт ли клапан на заполнение системы и открыт ли клапан расширительного бачка; (if ($r5 == 1 && $r7 == 1))
2. Если все норм, то открываем на слив системы. sg('r6.status', 0); Водичка пошла, при этом датчик протока замыкается и говорит, что водичка идет. (т.е. in11=1)
3. Когда система сольется, датчик протока размыкается (in11=0).
4. Если датчик протока разомкнут (in11=0) перекрываем клапан расширителььного бачка. (sg('r7.status', 0);)
5. Далее включаем компрессор для продувки системы отопления (sg('r8.status', 0);)
6. После того как он поработал, выключаем (sg('r8.status', 1);)
7. Открываем клапан расширительного бачка.
Ну после этого идет небольшая проверка положения клапанов. (не указано в этом коде)
Вопрос следующий. Majordomo не видит изменения состояния входа Megad-2561 во время выполнения скрипта. Т.е. он не реагирует на физическое изменение состояния входа во время исполнения скрипта. Т.е. он не видит изменения in11
1. Как сделать так, чтобы Majordomo реагировал во время выполнения скрипта без танцев с бубном. Может есть какой-то метод или скрипт для принудительно обновления состояния?
Технически удалось решить данную проблему принудительным опросом MegaD-2561 напрямую из скрипта. И все заработало. Скрипт ниже:
Код: Выделить всё
$getRealState = function ($port) {
$response = file_get_contents('http://192.168.1.111/sec/?cmd=get&pt=' . $port);
// say('Ответ сервера: ' . $response, 2);
return strtolower(substr($response, 0, 3)) == 'off' ? 0 : 1;
};
$in9 = gg('in9.state'); // датчик уровня в расширительном бачке
$in10 = gg('in10.state'); // датчик минимального уровня
$in11 = gg('in11.state'); // датчик протока при сливе
$r5 = gg('r5.status'); // клапан на заполнение
$r6 = gg('r6.status'); // клапан на слив
$r7 = gg('r7.status'); // клапан расширительного бачка
$r8 = gg('r8.status'); // реле компрессора для продувки системы
$p11 = 11; //Port для датчика протока
if ($r5 == 1 && $r7 == 0) {
sg('r6.status', 0); // открываем сливной клапан
say('Идет слив системы отопления.', 2);
$flushFinished = false;
$flushStarted = ($getRealState($p11) == 1); //датчик протока при сливе
// $limit = 8; //Пробуем только X раз
while (true) {
$limit--;
$in11 = $getRealState($p11); // датчик протока при сливе
// say('Проверяем слив: слив начался = ' . ($flushStarted ? 'true' : 'false') . ', закончился = ' . ($flushFinished ? 'true' : 'false') . ', новое состояние 11 = ' . ($in11), 2);
$flushStarted = $flushStarted || ($in11 == 1); //Станет true как только $in11 станет 1 первый раз, если еще не true
$flushFinished = $flushFinished || ($flushStarted && ($in11 == 0)); //Станет true как только $flushStarted true и $in11 станет 0
if ($flushFinished || ($limit < 0)) {
// say('Прерываем цикл: состояние = ' . ($flushFinished ? 'true' : 'false') . ', лимит сработал = ' . ($limit < 0 ? 'true' : 'false'), 2);
break;
}
sleep(5); //Ждем еще
}
say('Слив завершен.', 2);
say('Перекрываю клапан расширительного бачка.', 2);
sleep(5);
sg('r7.status', 1); //Перекрываем клапан расширительного бачка
sleep(5);
}
say('Включаю компрессор', 2);
sleep(5);
sg('r8.status', 0);
sleep(10);
say('Выключаю компрессор', 2);
sleep(5);
sg('r8.status', 1);
say('Открывю клапан расширительного бачка', 2);
sleep(3);
sg('r7.status', 0);
sleep(5);
say('Проверяю состояние клапанов после слива', 2);
if ($r5 == 1 && $r7 == 0 && $r6 == 0) {
say('Все клапаны открыты.', 2);
}
else {
say('Какой-то клапан перекрыт', 2);
}
Также я заметил, что во время выполнения какого-нибудь длинного скрипта, сайт системы Majordomo висит. И не отвисает до выполнения скрипта. В моем случае система отопления может сливаться целый час (цикл то идет). И все это время я не смогу ничего сделать с majordomo.
2. Как сделать так, чтобы выполнение скрипта проходило в "фоновом" режиме?
Конечно можно все это сделать используя шаблоны поведения, но хотелось бы все в один скрипт запихнуть.
Есть идеи? ))