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 @@

-Симуляторы сенсоров, развернутые в докер контейнерах, публикуют сообщения на 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/#"
]