Датчик движения странно включает/выключает свет

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

Модератор: immortal

Ответить
grafalex
Сообщения: 27
Зарегистрирован: Пт янв 20, 2017 12:24 am
Благодарил (а): 4 раза
Поблагодарили: 2 раза

Датчик движения странно включает/выключает свет

Сообщение grafalex » Вс янв 12, 2020 8:13 pm

Всем привет,

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

Пробовал сделать так:
- Создал простое устройство "Свет в кладовке" типа "реле/выключатель" (плюс объект)
- Создал простое устройство "Датчик движения в кладовке" типа "Датчик движения" (ну и связанный объект в придачу)
- В закладке "связанные устройства" добавил правило "включить на время" и связал его с реле (заодно бонусом получил включение света по движению)
- в разделе zigbee2mqtt привязал свойство state выключателя (железного) со свойством status простого устройства (логического)
- свойство occupancy датчика движения связал со свойством status простого устройства

Вот только к сожалению работает все не так как нужно:
2020-01-12 17:15:42.246461: zigbee2mqtt/storeroom_motion_sensor: b'{"battery":100,"voltage":3005,"linkquality":118,"occupancy":true}'
2020-01-12 17:15:42.740490: zigbee2mqtt/storeroom_switch/set: b'{"state":"ON"}'
2020-01-12 17:15:43.186515: zigbee2mqtt/storeroom_switch: b'{"state":"ON","linkquality":28}'
2020-01-12 17:15:43.387527: zigbee2mqtt/storeroom_switch: b'{"state":"ON","linkquality":21}'
2020-01-12 17:17:02.740065: zigbee2mqtt/storeroom_switch/set: b'{"state":"OFF"}'
2020-01-12 17:17:02.940077: zigbee2mqtt/storeroom_switch: b'{"state":"OFF","linkquality":28}'
2020-01-12 17:17:03.140088: zigbee2mqtt/storeroom_switch: b'{"state":"OFF","linkquality":26}'
2020-01-12 17:17:12.254610: zigbee2mqtt/storeroom_motion_sensor: b'{"battery":100,"voltage":3005,"linkquality":118,"occupancy":false}'
2020-01-12 17:17:12.592629: zigbee2mqtt/storeroom_switch/set: b'{"state":"ON"}'
2020-01-12 17:17:12.801641: zigbee2mqtt/storeroom_switch: b'{"state":"ON","linkquality":26}'
2020-01-12 17:17:13.006653: zigbee2mqtt/storeroom_switch: b'{"state":"ON","linkquality":23}'

Похоже, когда приходит сигнал с occupancy=false мажордомо его все равно интерпретирует как движение и опять включает лампочку.

Как мне правильно это отключить? Может там есть какое нибудь поле другое более удобное?
Аватара пользователя
SmoKE_xDDD
Сообщения: 816
Зарегистрирован: Ср апр 17, 2019 5:00 pm
Откуда: Нижний Новгород
Благодарил (а): 110 раз
Поблагодарили: 898 раз

Re: Датчик движения странно включает/выключает свет

Сообщение SmoKE_xDDD » Пн янв 13, 2020 10:06 pm

Все проще, создаем метод и его вызываем при любом событии:
СпойлерПоказать
Изображение
В методе описываем включение и заводим таймер: (Пример моего кода)
P.S. Разбираю статус сам ибо так надо =)

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

$action = json_decode(gg('Corridor_MotionSensor.report'))->data->status;

if($action == 'motion' && gg('Settings_Nightmode.status') == 1) {
 	sg('Corridor_Gateway.rgb', 'ffffff');
	sg('Corridor_Gateway.brightness', '100');
 	
 	//Включаем экран планшета
 	if(gg('Settings_TabletInfo.screenOnMotion') == 1) {
     	sg('Settings_TabletInfo.screenOnMotion_TurnOn', '1');
    }
 
 	if(timeAfter(gg('Kitchen_Light.nightTime_delay')) == 1) {
     	sg('Kitchen_Light.chanel_2', '1');
        if(gg('Kitchen_Light.chanel_1') != 1) {
            SetTimeOut("offKitchenLight", "sg('Kitchen_Light.chanel_2', '0');", '300');
        }
    }
 	
	SetTimeOut("offGatewayLight", "sg('Corridor_Gateway.brightness', '0');sg('Settings_TabletInfo.screenOnMotion_TurnOn', '0');", '300');
}
grafalex
Сообщения: 27
Зарегистрирован: Пт янв 20, 2017 12:24 am
Благодарил (а): 4 раза
Поблагодарили: 2 раза

