Измеряем температуру, влажность и отслеживаем показания газового счетчика с использованием ThingSpeak. Часть 4. Обрабатываем значения.

big-data-1352491_960_720Собирать данные о потреблении газа — здорово. Но собрать их мало, нужно собранные данные научиться анализировать и извлекать из них полезные сведения. Ведь, в конце концов, устройство для регистрации расхода создавалось не просто так, а с конкретными целями. Попробуем разобраться с тем, каким образом можно обрабатывать данные, с таким трудом добываемые устройством. Но хочу сразу предупредить, перечисленные ниже способы совсем не исчерпывающи и пытливый ум способен разработать еще множество вариантов того, как можно использовать накопленные данные.

ThingSpeak

Поскольку в рамках реализации устройства по измерению температуры, давления, влажности и показаний газового счетчика изначально было задумано использование серверов ThingSpeak для хранения данных, то самым простым способом анализа сохраняемой информации является как раз использование интерфейса ThingSpeak.

Да, графики, предлагаемые по умолчанию пользователям ThingSpeak, неказисты и несмотря на некоторые настройки, в некоторых случаях, недостаточны. При помощи стандартных графиков можно отслеживать динамику на протяжении определенного времени, примыкающего к настоящему, можно настраивать внешний вид графиков, проводить округления и выполнять прочие несложные операции.

Давайте быстренько рассмотрим, какие полезные варианты предлагают нам разработчики ThingSpeak. Но для начала напомню, что данные в ThingSpeak накапливаются в так называемых «каналах», каждый из каналов может содержать до восьми полей. Поля могут содержать как целые, так и дробные значения, собственно те цифровые данные, которые вы на сервер и отправляете. У каждого кванта данных есть два измерения: значение и время. Со значением все более-менее понятно, а вот временная метка устанавливается сервером автоматически. На нее мы не можем просто так повлиять. Более того, время каждой порции данных задается в формате UTC+0, а уже при выводе оно форматируется в соответствии с часовой зоной пользователя.

Вид графика

Самое простое, что может кардинально изменить визуальное восприятие представляемых данных — изменение типа графика.

По умолчанию применяется метод отображения line или линия. Такой тип графика отлично подходит для данных, которые нечасто обновляются либо имеют широкий диапазон изменений. Близкий к линейному типу, типу spline или кривая. В этом случае алгоритмы стараются изобразить плавные переходы между значениями. Такой тип графика лучше смотрится при отображении величин с отсутствием резких изменений.

Представление данных в виде линейного, сплайнового, столбчатого графиков и в виде бар

Представление данных в виде линейного, сплайнового, столбчатого графиков и в виде бар

Кроме линейного отображения, в ThingSpeak присутствует и столбчатая визуализация. Доступно два варианта bar или бары, когда данные отображаются в виде горизонтальных линий, и column или столбцы, с вертикальным отображением. Оба типа хороши для визуальной оценки объемов измерений в данных. Чем больше бар или столбец, тем больше значение.

Округления

Допустим, вы хотите посмотреть изменения температуры на протяжении недели, а сама температура измеряется с интервалом в 15 минут. На выходе получится неопрятный график с мешаниной из точек показаний. Улучшить отображение информации можно посредством уменьшения отображаемых точек на графике.

В ThingSpeak присутствует два варианта для уменьшения количества точек. Самый простой Average или усреднение. Выбирается количество минут для усреднения значений и график выходит опрятнее. Альтернативой усреднению выступает Median или медиана. Смысл воздействия медианы схож с усреднением, но тут отбрасываются крайние значения, что полезно, если какой-то из датчиков у вас чудит и выдает показания, разительно отличающиеся от нормальных.

Виды округлений данных за неделю: без округления, TimeScale 240 минут, Average 240 минут, Median 240 минут

Виды округлений данных за неделю: без округления, TimeScale 240 минут, Average 240 минут, Median 240 минут

Немного в стороне стоит вариант Timescale или сжатие временной шкалы. При выборе этого варианта происходит сжатие временной шкалы за счет выборки первого значения за указанное количество минут, все остальные значения отбрасываются. Еще один вариант с суммированием или Sum может применяться в том числе и для уменьшения количества значений на графике. В поле вводится количество минут, в рамках которых происходит суммирование значений. Результат выводится на график. Суммирование полезно применять, когда данные есть не что иное, как изменение по отношению к предыдущему значению, а не абсолютная величина. Например, при использовании в проекте, я бы мог публиковать не абсолютное значение счетчика потребления газа, а то количество газа, которое было потреблено с момента прошлой публикации сведений. В таком случае мне была бы полезна функция суммирования для отображения количества потребления газа за какую-то, выбранную, единицу времени.

Остальные настройки графика — тривиальны и не составляют труда в освоении.

Android

