Код получаю от приемника, подключенного к 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');
}
}
}
Принцип прост:
Слушаем эфир, при получении кода - ищем объект с rcValue равным принятому коду.
Если есть такой - вызываем его метод-обработчик Play. Если нет - говорим "Новый код!" и создаем в классе rcCode новый объект с именем rc<наш код> и свойством rcValue с нашим кодом.
Класс rcCode имеет свойства rcValue (код, на который надо среагировать), Freq (частота, с которой получен код. По идее надо реагировать только на свою) и Method (вызываемый метод при поступлении кода) (историю не хранить ни одному из них) и метод Play:
Код: Выделить всё
$method = $this->getProperty('Method');
if ($method)
{
callMethod($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. Длинные нажатия и отсечка мультиклика. Думаю как: по факту - надо некий скрипт, который через некоторое время ПОСЛЕ последнего сигнала считает, сколько того сигнала было и вызывает обработчик для этого кода и длительности.