Re: Датчик движения странно включает/выключает свет

Сообщение grafalex » Вт янв 14, 2020 12:27 am

Ммммм, я сейчас нахожусь на этапе начального познания системы. Не могли бы Вы чуток подробнее?

Вы создали метод в каком объекте? Конкретного датчика? или всех датчиков?
Правильно ли я понимаю, что вы в одном обработчике написали логику для всех датчиков движения в квартире?


Для начала хотел бы прояснить такой вопрос:
Вот есть модуль zigbee2mqtt, он слушает mqtt и обновляет данные различных устройств. К примеру от датчика приходит примерно раз в минуту сообщение {"occupancy":true}. В первый раз когда поле occupancy изменяется с false на true запускается мой метод, который что-то там делает. Но когда второй раз приходит сообщение, значение поля не меняется и метод не вызывается. Но как тогда мне ловить событие что в помещении все еще кто-то есть и свет выключать пока не нужно?
grafalex
Сообщения: 27
Зарегистрирован: Пт янв 20, 2017 12:24 am
Благодарил (а): 4 раза
Поблагодарили: 2 раза

Re: Датчик движения странно включает/выключает свет

Сообщение grafalex » Вт янв 14, 2020 12:27 am

Ммммм, я сейчас нахожусь на этапе начального познания системы. Не могли бы Вы чуток подробнее?

Вы создали метод в каком объекте? Конкретного датчика? или всех датчиков?
Правильно ли я понимаю, что вы в одном обработчике написали логику для всех датчиков движения в квартире?


Для начала хотел бы прояснить такой вопрос:
Вот есть модуль zigbee2mqtt, он слушает mqtt и обновляет данные различных устройств. К примеру от датчика приходит примерно раз в минуту сообщение {"occupancy":true}. В первый раз когда поле occupancy изменяется с false на true запускается мой метод, который что-то там делает. Но когда второй раз приходит сообщение, значение поля не меняется и метод не вызывается. Но как тогда мне ловить событие что в помещении все еще кто-то есть и свет выключать пока не нужно?
Аватара пользователя
SmoKE_xDDD
Сообщения: 816
Зарегистрирован: Ср апр 17, 2019 5:00 pm
Откуда: Нижний Новгород
Благодарил (а): 110 раз
Поблагодарили: 898 раз

Re: Датчик движения странно включает/выключает свет

Сообщение SmoKE_xDDD » Вт янв 14, 2020 12:22 pm

1) Создаем объект
2) Создаем свойства:
- report
- no_motion
- lux
- motion
- battery_level
3) Открываем данные датчика и выбираем Объект -> Свойство + вызов метода, как на скрине
4) Создаем метод у этого объекта

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

//Тут получаем всю строку с датчика движения, со свойства report
$action = json_decode(gg('Corridor_MotionSensor.report'))->data->status;
//Если движение
if($action == 'motion') {
 	//Что то делаем если получили движение
 	
 	
 	//Заводим таймер на отключение, того что включили через 300 сек
 	SetTimeOut("offGatewayLight", "sg('Corridor_Gateway.brightness', '0');", '300');
}
grafalex
Сообщения: 27
Зарегистрирован: Пт янв 20, 2017 12:24 am
Благодарил (а): 4 раза
Поблагодарили: 2 раза

Re: Датчик движения странно включает/выключает свет

Сообщение grafalex » Вт янв 14, 2020 11:40 pm

Ок, спасибо, попробую отделить мух от котлет.

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

Я сейчас пытаюсь взлететь с модулем zigbee2mqtt. Экран устройства выглядит так
qqq.png
qqq.png (35.55 КБ) 2485 просмотров
Проблема собственно вот в чем:
- Поле occupancy, похоже, обновляется только при изменении. Т.е. если мне пришло сообщение с occupancy=true, а через минуту еще одно, то на второе сообщение мой метод не вызывается (даже не смотря на то, что галка "Сохранять только новые значения" не установлена)
- Я пробовал завязаться на поле storeroom_motion_sensor в котором есть оригинальный json, но оно обновляется еще реже.

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

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