Например есть датчик напряжения, на Arduino и PZEM004Tv30 который раз в 10-секунд отправляет данные на сервер по протоколу MQTT. Мы привязываем значение топика L1_voltage MQTT к Sensor_voltage01.value, также устанавливаем Sensor_voltage01.minValue (180), Sensor_voltage01.maxValue (260) и информирование Sensor_voltage01.notify (1), хотим мы знать, что напряжение вышло за пределы, например если ниже 180 вольт - может сгореть компрессор холодильника, так как он при низком напряжении не запустится (еще 10 секунд терпимо, но если дольше лучше его выключить), превышения напряжения в 260 также не есть хорошо
И все прекрасно работает, но так как данные поступают с частотой 6 значений в минуту - за сутки в истории 6 * 60 * 24 = 8640!!!. Если у нас датчиков три, а еще датчики тока, мощности, частоты, коэффициента мощности - тогда, примерно, 8640 * 3 * 4 = 103680!!!
За сутки, только датчиками электропитания, можно сервер "положить"
И здесь можно, например перепрограммировать Arduino чтобы отправлял данные не так часто (раз в 10 минут, в 30 минут), но мы можем пропустить важное событие, и событие когда значение вернется к норме, или как-то хитрить ...
Как я сделал в себя:
ввел дополнительные свойства для класса SSensors
valueMQTT - значение свойства которое приходит с модуля MQTT, при изменении вызвать valueUpdatedMQTT
flagLoadValueMQTT - Флаг записи значения с valueMQTT в value, default 0
loadValueTimeoutMQTT - время в секундах, ожидания копирования значения из valueMQTT в value, чтобы не забивать БД большим количеством значений датчика, если не установлено - копирование происходить не будет
также дополнительный метод valueUpdatedMQTT для класса SSensors
Код: Выделить всё
$valueMQTT = $this->getProperty("valueMQTT");
$minValue = $this->getProperty("minValue");
$maxValue = $this->getProperty("maxValue");
$normalValue = $this->getProperty("normalValue");
$deltaValue = $this->getProperty("deltaValue"); //На сколько единиц должна меняться величина (фильтр шумов), перед записью в value, если не задано - учитываться не будет
if (is_numeric($minValue) || is_numeric($maxValue)) {
if ($valueMQTT <= $minValue || $valueMQTT >= $maxValue)
{
$this->setProperty("value", $valueMQTT);
return;
}
if (!$normalValue && $valueMQTT >= $minValue && $valueMQTT <= $maxValue)
{
$this->setProperty("value", $valueMQTT);
return;
}
}
$flagLoadValueMQTT = (int)$this->getProperty("flagLoadValueMQTT"); // (int) даст 0, если flagLoadValueMQTT пуста строка
$loadValueTimeoutMQTT = $this->getProperty("loadValueTimeoutMQTT"); //В секундах
if (!$flagLoadValueMQTT && is_numeric($loadValueTimeoutMQTT)) {
$this->setProperty("flagLoadValueMQTT", 1);
$timeOutCommand = 'setGlobal("' . $this->object_title . '.flagLoadValueMQTT", 0);';
setTimeOut($this->object_title . "_flagLoadValueMQTT", $timeOutCommand, $loadValueTimeoutMQTT);
if (is_numeric($deltaValue)) {
if (abs($value - $valueMQTT) >= $deltaValue) {
$this->setProperty("value", $valueMQTT);
}
} else {
$this->setProperty("value", $valueMQTT);
}
return;
}
$value = $this->getProperty("value");
if ($valueMQTT != $value && !$flagLoadValueMQTT && $loadValueTimeoutMQTT == false) {
if (is_numeric($deltaValue)) {
if (abs($value - $valueMQTT) >= $deltaValue) {
$this->setProperty("value", $valueMQTT);
}
} else {
$this->setProperty("value", $valueMQTT);
}
}
в loadValueTimeoutMQTT запишем 1200 (раз на 20 минут)
Теперь мы не пропустим важные данные, а в историю (Sensor_voltage01.value) будут попадать данные с частотой указанной в loadValueTimeoutMQTT и критические. Также программно можно менять частоту истории - изменяя значение loadValueTimeoutMQTT.
Интересует как подобный функционал реализован у народа?
Спасибо за ответ