Создаём датчик контроля качества воздуха на InfluxDB, Grafana, Docker и Raspberry Pi

Автор оригинала: Chris Crocker-White
  • Перевод
Когда-нибудь думали о мониторинге качества воздуха в доме или за его пределами: там, где живёте и работаете? Этот проект, который мы окрестили balenaSense, представляет собой установку для снятия показаний температуры, влажности, барометрического давления и качества воздуха, а также панель мониторинга, к которой вы можете получить доступ из любого места, чтобы увидеть сводную статистику и отслеживать тенденции.



Содержание



Введение


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



Рассмотрим мониторинг температуры, влажности, барометрического давления и качества воздуха с помощью сенсора «всё-в-одном», который подключается непосредственно к Raspberry Pi без дополнительных компонентов. Вам не нужен никакой опыт в электронике, но паяльник был бы кстати (хотя он тоже необязателен). Этот проект реализует базу данных для хранения исторических показаний вместе с графическим интерфейсом, чтобы просматривать текущие показания и сразу видеть тенденции.





Необходимое оборудование


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



Я не хочу паять


Если не хотите паять, вам потребуются:


Я хочу паять — дайте мне!


Если вы рады взять в руки паяльник, то вам понадобятся:


Другие датчики


Если у вас уже есть какой-то датчик, этот проект поддерживает Sense HAT с дополнительным бонусом: смайлик на светодиодной матрице (в зависимости от качества воздуха, конечно)!



Bosch BME680 с переходной платой можно заказать у разных поставщиков по разным ценам.


Примечание. В статье мы используем Pimoroni: эта плата имеет то дополнительное преимущество, что контакты разбиты в правильном порядке для Raspberry Pi GPIO. При использовании других плат нужно проверять, что контакты питания, заземления и шины I2C (SDA и SCL) совпадают — это объясняется далее в руководстве.

Программное обеспечение


Мы открыли на GitHub проект balena-sense, который содержит всё программное обеспечение, конфигурацию и код, которые вам нужны для рабочей системы. Мы собираемся развернуть этот проект на бесплатном аккаунте balenaCloud, чтобы распространять всё программное обеспечение для Raspberry Pi, а также обеспечить удалённый доступ. Поэтому вам понадобятся:


Сборка оборудования


На аппаратном фронте этого проекта мало работы. Наша цель состоит в том, чтобы подключить плату датчика к контакту GPIO на Raspberry Pi.

Датчик BME680 взаимодействует с Raspberry Pi по шине под названием I2C (eye-squared-see), которая является последовательной шиной с двумя проводами. Эти два провода называются линия синхронизации (SCK) и линия передачи данных (SDA). В дополнение к двум проводам необходимо подать на датчик питание (3.3V или 3V3) и заземлить.

Если вы выбрали вариант без пайки от Pimoroni или Sparkfun или используете Sense HAT, достаточно просто подключить блестящие новые компоненты к Raspberry Pi, и все соединения будут сделаны для вас: переходите к следующему шагу!

Если вы решили подключить датчик напрямую к Raspberry Pi с помощью Pimoroni или другой переходной платы, то главное обеспечить правильное подключение описанных выше контактов (SDA, SCK, 3V3 и GND).



Полезный сайт для работы с GPIO на Raspberry Pi — pinout.xyz; он ясно показывает, что нам нужны контакты 1 (3V3 питание), 3 (SDA), 5 (SCL) и 9 (земля). 40-контактный GPIO является стандартным для Pi 2 и более поздних версий. Если используете плату Pimoroni, то контакты находятся в правильном порядке для соединения плат. Обратите внимание, как надпись на плате соответствует диаграмме распиновки выше.



Но если подключить датчик таким образом, то на показания будет влиять тепло от процессора Raspberry Pi. Чтобы собирать более точные показания, нужно вынести датчик с платы: делаем это кабелями DuPont папа-мама (или Jumper Jerky), как показано ниже:



