Как сделать Online-логгирование с нуля

    Описанное ниже — это конструкция выходного дня. От идеи до реализации была затрачена пара вечеров. В описании представлен необходимый минимум для реализации системы сбора информации, с доступом к последней в режиме Online.
    image

    Уже в процессе написания данной заметки, появилась статья: Зимовка кактусов с онлайн контролем температуры. В начале испугался, что опередили, однако, хоть решаемая задача в обоих случаях и близка, реализация кардинально отличается.
    Архитектура получившейся системы представлена на диаграмме:
    image
    Как можно видеть, клиентская часть полностью реализована в микроконтроллере. Система легко масштабируется и настраивается под любые нужды.

    Устройство


    В качестве основы клиента взята плата Keil MCB2300, долго лежавшая без дела. Плата построена на микроконтроллере LPC2368, он довольно старый (в настоящий момент вместо него разумнее использовать LPC1768), однако напичкан всем необходимым. На плате присутствует Ethernet-интерфейс, который и является в данном случае «окном в мир». В качестве источника данных взят давно знакомый мне BMP085, подключаемый по интерфейсу I2C.
    image
    Софт для тестирования сервера и проверки работы HTTP-запросов писался в рамках Win32-приложения:
    image
    В дальнейшем эта же логика перешла внутрь микроконтроллера. В настоящий момент запрос адресуется конкретному IP-адресу, но лучше использовать DNS-клиент, т.к. теоретически хостинг-оператор может переносить сайт внутри своего пространства адресов. Так же можно добавить NTP-клиент, чтобы отправлять серверу данные сразу с меткой времени.
    Данный проект — первая моя проба работы с TCP/IP протоколом на микроконтроллере. В основу взят пример EasyWeb, который предлагается для многих плат с Ethernet в качестве стартового. Основной цикл программы получился кривым, однако, причесывать его не хочется, т.к. необходимый функционал уже реализован, зато хочется попробовать перенести это приложение на стек uIP, потому что по внутренней структуре он мне нравится больше.
    Главный цикл работы программы:
    1. Читаем данные с датчика.
    2. Открываем соединение.
    3. Отправляет HTTP GET-запрос к серверу.
    4. Если прошло 10 секунд, а протокол общения с сервером не прошел, разрываем соединение по таймауту.
    5. Ждем 1-5 минут. Это ожидание задает интервал сохранения данных.
    А вот и внешний вид всего устройства:


    Сервер


    Серверная часть развернулась на обычном хостинге. Главное требование к нему: поддержка PHP. Данные сохраняются в виде CSV-файлов. Скрипты максимально простые, функционал разделен на 2 файла:
    • add.php — скрипт добавления данных в лог-файл. Получает параметр file с именем файла на запись и параметр data с данным на запись. Первым столбцом скрипт добавляет метку времени. Так же есть функция clear, позволяющая очистить лог-файл.
    • get.php — отображение данных из лог-файла. Получает единственный параметр file с именем файла.

    Все данные на сервер передаются в рамках GET-запросов:
    GET http://server/add.php?file=temp&data=23.4;99809 HTTP/1.0\r\n\r\n

    А вот содержимое CSV файла:
    1418069433;23.4;99809
    1418069443;23.4;99811
    1418069453;23.4;99818
    1418069464;23.4;99801

    Каждая строчка содержит метку времени, температуру и давление в Паскалях.

    Графический вывод


    Чтобы все выглядело красиво, на сервере можно организовать и иные формы отображения данных. В качестве библиотеки диаграмм/графиков попробовал использовать Highcharts. С ним можно сделать вот такое оформление:
    image
    Это не живой график, это скриншот его вида. В живом виде график можно посмотреть по ссылкам: Температура и Давление.
    UPD: Совместил оба графика на одной странице: Температура/Давление.

    Файлы


    Ссылки

    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 36
      • 0
        Хоть бы прокомментировали, что за ссылка. Я так понимаю, пакет визуализации данных, который покрывает то, о чем я написал?
        Что есть из готового я не смотрел: не те цели были. Цель ставилась в первую очередь — протащить данные из датчика/контроллера на сервер, а затем вывести их в удобоваримом виде.
        • +1
          Одна из самых крутых штук в Graphite — это его функциональность по «даунсэмплингу» исторических данных. На базе Graphite можно строить компактные хранилища исторических данных на многие годы назад. Например, измерения текущей температуры за последние сутки хранятся с «разрешением» в 1 минуту, данные за прошлый месяц — с «разрешением» в 1 час (т.е. берутся 60 измерений, вычисляется среднее/максимальное/минимальное значение), а за всё остальное время — с «разрешением» в, например, 4 часа.
          • 0
            Наблюдая, каким образом растет объем данных (и в теле отдаваемой страницы), уже появилась идея реализовать подобный алгоритм.
            • 0
              Плюс циклическая база данных (RRD, round robin database). Для графиков — самое оно.
            • +1
              эта фича не Graphite, а самой rrd
              • +1
                Строго говоря, RRD как продукт в Graphite уже не используется. Там есть свои, со всем причитающимся, — Whisper и Ceres. Про второй не скажу, а первый — концептуально RRD, верно.
                • +1
                  RRD — это ведь, по сути, характеристика базы данных:
                  база данных, объём хранимых данных которой не меняется со временем, поскольку количество записей постоянно, в процессе сохранения данных они используются циклически


                  Whisper — RRD, Ceres — уже нет:
                  In contrast with Whisper, Ceres is not a fixed-size database and is designed to better support sparse data of arbitrary fixed-size resolutions. This allows Graphite to distribute individual time-series across multiple servers or mounts.
                  • 0
                    А есть какое-нибудь чтиво о внутреннем устройстве Ceres'а, окромя исходников?
                    • 0
                      К сожалению, я не видел ничего подобного. Сам всё хочу добраться до него, попробовать да посмотреть, как оно там реализовано, но всё руки не доходят — есть более важные задачи :(
                • 0
                  В графите «из коробки» оно есть, значит можно сказать, что это фича графита :)
              • 0
                Вот неплохой доклад про графит от наших любимых и уважаемых коллег: events.yandex.ru/lib/talks/1122/ (презентация: www.slideshare.net/yandex/graphite-26755017). Если и правда интересно. Там слишком много нюансов, чтобы в одном коротком комментарии все их писать.

                Если в двух словах: описываемое в статье решение, возможно, хорошо показывает себя в процессе разработки и сразу после запуска. Но через месяц (или даже через год, как повезёт) этим совершенно невозможно будет пользоваться. А уж поддерживать и расширять функционал — так и подавно. Графит (и прочие решения) решает эти проблемы и позволяет сосредоточится на других, более важных и интересных моментах. Впрочем, как «pet project» в качестве небольшого проекта для получения опыта в ключе «как делать ни в коем случае не надо» описываемое в статье решение вполне себе ок.
                • 0
                  Понятное, что во многих случаях лучше скомбинировать готовые решения. Эта статься описывает скорее рыбу, то как можно реализовать на самом нижнем уровне все составные части. Главный недостаток системы, который надо решить — нормальная долговременная работа.

                  Да, а графит (и скорее всего большое количество прочих готовых решений) я и вовсе не смог бы запустить в имеющихся требованиях, поддержка Python на сервере отсутствует, так же как и поддержка базы данных.
              • +1
                Графит хорош на малых нагрузках, но с несколькими десятками хостов, пишущих одновременно свои метрики, мне пришлось выносить его в рамдиск, иначе тупо нагружал сервер до предела и не успевал писать. Плюс там куча раздрая в отношении чего и как деплоить, То megacarbon предложат, то просто carbon-cache, плюс теперь говорят что база whisper устарела, попробуйте новую. Короче у меня отрицательные впечатления.
                • 0
                  Я пару лет назад общался с парнями из Disqus, у них тоже куча хостов (точную цифру не помню), графит пишет на SSD, суммарный объём дисков графита тогда был около 5 терабайт. Вопрос лишь в том, как его «готовить». С деплоем тоже проблем особых нет — один раз собирается соответствующий пакет (RPM, например) и всё, ставится за пять секунд одной командой.

                  В целом да, согласен, графит, порой, жутко бесит, есть узкие места и проблемы, но практически все они преодолимы, да и проявляются только на очень больших проектах, когда совершенно отчётливо понимаешь, что, где, как и зачем. Мой посыл в том, что графит совершенно однозначно лучше решения, описанного в статье, даже в таких простых проектах :)
                  • +1
                    Дело как раз в том, что пока читаешь о фичах — все круто. Начинаешь ставить и тут косяки как начинают переть со всех щелей. Если разворачивать например Ganglia, такого количества гемороя там нет. Может быть сейчас подтянули, но когда я разворачивал Graphite у себя, не было даже внятной доки как это поставить, масштабировать и настраивать. Пришлось перечитать кучу блогов и даже поспрашивать в irc.
                    Я планирую в ближайшее время попробовать influxdb на своей инсталляции, выглядит многообещающе.
                    • 0
                      Вот тут соглашусь со всем написанным :)
              • 0
                Все ссылки в Файлах 404.
                • 0
                  Прошу прощения. Ссылки исправлены.
                • 0
                  Мой пример скрещивания ардуинки и грифинчика

                  • 0
                    Расскажите как вы CORS побороли? У меня дуэт Grafana + InfluxDB работал пару дней, потом ВНЕЗАПНО перестал ссылаясь на CORS.
                    • 0
                      А это не Кибана?
                    • 0
                      Тоже подобное сделал, но вот не понял можно ли как-то графики выносить отдельно из Графити, есть ли простые варианты?
                      • 0
                        Можно отдельный график взять с дашбоарда, но при этом вверху будет доступно меню управления.
                        Обещают, что в будущем сделают возможность отключения меню в графике.
                    • 0
                      Умеют ли HighCharts или Graphite делать горизонтальные и вертикальные выделенные секторы, пример вертикального, в данном случае это график домашней температуры с указание периодов включенного котла. Этот пример сделан на dxChart.
                      • +1
                        В примерах к Highcharts подобного картинке нет. Думаю, подобные полосы в нем можно получить, если вывести 2ой график с состояниями 0-1 с заполнением.
                        • 0
                          Что за котел если не секрет?
                          • 0
                            Baxi Ecofour. Включаю просто с помощью реле, замыкая 2 контакта. github.com/Forever-Young/thermostat-web
                            • 0
                              У меня Протермы пантера и скат, никак не могу научиться снимать с них нагрузку в киловатах. Простое вкл\выкл это уже что-то, но значения в киловаттах сильно круче.
                        • 0
                          Ох Как удачно выложили. Лень было искать что-то для отображения лога температуры. А тут готовые решения. Сделал за 10 минут себе смотрелку. Спасибо за подсказку!
                          • 0
                            Есть хороший бесплатный сервис — thingspeak.com
                            Расширяется плагинами, есть настройка внешнего вида графиков, пред/пост-обработка данных, экспорт/импорт данных, настройка публичности каналов и много другого.
                            • 0
                              Да, отличный сервис!
                              Я себе несколько комплектов мониторинга сделал на базе китайских роутеров + датчики, все заводится с пол-пинка.
                              Поставил в вегетарии, дома и на базовой станции на побережье.
                              ThingSpeak можно использовать отправляя данные как на их сервера, так и подняв свой полностью — исходники на Github.
                              Еще одна достаточно хорошая фича — графики можно брать и встраивать в свои страницы, все очень просто, вот пример.
                              В общем, для новичков в мониторинге и когда нужен быстрый старт ThingSpeak самое то.
                              • 0
                                Вот IMHO интересная ссылка на эту тему — ThingSpeak & ds18b20+arduino+esp8266

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.