diff --git a/README.md b/README.md index 9e8a9c1..065fe00 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Введение -Данная практика посвещена базовым принципам Docker. Для выполнения практики необходимо использовать 3 виртуальные машины Linux. +Данная практика посвещена базовым принципам Docker. Для выполнения практики необходимо развернуть контейнеры на локальном хосте. # Задание @@ -7,57 +7,125 @@ ![image](assets/images/DockerTask.png) -Симуляторы сенсоров, развернутые в докер контейнерах, публикуют сообщения на Mqtt брокер. Сервис Consumer подписывается на все сообщение, -опубликованные в брокере, и заносит их в базу данных временных рядов. Сервис dashboard отображает графики полученных данных от сервисов. - -Для выполнения данного задания необходимо: -1. Использовать три виртуальные машины из предыдущей практики. Установить на каждой docker и docker-compose. - -2. Linux A. - 1. Разработать скрипты - симулятор технологических данных. Создать класс Sensor, а также наследников этого класса (указать 4 реально существующих типа датчиков, например, температура, давление, потребляемый ток). - 2. В основной программе реализовать клиента, который подключается к mqtt брокеру и публикует сообщения. - 3. Конфигурацию типов датчиков вывести через переменные среды - 4. Запуск реализовать с помощью докер контейнеров. Для запуска нескольких типов использовать docker-compose. - 5. В итоге сделать 4 типа датчиков, запустить 6 контейнеров разных типов, где задается: - * тип датчика - * название датчика - * дискретность публикации сообщений - * (ДОП ЗАДАЧА, НЕОБЯЗАТЕЛЬНО) тип формулы (подумайте как можно через конфигурацию повлиять на характер генерации нового числа) - * в формуле предусмотрите в качестве операнда дату вашего рождения (например умножение на год рождения или месяц) - * (ДОП ЗАДАЧА, НЕОБЯЗАТЕЛЬНО) тип топика (json формат (topic - /sensor/type, value {"name":"sensor1", "value": 22.4} ) или значение в конкретный топик (topic - /sensor/type/value, value - 22.4)) - 6. Залить на свою страницу в докерхаб созданный image контейнера в публичный репозиторий. - -3. Linux B - 1. Развернуть mosquitto брокер с помощью docker. Настроить проброс портов, необходимый для работы приложения. - 2. Настроить конфигурационный файл для брокера. Использовать volume для подгрузки файла в докер. - 3. В файрволе открыть порт, необходимый для работы брокера. -4. Linux C - 1. Развернуть influxdb (1.8 версия), telegraf, grafana с помощью docker-compose - 2. Настроить подписку телеграфа на mqtt топики брокера - 3. Сохранять все сообщения в influxdb - 4. В grafana вывести дашборды с текущими значениями всех датчиков и агрегированными показаниями (среднее значение по всем датчикам) - сделать скриншот - 5. Необходимо создать volume для каждого контейнера с конфигурационными файлами. (ДОП ЗАДАЧА, НЕОБЯЗАТЕЛЬНО) При пересоздании контейнеров конфигурация дашбордов должна сохранится (без самих данных). - 6. В конфигурационных файлах ссылаться по alias контейнеров (не по ip адресам) -5. При загрузки задания в гит репозиторий создать две ветки develop и master. В master загрузить только readme - задание. - В ветку develop - загружаем сделанное задание. Как только отправляете мне на проверку задание, создаете пул реквест в ветку мастер и назначаете меня ревьювером. Таким образом я смогу комментировать ваш репозиторий. -6. Оформить инструкцию в виде Markdown файла. Приложить конфигурационные файлы в репозиторий. - Критерием успеха выполнения задания будет являтся также написанная инструкция по запуску ваших контейнеров. То есть, если я загружу с докерхаба ваш image, запущу docker-compose файлы на своих виртуальных машинах, и при этом смогу зайти в интерфейс и посмотреть дашборд с потоком данных, то задание выполнено. - -Репозиторий оформить следующим образом: -- root - - assets - - images - картинки для отчета - - vms - - client - - simulator - код симулятора и докерфайл - - gateway - - mosquitto - папка с конфигом для mosquitto + sh скрипт по запуску докера - - server - - grafana - конфиги для тома графаны - - influxdb - конфиги для тома инфлукса - - telegraf - конфиги для тома телеграфа - - docker-compose.yml - - - report.md - Отчет markdown - -P.S. опираться можно на данную [статью](https://coderlessons.com/articles/programmirovanie/raspberry-pi-iot-datchiki-influxdb-mqtt-i-grafana) +Симуляторы сенсоров, развернутые в докер контейнерах, публикуют сообщения на Mqtt брокер. Сервис Consumer подписывается на все сообщение, опубликованные в брокере, и заносит их в базу данных временных рядов. Сервис dashboard отображает графики полученных данных от сервисов. + +# Решение +# Настройка в client'e + +В начале работы нам необходимо создать еще один класс датчиков в файле `sensor.py`, было решено добавить датчик влажности (humidity). Датчик гененрирует процет влажности в пределах от 30% до 70%. + + +

