import asyncio import logging import logging.handlers import yaml from pathlib import Path from src.services.mqtt_service import MQTTService from src.services.i2c_service import I2CService from src.services.http_service import HTTPService from src.controllers.measurement_controller import MeasurementController from src.services.prometheus_service import start_metrics_server async def main(): # Load config config_path = Path(__file__).parent / "config" / "config.yaml" with open(config_path) as f: config = yaml.safe_load(f) # Setup logging logging.basicConfig( level=getattr(logging, config['logging']['level']), format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.handlers.RotatingFileHandler( filename=config['logging']['file'], mode=config['logging']['mode'], maxBytes=config['logging']['max_bytes'], backupCount=2, encoding=None, delay=False ), logging.StreamHandler() ] ) logging.info("Starting battery measurement controller...") # Initialize services i2c_service = I2CService(config) mqtt_service = MQTTService(config) http_service = HTTPService(config) controller = MeasurementController(config, i2c_service, http_service, mqtt_service) start_metrics_server(8000) await controller.start_polling() try: # Keep running until interrupted while True: await asyncio.sleep(1) finally: logging.info("Shutting down...") mqtt_service.cleanup() if __name__ == "__main__": asyncio.run(main())