В мире смартфонов и планшетов было бы глупо не иметь возможности получать данные из ThingSpeak и не отображать их на экране телефона. Например, при отслеживании температуры в помещении полезно иметь ее иногда перед глазами дабы проверять, вдруг что идет не так, как задумано. Согласитесь, что лезть с мобильного на сервер ThingSpeak не так удобно.

К счастью, популярность ThingSpeak привела к тому, что разработчиками создан как минимум десяток приложений для среды Andriod, позволяющих визуализировать данные ThingSpeak. Опробовав несколько из них, я остановился на IoT ThingSpeak Monitor Widget.

Виджет для отображения данных с ThingSpeak в правом верхнем углу. Дневное и недельное изменение значения на графиках.

Виджет для отображения данных с ThingSpeak в правом верхнем углу. Дневное и недельное изменение значения на графиках.

Продукт есть не что иное, как набор виджетов визуализирующих данные с серверов ThingSpeak. Виджеты не только могут гибко настраиваться, но и позволяют отображать графики изменения значений за разные периоды времени. Форма представления для меня оказалась наиболее удобной, а стабильность работы только закрепила мою приверженность этому приложению. Данные приложение получает через Read API Key который вы устанавливаете при настройке своего канала на ThingSpeak. К тому же приложение, точнее виджет, совершенно бесплатно.

Excel

Microsoft Excel продукт не простой, хотя многие его знают лишь как замену настольному калькулятору или как удобный инструмент для составления красивых табличек. Но в действительности, все не так, как на самом деле. Даже в стандартном исполнении, что называется из коробки, Excel предоставляет настолько богатый набор функций, что де-факто закрывает около 90–95% любых потребностей в расчетах. А если добавить к Excel надстройки, например, Crystal Ball, Power Pivot, Inventor или другие пакеты, то можно подобраться и к 98–99%. Остальные же проценты добираются сугубо специализированными пакетами.

Импорта в Excel из CSV

Импорта в Excel из CSV

Именно по этой причине, возможность выгрузки данных из ThingSpeak в формате CSV (Comma Separated Values, значения, разделенные запятыми) означает возможность загрузки данных в Excel. А дальше с ними можно творить все что душе возжелается, начиная от сортировки и заканчивая визуализацией в графиках.

Импорт в Excel из CSV: выбираем разделитель

Импорт в Excel из CSV: выбираем разделитель

Импорт измерений из текстового файла в Excel не составит труда, важно помнить, что в новых версиях загрузка текста перебралась из меню «Файл» в меню «Данные». Настройки для импорта выбираем следующие: файл с разделителем в виде запятой, с заголовком.

Импорт в Excel из CSV: указываем разделитель для разрядов

Импорт в Excel из CSV: указываем разделитель для разрядов

После импорта возникает небольшая проблема. Поле с датой и временем в ThingSpeak единое, а Excel не умеет обрабатывать дату и время в таком формате. Но это легко поправить при помощи еще одного мастера из группы «Данные». Мастер по конвертации текста в столбы поможет разнести дату и время по разным столбцам.

Таблица в Excel и результаты анализа

Таблица в Excel и результаты анализа

В результате на выходе, мы имеем обычную таблицу Excel, с которой можно проводить любые манипуляции. Например, посмотреть корреляцию между изменениями температуры и влажности. Так, из данных по мониторингу температуры и влажности в комнате я выяснил, что влажность с температурой зависимы друг от друга. Коэффициент корреляции составил -0.83, что не так уж и мало. Хотя и без измерений понятно, что в зимний период влажность в помещении зависит напрямую от того, насколько сильно топят батареи, как и температура в комнате. Кстати, зависимость составляет величину в -12 единиц, найти которые помогла функция ковариации.

Результирующий график

Результирующий график

Но это всего лишь легкие упражнения. Большу́ю трудность и большу́ю ценность для исследователя представляют не просто сведения о соотношении температуры и влажности, а более глубокий анализ полученных данных. Например, градиент температуры внутри корпуса, внутри помещения, вне помещения и затраты газа на поддержание градиента.

Ради эксперимента я попробовал получить и проанализировать сведения в отношении температуры в помещении и часовому расходу газа. Напомню, что устройство протоколирует каждый импульс, полученный от газового счетчика, и делает это нарастающим итогом. Методику «часового» расхода газа для отображения на ThingSpeak я раскрою ниже, в соответствующем разделе. А сейчас просто воспользуемся этими данными. Да и температура в помещении у меня определяется другим устройством, хотя также записывается на ThingSpeak.

Шаг 1

Выгрузить соответствующие сведения из ThingSpeak и загрузить их в Excel. У меня получилось две таблицы.

Шаг 2

Свести данных из двух таблиц в одну. Причем данные из одной таблицы добавить в конец другой, не забыв про столбцы времени и даты.

