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/#"
]