main.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import asyncio
  2. import logging
  3. import logging.handlers
  4. import yaml
  5. from pathlib import Path
  6. from services.mqtt_service import MQTTService
  7. from services.i2c_service import I2CService
  8. from services.http_service import HTTPService
  9. from controllers.measurement_controller import MeasurementController
  10. async def main():
  11. # Load config
  12. config_path = Path(__file__).parent.parent / "config" / "config.yaml"
  13. with open(config_path) as f:
  14. config = yaml.safe_load(f)
  15. # Setup logging
  16. logging.basicConfig(
  17. level=getattr(logging, config['logging']['level']),
  18. format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
  19. handlers=[
  20. logging.handlers.RotatingFileHandler(
  21. filename=config['logging']['file'],
  22. mode=config['logging']['mode'],
  23. maxBytes=config['logging']['max_bytes'],
  24. backupCount=2,
  25. encoding=None,
  26. delay=0
  27. ),
  28. logging.StreamHandler()
  29. ]
  30. )
  31. logging.info("Starting battery measurement controller...")
  32. # Initialize services
  33. i2c_service = I2CService(config)
  34. http_service = HTTPService(config)
  35. measurement_controller = MeasurementController(config, i2c_service, http_service)
  36. # Setup MQTT client with callback
  37. mqtt_service = MQTTService(config)
  38. async def on_cell_inserted(device_id: str, slot: int, cell_id: int):
  39. await measurement_controller.start_measurement(device_id, slot, cell_id)
  40. mqtt_service.set_callback(on_cell_inserted)
  41. await mqtt_service.connect()
  42. try:
  43. # Keep running until interrupted
  44. while True:
  45. await asyncio.sleep(1)
  46. except KeyboardInterrupt:
  47. logging.info("Shutting down...")
  48. finally:
  49. await mqtt_service.disconnect()
  50. if __name__ == "__main__":
  51. asyncio.run(main())