Подключение RcSwitch приемника

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

TransMatrix
Сообщения: 186
Зарегистрирован: Вс май 28, 2017 9:24 am
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Подключение RcSwitch приемника

Сообщение TransMatrix » Чт окт 26, 2017 3:41 am

Толкового гайда не нашёл - делюсь своим решением.

Код получаю от приемника, подключенного к ESP8266 с WiFi IoT прошивкой через MQTT.
В принципе - там суть не сильно меняется от типа подключения, так что...

Приемники - 315 и 433 МГц.

Под это дело создан класс RcReciver.
У него свойство - rcdata (время хранения - 1 день) к изменению которого привязан его метод onRecive:
Плюс свойства OldData и OldTime для хранения предыдущего принятого кода и времени получения (время хранения - 0). (хотел через историю свойства, но оно выдаёт результат с пятого на десятое).

onRecive:

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

$NowTime = time();
$rcdata = $this->getProperty('rcdata'); 
$OldData = $this->getProperty('OldData'); 
$OldTime = $this->getProperty('OldTime'); 

$this->setProperty('OldData',$rcdata);
$this->setProperty('OldTime',$NowTime);

if (($OldData!=$rcdata) || (($OldData==$rcdata) && (($NowTime-$OldTime)>1)))
    {
    $objects=getObjectsByProperty('rcValue','=',$rcdata);
    if (count($objects)==0)
        {
         say('Новый код',2,$from_user_id);
        addClassObject('rcCode', 'rc'.$rcdata);
         setGlobal('rc'.$rcdata.'.rcValue',$rcdata);
         setGlobal('rc'.$rcdata.'.Freq',$this->object_title);
        }
    elseif (is_array($objects)) 
    {
     //say('Получен код ',2,$from_user_id);
     foreach($objects as $obj) 
        {
          callMethod($obj.'.Play');
         }
    }
}
 
От него созданы два объекта - rf315 и rf433, к rcdata которых привязаны соответствующие записи MQTT или любого другого метода получения кода.

Принцип прост:
Слушаем эфир, при получении кода - ищем объект с rcValue равным принятому коду.
Если есть такой - вызываем его метод-обработчик Play. Если нет - говорим "Новый код!" и создаем в классе rcCode новый объект с именем rc<наш код> и свойством rcValue с нашим кодом.

Класс rcCode имеет свойства rcValue (код, на который надо среагировать), Freq (частота, с которой получен код. По идее надо реагировать только на свою) и Method (вызываемый метод при поступлении кода) (историю не хранить ни одному из них) и метод Play:

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

$method = $this->getProperty('Method');
if ($method)
    {
    callMethod($method);
    } 
В создаваемом объекте этого класса "переписываем" метод Play, если надо сотворить что-то дикое, или прописываем в свойство Method, если только одна команда.
К примеру для кнопки пульта, которая должна включить торшер:

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

callMethod('Switch2.turnOn');
или
Method = Switch2.turnOn

При нажатии на кнопку - пульт обычно присылает фиксированный код, при нажатии на две, три или четыре сразу - общий код с "битами" соответствующих кнопок. Я не заморачиваюсь и просто прописываю ему свой обработчик.



Пути улучшения:
1. Прописать как модуль для Маркета...
2. Сделать свойства для привязки к методам и объектам, чтобы Play "корневой" проигрывал нужный объект или выставлял нужное свойство (думаю).
3. Сделать обработку для кнопок раздельно (т.е. нажали 1 и 2 сразу - вызвало и 1 и 2 обработчики), но смысла не вижу. У меня на 2-3 кнопки обычно завязаны "сложные" команды. Типа 1 - включение света в ванной, 3 - в туалете, 2 - гасит оба, 1+2 и 2+3 - раздельно в ванной и туалете, а 1+2+3 - скрипт гашения всего света.
4. Длинные нажатия и отсечка мультиклика. Думаю как: по факту - надо некий скрипт, который через некоторое время ПОСЛЕ последнего сигнала считает, сколько того сигнала было и вызывает обработчик для этого кода и длительности.
За это сообщение автора TransMatrix поблагодарили (всего 3):
kawkay (Чт окт 26, 2017 10:39 am) • VooDooN (Пн окт 30, 2017 8:12 am) • artem33 (Пн мар 04, 2019 1:26 pm)
Рейтинг: 3.49%
TransMatrix
Сообщения: 186
Зарегистрирован: Вс май 28, 2017 9:24 am
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Re: Подключение RcSwitch приемника