Аналогично, если вы используете другой датчик, где диаграммы распиновки не совпадают точно, то можете подключить эти платы к Pi тем же методом. Главное — обеспечить соответствие 3V3, SDA, SCL и GND. Если на плате есть контакты для SDI, SDO, CS — можете их игнорировать, поскольку они используются для альтернативного интерфейса SPI, который мы в этом проекте не используем.

На приведённых выше фотографиях у нас Raspberry Pi 3A+, но подходит и Pi Zero в качестве более дешёвого решения.

Настройка Raspberry Pi


Мы собираемся прошить SD-карту операционкой balenaOS, привязавшись к облаку balenaCloud, добавить туда своё устройство и настроить проект таким образом, чтобы позже его можно было легко обновить.

Сначала требуется настроить учётную запись balenaCloud. Это значит регистрация, добавление приложения и добавление устройства.

Шаг 1. Зарегистрируйтесь в balenaCloud


Если у вас уже есть аккаунт GitHub или Google, его можно использовать для входа в систему минуя процесс регистрации.

Шаг 2. Cоздание приложения


Добавьте приложение, выбрав правильный тип устройства и Starter в качестве типа приложения, затем нажмите Create New Application. Этот тип поддерживает все микросервисы и бесплатен до десяти устройств.

Далее вы попадёте в панель мониторинга для вновь созданного приложения, где можете перейти к следующему шагу и добавить устройство. Можете дать приложению произвольное имя, но оно понадобится позже в руководстве, когда будем писать код.

Шаг 3. Добавьте устройство и загрузите ОС


После создания приложения можете добавить устройство в этом приложении, нажав зелёную кнопку Add Device. При добавлении устройства укажите правильный тип устройства. Если подключаетесь к беспроводной сети, можете установить свой SSID WiFI и парольную фразу.

Примечание: в анимации указан Raspberry Pi 3, не забудьте выбрать правильный тип своего устройства!



Этот процесс создаёт настраиваемый образ для приложения и типа устройства, который включает параметры сети, если они указаны.

Примечание: для начала лучше выбрать dev-образ, чтобы провести какие-то тесты и устранить неисправности. Более подробную информацию о различиях между образами development и production см. здесь. Если вы уверены, что можете приступить к развёртыванию производственного образа прямо сейчас — пожалуйста.

Шаг 4. Запись SD-карты и загрузка устройства


Когда образ ОС загружен, пришло время прошить SD-карту. Для этого можно использовать balenaEtcher.



После завершения процесса вставьте SD-карту в Raspberry Pi и подключите источник питания.



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



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

Развёртывание ПО


Когда ваш Raspberry Pi подготовлен, загружен и подключён к balenaCloud, вы готовы установить на устройство код приложения.

Установка инструментов balena CLI на рабочую станцию


BalenaCloud позволяет удалённо передавать на Raspberry Pi и другие устройства прикладное программное обеспечение/код. Чтобы это стало возможным, ваша рабочая станция (не Raspberry Pi) должна соответствовать неким минимальным требованиям по части программного обеспечения. Примечание: Для успешного развёртывания этого проекта вам не нужно запускать какие-либо команды на самом устройстве ни через SSH, ни с панели мониторинга balenaCloud. Всё делается удалённо!

Если у вас на компьютере уже есть (или вы можете настроить) npm, то это самый быстрый способ запустить инструменты CLI. Есть ещё бинарники для Windows, macOS и Linux. Примечание: если вы уже установили эти инструменты для других наших проектов, можете пропустить эту часть и перейти непосредственно к следующему шагу.

Документация для инструментов CLI описывает установку и настройку пакета npm, а также бинарников.

Когда у вас установлен и работает CLI, первый шаг — войти в balenaCloud, выполнив команду balena login:





Когда есть рабочий CLI, который зарегистрирован в учётной записи, вы готовы к установке программ на Raspberry Pi.

Загрузка проекта с GitHub


Следующим шагом является загрузка кода для этого проекта с GitHub.

Синяя кнопка загрузит zip-файл проекта, но если вы уже знакомы с Git, то можете использовать git clone обычным способом.

Установка на Raspberry Pi


