На примере модуля Xiaomi Home рассмотрим возможность выполнения фильтрации и округления поступающих от устройств данных перед тем, как сохранять их в базу данных MajorDoMo.
Такая предварительная обработка может потребоваться в случаях, когда надо исключить попадание в систему заведомо некорректных данных, а также для округления значений, если их точность слишком избыточна.
При использовании Простых устройств в модуле Xiaomi Home автоматически создаются нужные объекты, а свойства привязываются к соответствующим метрикам в модуле. При таком подходе данные с датчиков сразу же пишутся в связанное свойство объекта. Наша задача удалить в модуле связанное свойство и привязать вместо него метод.
Сначала создадим нужный нам метод. Переходим в раздел Методы класса SSensors и нажимаем кнопку Добавить метод.
Указываем название и описание метода. Они могут быть произвольными, лишь бы вы сами понимали для чего они созданы и что выполняют.
После этого можно переходить на вкладку Методы нужного нам объекта, чьи данные требуется обрабатывать, и настраивать только что созданный метод.
Настройка метода заключается в выборе типа Код и написании логики на PHP или Blockly.
Данные в метод поступают через параметры, которые на стороне метода принимаются конструкцией $params['имя_параметра'], где имя_параметра обычно совпадает с метрикой в модуле. Получив данные, обрабатываем их в соответствии с нужной логикой и в завершении сохраняем в свойство объекта.
Чтобы узнать, какие параметры передаются методу при его вызове, можно воспользоваться вкладкой Methods в модуле XRay. В столбце PARAMS приводятся параметры вызова методов.
Для датчика температуры примерный код будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 |
// Получаем данные от сенсора $value = $params['temperature']/100; // Фильтруем данные if ($value > 60 || $value < -60) return; // Выполняем округление с точностью до одного знака $value = round($value, 1); // Сохраняем обработанное значение в свойство объекта $this->setProperty('value', $value); |
А для датчика влажности так:
1 2 3 4 5 6 7 8 9 10 11 |
// Получаем данные от сенсора $value = $params['humidity']/100; // Фильтруем данные if ($value > 100 || $value < 0) return; // Выполняем округление с точностью до одного знака $value = round($value, 1); // Сохраняем обработанное значение в свойство объекта $this->setProperty('value', $value); |
После настройки методов возвращаемся в модуль на вкладку Данные нужного датчика и отвязываем свойства объектов, взамен их указываем методы и сохраняем изменения.