Оглавление:

BBQ Pi (с визуализацией данных!): 4 шага (с изображениями)
BBQ Pi (с визуализацией данных!): 4 шага (с изображениями)

Видео: BBQ Pi (с визуализацией данных!): 4 шага (с изображениями)

Видео: BBQ Pi (с визуализацией данных!): 4 шага (с изображениями)
Видео: Основы Matplotlib. Визуализация данных. Графики и диаграммы в Python 2024, Ноябрь
Anonim
BBQ Pi (с визуализацией данных!)
BBQ Pi (с визуализацией данных!)
BBQ Pi (с визуализацией данных!)
BBQ Pi (с визуализацией данных!)
BBQ Pi (с визуализацией данных!)
BBQ Pi (с визуализацией данных!)

Вступление

Приготовление на гриле чаще всего относится к медленному процессу использования непрямого нагрева для приготовления любимого мяса. Хотя этот метод приготовления очень популярен, особенно в США, у него есть то, что некоторые могут посчитать довольно серьезным недостатком: он требует часов полуосознанного внимания, которые нужно потратить на мониторинг температуры вашей ямы и еды. Введите: Raspberry Pi.

Оригинальный проект

Первоисточник этого проекта можно найти здесь: https://old.reddit.com/r/raspberry_pi/comments/a0 … Суть в том, что пользователь Reddit Produkt смог передать данные о температуре еды и ямы по относительно дешевым ценам., коммерчески доступные беспроводные термометры к Raspberry Pi (к выводам GPIO которого был прикреплен небольшой радиочастотный модуль). В исходном проекте (ссылка приведена выше) данные Produkt хранились в базе данных sqlite и отображались на локальном веб-сайте apache2 php.

Это решение уже решает первоначальную проблему, затронутую во введении к этому блогу: теперь вы можете удаленно контролировать температуру продуктов и ям с помощью веб-браузера. Но что, если бы мы хотели подробнее остановиться на этом? Введите: GridDB.

Запасы

Малина Pi4

Модуль беспроводного супергетеродинного приемника SUNKEE 433 МГц

Шаг 1. Веб-API GridDB и FluentD

Веб-API GridDB и FluentD
Веб-API GridDB и FluentD

Увидев этот проект, моя первая мысль - после первой волны ажиотажа - была думать о способах расширения функциональности. Используя GridDB и его плагин Grafana, я стремился визуализировать свои данные о еде и ямах. Помимо этого, я хотел настроить аннотации Grafana для поиска любых аномальных точек данных - не может быть обугленного мяса!

Для начала мне нужно было использовать код C из исходного проекта, чтобы прочитать данные, поступающие с беспроводного термометра, и разместить эти данные на моем сервере GridDB. Чтобы запустить его, я развернул сервер GridDB в Azure с помощью виртуальной машины CentOS. Самый простой способ передать данные с нашего пограничного компьютера (Raspberry Pi) на наш облачный сервер - через веб-API GridDB. Итак, на этой виртуальной машине я установил WebAPI GridDB вместе с Fluentd и сопутствующим коннектором GridDB.

Перед фактической отправкой данных в облако мне нужно было создать базовую схему для моего контейнера BBQ Pi. Набор данных предельно прост: у нас есть два датчика температуры, один идентификатор готовки и, конечно же, временная метка. Итак, наша схема выглядит так:

timeseries = gridstore.put_container ("bbqpi", [("время", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)], griddb. GS_IMECONTAINER_INT)

Чтобы создать этот контейнер таймсерий, я просто использовал WebAPI (порт 8080):

curl -X POST --basic -u admin: admin -H "Content-type: application / json" -d

'{"имя_контейнера": "bbqpi", "тип_контейнера": "СЕРИИ_ВРЕМЕНИ", / "ключ строки": true, "столбцы": [{"имя": "время", "тип": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "probe1", "type": "INTEGER"}, {"name": "probe2", "type": "INTEGER"}]} '\ https:// localhost: 8080 / griddb / v2 / defaultCluster / dbs / public / container

После создания контейнера мне нужно было использовать Fluentd (порт 8888) для отправки фактических данных в наш контейнер. Вот команда CURL, отправляющая фиктивные данные:

curl -X POST -d 'json = {"date": "2020-01-01T12: 08: 21.112Z", "cookid": "1", "probe1": "150", "probe2": "140" } 'https:// localhost: 8888 / griddb

Оттуда мне нужно было добавить исходный код для отправки HTTP-запроса POST всякий раз, когда наш Pi считывал данные из нашей ямы (примерно раз в ~ 12 секунд).

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

