feat(ocpp): implement BootNotification, Heartbeat, and StatusNotification actions with database integration
This commit is contained in:
61
apps/csms/src/ocpp/actions/boot-notification.ts
Normal file
61
apps/csms/src/ocpp/actions/boot-notification.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { useDrizzle } from '@/lib/db.js'
|
||||
import { chargePoint } from '@/db/schema.js'
|
||||
import type {
|
||||
BootNotificationRequest,
|
||||
BootNotificationResponse,
|
||||
OcppConnectionContext,
|
||||
} from '../types.ts'
|
||||
|
||||
const DEFAULT_HEARTBEAT_INTERVAL = 60
|
||||
|
||||
export async function handleBootNotification(
|
||||
payload: BootNotificationRequest,
|
||||
ctx: OcppConnectionContext,
|
||||
): Promise<BootNotificationResponse> {
|
||||
const db = useDrizzle()
|
||||
|
||||
await db
|
||||
.insert(chargePoint)
|
||||
.values({
|
||||
id: crypto.randomUUID(),
|
||||
chargePointIdentifier: ctx.chargePointIdentifier,
|
||||
chargePointVendor: payload.chargePointVendor,
|
||||
chargePointModel: payload.chargePointModel,
|
||||
chargePointSerialNumber: payload.chargePointSerialNumber ?? null,
|
||||
firmwareVersion: payload.firmwareVersion ?? null,
|
||||
iccid: payload.iccid ?? null,
|
||||
imsi: payload.imsi ?? null,
|
||||
meterType: payload.meterType ?? null,
|
||||
meterSerialNumber: payload.meterSerialNumber ?? null,
|
||||
registrationStatus: 'Accepted',
|
||||
heartbeatInterval: DEFAULT_HEARTBEAT_INTERVAL,
|
||||
lastBootNotificationAt: new Date(),
|
||||
})
|
||||
.onConflictDoUpdate({
|
||||
target: chargePoint.chargePointIdentifier,
|
||||
set: {
|
||||
chargePointVendor: payload.chargePointVendor,
|
||||
chargePointModel: payload.chargePointModel,
|
||||
chargePointSerialNumber: payload.chargePointSerialNumber ?? null,
|
||||
firmwareVersion: payload.firmwareVersion ?? null,
|
||||
iccid: payload.iccid ?? null,
|
||||
imsi: payload.imsi ?? null,
|
||||
meterType: payload.meterType ?? null,
|
||||
meterSerialNumber: payload.meterSerialNumber ?? null,
|
||||
registrationStatus: 'Accepted',
|
||||
heartbeatInterval: DEFAULT_HEARTBEAT_INTERVAL,
|
||||
lastBootNotificationAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
},
|
||||
})
|
||||
|
||||
ctx.isRegistered = true
|
||||
|
||||
console.log(`[OCPP] BootNotification accepted: ${ctx.chargePointIdentifier}`)
|
||||
|
||||
return {
|
||||
currentTime: new Date().toISOString(),
|
||||
interval: DEFAULT_HEARTBEAT_INTERVAL,
|
||||
status: 'Accepted',
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user