import asyncio import logging import logging.handlers import yaml from pathlib import Path from services.mqtt_service import MQTTService from services.i2c_service import I2CService from services.http_service import HTTPService from controllers.measurement_controller import MeasurementController async def main(): # Load config config_path = Path(__file__).parent.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=0 ), logging.StreamHandler() ] ) logging.info("Starting battery measurement controller...") # Initialize services i2c_service = I2CService(config) http_service = HTTPService(config) measurement_controller = MeasurementController(config, i2c_service, http_service) # Setup MQTT client with callback mqtt_service = MQTTService(config) async def on_cell_inserted(device_id: str, slot: int, cell_id: int): await measurement_controller.start_measurement(device_id, slot, cell_id) mqtt_service.set_callback(on_cell_inserted) await mqtt_service.connect() try: # Keep running until interrupted while True: await asyncio.sleep(1) except KeyboardInterrupt: logging.info("Shutting down...") finally: await mqtt_service.disconnect() if __name__ == "__main__": asyncio.run(main())