diff --git a/assets/images/img_6Cont.png b/assets/images/img_6Cont.png new file mode 100644 index 0000000..e800f82 Binary files /dev/null and b/assets/images/img_6Cont.png differ diff --git a/assets/images/img_6logRecieved.png b/assets/images/img_6logRecieved.png new file mode 100644 index 0000000..e902021 Binary files /dev/null and b/assets/images/img_6logRecieved.png differ diff --git a/assets/images/img_CreatedImg.png b/assets/images/img_CreatedImg.png new file mode 100644 index 0000000..0a0d780 Binary files /dev/null and b/assets/images/img_CreatedImg.png differ diff --git a/assets/images/img_DONE.png b/assets/images/img_DONE.png new file mode 100644 index 0000000..266c761 Binary files /dev/null and b/assets/images/img_DONE.png differ diff --git a/assets/images/img_Dash.png b/assets/images/img_Dash.png new file mode 100644 index 0000000..1760fd4 Binary files /dev/null and b/assets/images/img_Dash.png differ diff --git a/assets/images/img_DockerBuild.png b/assets/images/img_DockerBuild.png new file mode 100644 index 0000000..3aa0f18 Binary files /dev/null and b/assets/images/img_DockerBuild.png differ diff --git a/assets/images/img_MQTT.png b/assets/images/img_MQTT.png new file mode 100644 index 0000000..933556d Binary files /dev/null and b/assets/images/img_MQTT.png differ diff --git a/assets/images/img_MosqCont.png b/assets/images/img_MosqCont.png new file mode 100644 index 0000000..d6fd7af Binary files /dev/null and b/assets/images/img_MosqCont.png differ diff --git a/assets/images/img_New.png b/assets/images/img_New.png new file mode 100644 index 0000000..e267620 Binary files /dev/null and b/assets/images/img_New.png differ diff --git a/assets/images/img_ServCont.png b/assets/images/img_ServCont.png new file mode 100644 index 0000000..617a137 Binary files /dev/null and b/assets/images/img_ServCont.png differ diff --git a/assets/images/img_Sost.png b/assets/images/img_Sost.png new file mode 100644 index 0000000..d8e3593 Binary files /dev/null and b/assets/images/img_Sost.png differ diff --git a/assets/images/img_Start.png b/assets/images/img_Start.png new file mode 100644 index 0000000..231bb12 Binary files /dev/null and b/assets/images/img_Start.png differ diff --git a/assets/images/img_servLogs.png b/assets/images/img_servLogs.png new file mode 100644 index 0000000..4432f59 Binary files /dev/null and b/assets/images/img_servLogs.png differ diff --git a/report.md b/report.md new file mode 100644 index 0000000..1c83199 --- /dev/null +++ b/report.md @@ -0,0 +1,347 @@ +# *Отчет*: Взаимодействие docker-контейнеров + +**Выполнил** Гавриленко Даниил + +**Группа** 5142704/30801 + +## Симуляция датчиков - генерация данных + +Добавим четвёртый тип датчиков: в файле `sensor.py` создаем четвертый класс *Humidity*, который будет отвечать за датчики влажности. + +```python +class Humidity(Sensor): + step = 0 + + def __init__(self, name): + super().__init__(name) + self.type = "humidity" + + def generate_new_value(self): + import math + self.value = math.sin(self.step) * 1.3 + random.random() * 0.2 + self.step = self.step + 1 +``` +Теперь реализуем клиента, который будет подключаться к mqtt брокеру и публиковать сообщения. Для этого создадим файл `main.py` со следующим кодом: + +```python +import paho.mqtt.client as paho +from os import environ +import time + +from entity.sensor import * + +broker = "localhost" if "SIM_HOST" not in environ.keys() else environ["SIM_HOST"] +port = 1883 if "SIM_PORT" not in environ.keys() else int(environ["SIM_PORT"]) +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, "humidity": Humidity} + + +def on_publish(client, userdata, result): # create function for callback + print(f"data published {userdata}") + pass + + +sensor = sensors[type_sim](name=name) +client1 = paho.Client(sensor.name) # create client object +client1.on_publish = on_publish # assign function to callback +client1.connect(broker, port) # establish connection +while True: + sensor.generate_new_value() + ret = client1.publish("sensors/" + sensor.type + "/" + sensor.name, sensor.get_data()) # publish + time.sleep(period) +``` +Приложение будет развёрнуто в docker контейнер с подключением python-alpine 3.19. +Сконфигурирем файл `Dockerfile` следующим образом: + +``` Dockerfile +FROM python:alpine3.19 +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt +COPY . . +CMD ["python", "main.py"] +``` +Создадим файл *requirements.txt*: +`paho_mqtt==1.6.1` + +Также, добавил текущего пользователя ВМ в группу *docker*: +* `sudo usermod -a -G docker gavrilenko_1` для server +* `sudo usermod -a -G docker gavrilenko_2` для gateway +* `sudo usermod -a -G docker gavrilenko_3` для client + +Теперь создадим образ при помощи команды: +`docker build -t vespuchka/simulator . ` + +