int postData (char time , int cookid, int probe1, int probe2, char url ))

{CURL * curl; CURLcode res; / * В Windows это запустит материал winsock * / curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; символ агента [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" date / ": \"% s.112Z / ", \" cookid / ": \"% d / ", \" probe1 / ": \"% d / ", / "проба2 \": / "% d \"} ", время, cookid, проба1, проба2); / * получаем дескриптор curl * / curl = curl_easy_init (); if (curl) {/ * Сначала установите URL-адрес, по которому будет получен POST. Этот URL-адрес может также быть URL-адресом https://, если именно он должен получать данные. * / snprintf (агент, размер агента, "libcurl /% s", curl_version_info (CURLVERSION_NOW) -> версия); агент [размер агента - 1] = 0; curl_easy_setopt (завиток, CURLOPT_USERAGENT, агент); curl_easy_setopt (завиток, CURLOPT_URL, URL); curl_easy_setopt (завиток, CURLOPT_USERNAME, «админ»); curl_easy_setopt (завиток, CURLOPT_PASSWORD, «админ»); curl_easy_setopt (завиток, CURLOPT_VERBOSE, 1L); curl_easy_setopt (завиток, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt (завиток, CURLOPT_POSTFIELDS, json); / * Выполняем запрос, res получит код возврата * / res = curl_easy_perform (curl); если (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (% d)", res); if (len) fprintf (stderr, "% s% s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": "")); fprintf (stderr, "% s / n / n", curl_easy_strerror (res)); goto cleanup; } очистка: curl_easy_cleanup (завиток); curl_global_cleanup (); возврат 0; }}

Когда эта функция была написана, мне просто нужно было запустить ее одновременно с публикацией данных sqlite:

if (goodData == 1) {

if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "ВСТАВИТЬ показания (cookid, time, probe1, probe2) ЗНАЧЕНИЯ (% d, '% s',% d, % d); ", cookID, buff, probe1, probe2); printf ("% s / n", sql); rc = sqlite3_exec (база данных, sql, обратный вызов, 0, & zErrMsg); if (rc! = SQLITE_OK) {printf ("Ошибка SQL:% s / n", zErrMsg); } еще {last_db_write = сек; } char url = "https://xx.xx.xx.xx: 8888 / griddb"; postData (бафф, cookID, проба1, проба2, URL); }}

Чтобы убедиться, что ваши данные действительно вставляются на ваш сервер, вы можете выполнить следующую команду, чтобы запросить вашу базу данных и просмотреть результаты:

curl -X POST --basic -u admin: admin -H "Content-type: application / json" -d '{"limit": 1000}' https:// localhost: 8080 / griddb / v2 / defaultCluster / dbs / общедоступные / контейнеры / bbqpi / строки

Шаг 2: Графана

Графана
Графана
Графана
Графана

Имея код на месте, теперь, когда мы используем исходный веб-портал для запуска «готовки», мы одновременно будем сохранять данные о температуре на нашем сервере GridDB.

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

Аннотации, обсуждаемые в блоге, позволяют нам очень легко отслеживать, когда что-то идет не так с нашей едой или самой косточкой. В моем случае я готовил короткие говяжьи ребрышки. С ними я не хотел, чтобы температура в яме превышала 275 градусов по Фаренгейту. Если бы я увидел, что температура превышает это значение, я мог бы выключить конфорку и позволить теплу снова опуститься:

У меня было аналогичное правило для датчика, который следил за самой едой: если температура внутри еды достигала 203 градусов по Фаренгейту, ребра были готовы. Здесь вы можете увидеть аннотацию в конце повара:

В общем, на приготовление у меня ушло около ~ 4 часов или около того, но такая установка была бы действительно отличной, если бы я готовил что-то, что потребовало бы еще больше времени на гриле (подумайте о низко-медленном копчении, которое длится ~ 12 часы). Несмотря на это, я считаю, что ценность этого инструмента очевидна: возможность регистрировать результаты ваших блюд, а затем сравнивать их с результатами предыдущих поваров, означает, что ваше барбекю будет постепенно улучшаться со временем, поскольку вы можете использовать данные, чтобы увидеть, что работает, а что нет. т.

Шаг 3: Еда

Еда
Еда
Еда
Еда
Еда
Еда

Это был первый раз, когда я делал короткие говяжьи ребрышки; в качестве приправы я просто использовала соль, черный перец и чесночный порошок. Несмотря на некоторые проблемы с слишком высокой горелкой вначале, ребра вышли фантастическими. Пожалуйста, взгляните:

Шаг 4: Заключение

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

Рекомендуемые: