Датчик дыма. Постоянное уведомление: Значение датчика вернулось к норме в MajorDoMo

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

Модератор: immortal

Ответить
Аватара пользователя
klejnov
Сообщения: 46
Зарегистрирован: Чт июн 28, 2018 4:31 am
Благодарил (а): 12 раз
Поблагодарили: 2 раза

Датчик дыма. Постоянное уведомление: Значение датчика вернулось к норме в MajorDoMo

Сообщение klejnov » Пт май 01, 2020 11:42 pm

Добрый вечер форумчане.
Подключил датчик дыма Xiaomi mijia Honeywell в плагине Xiaomi Home.
Теперь MajorDoMo примерно каждые 40 минут повторяет "Значение датчика вернулось к норме". Причем даже когда "Режим Ночной активирован."
Подскажите как сделать, что бы повторяло только один раз после обнаружения дыма когда датчик возвращается в нормальное состояние, либо как отключить для этого датчика оповещения Алисой "Значение датчика вернулось к норме"
Настройки датчика дымаПоказать
_2020-05-01_23.37.28_7rpqz.png
_2020-05-01_23.37.28_7rpqz.png (48.8 КБ) 728 просмотров
Последний раз редактировалось klejnov Вс май 03, 2020 11:34 pm, всего редактировалось 1 раз.
Аватара пользователя
klejnov
Сообщения: 46
Зарегистрирован: Чт июн 28, 2018 4:31 am
Благодарил (а): 12 раз
Поблагодарили: 2 раза

Re: Датчик дыма. Постоянное уведомление: Значение датчика вернулось к норме

Сообщение klejnov » Вс май 03, 2020 11:28 pm

Отвечу, похоже, сам на свой вопрос.
Сделал небольшой костыль (не судите строго. как смог).

Отредактировал файл /var/www/md/modules/devices/SSmoke_statusUpdated.php

Если коротко: подключаюсь к базе данных, просматриваю таблицу `shouts` , ищу последнее уведомление от датчика дыма и если новое уведомление было таким же как и предыдущее, то ставлю флаг и дополнительное условие для say(). Как итог say() срабатывает только один самый первый раз, после обнаружения дыма.

Вот так выглядит файл.
SSmoke_statusUpdated.phpПоказать

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

<?php

// Начало определения корректности датчика состояния дыма.

$host_SS = 'localhost'; // адрес сервера 
$database_SS = 'db_terminal'; // имя базы данных
$user_SS = 'root'; // имя пользователя
$password_SS = 'password'; // пароль

$pdo_SS = new PDO('mysql:host=localhost;dbname=db_terminal', $user_SS, $password_SS);

$sql_SS = "select * FROM `shouts` WHERE `MESSAGE` = 'Значение датчика вернулось к норме: Датчик задымленности' OR `MESSAGE` = 'Внимание! Сигнал тревоги от датчика: Датчик задымленности расположеный в комнате Кухня' LIMIT 2;";
$result_SS = $pdo_SS->query($sql_SS);
$alert_SS = $result_SS->fetchAll(PDO::FETCH_ASSOC);

//var_dump($alert_SS);

$alert_1 = 'Внимание! Сигнал тревоги от датчика: Датчик задымленности расположеный в комнате Кухня';

if ($alert_1 == $alert_SS[0]["MESSAGE"]) {
	$flag_SS = true;
} else {
	$flag_SS = false;
} 
// Конец определения корректности датчика состояния дыма.

$ot = $this->object_title;

$this->setProperty('updated', time());
$this->setProperty('updatedText', date('H:i', $tm));

$this->callMethod('keepAlive');

$is_blocked=(int)$this->getProperty('blocked');
if ($is_blocked) {
    return;
}

$alert_timer_title = $ot.'_alert';
if (isset($params['NEW_VALUE']) ) {
    if ($params['NEW_VALUE']) {
        $this->callMethod('alert');
    } else {
        clearTimeOut($alert_timer_title);
        // было: say(LANG_DEVICES_NOTIFY_BACKTONORMAL.': '.$this->description,100);
		if($flag_SS) {
		   say(LANG_DEVICES_NOTIFY_BACKTONORMAL.': '.$this->description,100);
		}
    }
}

$this->callMethodSafe('logicAction');

include_once(DIR_MODULES . 'devices/devices.class.php');
$dv=new devices();
$dv->checkLinkedDevicesAction($ot, $this->getProperty('status'));

За это сообщение автора klejnov поблагодарил:
~220v (Чт июн 25, 2020 1:19 pm)
Рейтинг: 1.22%
Аватара пользователя
~220v
Сообщения: 35
Зарегистрирован: Пн дек 23, 2019 5:56 pm
Благодарил (а): 58 раз
Поблагодарили: 2 раза

Re: Датчик дыма. Постоянное уведомление: Значение датчика вернулось к норме в MajorDoMo

Сообщение ~220v » Чт июл 02, 2020 4:49 pm

За идею спасибо, но реализация на троечку уж простите меня ;) . Та же проблема с датчиками протечки (потопа).
После вашей идеи сделал проще - добавил в объект новое свойство - StatusLast, в коде SLeak_statusUpdated.php добавил проверку на совпадение с предыдущим состоянием StatusLast и новым состоянием Status если совпадают - отправку игнорим.

Продолжаючи читать форум, заметил что есть параметр как $params['OLD_VALUE'] и это то что нужно! сравниваем его с $params['NEW_VALUE'] можно понять в каком состоянии был датчик. И если был "0" и так и остался "0" отправку сообщения "Значение датчика вернулось к норме" игнорим. Новое свойство добавлять не нужно, дописать всего одну строку: if (($params['OLD_VALUE']) <> ($params['NEW_VALUE']))

Вот полный код для датчика протечки SLeak_statusUpdated.php

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

<?php

$ot = $this->object_title;

$tm = time();
$this->callMethodSafe('keepAlive');
$this->setProperty('updated', $tm);
$this->setProperty('updatedText', date('H:i Y.m.d', $tm));

$this->callMethod('keepAlive');

$is_blocked=(int)$this->getProperty('blocked');
if ($is_blocked) {
    return;
}

$alert_timer_title = $ot.'_alert';

if (isset($params['NEW_VALUE']) )                            # Определяет, была ли установлена переменная значением отличным от NULL
  {
    if ($params['NEW_VALUE'])                                # Включаем тревогу, если $params =1 
      { $this->callMethod('alert');
      }

        else
            { clearTimeOut($alert_timer_title);              # хз что это
                                                                            ### Добавил для исключения повторного срабатывания в нормальном состоянии
              if (($params['OLD_VALUE']) <> ($params['NEW_VALUE']))         # сравниваем предыдущее значение с новым, 
                {
                   say(LANG_DEVICES_NOTIFY_BACKTONORMAL.': '.$this->description,100); # выполняем если значения отличаются (не равны)
                }
            }
  }



$this->callMethodSafe('logicAction'); 			     # там пусто 2020.06.29

include_once(DIR_MODULES . 'devices/devices.class.php');
$dv = new devices();
$dv->checkLinkedDevicesAction($ot, $this->getProperty('status'));

ps
сори за не привычное расположение фигурных скобок, я программист от Бога 8-)
Ответить