[Модуль] Простые устройства - Хранение данных с датчиков

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Ответить
Velizar
Сообщения: 37
Зарегистрирован: Ср фев 15, 2017 10:54 pm
Благодарил (а): 9 раз
Поблагодарили: 7 раз

[Модуль] Простые устройства - Хранение данных с датчиков

Сообщение Velizar » Вт янв 19, 2021 5:01 pm

Поделитесь как Вы храните данные с датчиков в модуле Простые устройства

Например есть датчик напряжения, на 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);
	}
}
Мы привязываем значение топика L1_voltage MQTT к Sensor_voltage01.valueMQTT

в loadValueTimeoutMQTT запишем 1200 (раз на 20 минут)

Теперь мы не пропустим важные данные, а в историю (Sensor_voltage01.value) будут попадать данные с частотой указанной в loadValueTimeoutMQTT и критические. Также программно можно менять частоту истории - изменяя значение loadValueTimeoutMQTT.

Интересует как подобный функционал реализован у народа?
Спасибо за ответ :)
Последний раз редактировалось Velizar Пт янв 22, 2021 5:07 pm, всего редактировалось 3 раза.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Простые устройства - Хранение данных с датчиков

Сообщение skysilver » Вт янв 19, 2021 6:08 pm

MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Ответить