+ +Рисунок 1 - Создание образа +

+ +Получили docker образ, из которого можно развернуть контейнер: + +

+ +Рисунок 2 - Созданный образ +

+ +Сконфигурируем файл *docker-compose.yml*, в котором укажем: +* Тип датчика +* Имя датчика +* Период отправки +* Адрес отправки + +*docker-compose* +```yml +version: "3" + +services: + temp_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=TEMP1 + - SIM_PERIOD=2 + - SIM_TYPE=temperature + + pressure_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=PRESS1 + - SIM_PERIOD=2 + - SIM_TYPE=pressure + + current_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=CUR1 + - SIM_PERIOD=6 + - SIM_TYPE=current + + humidity_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=HUM1 + - SIM_PERIOD=4 + - SIM_TYPE=humidity + + temp_slow_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=TEMP2 + - SIM_PERIOD=15 + - SIM_TYPE=temperature + + humidity_slow_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=HUM2 + - SIM_PERIOD=15 + - SIM_TYPE=humidity +``` + +## Настройка брокера - Mosquitto + +Для настройки брокера необходимо создать конфигурационный файл *mosquitto.conf* со следующим содержимымы: +```c +listener 1883 +allow_anonymous true +``` + +Также сформируем docker-compose файл. +*docker-compose* +```yml +version: "3" +services: + broker: + image: eclipse-mosquitto + container_name: broker + volumes: + - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf + ports: + - "1883:1883" +``` +Напоследок сконфигурируем порты: +``` +sudo iptables -A OUTPUT -o enp0s8 -p tcp --syn --dport 1883 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A OUTPUT -o enp0s9 -p tcp --syn --dport 1883 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A INPUT -i enp0s8 -p tcp --syn --dport 1883 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A INPUT -i enp0s9 -p tcp --syn --dport 1883 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT +``` + +Теперь запустим контейнер с брокером: + +

+ +Рисунок 3 - Запущенный контейнер с брокером +

+ +Далее запустим на ВМ клиента одновременно 6 контейнеров, симулирующих работу датчиков: + +

+ +Рисунок 4 - Запуск 6 контейнеров +

+ +При этом брокер отобразит подключение: + +

+ +Рисунок 5 - Логи брокера при подключении датчиков +

+ +Проверим также данные от датчиков в MQTT explorer: + +

+ +Рисунок 6 - Данные в MQTT explorer +

