Разбираемся с датчиками.
Все датчики, которые подключены к цифровым портам, я предлагаю поместить в отдельный класс. Назовем его, к примеру, "Sensors". (Для всех датчиков, подключаемых к стандартным портам, будем создавать свои отдельные классы).
На каждый измеряемый датчиком параметр в классе будет создаваться отдельный объект. Ведь есть датчики, которые изменяют сразу несколько параметров. Наименования объектов могут быть любые, но я бы выбрал что-то стандартизированное и отражающее смысл измеряемого параметра:
SensorTemp_01
SensorTemp_02
SensorTemp_03
...
SensorHum_01
SensorHum_02...
У каждого объекта будет отдельный код опроса, который мы запишем в код ОБЪЕКТА.
Добавим в класс свойства:
Value -- текущее значение (свойство без истории);
ValueSaved -- сохраненное значение (свойство с историей);
DebMessage -- некорректное значение (свойство без истории).
Добавляем в класс метод "getValue".
Добавляем для объекта "SensorTemp_01" код метода:
Код: Выделить всё
//Модель датчика
//DS18B20
//Обозначение провода, к которому подключен датчик
//
//Комментарий: температурный датчик на обратке радиаторного контура 1-го этажа
//Запрашиваемый параметр: температура
//Исключение датчика из опроса (Disabled = 1)
$Disabled = 0;
if ($Disabled == 1) return;
//Параметры работы с полученными значениями
//Периодичность опроса датчика в минутах
$FrequencyPolling = 1;
//Периодичность сохранения значения в историю в минутах (не должна быть меньше периодичности опроса)
$FrequencySaving = 5;
//Минимально допустимое значение
$MinimumAllowedValue = 1;
//Максимально допустимое значение
$MaximumAllowedValue = 84;
//Максимальное количество повторных попыток опроса в случае некорректности данных
$MaximumAllowedRePolling = 5;
//Обработка полученного значения (удаление лишнего текста, например)
$Processing = 'explode(":",$Value); $Value = $Value[1]';
//Параметры доступа к контроллеру
$ipAddress = "192.168.0.211";
$Password = "sec";
//Порт для получения данных
$Port = 31;
//Запрос
//Общая часть запроса
$RequestCommon = "http://".$ipAddress."/".$Password."/?pt=".$Port;
//Специальная часть запроса
$RequestSpecial = "&cmd=get";
//Запрос полный
$Request = $RequestCommon.$RequestSpecial;
//Получение значения с датчика
//Проверка периодичности опроса
$m=date('i',time());
if ($m%$FrequencyPolling == 0) {
//Запрос значения
$i = 0;
RequestValue:
$Value = file_get_contents($Request);
//Обработка значения
if ($Processing !="") {
eval('$Value = '.$Processing.';');
}
//say("OLD=".$this->getProperty('Value', $params['OLD_VALUE']));
//say($Value);
//Проверка значения на корректность
if ($Value >= $MinimumAllowedValue && $Value <= $MaximumAllowedValue) {
$this->setProperty('Value', $Value);
//Проверка периодичности записи значений в историю
if ($m%$FrequencySaving == 0) $this->setProperty('ValueSaved', $Value);
} else {
//Подсчет количества попыток повторного опроса
$i++;
if ($i <= $MaximumAllowedRePolling) {
//Пауза перед повторной попыткой опроса
sleep(2);
//Повторный опрос
Goto RequestValue;
}
//Запись сообщения в свойство для последующей отладки
$this->setProperty('DebMessage', $Value);
}
}
Можно было бы, конечно, обойтись парой строчек, но хочется сделать более-менее универсальный вариант.
Смысл в следующем. Мы "развязываем" текущее значение и то значение, которое должно быть записано в историю. Дело в том, что актуальное значение с датчика мы можем захотеть знать раз 10 секунд, а вот в историю записывать можем раз в полчаса. Поэтому мы не будем писать значение в историю, каждый раз, когда опрашиваем датчик. Все эти временнЫе параметры настроим в коде опроса конкретного датчика.
Напишем сценарий для запуска опроса датчиков, подключенных к цифровым портам. Пусть называется "SensorsPolling". Каждая строчка сценария будет запускать команду на опрос отдельного датчика/параметра.
Код: Выделить всё
//Скрипт запуска кода опроса цифровых датчиков
callMethodSafe('SensorTemp_01.getValue');
//callMethodSafe('SensorTemp_02.getValue');
//callMethodSafe('SensorTemp_03.getValue');
По мере добавления цифровых датчиков для опроса и настройки кода сюда будут добавляться строчки для организации периодического опроса.
Будем запускать опрос датчиков из onNewMinute. Просто добавим туда строчку:
Код: Выделить всё
runScriptSafe('SensorsPolling');
Можете добавить для аналитики домашнюю страницу и вывести графики с датчиков туда. Если никогда этого раньше не делали, я подскажу, там все очень просто.
Дальше будем разбираться с насосами. Там, с одной стороны проще, но надо будет чуть-чуть понастраивать в модуле "MegaD".