+ +

+ + +Мы добавили датчик, теперь внесем измнения и в файл 'main.py' + +

+ +

+ +С датчиками готово. Настроим Dockerfile: + +

+ +

+ +Докерфайл готов. Можем перейти к следующему шагу - настройка requirements. + +

+ +

+ +Теперь сбилдим образ + +

+ +

+ +# Настройка gateway (mqtt-брокер) + +Для начала создадим файл mosquitto.conf. + +

+ +

+ +Далее создаём файл docker-compose.yml + +

+ +

+ +Запускаем и видим, что, брокер работает + +

+ +

+ +Подправим наш 'docker-compose.yml' в client'e + +

+ +

+ +Обновим docker-compose командой 'docker-compose up' +Присоедимся к брокеру и увидим ответ от брокера + +

+ +

+ +# Настройка server'a + +В первую очередь настроим telegraf, так как он получает данные с mqqt-брокера, а затем сохраняются в InfluxDB и визуализируются в Grafana. В 'telegraf.conf' необходимо настроить следующее: + +

+ +

+ +Теперь telegraf читает данные с 1883 порта по IP 192.168.0.112 + +Посмотрим работу наших образов + +

+ +

+ +Поднимем Grafana на 3000 порту + +

+ +

+ +Залогинимся + +

+ +

+ +Посмотрим на отображение данных, имеется ли оно + +

+ +

+ +Все работает, можем приступить к настройке графиков + +# Настройка графиков + +Посмотрим, что мы видим InfluxDB в Grafana + +

+ +

+ +Все ок, переходим к выводу графиков. Нам нужно вывести все наши сенсоры (Pressure, Temperature, Humidity, Current) + +

+ +

