import logging import os from datetime import datetime, timezone from ocpp.routing import on from ocpp.v16 import ChargePoint as cp from ocpp.v16 import call_result from ocpp.v16.enums import Action, RegistrationStatus from app.core.session_manager import session_mgr logger = logging.getLogger("ocpp_router") def get_utc_time(): return datetime.now(timezone.utc).isoformat().replace("+00:00", "Z") HEARTBEAT_INTERVAL = int(os.getenv("OCPP_HEARTBEAT_INTERVAL", 300)) class CustomChargePoint(cp): @on(Action.BootNotification) async def on_boot_notification(self, charge_point_vendor, charge_point_model, **kwargs): await session_mgr.register_cp(self.id, charge_point_model, charge_point_vendor, getattr(self, 'subprotocol', 'Unknown')) response = call_result.BootNotificationPayload( current_time=get_utc_time(), interval=HEARTBEAT_INTERVAL, status=RegistrationStatus.accepted ) return response @on(Action.Heartbeat) async def on_heartbeat(self): response = call_result.HeartbeatPayload(current_time=get_utc_time()) return response @on(Action.Authorize) async def on_authorize(self, id_tag, **kwargs): status = "Accepted" if id_tag == "CHARGEMAP_PASS" else "Invalid" response = call_result.AuthorizePayload(id_tag_info={"status": status}) return response @on(Action.MeterValues) async def on_meter_values(self, connector_id, meter_value, **kwargs): response = call_result.MeterValuesPayload() return response @on(Action.StatusNotification) async def on_status_notification(self, connector_id, status, error_code, **kwargs): await session_mgr.update_cp_status(self.id, str(status)) response = call_result.StatusNotificationPayload() return response @on(Action.StartTransaction) async def on_start_transaction(self, connector_id, id_tag, meter_start, timestamp, **kwargs): response = call_result.StartTransactionPayload(transaction_id=123456, id_tag_info={"status": "Accepted"}) return response @on(Action.StopTransaction) async def on_stop_transaction(self, transaction_id, meter_stop, timestamp, **kwargs): response = call_result.StopTransactionPayload(id_tag_info={"status": "Accepted"}) return response