+ +## Отображение данных + +Отображение будет происходить следующим образом: +* Настроим `Telegraf`, который будет подписываться на MQTT с данными от датчиков +* Эти данные будут сохраняться в `InfluxDB` +* Непосредственное отображение данных с датчиков будет реализовано при помощи `Grafana` + +### Telegraf + +Настроим `Telegraf` - изменим в конфигурационный файле *telegraf.conf* параметр `servers`: + +*telegraf.conf* +```c +servers = ["tcp://192.168.0.104:1883"] # адрес vm с mqtt-брокером +``` +### IfluxDB + +Для *Influxdb* используем образ `influxdb:1.8`. + +Теперь настроим конфигурационный файл `influxdb-init.iql` для корректной работы influxdb. Укажем в нём какую таблицу создавать - *sensors*: + +*influxdb-init.iql* +```SQL +CREATE database sensors +CREATE USER telegraf WITH PASSWORD 'telegraf' WITH ALL PRIVILEGES +``` +### Grafana + +Данные для отображения датчиков берутся из InfluxDB. Для настройки в конфигурационном файле `default.yaml` в папке `datasourse` необходимо прописать следующее: + +*default.yaml* +```yaml +apiVersion: 1 + +datasources: + - name: InfluxDB_v1 + type: influxdb + access: proxy + database: sensors + user: telegraf + url: http://influxdb:8086 + jsonData: + httpMode: GET + secureJsonData: + password: telegraf +``` +Теперь запустим все три контейнера при помощи docker-compose, но для начала сконфигурируем `docker-compose.yml`: + +*docker-compose.yml* +```yml +version: "3" +services: + influxdb: + image: influxdb:1.8 + container_name: influxdb + volumes: + - ./influxdb/scripts:/docker-entrypoint-initdb.d + - influx_data:/var/lib/influxdb + networks: + - server-net + telegraf: + image: telegraf + container_name: telegraf + volumes: + - ./telegraf:/etc/telegraf:ro + restart: unless-stopped + networks: + - server-net + grafana: + image: grafana/grafana + container_name: grafana + volumes: + - grafana_data:/var/lib/grafana + - ./grafana/:/etc/grafana/ + + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + restart: unless-stopped + ports: + - 3000:3000 + networks: + - server-net + + +volumes: + influx_data: {} + grafana_data: {} + +networks: + server-net: {} +``` + +Теперь можно выполнять команду `docker-compose up`: + +

+ +Рисунок 7 - Запуск контейнеров +

+ +Логи брокера на машине B: + +

+ +Рисунок 8 - Подключение telegraf в логах на машине B +

+ +### Настройка dashboard в Grafana + +После запуска всех необходимых контейнеров, в браузере переходим по `192.168.0.102:3000` + +

+ +

+ +Для проверки соединения перейдем в Menu -> Connections -> Data sources. Находим в истончиках InfluxDB и проверяем подключение: +

+ +

+ +После переходим через Меню в раздел Dashboards, где создаем собственный дашбоард. + +

+ +

+ +Для отображения данных необходимо настроить запросы (query) + +

+ +