Поскольку CLI и последний код установлены, можно одной командой запушить этот код на balenaCloud. Там собирается и настраивается образ Docker, который запустится на вашем устройстве.

Из каталога проекта после его распаковки выполните команду balena push <appName>, где appName — это имя приложения, заданное в начале руководства. Например, balena push balenaSense.

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



В первый раз загрузка может занять несколько минут (в зависимости от скорости вашего интернет-соединения), но потом загружаются только изменения в контейнере, поэтому всё происходит намного быстрее.

Примечание: когда приложение запускается впервые (и вы используете BME680, а не Sense HAT), датчик примерно пять минут выполняет 'burn-in'. В течение этого периода показания не будут сниматься и вставляться в базу данных. Приложение будет записывать обратный отсчёт, что и отобразиться в панели balenaCloud:



Когда отсчёт достигнет нуля, вы увидите сообщение ‘Starting loop…`. После этого показания будут сниматься и вставляться в базу данных каждые 10 секунд.

Просмотр панели мониторинга


Надеюсь, вы прошили устройство, подключили к сети и запустили без особых проблем. Одно из больших преимуществ использования бесплатного аккаунта balenaCloud — функция Public Device URL.



Активируйте этот переключатель и нажмите значок с синей стрелкой для доступа к панели мониторинга. Можете поделиться этой ссылкой или добавить её в закладки телефона или другого устройства. Пока устройство balenaSense подключено и работает, на панель мониторинга можно посмотреть откуда угодно!



Если не хотите включать публичный доступ, вы всё равно можете просматривать панель мониторинга из собственной локальной сети по IP-адресу, как видно на скриншоте вверху. Ваш будет отличаться, но достаточно ввести в браузере http://<ip-адрес>, и вы всё равно получите доступ к панели мониторинга, если находитесь в той же сети, что и устройство. Например, для доступа к моему устройству я бы ввёл http://10.1.231.36.

Если хотите войти в Grafana и поиграться с настройками, то учётные данные по умолчанию admin и admin.

Как это работает?


У этого проекта три основных компонента, три сервиса. Эти названия есть на панели мониторинга balenaCloud:

  • InfluxDB — база данных, используемая для хранения показаний датчика
  • Sensor — библиотека Python и код для доступа к датчику, снятия показаний и сохранения их в БД
  • Grafana — используется для создания панели мониторинга с графиками и отчётами

Датчик BME680 от Bosch определяет температуру, влажность, давление и газоустойчивость. Датчики температуры, влажности и давления работают сразу из коробки, но показания газоустойчивости сами по себе не очень полезны. Это индикаторы изменения состава воздуха. Когда датчик начинает работу, он устанавливает базис, а затем контролирует изменения. Индикативные показатели качества воздуха приведены в процентах и учитывают влияние влажности и газоустойчивости.

Если вы используете Sense HAT, где нет сенсора газоустойчивости, мы аппроксимируем показания качества воздуха на основе целевых значений температуры и влажности.

Что дальше?


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

Измените пароль


Если открываете устройство для публичного доступа, рекомендуется изменить пароль для Grafana.



Мы установили систему с именем пользователя и паролем по умолчанию admin admin. Чтобы их изменить, войдите в Grafana с помощью кнопки в левом нижнем углу панели. Вам будет предложено изменить пароль при первом входе в систему.

Настройка на свой вкус


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



Можете настроить каждую панель Grafana, наведя курсор на заголовок и перейдя к редактированию. Рекомендую поиграться с параметрами — изменения в панели мониторинга не сохраняются автоматически, так что если сделаете ошибку, то достаточно просто перезагрузить страницу, и всё вернётся в исходный вид. Если хотите сохранить изменения, нажмите Save в верхней части панели управления, и все настройки будут сохранены на вашем устройстве.



Также можете настроить датчики. Например, на диаграмме манометра мы настроили несколько основных диапазонов и текстовые значения вместо цифр. Всё это меняется на ваш вкус!

Корпус


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

Метеорологические будки есть в продаже, но они могут быть довольно дорогими, поэтому рассмотрите DIY-варианты.

На Thingiverse есть несколько корпусов BME680 и метеорологических будок.

Последние мысли


Спасибо за чтение! Если вы решили построить собственную метеорологическую станцию с контролем качества воздуха — расскажите, как всё прошло, какие возникли проблемы. Идеи по развитию нашего проекта можно высказывать на форумах.
Поддержать автора
Поделиться публикацией

Комментарии 43

    +6
    Меня сильно смущает вот это вот расплывчатое «качество воздуха», которое ныне так модно. Я могу понять «концентрация газа/паров X», «количество частиц размера Y» и т.д., но «качество воздуха»?..
      –2
      Это комплекс перечисленных вами параметров и еще многих.
        +2
        Простите, но я не верю, что одним датчиком можно измерять и количество частиц и содержание всех вредных газов/веществ. При том, что один только нормальный датчик CO2 имеет размеры в сотни раз больше и стоит дороже.
        Или он просто реагирует на любую органику в воздухе как распространенные датчики разных газов? Зашел в помещение человек с похмелья — и качество воздуха упало ниже плинтуса? :)
        ЗЫ: посмотрел даташит. Как я и предположил — показывает органические соединения в воздухе. Но ни пыль, ни углекислый газ в оценке качества не участвуют. То есть он может показывать прекрасное качество воздуха там, где уже дышать нечем и отвратительное качество там, где ничего особо вредного нет.
          0
          То, что этот конкретный датчик не может мерить все, не значит, что понятия «качество воздуха» не существует.

          Вас же «смущает вот это вот расплывчатое «качество воздуха»» а не конкретный датчик?
        0
        По сути BME680 меряет концентрацию органических летучих веществ (этанол, ацетон, изопрен, продукты дыхания и т. д), вот чуть подробней.

        Т.е. нормальный датчик Co2 не заменит, больше «на поиграться»
          +3
          Он никакой датчик CO2 не заменит, потому что вообще не измеряет его.
          0
          имел дело с этим датчиком. Там это самое «качество» высчитывается из суммы двух параметров с разными вЕсами в пересчете на проценты. Первый параметр — это текущая влажность воздуха относительно комфортной. Второй — это сопротивление воздуха в Омах. Причем в «качество» входит не само сопротивление, а его флуктуации. То есть берется N измерений сопротивления воздуха и смотрится отклонение показания последнего измерения от среднего значения предыдущих N измерений. Чем меньше флуктуации, тем лучше. Видимо это логичнее назвать показателем однородности воздуха ))
            0
            А подробнее по коэффициентам где можно посмотреть?

            Поставил MQ-135 на управление вентиляцией в туалете, результат радует. Вот думаю на BME680 переходить.
              0
              как я понял, bosch держит в секрете методику расчета этого «качества». Пользователям дается готовая библиотека для использования, без сорцов. Я ковырял эту библиотеку для понимания логики работы. Как автор узнал методику расчета — не знаю… как и то, является ли она официальной
          0
          Technical info на BME680 не поясняет как именно оценивается качество воздуха, а Datasheet ведёт на 404 страницу. А значит не нужно.
            0
            Ну, в даташите слегка описано:
            Besides ethanol (EtOH) as a target test gas, the sensors are also tested with breath-VOC (b-VOC). The b-VOC mixture, as listed in Table 5, represents the most important compounds in an exhaled breath of healthy humans. The values are derived from several publications on breath analysis studies. The composition does not contain species which would chemically react to ensure that the mixture is stable for at least 6 months. Furthermore, the composition is also limited to species which can be manufactured in one mixture.

            И дальше:
            BME680 is a metal oxide-based sensor that detects VOCs by adsorption (and subsequent oxidation/reduction) on its sensitive layer. Thus, BME680 reacts to most volatile compounds polluting indoor air (one exception is for instance CO2). In contrast to sensors selective for one specific component, BME680 is capable of measuring the sum of VOCs/contaminants in the surrounding air. This enables BME680 to detect e.g. outgassing from paint, furniture and/or garbage, high VOC levels due to cooking, food consumption, exhaled breath and/or sweating.

            То есть на CO2 он не реагирует, зато реагирует на почти любую органику. Ну и твердые частицы проходят мимо.
            Честно говоря, даже не знаю зачем нужна такая оценка качества воздуха :)
              0
              О, спасибо, там и табличка есть:
              * Этан
              * Этанол
              * Ацетон
              * Угарный газ
              * и Изопре́н (2-метилбута-1,3-диен)
              при этом не сразу, а начиная с какого-то порогового значения. И есть подозрение, что например он не годится для детекта угарного газа, ибо среагирует слишком поздно.
            0
            Было бы интересно сделать сравнение в виде графика как покажут себя 2 датчика BME680 и какой-нибудь MH-Z19, работающие одновременно.
            Ведь сам человек является не маленьким таким источником загрязнения. Я слабо представляю ситуацию, когда в жилом/офисном помещении будет повышаться уровень CO2, но НЕ ацетона и прочего естественного выхлопа.
            С другой стороны, если в уголочке сложить пахнущую обувь, то вроде как CO2 в норме, но вот дышать этим не сильно приятно. А если арома-масло использовать, то пахнет приятно, уровень CO2 не должен бы расти, но BME наверняка будет не доволен. Нужны тесты.
            Сам пока планирую к покупке BME, у коллеги есть MH-Z19 в умном доме, может ради интереса попробуем их свести в месте.
              0
              В офисе может быть. А вот если у вас на кухне газ, то плита может в некоторых режимах генерировать чудовищное количество Co2, которые не факт, что этот датчик поймает.
                0
                Да не ловит он CO2 вообще, об этом прямо сказано в даташите:
                reacts to most volatile compounds polluting indoor air (one exception is for instance CO2)
                  0
                  Тут выше человек утверждает, что в общем случае их показания вполне себе коррелируют.
                    +2

                    Если Вы про меня, то не утверждаю, а говорю, что интересно сравнить.

                  0

                  О таком случае не думал. Мне ближе офис, дабы было проще проветрить, когда некоторым индивидумам холодно и дует.
                  И просто измерять в комнате, что бы видеть показатели за ночь, результат проветривания и т.д.


                  Сейчас у меня в комнате трудится дешёвый китайский MQ-135. К сожалению не заведён на графану, а только на Serial plotter. Никак не откалиброван. Тем не менее, он "чует" когда надышали, отсюда желание попробовать что-то более чувствительное.

                  0
                  Области их интересов не пересекаются, так что и сравнивать нечего :)
                    0
                    вот, пожалуйста.
                    Спойлер
                    image
                    image
                      0
                      Спасибо!
                      Я правильно понимаю, что график «Сопротивление» это то самое качество воздуха с BME, а график CO2 это данные о концентрации с MH-Z или подобного? Если нет, поясните пожалуйста.
                        0
                        Датчик непосредственно измеряет 4 величины: температуру, влажность, давление и сопротивление. «Качество» — это расчетная величина на основе влажности и сопротивления. Вот в этом комменте и чуть ниже подробнее
                          0
                          Тогда судя по графику данные вполне себе коррелируют и принять решение о необходимости проветривать помещение можно с достаточно высокой достоверностью.
                    0
                    Мерить влажность воздуха при отрицательных температурах ниже -15, не получится, датчик сразу покрывается изморозью и показывает 99.9. Нужно для корректного измерения влажности обеспечить принудительную циркуляцию воздуха, вентилятором например. По крайней мере это мой опыт.
                      0
                      Что такое «газоустойчивость»? В оригинале «gas content» — это содержание газа.
                      0
                      странная мода пошла: под каждый проект своя OS.
                      Зачем? Нельзя было сделать на Raspbian?
                        0
                        Можно было даже на микроконтроллере (STM, Arduino). Но не было бы столько громких названий :)
                        Вот отображение данных с автономной станции на STM32 с GSM-модемом:
                        Заголовок спойлера

                          0
                          Недавно собрал монитор на контроллере ESP8266 (wemos d1 mini + nodemcu firmware) и датчиках: BME680 + mh-z19 + BH1750. Отлично работает без избыточных Raspberry Pi, не говоря уже про разницу в ценах. Если бы не прожорливость и привередливость mh-z19, то можно было бы питать это от аккумулятора. Подключил все это к HomeAssistant — полет отличный!
                            0
                            ESP8266 + BME280(Lolin v3 + arduino) через MQTT на Ubuntu сервер, где крутятся графана и OpenHAB2, всё прикрыто nginx proxy pass.
                            Графана таки удобная что бы смотреть исторические данные. Графики динамические. Можно подключить collectd. В моём случае смотрю что с самим NAS, а так же OrangePi Zero, что обслуживает 3D принтер.
                            Всецело советую.
                              0
                              Так у вас HomeAssistant как раз на Raspberry Pi или чем-то подобном?
                                0

                                Да, homeassistant как раз на raspberry pi

                              0
                              Как я понял тут смысл в том, что минимум делать руками, т.е. не надо ставить графану, инфлюкс, писать скрипт для опроса датчиков. Не лезем в конфиги и пр. Я тут вижу подход/фмлософию аналогично голый МК или Ардуино. Имеет право на жизнь.
                              0

                              а есть какие-нибудь потребительские датчики, чтобы диоксины в воздухе измерять (когда помойки горят)?

                                +1
                                У диоксинов ПДК в воздухе измеряется нано и пикограммами на кубометр. Газовый хроматограф кажется наиболее потребительским для таких целей.
                                  0
                                  А они доступные для потребителя существуют? Кстати, если в воздухе может быть диоксин, то стоит думать уже о глухих стеклопакетах и вентиляции на подветренную сторону.
                                    0
                                    Нет, конечно. Стоило взять слово «потребительский» в саркастические кавычки. Это громоздкие аппараты размером с половину письменного стола и стоимостью под миллион рублей и больше. Однажды был на санэпидемстанции на экскурсии, наблюдал процесс анализа воздуха. Серьезный процесс. В принципе такой анализ можно провести по заказу. Пробу воздуха возьмут и проанализируют. Но дома мониторить диоксины не получится, очень уж мизерные концентрации.
                                      0
                                      Надо было. Брали подержанный за 7000 евро, очень радовались, что дёшево выцепили.
                                0
                                Эта штука умеет засылать данные на narodmon.ru?
                                  0
                                  Ещё бы на breathe.moscow.
                                  Вообще, несколько напрягает, что снова предлагается пилить свой велосипед, который ни с чем не интегрирован. Сразу возникает вопрос: зачем это все? Вот статья на него совсем не отвечает. Вряд ли кто-то планирует каждый день смотреть графики в Графане.
                                  +1
                                  Простите, но это шутка такая?

                                  Вы завели RPI, оборудование, фреймворки, проекты, докеры, графаны, развертывания ПО, облака, чтобы считывать полторы цифры с устройства, показывающего погоду на Марсе?

                                  Мда. Постарел я. Раньше это все делалось в четыре строчки на пыхе\питоне, или вообще баше через i2cget, а если уж очень хотелось в веб, то писалось в промежуточный файл типа /dev/co2 или /tmp/co2.txt и оттуда дергалось пыхом или перлом.

                                  image

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

                                  Даже тестов не провели. Не написали как изменяется «качество» воздуха утром и вечером. Что будет если зажечь спичку или включить кондиционер. А если не горение, а тление (например угля от кальяна), как это влияет на качество воздуха. Пукнуть. Или пригласить знакомого с перегаром после вчерашнего.
                                  А самое главное — линейна ли зависимость вашего (а может и ваших близких-подопытных) состояния здоровья от показателей «качества» воздуха.

                                    0
                                    Дети стареют — лего усложняется. Всё путём.
                                    0
                                    не совсем понял (видимо пятница), инфлюкс с графаной на Pi заливаются в итоге? если так, то это же дикость)

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

                                    Самое читаемое