Открытая система MajorDoMo

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
MSapogov
Сообщения: 312
Зарегистрирован: 13 май 2015, 08:44
Откуда: г. Томск

Re: Открытая система MajorDoMo

Сообщение MSapogov » 08 фев 2017, 11:16

А что есть биндинг для MajorDoMo и MegaD-2561?
Насколько я помню там только MegaD-328 была.

cheese
Сообщения: 18
Зарегистрирован: 07 фев 2017, 22:37

Re: Открытая система MajorDoMo

Сообщение cheese » 08 фев 2017, 12:15

Есть. И что самое интересное. На точно такой же системе, но на железном компе, все работает.
Кстати с vmware такие же проблемы.

MSapogov
Сообщения: 312
Зарегистрирован: 13 май 2015, 08:44
Откуда: г. Томск

Re: Открытая система MajorDoMo

Сообщение MSapogov » 08 фев 2017, 15:15

cheese писал(а):Есть. И что самое интересное. На точно такой же системе, но на железном компе, все работает.
Кстати с vmware такие же проблемы.
Значит Ваша виртуалка широковещательные пакеты где-то теряет скорее всего.

cheese
Сообщения: 18
Зарегистрирован: 07 фев 2017, 22:37

Re: Открытая система MajorDoMo

Сообщение cheese » 14 фев 2017, 11:05

Люди, помогите! )))
Возник еще вопрос.

В общем-то делаю скрипты по сливу и заполнению системы отопления.

Начнем со слива.
вот код:
В коде специально слишком много 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. Как сделать так, чтобы выполнение скрипта проходило в "фоновом" режиме?

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

Есть идеи? ))

Gelezako
Сообщения: 1
Зарегистрирован: 11 мар 2017, 17:32

Re: Открытая система MajorDoMo

Сообщение Gelezako » 11 мар 2017, 21:52

сделал расширенного ассистента для Majordomo, умеет получать курсы валют и высчитывать необходимые суммы, озвучивать вашу погоду, голосом включать музычку, извучивать фильмы, которые идут в кинотеатре. В общем все модули расчитаны на голосовое управление.

https://www.youtube.com/watch?v=jJFTIZ4kLTY
https://www.youtube.com/watch?v=jMAKK0fWFJg
https://www.youtube.com/watch?v=wZSfGWjE6lc
https://www.youtube.com/watch?v=EDtMvenQhYs

LSE
Сообщения: 2
Зарегистрирован: 05 июл 2017, 10:05

Re: Открытая система MajorDoMo

Сообщение LSE » 05 сен 2017, 23:27

Помогите пожалуйста, бьюсь уже неделю не могу понять что не так работает связка MDM + MEGAD (5шт) в доме все выключатели настроены и работают как надо без задержек.
Теперь мне понадобилось подключить датчики движения hс-sr501 я приобрел MegaD-14-IN сконфиругировал порт как IN джампер внизу питание 12V, когда движения нет в MDM 0 Input 1 в конфигураторе megad P0/ON/
и вот теперь проблема
когда происходит движение в конфигураторе меняется на P0/OFF/ а в MDM остается 0 Input 1 и соответсвенно в MDM не идут данные, если предположить что сервер не правильно работает то почему тогда выключатели срабатывают моментально (если сервер отключить с задержкой)

То есть проблема в том что при подключении hс-sr501 данные в MDM об изменении состояния порта не летят, если включить в настройках модуля Период опроса, секунд: 1 то датчик начинает работать как надо, но с задержкой 1 сек (и думаю что это не есть хорошо раз в секунду опрашивать мегу)

помогите всю голову сломал
Вложения
9b1e5aeb31.jpg
9b1e5aeb31.jpg (80.74 КБ) 3000 просмотров
2d053d3374.jpg
2d053d3374.jpg (82.61 КБ) 3000 просмотров
864df9c5b4.jpg
864df9c5b4.jpg (34.75 КБ) 3000 просмотров
e90a9effe0.jpg
e90a9effe0.jpg (140.4 КБ) 3000 просмотров
ddb6d27de3.jpg
ddb6d27de3.jpg (36.52 КБ) 3000 просмотров

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

Re: Открытая система MajorDoMo

Сообщение Ruslan » 06 сен 2017, 10:27

С датчиками движения hс-sr501 дела не имел. Но хочется заметить, что если они работают как остальные, т.е. просто замыкают или размыкают сигнальную цепь при срабатывании, то нужно выставлять верхнее положение джампера. Т.к. это ничем не будет отличаться от работы обычной кнопки.

Если при срабатывании ваш датчик замыкает сигнальную цепь, то надо выставить режим работы порта "P", а если размыкают - то "R". У большинства датчиков движения при срабатывании сигнальная цепь размыкается.

Никаких задержек между срабатыванием датчика и получением данных Мажордомо быть не должно. Опрашивать этот датчик периодически - путь неправильный. Т.е. нужно искать причину задержек.

Попробуйте на всякий случай перечитать конфигурацию Меги на вкладке "Advenced" (Read Config).

Еще нужно проверить, а точно ли Мажордомо ничего не получает, когда срабатывает датчик движения? Можно попробовать временно подключить к этому входу вместо датчика hс-sr501 два проводка (положение джампера верхнее, т.к. это имитация обычной кнопки) и посмотреть, меняется ли свойство "status" вашего объекта при замыкании/размыкании проводков. Чтобы на странице со свойством отразились изменения (если свойства действительно изменились), нужно обновить страницу (F5).

LSE
Сообщения: 2
Зарегистрирован: 05 июл 2017, 10:05

Re: Открытая система MajorDoMo

Сообщение LSE » 14 сен 2017, 14:57

LSE писал(а):Помогите пожалуйста, бьюсь уже неделю не могу понять что не так работает связка MDM + MEGAD (5шт) в доме все выключатели настроены и работают как надо без задержек.
Теперь мне понадобилось подключить датчики движения hс-sr501 я приобрел MegaD-14-IN сконфиругировал порт как IN джампер внизу питание 12V, когда движения нет в MDM 0 Input 1 в конфигураторе megad P0/ON/
и вот теперь проблема
когда происходит движение в конфигураторе меняется на P0/OFF/ а в MDM остается 0 Input 1 и соответсвенно в MDM не идут данные, если предположить что сервер не правильно работает то почему тогда выключатели срабатывают моментально (если сервер отключить с задержкой)

То есть проблема в том что при подключении hс-sr501 данные в MDM об изменении состояния порта не летят, если включить в настройках модуля Период опроса, секунд: 1 то датчик начинает работать как надо, но с задержкой 1 сек (и думаю что это не есть хорошо раз в секунду опрашивать мегу)

помогите всю голову сломал

Ну в общем сам разобрался)
В том варианте кода который предлагается в базовой MDM нужно использовать Mode P&R в megaD с датчиком hc-sr501

Ответить