Шаг 3

Настроить формат столбца со временем как «время». Выделить в отдельный столбец только часы при помощи функции Hour или «Час» если у вас русскоязычная версия Excel.

Шаг 4

На основе полученной таблицы создаем сводную (Pivot) таблицу. Где добавляем строки с датой и часом, не временем, а именно часом, который мы получили на шаге 3. В качестве значений выбираем потребление газа и ставим параметр агрегации «сумма» и температуру с агрегацией «усреднение».

Значения в таблице для создания Pivot-таблицы, желтым отмечено место слияния двух исходных таблиц

Значения в таблице для создания Pivot-таблицы, желтым отмечено место слияния двух исходных таблиц

В результате у нас получается таблица с разбивкой по календарным датам, в каждой дате у нас будут выделены часы. Для каждого часа дается потребление в час и средняя температура за этот час. Более того, по суткам дается потребление газа и средняя температура за эти сутки.

Результирующая сводная таблица и график с двумя видами значений

Результирующая сводная таблица и график с двумя видами значений

На графике проявляется корреляция между потреблением газа и температурой в помещении. Чем больше потрачено, тем выше температура. Также заметны всплески с огромным потреблением газа, которым предшествуют пустые области. Это проблема с отправкой показаний через интернет. В это время импульсы считаются, но устройство не может отправить их на ThingSpeak, например, из-за плохого сигнала Wi-Fi. А позже, когда сигнал нормализуется, отправляет все накопленные данные единоразово. Для желающих поупражняться с Excel, я выложил оригинальную книгу с данными.

Кстати, в ThingSpeak есть целых две возможности экспорта. Одна выгружает данные все сразу и только в формате CSV, а вторая более гибкая, позволяет настроить поля для выгрузки и предлагает несколько форматов на выбор: JSON, XML, CSV. Располагается вторая на вкладке с отображением графиков ThingSpeak, а первая на специальной вкладке по импорту и экспорту данных.

ThingSpeak визуализация и анализ

Выгрузить данные для внешнего анализа — штука, безусловно, хорошая. Но и в самом ThingSpeak есть возможность по дополнительной обработке и визуализации данных. Как-никак ThingSpeak детище Mathworks Inc, производителя известного MATLAB. А уж в этом пакете средств для анализа не то что мало, а вполне даже и много. MATLAB как раз тот продукт, который добивает последние проценты потребностей в анализе данных.

MATLAB очень мощный продукт, вся или почти вся функциональность которого доступна для использования на ThingSpeak. Для использования предлагается две группы инструментов: Analytics, для дополнительной обработки данных, и Actions, для выполнения действий или команд при наступлении определенных событий.

Нас больше интересует два инструмента из группы Analytics: MATLAB Analysis и MATLAB Visualization. Первый отвечает за обработку данных, а второй за обработку и визуализацию данных. Оба программируются на внутреннем языке MATLAB, а разница между ними в том, что вывод Visualization можно добавить к какому-либо каналу.

Начнем с Analysis.

Для облегченного использования сервиса, вернее, для получения данных по потреблению газа не в виде текущего показания счетчика, а в виде потребления в течение некоего периода, я реализовал небольшое приложение. Оно выполняет, в принципе, несложную работу. Каждый час выбирает данные из поля с показанием газового счетчика, берет максимальное и минимальное значение за час, вычитает одно из другого, а результат записывается в новый канал, в специально выделенное для этого поле.

