59 lines
2.3 KiB
Python
59 lines
2.3 KiB
Python
|
|
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
|