diff --git a/app/services/cwmp/main_state_machine.ts b/app/services/cwmp/main_state_machine.ts index 4bd732f..747005b 100644 --- a/app/services/cwmp/main_state_machine.ts +++ b/app/services/cwmp/main_state_machine.ts @@ -54,6 +54,15 @@ class IdleState extends DeviceState { return { nextState: new CriticalReadsState(), response: '' } } + // If device is already classified (GPN supported + has parameters), skip GPN test + if (device.gpnStatus === 'supported' && device.getParameters().length > 0) { + logger.info( + { gpnStatus: device.gpnStatus, paramCount: device.getParameters().length, deviceId: device.identifier }, + '[IdleState] Device already classified — skipping GPN test' + ) + return { nextState: new CriticalReadsState(), response: '' } + } + logger.info( { gpnStatus: device.gpnStatus, circuitBreaker: device.gpnCircuitBreaker, deviceId: device.identifier }, '[IdleState] GPN allowed — proceeding to discovery' @@ -239,7 +248,9 @@ class CriticalReadsState extends DeviceState { } } - if (context.device.gpnStatus !== 'supported') { + // Only reclassify via catalog if GPN is not supported AND device hasn't been classified yet + // (i.e., no parameters exist — all are still stored as properties) + if (context.device.gpnStatus !== 'supported' && context.device.getParameters().length === 0) { reclassifyDeviceFromCatalog(context.device) }