Страница 1 из 5

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

Добавлено: Чт окт 26, 2017 3:41 am
TransMatrix
Толкового гайда не нашёл - делюсь своим решением.

Код получаю от приемника, подключенного к 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. Длинные нажатия и отсечка мультиклика. Думаю как: по факту - надо некий скрипт, который через некоторое время ПОСЛЕ последнего сигнала считает, сколько того сигнала было и вызывает обработчик для этого кода и длительности.

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

Добавлено: Пн окт 30, 2017 7:23 am
TransMatrix
Upd. Прикрутил отсечку длинного нажатия - среагирует только на начало и не начнет повторяться на повторы, если от прошлого вызова прошло меньше секунды.
Добавил свойство Method - можно выставить его, не записывая код. По факту - должен быть аналог выпадашкам "Объект" и "Метод" при настройке чего-нить.

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

Добавлено: Ср ноя 22, 2017 4:41 pm
ngservis
Не понятно откуда берет значение свойство Freq

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

Добавлено: Ср ноя 22, 2017 5:35 pm
Vitalij
Значение свойство Freq берет из названий объектов - rf315 и rf433

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

Добавлено: Пн ноя 27, 2017 3:47 am
TransMatrix
Freq - по большей части для удобства опознания. У меня иногда Алиса вопит про новый код, когда что-то у соседей ловит. Ну и надо в итоге понять на какой частоте это вообще пришло?!

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

Добавлено: Ср дек 20, 2017 11:37 am
schumaher87
Добрый день, много инфы мозг кипит.
Задача зацепить обычные китайские датчики движения на RF приёмник,
отсюда вопрос по ESP нет ли шумов в эфире?
И можно инструкцию по ESP прошивке и какую ESP использовать и какой приёмник? И Какие модули при компиляции прошивки выбирать?

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

Добавлено: Ср дек 20, 2017 11:49 am
nick7zmail
esp8266-12f/e с любой платой, в виде nodeMcu, wemos, witty. Приемник - дома буду, скину модельку.

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

Добавлено: Ср дек 20, 2017 11:56 am
schumaher87
nick7zmail писал(а):esp8266-12f/e с любой платой, в виде nodeMcu, wemos, witty. Приемник - дома буду, скину модельку.
Огромное спасибо.

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

Добавлено: Ср дек 20, 2017 11:57 am
ngservis
У меня esp12 с прошивкой wifiot, принимает без вопросов с китайских беспроводных датчиков pir.

Отправлено с моего X5max_PRO через Tapatalk

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

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

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