Корректировка значений датчиков

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Корректировка значений датчиков

Сообщение Ko/|xo3HUk » Пт дек 02, 2016 11:21 am

Доброго дня!
Есть у меня небольшая хотелка - корректировать показания с датчиков, но пока нет мыслей как это реализовать. Может уже есть готовое решение?
Суть проблемы следующая: есть несколько ESPшек, с которых прилетают GET-запросы и обрабатываются сценарием "espdata". Этот сценарий уже раскладывает GET-запрос на составляющие и записывает значение с датчика в SQL.
Есть, например, два датчика температуры, которые стоят в одном и том же месте, но показания различаются на 0,5 градуса. Как мне скорректировать показания одного из датчиков? (В функционале прошивки ESP от wifi-iot.com коррекция есть, но не для всех датчиков (на AM2320 нету) и можно только добавлять/вычитать определённое значение, а может понадобиться и умножать значение на коэффициент).
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
xrogi
Сообщения: 4
Зарегистрирован: Вс ноя 27, 2016 9:21 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Корректировка значений датчиков

Сообщение xrogi » Пт дек 02, 2016 8:11 pm

Добрый день.

Вопрос похоже не по теме форума. Необходимо добиться идентичной работы датчиков, это всегда правильней. Если хочется корректировать в системе, то как вариант пишете значение в переменную 1, вешаете обработчик, там по своей формуле пересчитываете и пишете в переменную2 по которой и ведете архив+графики.

Удачи
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Корректировка значений датчиков

Сообщение Ko/|xo3HUk » Сб дек 03, 2016 6:12 pm

Добиться идентичной работы датчиков нереально, всегда есть разброс хоть на 0,01 градуса. Вот и хочется этот разброс скорректировать. А вопрос был как раз по теме - как программно реализовать корректировку значений с датчиков? Я понимаю что надо:
пишете значение в переменную 1, вешаете обработчик, там по своей формуле пересчитываете и пишете в переменную2
Вопрос в том - как это сделать? Если в скрипте "espdata" - то корректироваться будут сразу вся серия датчиков каждой ESPшки (например, все датчики dsw1), а нужна выборочная корректировка.
Понятно что можно в скрипте прописать:

Код: Выделить всё

если (IDшник  = "ESP_1") то {ESP_1.значение температуры_1 = ESP_1.значение температуры_1 + 0,5};
если (IDшник  = "ESP_2") то {ESP_2.значение температуры_1 = ESP_2.значение температуры_1 + 0,01}; 
Но какое-то топорное решение. Хочется чего-то оригинального и изящного. Вот поэтому и спрашиваю - кто как реализовал это?
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Корректировка значений датчиков

Сообщение serghei » Сб дек 03, 2016 7:10 pm

Ko/|xo3HUk писал(а):Добиться идентичной работы датчиков нереально, всегда есть разброс хоть на 0,01 градуса.... Вот поэтому и спрашиваю - кто как реализовал это?
Зима пришла.....Ответ простой - просто после получения значения с датчика отнять или прибавить 0.01 градуса. Я даже не поднимаю вопрос - зачем ??? Вопрос в другом - кому Вы верите - тому , кто показывает 23.4 или 23.5 ??? Сейчас в одной комнате 4 далласа и разница в показаниях 10 градусов ! Когда начал разбираться - один касается стены возле двери на улицу, другой на подоконнике над батареей и остальные на столе в середине комнаты. Когда Вы поставите градусники в одну точку - тогда можно говорить о какой то калибровке.
Как это реализовать в МД я не знаю , а в АМС просто отнять или прибавить к полученному значению ту разницу , какую хотите.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Корректировка значений датчиков

Сообщение xor » Сб дек 03, 2016 9:52 pm

1. а нельзя добавить каждому датчику свойство Корректировка и эту дельту прибавлять к результату?
2. а в базу когда пишется, там можно корректировать? или лучше поле "Значение с учетом корректировки" завести, апдейтить и оттуда брать?