Сообщение TransMatrix » Пн окт 30, 2017 7:23 am

Upd. Прикрутил отсечку длинного нажатия - среагирует только на начало и не начнет повторяться на повторы, если от прошлого вызова прошло меньше секунды.
Добавил свойство Method - можно выставить его, не записывая код. По факту - должен быть аналог выпадашкам "Объект" и "Метод" при настройке чего-нить.
ngservis
Сообщения: 92
Зарегистрирован: Ср ноя 19, 2014 4:15 pm
Откуда: Альметьевск
Благодарил (а): 7 раз
Поблагодарили: 4 раза

Re: Подключение RcSwitch приемника

Сообщение ngservis » Ср ноя 22, 2017 4:41 pm

Не понятно откуда берет значение свойство Freq
Rasberry PI + arduino mega 2560
Vitalij
Сообщения: 3
Зарегистрирован: Пн сен 25, 2017 10:57 pm
Благодарил (а): 3 раза
Поблагодарили: 0

Re: Подключение RcSwitch приемника

Сообщение Vitalij » Ср ноя 22, 2017 5:35 pm

Значение свойство Freq берет из названий объектов - rf315 и rf433
TransMatrix
Сообщения: 186
Зарегистрирован: Вс май 28, 2017 9:24 am
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Re: Подключение RcSwitch приемника

Сообщение TransMatrix » Пн ноя 27, 2017 3:47 am

Freq - по большей части для удобства опознания. У меня иногда Алиса вопит про новый код, когда что-то у соседей ловит. Ну и надо в итоге понять на какой частоте это вообще пришло?!
schumaher87
Сообщения: 38
Зарегистрирован: Пт мар 24, 2017 6:22 am
Благодарил (а): 3 раза
Поблагодарили: 0

Re: Подключение RcSwitch приемника

Сообщение schumaher87 » Ср дек 20, 2017 11:37 am

Добрый день, много инфы мозг кипит.
Задача зацепить обычные китайские датчики движения на RF приёмник,
отсюда вопрос по ESP нет ли шумов в эфире?
И можно инструкцию по ESP прошивке и какую ESP использовать и какой приёмник? И Какие модули при компиляции прошивки выбирать?
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Подключение RcSwitch приемника

Сообщение nick7zmail » Ср дек 20, 2017 11:49 am

esp8266-12f/e с любой платой, в виде nodeMcu, wemos, witty. Приемник - дома буду, скину модельку.
За это сообщение автора nick7zmail поблагодарил:
schumaher87 (Ср дек 20, 2017 12:01 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
schumaher87
Сообщения: 38
Зарегистрирован: Пт мар 24, 2017 6:22 am
Благодарил (а): 3 раза
Поблагодарили: 0

Re: Подключение RcSwitch приемника

Сообщение schumaher87 » Ср дек 20, 2017 11:56 am

nick7zmail писал(а):esp8266-12f/e с любой платой, в виде nodeMcu, wemos, witty. Приемник - дома буду, скину модельку.
Огромное спасибо.
ngservis
Сообщения: 92
Зарегистрирован: Ср ноя 19, 2014 4:15 pm
Откуда: Альметьевск
Благодарил (а): 7 раз
Поблагодарили: 4 раза

Re: Подключение RcSwitch приемника

Сообщение ngservis » Ср дек 20, 2017 11:57 am

У меня esp12 с прошивкой wifiot, принимает без вопросов с китайских беспроводных датчиков pir.

Отправлено с моего X5max_PRO через Tapatalk
Rasberry PI + arduino mega 2560
schumaher87
Сообщения: 38
Зарегистрирован: Пт мар 24, 2017 6:22 am
Благодарил (а): 3 раза
Поблагодарили: 0

Re: Подключение RcSwitch приемника

Сообщение schumaher87 » Ср дек 20, 2017 11:58 am

ngservis писал(а):У меня esp12 с прошивкой wifiot, принимает без вопросов с китайских беспроводных датчиков pir.

Отправлено с моего X5max_PRO через Tapatalk
Понял, а какие модули вы выбирали в WIFIIOT?
Ответить