Functioning mqtt ingestion and db write, formating changes, device manager initiated

This commit is contained in:
Andrej Mickov
2025-10-30 00:32:25 +01:00
parent 0b96c72f45
commit 12d3720421
45 changed files with 2168 additions and 820 deletions

View File

@@ -5,75 +5,65 @@ from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool
from config import config
from schema import SensorReading
from models import SensorReading as SensorReadingModel
from schema import TelemetryReading
from models import Telemetry
class DatabaseWriter:
"""
Database writer using SQLAlchemy.
Schema is defined in models.py and should be managed using Alembic migrations.
This class only handles data insertion, NOT schema creation.
To manage schema:
1. Edit models.py to define your schema
2. Generate migration: alembic revision --autogenerate -m "description"
3. Apply migration: alembic upgrade head
Database writer for telemetry data.
"""
def __init__(self):
self.logger = logging.getLogger(__name__)
# Initialize SQLAlchemy engine with connection pooling
connection_string = config.database.get_connection_string()
self.engine = create_engine(
connection_string,
poolclass=QueuePool,
pool_size=5,
max_overflow=10,
pool_pre_ping=True
pool_pre_ping=True,
)
# Create session factory
self.SessionLocal = sessionmaker(bind=self.engine)
self.logger.info("Database writer initialized")
def write_batch(self, readings: List[SensorReading]) -> bool:
"""Write a batch of sensor readings to the database"""
def write_batch(self, readings: List[TelemetryReading]) -> bool:
"""Write a batch of telemetry readings to the database"""
if not readings:
return True
session = self.SessionLocal()
try:
# Convert to database objects
# Convert to database objects using the correct field mapping
db_objects = [
SensorReadingModel(
timestamp=reading.timestamp,
Telemetry(
time=reading.time,
device_id=reading.device_id,
sensor_type=reading.sensor_type,
metric=reading.metric,
value=reading.value,
metadata=reading.metadata
unit=reading.unit,
)
for reading in readings
]
# Bulk insert
session.bulk_save_objects(db_objects)
session.commit()
self.logger.debug(f"Wrote {len(readings)} readings to database")
return True
except Exception as e:
self.logger.error(f"Failed to write batch: {e}")
session.rollback()
return False
finally:
session.close()
def health_check(self) -> bool:
"""Check if database connection is healthy"""
try:
@@ -83,9 +73,9 @@ class DatabaseWriter:
except Exception as e:
self.logger.error(f"Database health check failed: {e}")
return False
def close(self):
"""Close database engine and all connections"""
if hasattr(self, 'engine') and self.engine:
if hasattr(self, "engine") and self.engine:
self.engine.dispose()
self.logger.info("Database engine closed")