+ +После создания необходимо количества графиков, отображающих данные с Simluator, экспортируем дашборд как JSON-файл + +Для этого находим функцию `Share` -> ``Export` -> `Save to file`. Сохраненный файл помещаем в папку `vms\server\infra\grafana\provisioning\dashboards\mqtt.json` + +Настроенный в нашем случае дашборд выглядит вот так: + +

+ +

diff --git a/vms/client/simulator/docker-compose.yml b/vms/client/simulator/docker-compose.yml index b9e08bb..c856fe0 100644 --- a/vms/client/simulator/docker-compose.yml +++ b/vms/client/simulator/docker-compose.yml @@ -2,23 +2,49 @@ version: "3" services: temp_sensor: - image: antonaleks/data-simulator + image: vespuchka/simulator:latest environment: - - SIM_HOST=192.168.1.1 - - SIM_NAME=TIRCAHL24 - - SIM_PERIOD=5 + - SIM_HOST=192.168.0.104 + - SIM_NAME=TEMP1 + - SIM_PERIOD=2 - SIM_TYPE=temperature + pressure_sensor: - image: antonaleks/data-simulator + image: vespuchka/simulator:latest environment: - - SIM_HOST=192.168.1.1 - - SIM_NAME=PIRCAHL11 - - SIM_PERIOD=10 + - SIM_HOST=192.168.0.104 + - SIM_NAME=PRESS1 + - SIM_PERIOD=2 - SIM_TYPE=pressure + current_sensor: - image: antonaleks/data-simulator + image: vespuchka/simulator:latest environment: - - SIM_HOST=192.168.1.1 - - SIM_NAME=A0_CURRENT - - SIM_PERIOD=1 + - SIM_HOST=192.168.0.104 + - SIM_NAME=CUR1 + - SIM_PERIOD=6 - SIM_TYPE=current + + humidity_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=HUM1 + - SIM_PERIOD=4 + - SIM_TYPE=humidity + + temp_slow_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=TEMP2 + - SIM_PERIOD=15 + - SIM_TYPE=temperature + + humidity_slow_sensor: + image: vespuchka/simulator:latest + environment: + - SIM_HOST=192.168.0.104 + - SIM_NAME=HUM2 + - SIM_PERIOD=15 + - SIM_TYPE=humidity diff --git a/vms/client/simulator/entity/sensor.py b/vms/client/simulator/entity/sensor.py index 922fea5..c3bbd38 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): + import math + self.value = math.sin(self.step) * 1.3 + random.random() * 0.2 + self.step = self.step + 1 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/server/infra/grafana/provisioning/dashboards/mqtt.json b/vms/server/infra/grafana/provisioning/dashboards/mqtt.json index ec65ac0..43de12a 100644 --- a/vms/server/infra/grafana/provisioning/dashboards/mqtt.json +++ b/vms/server/infra/grafana/provisioning/dashboards/mqtt.json @@ -3,7 +3,10 @@ "list": [ { "builtIn": 1, - "datasource": "-- Grafana --", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", @@ -21,9 +24,361 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, + "id": 1, "links": [], "liveNow": false, "panels": [ + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 140 + }, + { + "color": "#6ED0E0", + "value": 150 + }, + { + "color": "#EF843C", + "value": 160 + }, + { + "color": "#E24D42", + "value": 170 + }, + { + "color": "#1F78C1", + "value": 180 + }, + { + "color": "#BA43A9", + "value": 190 + }, + { + "color": "#705DA0", + "value": 200 + }, + { + "color": "#508642", + "value": 209.9999 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 5, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": true, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.3", + "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 sensor", + "type": "stat" + }, + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.3", + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "groupBy": [], + "measurement": "mqtt_consumer", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "tags": [ + { + "key": "topic::tag", + "operator": "=", + "value": "sensors/humidity/HUM1" + } + ] + }, + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "groupBy": [], + "hide": false, + "measurement": "mqtt_consumer", + "orderByTime": "ASC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + } + ] + ], + "tags": [ + { + "key": "topic::tag", + "operator": "=", + "value": "sensors/humidity/HUM2" + } + ] + } + ], + "title": "Humidity sensors", + "type": "gauge" + }, + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-YlBl" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "series", + "axisGridShow": true, + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 4, + "options": { + "barRadius": 0, + "barWidth": 1, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xField": "Time", + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "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/CUR1" + } + ] + } + ], + "title": "Current sensor", + "type": "barchart" + }, { "datasource": { "type": "influxdb", @@ -35,6 +390,9 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, @@ -46,6 +404,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -80,17 +439,18 @@ "overrides": [] }, "gridPos": { - "h": 9, + "h": 8, "w": 12, "x": 0, - "y": 0 + "y": 17 }, - "id": 2, + "id": 3, "options": { "legend": { "calcs": [], "displayMode": "list", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { "mode": "single", @@ -121,30 +481,61 @@ ], "tags": [ { - "key": "topic", + "key": "topic::tag", + "operator": "=", + "value": "sensors/temp/TEMP1" + } + ] + }, + { + "datasource": { + "type": "influxdb", + "uid": "P4B5EB7AC8565B06F" + }, + "groupBy": [], + "hide": false, + "measurement": "mqtt_consumer", + "orderByTime": "ASC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "topic::tag", "operator": "=", - "value": "sensors/current/A0_CURRENT" + "value": "sensors/temp/TEMP2" } ] } ], - "title": "Panel Title", + "title": "Temp sensors", "type": "timeseries" } ], - "schemaVersion": 35, - "style": "dark", + "refresh": "", + "schemaVersion": 39, "tags": [], "templating": { "list": [] }, "time": { - "from": "now-5m", + "from": "now-2m", "to": "now" }, "timepicker": {}, "timezone": "", - "title": "New dashboard", - "version": 0, + "title": "My Dashboard", + "uid": "fdmpanv7yznk0e", + "version": 19, "weekStart": "" -} \ No newline at end of file +} diff --git a/vms/server/infra/telegraf/telegraf.conf b/vms/server/infra/telegraf/telegraf.conf index ddd8b05..52fa5a5 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.104:1883"] # адрес vm с mqtt-брокером topics = [ "sensors/#" ]