diff --git a/Militsyn_work_2.docx b/Militsyn_work_2.docx new file mode 100644 index 0000000..a73e0eb Binary files /dev/null and b/Militsyn_work_2.docx differ diff --git a/client/docker-compose.yml b/client/docker-compose.yml new file mode 100644 index 0000000..e8173e0 --- /dev/null +++ b/client/docker-compose.yml @@ -0,0 +1,49 @@ +version: '3' +services: + temp1: + image: sc0ve/sensor-simulator:latest + environment: + - SIM_HOST=host.docker.internal + - SIM_TYPE=temperature + - SIM_NAME=temp1 + - SIM_INTERVAL=2 + + temp2: + image: sc0ve/sensor-simulator:latest + environment: + - SIM_HOST=host.docker.internal + - SIM_TYPE=temperature + - SIM_NAME=temp2 + - SIM_INTERVAL=3 + + pressure1: + image: sc0ve/sensor-simulator:latest + environment: + - SIM_HOST=host.docker.internal + - SIM_TYPE=pressure + - SIM_NAME=pressure1 + - SIM_INTERVAL=2 + + pressure2: + image: sc0ve/sensor-simulator:latest + environment: + - SIM_HOST=host.docker.internal + - SIM_TYPE=pressure + - SIM_NAME=pressure2 + - SIM_INTERVAL=4 + + current1: + image: sc0ve/sensor-simulator:latest + environment: + - SIM_HOST=host.docker.internal + - SIM_TYPE=current + - SIM_NAME=current1 + - SIM_INTERVAL=2 + + humidity1: + image: sc0ve/sensor-simulator:latest + environment: + - SIM_HOST=host.docker.internal + - SIM_TYPE=humidity + - SIM_NAME=humidity1 + - SIM_INTERVAL=2 diff --git a/client/simulator/Dockerfile b/client/simulator/Dockerfile new file mode 100644 index 0000000..bded170 --- /dev/null +++ b/client/simulator/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.11-slim +WORKDIR /app +RUN pip install paho-mqtt +COPY sensor.py . +CMD ["python", "sensor.py"] diff --git a/client/simulator/sensor.py b/client/simulator/sensor.py new file mode 100644 index 0000000..948aae1 --- /dev/null +++ b/client/simulator/sensor.py @@ -0,0 +1,56 @@ +import paho.mqtt.client as mqtt +import time, os, random, math + +class Sensor: + def __init__(self): + self.host = os.environ.get('SIM_HOST', 'localhost') + self.port = int(os.environ.get('SIM_PORT', 1883)) + self.name = os.environ.get('SIM_NAME', 'sensor') + self.sensor_type = os.environ.get('SIM_TYPE', 'temperature') + self.interval = float(os.environ.get('SIM_INTERVAL', 2)) + self.topic_format = os.environ.get('SIM_TOPIC_FORMAT', 'raw') + self.client = mqtt.Client() + + def generate(self): + return round(random.uniform(20, 30), 2) + + def publish(self): + self.client.connect(self.host, self.port) + topic = f"sensors/{self.sensor_type}/{self.name}" + while True: + value = self.generate() + if self.topic_format == 'json': + payload = f'{{"name":"{self.name}","value":{value}}}' + else: + payload = str(value) + self.client.publish(topic, payload) + print(f"[{self.sensor_type}] {topic}: {payload}") + time.sleep(self.interval) + +class TemperatureSensor(Sensor): + def generate(self): + return round(20 + 10 * math.sin(time.time() / 10), 2) + +class PressureSensor(Sensor): + def generate(self): + return round(random.uniform(950, 1050), 2) + +class CurrentSensor(Sensor): + def generate(self): + return round(random.uniform(0.1, 5.0), 2) + +class HumiditySensor(Sensor): + def generate(self): + return round(random.uniform(30, 90), 2) + +TYPES = { + 'temperature': TemperatureSensor, + 'pressure': PressureSensor, + 'current': CurrentSensor, + 'humidity': HumiditySensor, +} + +if __name__ == '__main__': + sensor_type = os.environ.get('SIM_TYPE', 'temperature') + sensor = TYPES.get(sensor_type, TemperatureSensor)() + sensor.publish() \ No newline at end of file diff --git a/gateway/mosquitto/mosquitto.conf b/gateway/mosquitto/mosquitto.conf new file mode 100644 index 0000000..daa4137 --- /dev/null +++ b/gateway/mosquitto/mosquitto.conf @@ -0,0 +1,2 @@ +listener 1883 +allow_anonymous true \ No newline at end of file diff --git a/server/docker-compose.yml b/server/docker-compose.yml new file mode 100644 index 0000000..53b42d4 --- /dev/null +++ b/server/docker-compose.yml @@ -0,0 +1,49 @@ +version: '3' +networks: + monitoring: + +services: + broker: + image: eclipse-mosquitto + networks: + - monitoring + ports: + - "1883:1883" + volumes: + - ../gateway/mosquitto:/mosquitto/config + + influxdb: + image: influxdb:1.8 + networks: + - monitoring + volumes: + - influxdb_data:/var/lib/influxdb + environment: + - INFLUXDB_DB=sensors + - INFLUXDB_USER=telegraf + - INFLUXDB_USER_PASSWORD=telegraf + + telegraf: + image: telegraf:latest + networks: + - monitoring + volumes: + - ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro + depends_on: + - influxdb + - broker + + grafana: + image: grafana/grafana:latest + networks: + - monitoring + ports: + - "3000:3000" + volumes: + - grafana_data:/var/lib/grafana + depends_on: + - influxdb + +volumes: + influxdb_data: + grafana_data: diff --git a/server/telegraf/telegraf.conf b/server/telegraf/telegraf.conf new file mode 100644 index 0000000..a49d88b --- /dev/null +++ b/server/telegraf/telegraf.conf @@ -0,0 +1,14 @@ +[agent] + interval = "10s" + +[[inputs.mqtt_consumer]] + servers = ["tcp://broker:1883"] + topics = ["sensors/#"] + data_format = "value" + data_type = "float" + +[[outputs.influxdb]] + urls = ["http://influxdb:8086"] + database = "sensors" + username = "telegraf" + password = "telegraf"