ps. Мой конкретный случай с коррекцией значения (не знаю, поможет?):
У меня погодная станция возвращает абсолютное давление, мне интересно видеть относительное.
Я переназвал файл, где идет обработка данных от погодной станции, из cumulus.php на cumulus_my.php (чтобы при обновлении не затирался). Поменял соотв. ссылку на него.

В нём уже и поставил коррекцию (-0,3 мм рт ст)

Код: Выделить всё

if ($updated['pressure'])
{
   setGlobal('ws.pressureRt', round((((float)getGlobal('ws.pressure'))/1.33322)-0.3,2));
}
Последний раз редактировалось xor Сб дек 03, 2016 10:06 pm, всего редактировалось 1 раз.
За это сообщение автора xor поблагодарил:
Ko/|xo3HUk (Пн дек 05, 2016 6:59 pm)
Рейтинг: 1.16%
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Корректировка значений датчиков

Сообщение serghei » Сб дек 03, 2016 10:05 pm

Что касается МД тут не подскажу - просто не представляю как это работает((((
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Корректировка значений датчиков

Сообщение Ko/|xo3HUk » Пн дек 05, 2016 6:58 pm

xor писал(а):1. а нельзя добавить каждому датчику свойство Корректировка и эту дельту прибавлять к результату?
По этому пути и решил пойти. Т.к. хотелось сделать корректировку не только сложением. но и умножением на коэффициент - решил делать по формуле:

Код: Выделить всё

скорректированное значение с датчика = текущее значение с датчика * коэффициент умножения + коэффициент сложения
В итоге поправил сценарий espdata и получился он у меня такой (в глазах рябило. когда писал это :)):
СпойлерПоказать

Код: Выделить всё

//Создаём алиасы для уже знакомых ESP-шек
if ($params['idesp']=="ESP826600f5хххх") 
    {$params['idesp'] = "ESP8266_Outside" ; 
//     DebMes("espdata request: ".$_SERVER['REQUEST_URI']); // После этого в XRay во вкладке debug можно смотреть результат.
    }
if ($params['idesp']=="ESP826600f5хххх") {$params['idesp'] = "ESP8266_Hall" ; }
if ($params['idesp']=="ESP826600f4хххх") {$params['idesp'] = "ESP8266_Kitchen" ; }
if ($params['idesp']=="ESP8266000aхххх") {$params['idesp'] = "ESP8266_Bathroom" ; }
if ($params['idesp']=="ESP8266000aхххх") {$params['idesp'] = "ESP8266_Server" ; }
if ($params['idesp']=="ESP82660017хххх") 
    {$params['idesp'] = "ESP8266_Garage" ; 
//     DebMes("espdata request: ".$_SERVER['REQUEST_URI']); // После этого в XRay во вкладке debug можно смотреть результат.
    }

if ($params['idesp']=="") { return; } //Если ID устройства отсутствует, то перестаем отрабатывать сценарий
addClass('ESP8266'); //Создаем класс ESP8266
addClassObject('ESP8266',$params['idesp']); //Создаем в классе ESP8266 объект где в качестве имени 
addClassProperty('ESP8266', 'vdd', 90); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 90 дней
addClassProperty('ESP8266', 'updated', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'updatedTime', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'alive', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'bmpp_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmpp_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmpt_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmpt_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmep_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmep_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmet_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmet_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmeh_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'bmeh_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'amt_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'amt_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'amh_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'amh_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhth1_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhth1_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhth2_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhth2_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhtt1_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhtt1_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhtt2_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dhtt2_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw1_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw1_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw2_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw2_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw3_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw3_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw4_multiplier', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
addClassProperty('ESP8266', 'dsw4_addition', 0); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 0 дней
if (gg($params['idesp'].".bmpp_multiplier")=="") { sg(($params['idesp'].".bmpp_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".bmpp_addition")=="") { sg(($params['idesp'].".bmpp_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".bmpt_multiplier")=="") { sg(($params['idesp'].".bmpt_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".bmpt_addition")=="") { sg(($params['idesp'].".bmpt_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".bmep_multiplier")=="") { sg(($params['idesp'].".bmep_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".bmep_addition")=="") { sg(($params['idesp'].".bmep_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".bmet_multiplier")=="") { sg(($params['idesp'].".bmet_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".bmet_addition")=="") { sg(($params['idesp'].".bmet_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".bmeh_multiplier")=="") { sg(($params['idesp'].".bmeh_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".bmeh_addition")=="") { sg(($params['idesp'].".bmeh_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".amt_multiplier")=="") { sg(($params['idesp'].".amt_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".amt_addition")=="") { sg(($params['idesp'].".amt_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".amh_multiplier")=="") { sg(($params['idesp'].".amh_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".amh_addition")=="") { sg(($params['idesp'].".amh_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dhth1_multiplier")=="") { sg(($params['idesp'].".dhth1_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dhth1_addition")=="") { sg(($params['idesp'].".dhth1_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dhth2_multiplier")=="") { sg(($params['idesp'].".dhth2_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dhth2_addition")=="") { sg(($params['idesp'].".dhth2_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dhtt1_multiplier")=="") { sg(($params['idesp'].".dhtt1_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dhtt1_addition")=="") { sg(($params['idesp'].".dhtt1_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dhtt2_multiplier")=="") { sg(($params['idesp'].".dhtt2_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dhtt2_addition")=="") { sg(($params['idesp'].".dhtt2_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw1_multiplier")=="") { sg(($params['idesp'].".dsw1_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw1_addition")=="") { sg(($params['idesp'].".dsw1_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw2_multiplier")=="") { sg(($params['idesp'].".dsw2_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw2_addition")=="") { sg(($params['idesp'].".dsw2_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw3_multiplier")=="") { sg(($params['idesp'].".dsw3_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw3_addition")=="") { sg(($params['idesp'].".dsw3_addition"),0); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw4_multiplier")=="") { sg(($params['idesp'].".dsw4_multiplier"),1); } //Инициализация коэффициента
if (gg($params['idesp'].".dsw4_addition")=="") { sg(($params['idesp'].".dsw4_addition"),0); } //Инициализация коэффициента

//Распихиваем всё по свойствам. Если полученное значение пустое, то свойство не записываем
if ($params['bmpp']!="") { sg(($params['idesp'].".bmpp"),$params['bmpp']*gg($params['idesp'].".bmpp_multiplier")+gg($params['idesp'].".bmpp_addition")); } //Данные с датчика BMP (давление)
if ($params['bmpt']!="") { sg(($params['idesp'].".bmpt"),$params['bmpt']*gg($params['idesp'].".bmpt_multiplier")+gg($params['idesp'].".bmpt_addition")); } //Данные с датчика BMP (температура)
if (($params['bmep']!="") && ($params['bmep']!="_BMEP_")) { sg(($params['idesp'].".bme_pressure"),$params['bmep']*gg($params['idesp'].".bmep_multiplier")+gg($params['idesp'].".bmep_addition")); } //Данные с датчика BME280 (давление)
if (($params['bmet']!="") && ($params['bmet']!="_BMET_")) { sg(($params['idesp'].".bme_temper"),$params['bmet']*gg($params['idesp'].".bmet_multiplier")+gg($params['idesp'].".bmet_addition")); } //Данные с датчика BME280 (температура)
if (($params['bmeh']!="") && ($params['bmeh']!="_BMEH_")) { sg(($params['idesp'].".bme_humidity"),$params['bmeh']*gg($params['idesp'].".bmeh_multiplier")+gg($params['idesp'].".bmeh_addition")); } //Данные с датчика BME280 (влажность)
if ($params['counter']!="") { sg(($params['idesp'].".counter"),$params['counter']); } //Количество импульсов со счетчика
if (($params['amt']!="") && ($params['amt']!="255.0")) { sg(($params['idesp'].".am2320_temper"),$params['amt']*gg($params['idesp'].".amt_multiplier")+gg($params['idesp'].".amt_addition")); } //Данные с I2C датчика AM232x (температура)
if (($params['amh']!="") && ($params['amh']!="255.0")) { sg(($params['idesp'].".am2320_humidity"),$params['amh']*gg($params['idesp'].".amh_multiplier")+gg($params['idesp'].".amh_addition")); } //Данные с I2C датчика AM232x (влажность)
if ($params['dhth1']!="") { sg(($params['idesp'].".dhth1"),$params['dhth1']*gg($params['idesp'].".dhth1_multiplier")+gg($params['idesp'].".dhth1_addition")); } //Данные с первого датчика DHT (влажность)
if ($params['dhth2']!="") { sg(($params['idesp'].".dhth2"),$params['dhth2']*gg($params['idesp'].".dhth2_multiplier")+gg($params['idesp'].".dhth2_addition")); } //Данные со второго датчика DHT (влажность)
if ($params['dhtt1']!="") { sg(($params['idesp'].".dhtt1"),$params['dhtt1']*gg($params['idesp'].".dhtt1_multiplier")+gg($params['idesp'].".dhtt1_addition")); } //Данные с первого датчика DHT (температура)
if ($params['dhtt2']!="") { sg(($params['idesp'].".dhtt2"),$params['dhtt2']*gg($params['idesp'].".dhtt2_multiplier")+gg($params['idesp'].".dhtt2_addition")); } //Данные со второго датчика DHT (температура)
if (($params['dsw1']!="") && ($params['dsw1']!="255.0")) { sg(($params['idesp'].".Temper_1"),$params['dsw1']*gg($params['idesp'].".dsw1_multiplier")+gg($params['idesp'].".dsw1_addition")); } //Данные с датчика DS18B20 №1
if (($params['dsw2']!="") && ($params['dsw2']!="255.0")) { sg(($params['idesp'].".Temper_2"),$params['dsw2']*gg($params['idesp'].".dsw2_multiplier")+gg($params['idesp'].".dsw2_addition")); } //Данные с датчика DS18B20 №2
if (($params['dsw3']!="") && ($params['dsw3']!="255.0")) { sg(($params['idesp'].".Temper_3"),$params['dsw3']*gg($params['idesp'].".dsw3_multiplier")+gg($params['idesp'].".dsw3_addition")); } //Данные с датчика DS18B20 №3
if (($params['dsw4']!="") && ($params['dsw4']!="255.0")) { sg(($params['idesp'].".Temper_4"),$params['dsw4']*gg($params['idesp'].".dsw4_multiplier")+gg($params['idesp'].".dsw4_addition")); } //Данные с датчика DS18B20 №4
if (($params['dsw5']!="") && ($params['dsw5']!="255.0")) { sg(($params['idesp'].".Temper_5"),$params['dsw5']); } //Данные с датчика DS18B20 №5
if ($params['freemem']!="") { sg(($params['idesp'].".freemem"),$params['freemem']); } //Объем свободной памяти модуля
if ($params['hostname']!="") { sg(($params['idesp'].".hostname"),$params['hostname']); } //Имя модуля
if ($params['light']!="") { sg(($params['idesp'].".light"),$params['light']); } //Данные с датчика BH1750
if ($params['uptime']!="") { sg(($params['idesp'].".uptime"),$params['uptime']); } //Время непрерывной работы модуля
if ($params['vdd']!="") { sg(($params['idesp'].".vdd"),$params['vdd']); } //Напряжение на модуле
if ($params['ver']!="") { sg(($params['idesp'].".ver"),$params['ver']); } //Версия прошивки
if ($params['wanip']!="") { sg(($params['idesp'].".wanip"),$params['wanip']); } //IP-адрес
sg(($params['idesp'].".idesp"),$params['idesp']);  // 

Теперь хочу сделать домашнюю страницу "Корректировка датчиков" с таблицей всех коэффициентов. И тут неожиданно столкнулся с простой, казалось бы, проблемой - как вывести кучу полей ввода/вывода для редактирования коэффициентов? писать для каждого поля форму ввода? Типа такого:

Код: Выделить всё

<form name="test" method="post" action="input1.php">
   <input type="text" size="40">
 </form> 
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Ответить