+ +Все готово, на этом наше задание выполнено. + diff --git a/assets /images/Dockerfile.jpeg b/assets /images/Dockerfile.jpeg new file mode 100644 index 0000000..d061178 Binary files /dev/null and b/assets /images/Dockerfile.jpeg differ diff --git a/assets /images/Grafana on.jpg b/assets /images/Grafana on.jpg new file mode 100644 index 0000000..1eabaed Binary files /dev/null and b/assets /images/Grafana on.jpg differ diff --git "a/assets /images/InfluxDB \320\262 \320\263\321\200\320\260\321\204\320\260\320\275\320\260.jpg" "b/assets /images/InfluxDB \320\262 \320\263\321\200\320\260\321\204\320\260\320\275\320\260.jpg" new file mode 100644 index 0000000..2a109ff Binary files /dev/null and "b/assets /images/InfluxDB \320\262 \320\263\321\200\320\260\321\204\320\260\320\275\320\260.jpg" differ diff --git "a/assets /images/docker-compose \320\264\320\273\321\217 client.jpg" "b/assets /images/docker-compose \320\264\320\273\321\217 client.jpg" new file mode 100644 index 0000000..4dc209e Binary files /dev/null and "b/assets /images/docker-compose \320\264\320\273\321\217 client.jpg" differ diff --git "a/assets /images/docker-compose \320\264\320\273\321\217 gateway.jpg" "b/assets /images/docker-compose \320\264\320\273\321\217 gateway.jpg" new file mode 100644 index 0000000..a9300be Binary files /dev/null and "b/assets /images/docker-compose \320\264\320\273\321\217 gateway.jpg" differ diff --git a/assets/images/DockerTask.png b/assets /images/imagesDockerTask.png similarity index 100% rename from assets/images/DockerTask.png rename to assets /images/imagesDockerTask.png diff --git a/assets /images/mosquitto.conf.jpg b/assets /images/mosquitto.conf.jpg new file mode 100644 index 0000000..db1ceb8 Binary files /dev/null and b/assets /images/mosquitto.conf.jpg differ diff --git a/assets /images/mqqt.jpg b/assets /images/mqqt.jpg new file mode 100644 index 0000000..6d70e76 Binary files /dev/null and b/assets /images/mqqt.jpg differ diff --git a/assets /images/telegraf.jpg b/assets /images/telegraf.jpg new file mode 100644 index 0000000..0498359 Binary files /dev/null and b/assets /images/telegraf.jpg differ diff --git "a/assets /images/\320\223\321\200\320\260\321\204\320\260\320\275\320\260.jpg" "b/assets /images/\320\223\321\200\320\260\321\204\320\260\320\275\320\260.jpg" new file mode 100644 index 0000000..ad0e730 Binary files /dev/null and "b/assets /images/\320\223\321\200\320\260\321\204\320\260\320\275\320\260.jpg" differ diff --git "a/assets /images/\320\227\320\260\320\277\321\203\321\201\320\272 \320\261\321\200\320\276\320\272\320\265\321\200\320\260.jpeg" "b/assets /images/\320\227\320\260\320\277\321\203\321\201\320\272 \320\261\321\200\320\276\320\272\320\265\321\200\320\260.jpeg" new file mode 100644 index 0000000..5f46f1b Binary files /dev/null and "b/assets /images/\320\227\320\260\320\277\321\203\321\201\320\272 \320\261\321\200\320\276\320\272\320\265\321\200\320\260.jpeg" differ diff --git "a/assets /images/\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 main.jpeg" "b/assets /images/\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 main.jpeg" new file mode 100644 index 0000000..f7923c3 Binary files /dev/null and "b/assets /images/\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 main.jpeg" differ diff --git "a/assets /images/\320\232\320\276\320\275\320\275\320\265\320\272\321\202 \320\272 \320\261\321\200\320\276\320\272\320\265\321\200\321\203.jpeg" "b/assets /images/\320\232\320\276\320\275\320\275\320\265\320\272\321\202 \320\272 \320\261\321\200\320\276\320\272\320\265\321\200\321\203.jpeg" new file mode 100644 index 0000000..a45d368 Binary files /dev/null and "b/assets /images/\320\232\320\276\320\275\320\275\320\265\320\272\321\202 \320\272 \320\261\321\200\320\276\320\272\320\265\321\200\321\203.jpeg" differ diff --git "a/assets /images/\320\236\320\261\321\200\320\260\320\267\321\213.jpg" "b/assets /images/\320\236\320\261\321\200\320\260\320\267\321\213.jpg" new file mode 100644 index 0000000..f78ce78 Binary files /dev/null and "b/assets /images/\320\236\320\261\321\200\320\260\320\267\321\213.jpg" differ diff --git "a/assets /images/\320\236\321\202\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\264\320\260\320\275\320\275\321\213\321\205.jpg" "b/assets /images/\320\236\321\202\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\264\320\260\320\275\320\275\321\213\321\205.jpg" new file mode 100644 index 0000000..b314242 Binary files /dev/null and "b/assets /images/\320\236\321\202\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\264\320\260\320\275\320\275\321\213\321\205.jpg" differ diff --git "a/assets /images/\320\241\320\265\320\275\321\201\320\276\321\200\321\213 \320\270 \320\263\321\200\320\260\321\204\320\270\320\272\320\270.jpg" "b/assets /images/\320\241\320\265\320\275\321\201\320\276\321\200\321\213 \320\270 \320\263\321\200\320\260\321\204\320\270\320\272\320\270.jpg" new file mode 100644 index 0000000..08992e5 Binary files /dev/null and "b/assets /images/\320\241\320\265\320\275\321\201\320\276\321\200\321\213 \320\270 \320\263\321\200\320\260\321\204\320\270\320\272\320\270.jpg" differ diff --git "a/assets /images/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\272\320\273\320\260\321\201\321\201\320\260.jpeg" "b/assets /images/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\272\320\273\320\260\321\201\321\201\320\260.jpeg" new file mode 100644 index 0000000..ed36700 Binary files /dev/null and "b/assets /images/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\272\320\273\320\260\321\201\321\201\320\260.jpeg" differ diff --git "a/assets /images/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\276\320\261\321\200\320\260\320\267\320\260.jpeg" "b/assets /images/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\276\320\261\321\200\320\260\320\267\320\260.jpeg" new file mode 100644 index 0000000..32b6968 Binary files /dev/null and "b/assets /images/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\276\320\261\321\200\320\260\320\267\320\260.jpeg" differ diff --git a/guide/manual.md b/guide/manual.md deleted file mode 100644 index 5f2410a..0000000 --- a/guide/manual.md +++ /dev/null @@ -1,114 +0,0 @@ -### Ubuntu_1 -1. Написать код симулятора - * Использовать класс sensor и наследников - * Использовать переменные среды для конфигурирования - -2. Показать настройку деплоя (через pycharm ssh) -3. Показать запуск через докер -```shell -docker build -t antonaleks/sensor-sim . -docker run -e SIM_HOST=192.168.0.114 -e SIM_TYPE=temperature --name temperature antonaleks/sensor-sim -docker push antonaleks/sensor-sim -``` -4. Продемонстрировать запуск через docker-compose двух сенсоров (пример в репозитории) - -### Ubuntu_2 -1. Загрузить mosquitto брокер, создать mosquitto.conf файл -2. Запустить контейнер с привязкой к порту и загрузкой conf файла в систему -```shell - docker run -v $PWD/mosquitto:/mosquitto/config -p 1883:1883 --name broker --rm eclipse-mosquitto -``` -3. Проверить через mqtt explorer - -### Ubuntu_3 -1. influx - развернуть контейнер, указать точки монтирования - 1. Запустить контейнер с БД с приатаченным volume (версия 1.8) - ```shell - sudo docker run -d -p 8086:8086 -v influx:/var/lib/influxdb --name influxdb influxdb:1.8 - ``` - 2. Запустить в контейнере influxdb - ```shell - CREATE database sensors - USE sensors - CREATE USER telegraf WITH PASSWORD 'telegraf' WITH ALL PRIVILEGES - ``` -2. Telegraf - сконфигурировать как в гайде - 1. Получить конфигурационный файл - ```shell - sudo docker run --rm telegraf telegraf config > telegraf.conf - ``` - 2. Вставить следующую конфигурацию: - ```shell - # в блок mqtt_consumer - servers = ["tcp://192.168.1.1:1883"] # адрес vm с mqtt-брокером - topics = [ - "sensors/#" - ] - data_format = "value" - data_type = "float" - - # в блок [outputs.influxdb] - urls = ["http://192.168.26.10:8086"] # адрес докера с influxdb (указать alias при docker-compose) - database = "sensors" - skip_database_creation = true - username = "telegraf" - password = "telegraf" - ``` - 3. Запустить телеграф - ```shell - sudo docker run -v $PWD/telegraf:/etc/telegraf:ro -d telegraf - ``` -3. Сконфигурировать grafana через интерфейс - 1. Запустить контейнер с графаной - ```shell - sudo docker run --rm -d grafana/grafana - ``` - 2. Экспортировать grafana.ini на хост файл - ```shell - sudo docker exec -it cat /etc/grafana/grafana.ini > grafana.ini - ``` - 3. Запустить контейнер - ```shell - sudo docker run -p 3000:3000 -v $PWD/grafana:/etc/grafana -v grafana-data:/var/lib/grafana --name grafana -d grafana/grafana - ``` - 4. Сконфигурировать через веб-интерфейс доступ к influxdb. IP адрес указать виртуальной машины. Логин пароль telegraf, бд sensors - 5. Удалить контейнер и volume. Создать на хост папке в grafana/provising две папки dashboards и datasources - В папке datasources создать default.yaml со следующим содержимым: - ```yaml - apiVersion: 1 - - datasources: - - name: InfluxDB_v1 - type: influxdb - access: proxy - database: site - user: telegraf - url: http://192.168.1.10:8086 - jsonData: - httpMode: GET - secureJsonData: - password: telegraf - ``` - - в папке dashboards создать default.yaml - ```yaml - apiVersion: 1 - - providers: - - name: 'mqtt' - orgId: 1 - folder: '' - type: file - disableDeletion: false - editable: true - allowUiUpdates: true - options: - path: /etc/grafana/provisioning/dashboards - ``` - Также сгенерировать график в grafana вручную и скопировать json графика. Этот json залить в папку с dashboards - -4. Сконфигурировать запуск контейнеров через docker-compose - 1. Запустить с созданием отдельной сети для докеров, при этом везде в конфигурационных файлах заменить ссылку на alias (см. docker-compose.yml) - - -[Исходная статья](https://coderlessons.com/articles/programmirovanie/raspberry-pi-iot-datchiki-influxdb-mqtt-i-grafana) \ No newline at end of file diff --git a/vms/client/simulator/docker-compose.yml b/vms/client/simulator/docker-compose.yml index b9e08bb..530a677 100644 --- a/vms/client/simulator/docker-compose.yml +++ b/vms/client/simulator/docker-compose.yml @@ -2,23 +2,30 @@ version: "3" services: temp_sensor: - image: antonaleks/data-simulator + image: hanz0m4/data-simulator environment: - - SIM_HOST=192.168.1.1 - - SIM_NAME=TIRCAHL24 - - SIM_PERIOD=5 + - SIM_HOST=192.168.0.112 + - SIM_NAME=TEMPER1 + - SIM_PERIOD=4 - SIM_TYPE=temperature pressure_sensor: - image: antonaleks/data-simulator + image: hanz0m4/data-simulator environment: - - SIM_HOST=192.168.1.1 - - SIM_NAME=PIRCAHL11 - - SIM_PERIOD=10 + - SIM_HOST=192.168.0.112 + - SIM_NAME=PRESS1 + - SIM_PERIOD=6 - SIM_TYPE=pressure current_sensor: - image: antonaleks/data-simulator + image: hanz0m4/data-simulator environment: - - SIM_HOST=192.168.1.1 + - SIM_HOST=192.168.0.112 - SIM_NAME=A0_CURRENT - - SIM_PERIOD=1 + - SIM_PERIOD=8 - SIM_TYPE=current + humidity: + image: hanz0m4/data-simulator + environment: + - SIM_HOST=192.168.0.112 + - SIM_NAME=HUMID1 + - SIM_PERIOD=4 + - SIM_TYPE=humidity diff --git a/vms/client/simulator/entity/sensor.py b/vms/client/simulator/entity/sensor.py index 922fea5..8ff91ff 100644 --- a/vms/client/simulator/entity/sensor.py +++ b/vms/client/simulator/entity/sensor.py @@ -52,3 +52,16 @@ def generate_new_value(self): import math self.value = math.sin(self.step) self.step = self.step + 1 + + +class Humidity(Sensor): + step = 0 + + def __init__(self,name): + super().__init__(name) + self.type = "humidity" + + def generate_new_value(self): + self.value = 30+40*random.random() + self.step = self.step + 5 + diff --git a/vms/client/simulator/main.py b/vms/client/simulator/main.py index 4d17730..1632f9a 100644 --- a/vms/client/simulator/main.py +++ b/vms/client/simulator/main.py @@ -9,7 +9,7 @@ name = "sensor" if "SIM_NAME" not in environ.keys() else environ["SIM_NAME"] period = 1 if "SIM_PERIOD" not in environ.keys() else int(environ["SIM_PERIOD"]) type_sim = "temperature" if "SIM_TYPE" not in environ.keys() else environ["SIM_TYPE"] -sensors = {"temperature": Temperature, "pressure": Pressure, "current": Current} +sensors = {"temperature": Temperature, "pressure": Pressure, "current": Current, "humidity": Humidity} def on_publish(client, userdata, result): # create function for callback diff --git a/vms/gateway/docker-compose.yml b/vms/gateway/docker-compose.yml new file mode 100644 index 0000000..3aa4263 --- /dev/null +++ b/vms/gateway/docker-compose.yml @@ -0,0 +1,9 @@ +version: "3" +services: + broker: + image: eclipse-mosquitto + container_name: broker + volumes: + - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf + ports: + - "1883:1883" diff --git a/vms/gateway/mosquitto/mosquitto.conf b/vms/gateway/mosquitto/mosquitto.conf deleted file mode 100644 index c8348ac..0000000 --- a/vms/gateway/mosquitto/mosquitto.conf +++ /dev/null @@ -1,2 +0,0 @@ -listener 1883 -allow_anonymous true diff --git a/vms/server/infra/grafana/provisioning/dashboard/mqtt.json b/vms/server/infra/grafana/provisioning/dashboard/mqtt.json new file mode 100644 index 0000000..ec2644a --- /dev/null +++ b/vms/server/infra/grafana/provisioning/dashboard/mqtt.json @@ -0,0 +1,507 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 7, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 4, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 5, + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "groupBy": [], + "measurement": "mqtt_consumer", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "topic::tag", + "operator": "=", + "value": "sensors/current/A0_CURRENT" + } + ] + } + ], + "title": "Current (time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 3, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 4, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "groupBy": [], + "measurement": "mqtt_consumer", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "topic::tag", + "operator": "=", + "value": "sensors/pressure/PRESS1" + } + ] + } + ], + "title": "Pressure (Давление)", + "type": "timeseries" + }, + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Percentage %", + "axisPlacement": "left", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 7, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 4, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 4, + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "groupBy": [], + "measurement": "mqtt_consumer", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "topic::tag", + "operator": "=", + "value": "sensors/humidity/HUMID1" + } + ] + } + ], + "title": "Humidity (Влажность)", + "type": "timeseries" + }, + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "degrees Celsius", + "axisPlacement": "left", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 8, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 4, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 3, + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "groupBy": [], + "measurement": "mqtt_consumer", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "topic::tag", + "operator": "=", + "value": "sensors/temp/TEMPER1" + } + ] + } + ], + "title": "Temperature (Температура)", + "type": "timeseries" + } + ], + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "New dashboard", + "uid": "cdmf4sxmw3thca", + "version": 6, + "weekStart": "" +} diff --git a/vms/server/infra/telegraf/telegraf.conf b/vms/server/infra/telegraf/telegraf.conf index ddd8b05..a40d74d 100644 --- a/vms/server/infra/telegraf/telegraf.conf +++ b/vms/server/infra/telegraf/telegraf.conf @@ -8558,7 +8558,7 @@ password = "telegraf" # "telegraf/+/mem", # "sensors/#", # ] -servers = ["tcp://192.168.26.1:1883"] # адрес vm с mqtt-брокером +servers = ["tcp://192.168.0.112:1883"] # адрес vm с mqtt-брокером topics = [ "sensors/#" ]