Commit d00e180d authored by Gezer's avatar Gezer
Browse files

Refactored influxdbWriter to a new Folder utils

and added new file in backend "influxdb_service"
where we can get data from the database but still
need to be implemented right and fixed
parent 239df3d8
Showing with 193 additions and 14 deletions
+193 -14
import os
from dotenv import load_dotenv
from utils.influx import InfluxDBHelper
load_dotenv()
client = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"),
token=os.getenv("INFLUXDB_TOKEN"),
org=os.getenv("INFLUXDB_ORG"),
bucket=os.getenv("INFLUXDB_BUCKET"),
)
client.get_all_data
...@@ -2,12 +2,29 @@ ...@@ -2,12 +2,29 @@
name = "backend" name = "backend"
version = "0.1.0" version = "0.1.0"
description = "backend of co2 web service" description = "backend of co2 web service"
authors = [
{name = "Patrick Ade", email = "21adpa1bif@hft-stuttgart.de"},
{name = "Morten Stetter", email = "22?stmo1bif@hft-stuttgart.de"},
{name = "Aaron Mele", email = "21meaa1bif@hft-stuttgart.de"},
{name = "Emre Gezer", email = "21geem1bif@hft-stuttgart.de"},
]
maintainers = [
{name = "Max Mustermann", email = "mustermann@example.com"}
]
readme = "README.md" readme = "README.md"
keywords = ["co2", "sensor", "temperature", "humidity", "monitor", "monitoring", "air quality"]
requires-python = ">=3.12" requires-python = ">=3.12"
dependencies = ["django>=5.2", "django-cors-headers>=4.7.0"] dependencies = [
"django>=5.2",
"django-cors-headers>=4.7.0",
"influxdb-client>=1.40"
]
[dependency-groups] [dependency-groups]
dev = ["ruff>=0.11.5"] dev = [
"ruff>=0.11.5"
]
[tool.ruff] [tool.ruff]
# Set the maximum line length to 80. # Set the maximum line length to 80.
......
django>=5.2
django-cors-headers>=4.7.0
influxdb-client>=1.40
\ No newline at end of file
...@@ -18,9 +18,10 @@ source = { virtual = "." } ...@@ -18,9 +18,10 @@ source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "django" }, { name = "django" },
{ name = "django-cors-headers" }, { name = "django-cors-headers" },
{ name = "influxdb-client" },
] ]
[package.dev-dependencies] [package.optional-dependencies]
dev = [ dev = [
{ name = "ruff" }, { name = "ruff" },
] ]
...@@ -29,10 +30,19 @@ dev = [ ...@@ -29,10 +30,19 @@ dev = [
requires-dist = [ requires-dist = [
{ name = "django", specifier = ">=5.2" }, { name = "django", specifier = ">=5.2" },
{ name = "django-cors-headers", specifier = ">=4.7.0" }, { name = "django-cors-headers", specifier = ">=4.7.0" },
{ name = "influxdb-client", specifier = ">=1.40" },
{ name = "ruff", marker = "extra == 'dev'", specifier = ">=0.11.5" },
] ]
provides-extras = ["dev"]
[package.metadata.requires-dev] [[package]]
dev = [{ name = "ruff", specifier = ">=0.11.5" }] name = "certifi"
version = "2025.1.31"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
]
[[package]] [[package]]
name = "django" name = "django"
...@@ -61,6 +71,46 @@ wheels = [ ...@@ -61,6 +71,46 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7e/a2/7bcfff86314bd9dd698180e31ba00604001606efb518a06cca6833a54285/django_cors_headers-4.7.0-py3-none-any.whl", hash = "sha256:f1c125dcd58479fe7a67fe2499c16ee38b81b397463cf025f0e2c42937421070", size = 12794 }, { url = "https://files.pythonhosted.org/packages/7e/a2/7bcfff86314bd9dd698180e31ba00604001606efb518a06cca6833a54285/django_cors_headers-4.7.0-py3-none-any.whl", hash = "sha256:f1c125dcd58479fe7a67fe2499c16ee38b81b397463cf025f0e2c42937421070", size = 12794 },
] ]
[[package]]
name = "influxdb-client"
version = "1.48.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "python-dateutil" },
{ name = "reactivex" },
{ name = "setuptools" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/11/47/b756380917cb4b968bd871fc006128e2cc9897fb1ab4bcf7d108f9601e78/influxdb_client-1.48.0.tar.gz", hash = "sha256:414d5b5eff7d2b6b453f33e2826ea9872ea04a11996ba9c8604b0c1df57c8559", size = 386415 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5c/b3/1edc89584b8d1bc5226cf508b67ab64da3ba83041cab348861e6f4392326/influxdb_client-1.48.0-py3-none-any.whl", hash = "sha256:410db15db761df7ea98adb333c7a03f05bcc2ceef4830cefb7071b888be2b827", size = 746177 },
]
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "six" },
]
sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
]
[[package]]
name = "reactivex"
version = "4.0.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ef/63/f776322df4d7b456446eff78c4e64f14c3c26d57d46b4e06c18807d5d99c/reactivex-4.0.4.tar.gz", hash = "sha256:e912e6591022ab9176df8348a653fe8c8fa7a301f26f9931c9d8c78a650e04e8", size = 119177 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/69/3f/2ed8c1b8fe3fc2ed816ba40554ef703aad8c51700e2606c139fcf9b7f791/reactivex-4.0.4-py3-none-any.whl", hash = "sha256:0004796c420bd9e68aad8e65627d85a8e13f293de76656165dffbcb3a0e3fb6a", size = 217791 },
]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.11.5" version = "0.11.5"
...@@ -86,6 +136,24 @@ wheels = [ ...@@ -86,6 +136,24 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/43/7c/c83fe5cbb70ff017612ff36654edfebec4b1ef79b558b8e5fd933bab836b/ruff-0.11.5-py3-none-win_arm64.whl", hash = "sha256:67e241b4314f4eacf14a601d586026a962f4002a475aa702c69980a38087aa4e", size = 10460287 }, { url = "https://files.pythonhosted.org/packages/43/7c/c83fe5cbb70ff017612ff36654edfebec4b1ef79b558b8e5fd933bab836b/ruff-0.11.5-py3-none-win_arm64.whl", hash = "sha256:67e241b4314f4eacf14a601d586026a962f4002a475aa702c69980a38087aa4e", size = 10460287 },
] ]
[[package]]
name = "setuptools"
version = "79.0.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/7d/19/fecb7e2825616270f34512b3394cdcf6f45a79b5b6d94fdbd86a509e67b5/setuptools-79.0.0.tar.gz", hash = "sha256:9828422e7541213b0aacb6e10bbf9dd8febeaa45a48570e09b6d100e063fc9f9", size = 1367685 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cc/ea/d53f2f8897c46a36df085964d07761ea4c2d1f2cf92019693b6742b7aabb/setuptools-79.0.0-py3-none-any.whl", hash = "sha256:b9ab3a104bedb292323f53797b00864e10e434a3ab3906813a7169e4745b912a", size = 1256065 },
]
[[package]]
name = "six"
version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
]
[[package]] [[package]]
name = "sqlparse" name = "sqlparse"
version = "0.5.3" version = "0.5.3"
...@@ -95,6 +163,15 @@ wheels = [ ...@@ -95,6 +163,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415 }, { url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415 },
] ]
[[package]]
name = "typing-extensions"
version = "4.13.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 },
]
[[package]] [[package]]
name = "tzdata" name = "tzdata"
version = "2025.2" version = "2025.2"
...@@ -103,3 +180,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be76 ...@@ -103,3 +180,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be76
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 },
] ]
[[package]]
name = "urllib3"
version = "2.4.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
]
...@@ -3,6 +3,16 @@ name = "mqtt-influx-backend" ...@@ -3,6 +3,16 @@ name = "mqtt-influx-backend"
version = "0.1.0" version = "0.1.0"
description = "Backend to write MQTT sensor data to InfluxDB" description = "Backend to write MQTT sensor data to InfluxDB"
readme = "README.md" readme = "README.md"
authors = [
{name = "Patrick Ade", email = "21adpa1bif@hft-stuttgart.de"},
{name = "Morten Stetter", email = "22?stmo1bif@hft-stuttgart.de"},
{name = "Aaron Mele", email = "21meaa1bif@hft-stuttgart.de"},
{name = "Emre Gezer", email = "21geem1bif@hft-stuttgart.de"},
]
maintainers = [
{name = "Max Mustermann", email = "mustermann@example.com"}
]
keywords = ["co2", "sensor", "temperature", "humidity", "monitor", "monitoring", "air quality"]
requires-python = ">=3.10" requires-python = ">=3.10"
dependencies = [ dependencies = [
"paho-mqtt", "paho-mqtt",
......
import json import json
from src.mqtt_influx_backend.loggingFactory import LoggerFactory from mqtt_influx_backend.loggingFactory import LoggerFactory
from datetime import datetime from datetime import datetime
import paho.mqtt.client as mqtt import paho.mqtt.client as mqtt
from src.mqtt_influx_backend import jsonhandler from mqtt_influx_backend import jsonhandler
from src.mqtt_influx_backend import influxDBWriter from utils.influx import InfluxDBHelper
class MQTTClientHandler: class MQTTClientHandler:
...@@ -17,7 +17,7 @@ class MQTTClientHandler: ...@@ -17,7 +17,7 @@ class MQTTClientHandler:
FIELD_HUMIDITY = "humidity" FIELD_HUMIDITY = "humidity"
# Konstruktor # Konstruktor
def __init__(self, broker_url: str, topic: str, influx_writer: influxDBWriter): def __init__(self, broker_url: str, topic: str, influx_writer: InfluxDBHelper):
self.logger = LoggerFactory.get_logger(__name__) self.logger = LoggerFactory.get_logger(__name__)
# key: mac : value : room # key: mac : value : room
self.mac_to_room = jsonhandler.load_json(self.MAPPING_FILE_NAME) self.mac_to_room = jsonhandler.load_json(self.MAPPING_FILE_NAME)
......
...@@ -5,5 +5,8 @@ ...@@ -5,5 +5,8 @@
"DE:AD:BE:EF:12:34": "", "DE:AD:BE:EF:12:34": "",
"DK:AD:BE:EF:12:34": "", "DK:AD:BE:EF:12:34": "",
"EK:AD:BE:EF:12:34": "", "EK:AD:BE:EF:12:34": "",
"lK:AD:BE:EF:12:34": "" "lK:AD:BE:EF:12:34": "",
"MK:AD:BE:EF:12:34": "",
"AB:AD:BE:EF:12:34": "",
"EF:AD:BE:EF:12:34": ""
} }
\ No newline at end of file
from dotenv import load_dotenv from dotenv import load_dotenv
import os import os
import logging from mqtt_influx_backend.mQTTClientHandler import MQTTClientHandler
from src.mqtt_influx_backend.mQTTClientHandler import MQTTClientHandler from utils.influx import InfluxDBHelper
from src.mqtt_influx_backend.influxDBWriter import InfluxDBWriter
load_dotenv() load_dotenv()
def main(): def main():
influx_writer = InfluxDBWriter( influx_writer = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"), url=os.getenv("INFLUXDB_URL"),
token=os.getenv("INFLUXDB_TOKEN"), token=os.getenv("INFLUXDB_TOKEN"),
org=os.getenv("INFLUXDB_ORG"), org=os.getenv("INFLUXDB_ORG"),
......
import os
from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import WriteOptions
class InfluxDBHelper:
def __init__(self, url: str, token: str, org: str, bucket: str):
self.client = InfluxDBClient(url=url, token=token, org=org)
self.bucket = bucket
self.org = org
self.query_api = self.client.query_api()
# self.write_api = self.client.write_api(write_options=SYNCHRONOUS) good for debug
self.write_api = self.client.write_api(write_options=WriteOptions(batch_size=1000, flush_interval=10000))
def write_point(self, measurement: str, tags: dict, fields: dict, timestamp=None):
'''
'''
point = Point(measurement)
for k, v in tags.items():
point.tag(k, v)
for k, v in fields.items():
point.field(k, v)
if timestamp:
point.time(timestamp, WritePrecision.NS)
self.write_api.write(bucket=self.bucket, org=self.org, record=point)
def get_all_data(self):
'''
'''
query = f'''
from(bucket: "{self.bucket}")
|> range(start: -1h)
|> filter(fn: (r) => r["_measurement"] == "sensor_data")
'''
return self.query_api.query(org=self.org, query=query)
def get_latest_room_data(self, room_id: str):
'''
'''
query = f'''
from(bucket: "{self.bucket}")
|> range(start: -5m)
|> filter(fn: (r) => r["_measurement"] == "co2")
|> filter(fn: (r) => r["room"] == "{room_id}")
|> last()
'''
return self.query_api.query(org=self.org, query=query)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment