import os import pprint import time from datetime import datetime from energy_monitor import CONN_STR, DatabaseManager, PlcManager from logger_setup import setup_logger # Globals DEVICE_DELAY = 1 # Delay between device data fetches POOL_RATE = 2 # 2s polling rate reading of NextRead value from database FALLBACK_INTERVAL = 20 # 1h = 3600s interval in case db read issue # Logger setup logger = setup_logger() def process_plc_devices(db_manager: DatabaseManager, plc_manager: PlcManager): plc_configs = db_manager.get_plc_configs() # If debug print out plc_configs to logs logger.debug( { "msg": "Retrieved PLC configurations", "plc_configs": [ { "id": plc.id, "ip": plc.ip, "location": plc.location, "is_enabled": plc.is_enabled, "db_number": plc.db_number, } for plc in plc_configs ], "timestamp": datetime.now().isoformat(), }, ) for plc_config in plc_configs: try: if not plc_manager.check_connection(plc_config.ip): logger.error( { "msg": "PLC connection failed", "PlcId": plc_config.id, "PlcIp": plc_config.ip, "timestamp": datetime.now().isoformat(), } ) continue air_value, energy_value, run_status = plc_manager.read_plc_data(plc_config) db_manager.save_energy_data(plc_config.id, energy_value, air_value, True) logger.info( { "msg": "✅ Data successfully read and saved", "PlcId": plc_config.id, "PlcIp": plc_config.ip, "energy_value": energy_value, "air_value": air_value, "timestamp": datetime.now().isoformat(), }, ) time.sleep(DEVICE_DELAY) # n-second delay between devices except Exception as e: logger.error( { "msg": "Error reading PLC data", "PlcId": plc_config.id, "PlcIp": plc_config.ip, "error": str(e), "timestamp": datetime.now().isoformat(), }, ) def main(): db_manager = DatabaseManager(CONN_STR) plc_manager = PlcManager() pprint.pp( { "SQL_Config": { "Server": os.getenv("DB_SERVER"), "Database": os.getenv("DB_NAME"), "User": os.getenv("DB_USER"), # Masking password for security "Password": "****", }, "SEQ_Config": { "URL": os.getenv("SEQ_URL"), # Masking API key for security "API_Key": "****", }, "timestamp": datetime.now().isoformat(), } ) while True: try: scheduler_config = db_manager.get_scheduler_config() if datetime.now() >= scheduler_config.next_read: process_plc_devices(db_manager, plc_manager) db_manager.update_next_read(scheduler_config.interval) time.sleep(POOL_RATE) except Exception as e: logger.error( { "msg": "Main loop error! Falling back to 1h interval.", "error": str(e), "timestamp": datetime.now().isoformat(), }, ) time.sleep(FALLBACK_INTERVAL) # Default fallback interval if __name__ == "__main__": main()