% Here we get maximum gas impulse value for the latest hour in scope of a week (there must be some gas consuptions in a week time 
% or the graph will show the value of the gas impulse meter
readChannelID = YourChannelWithData;
readAPIKey = 'YourReadApiKey';
GasReadField = 1;
writeChannelID = YourChannelWhereToPutData;
writeAPIKey = 'YourWriteApiKey';
GasWriteField = 2;

% Define times
% t1 means now, t2 means without the last hour, t3 means a week ago
t1=now()+0.125; % with adjustments for UTC+3
t2=t1-0.0416666666666667; % minus 1 hour
t3=t1-7; % a week ago

% Get the latest GAS Impulse
GasImpNow = thingSpeakRead(readChannelID, 'Fields', GasReadField, 'ReadKey', readAPIKey, 'DateRange', [datetime(datestr(t3)), datetime(datestr(t1))]);
GasImpNow(isnan(GasImpNow))=[]; % remove all NaN values from the vector
TheLatestGasImpulse=GasImpNow(numel(GasImpNow));
display(num2str(TheLatestGasImpulse), 'Real latest Gas impulse is'); 

% Get the latest GAS Impulse of the prevour hour
GasImpHourAgo = thingSpeakRead(readChannelID, 'Fields', GasReadField, 'ReadKey', readAPIKey, 'DateRange', [datetime(datestr(t3)), datetime(datestr(t2))]);
GasImpHourAgo(isnan(GasImpHourAgo))=[]; % remove all NaN values from the vector
TheLatestGasImpulseHourAgo=GasImpHourAgo(numel(GasImpHourAgo));
display(num2str(TheLatestGasImpulseHourAgo), 'Real latest an hour ago Gas impulse is'); 

% Write gas difference into a field
GasConsumptionPerHour=TheLatestGasImpulse-TheLatestGasImpulseHourAgo;
display(num2str(GasConsumptionPerHour), 'Gas consumption over the last hour is');
thingSpeakWrite(writeChannelID, 'Fields', GasWriteField, 'Values', GasConsumptionPerHour, 'timestamp', datetime(datestr(t1), 'TimeZone', 'Europe/Moscow'), 'Writekey', writeAPIKey);

Задача просто описывается, но не так уж и просто реализуется. На пути меня ждало несколько подводных камней. Во-первых, время в ThingSpeak хранится в непростом формате, а точнее в виде суток с начала ХХ века. Во-вторых, путаница с часовой зоной все же присутствует, мне пришлось вводить ручную корректировку иначе выборка не работала и возвращала ошибку. В-третьих, потребление газа происходит далеко не каждый час, поэтому мне пришлось брать выборку сразу за неделю и работать по ней. В-четвертых, отправка импульса происходит не с каждой отправкой сведений на сервер. Поэтому пустые значения в массиве пришлось дополнительно отфильтровать.

Часовая диаграмма потребления газа

Часовая диаграмма потребления газа

Готовый код вызывается ежечасно средствами TimeControl ThingSpeak. В результате получился удобный график, который отображает то, сколько газа потребляется каждый час. Как минимум наглядно.

Приложения по визуализации очень сильно напоминают приложения для анализа. Как я упоминал выше, разница между ними в том, что результат визуализирования можно добавлять сразу на страничку канала. А в остальном, все точно так же программируется на внутреннем языке MATLAB.

readChannelID = YourChannelWithData;
FieldID = 1;
readAPIKey = 'YourReadAPIKey';

t1=now()+3/24; % with adjustment of timezone
t3=t1-1; % a week ago
[GasImpNow, timeStamp] = thingSpeakRead(readChannelID, 'Fields',FieldID,'ReadKey', readAPIKey,'DateRange', [datetime(datestr(t3)), datetime(datestr(t1))]);
GasImpNow=diff(GasImpNow)*10; % calculating difference between next values
timeStamp(1)=[]; % reduce time stamp values vector to 1 due to the fact that diff also reduces the vector by 1

figure
bar(timeStamp, GasImpNow);
xlabel('Время');
ylabel('Потребление, кб. м.');
title('Потребление газа за последние 24 часа');
ax=gca;
ax.GridLineStyle = ':';
grid on

Для примера я задался задачей по онлайн-визуализации потребления газа. В качестве элемента отображения используется столбчатая диаграмма, а данные вычисляются как разница между соседними значениями. Масштаб графика — сутки. На таком масштабе очевидно, что показания потребления могут быть утеряны, если они слишком малы. Но такова сущность столбчатой диаграммы с моментальным потреблением газа. Увы.

Моментальное потребление газа за последние 24 часа, построено при помощи ThingSpeak

Моментальное потребление газа за последние 24 часа, построено при помощи ThingSpeak

В результате получился график, который может быть полезен если нужно посмотреть какие были периоды потребления газа, без каких-либо усреднений. В целом возможности по визуализации средствами MATLAB достаточно гибки, чтобы обойтись совсем без Excel. Но и сам Excel не лыком шит, если вспомнить, что в нем тоже можно программировать.

На этом можно сказать, что завершен полный цикл работ по проекту с автоматизацией получения значений газового счетчика. Цели достигнуты, требуемые результаты получены. Но впереди нас ждет еще небольшое усовершенствование. О нем в следующей части.

Ознакомиться со всем циклом статей можно по следующим ссылкам:
Измеряем температуру, влажность и отслеживаем показания газового счетчика с использованием ThingSpeak. Часть 1. Используем Arduino Uno R3.
Измеряем температуру, влажность и отслеживаем показания газового счетчика с использованием ThingSpeak. Часть 2. Используем ESP8266.
Измеряем температуру, влажность и отслеживаем показания газового счетчика с использованием ThingSpeak. Часть 3. Собираем все вместе.
Измеряем температуру, влажность и отслеживаем показания газового счетчика с использованием ThingSpeak. Часть 4. Обрабатываем значения.
Измеряем температуру, влажность и отслеживаем показания газового счетчика с использованием ThingSpeak. Часть 5. Избавляемся от сенсоров DHT.


Опубликовано автором в следующих категориях:
DIY Soft

Добавить комментарий