Report Components
이 부록은 충전기가 리포트 알림(NotifyReport)으로
CSMS에 보고하는 컴포넌트-변수 항목들을 가리킵니다.
Custom Variables가 CSMS와 충전기가 GetVariables / SetVariables 로
주고받는 설정 값이라면, 이 부록의 항목은 충전기가 자신의 구성을 CSMS에 알리는 값입니다.
따라서 조회·보고 메시지가 다르고, CSMS는 이 값들을 충전기 구성 정보의 기준 데이터로 관리합니다.
| 컴포넌트 | 보고 내용 |
|---|---|
| 공통 변수 | 컴포넌트별 펌웨어 버전 |
| Connector | 커넥터별 커넥터 타입 |
| CustomSystemInfo | 제어 PC의 운영체제·메인보드 정보 |
| CustomNetworkInterface | 제어 PC의 네트워크 어댑터 정보 |
| CustomStorage | 제어 PC의 저장 장치 정보 |
보고 규약
이 부록의 모든 항목은 같은 메시지와 같은 규칙으로 보고합니다.
보고 절차
CSMS가 리포트 조회(GetReport)로 대상을 지정하면,
충전기는 먼저 status 로 수용 여부를 응답하고 이어서 NotifyReport 로 실제 데이터를 전송합니다.
- OCPP v1.6:
DataTransfer:com.skelectlink:GetReport/DataTransfer:com.skelectlink:NotifyReport로 payload를 래핑합니다. - OCPP v2.1: 표준
GetReport/NotifyReport메시지 본문에 동일한 payload를 직접 담습니다.
requestId 는 보고를 유발한 GetReport 의 값을 그대로 되돌려주는 상관(correlation) 값입니다.
OCPP 표준에는 자발 보고를 위한 예약 requestId 가 없으므로,
충전기는 GetReport 를 수신했을 때 그 requestId 로 응답하는 경로를 반드시 구현해야 합니다.
CSMS는 하위 호환을 위해 대응되는 GetReport 가 없는 보고도 거부하지 않고 수신하지만,
상관 관계를 추적할 수 없는 보조 경로이므로 신규 연동에서는 사용하지 않습니다.
보고 시점
CSMS는 필요한 시점에 GetReport 를 발행합니다. 충전기가 접속할 때마다 자동으로 발행하지는 않습니다.
이 부록의 값은 대부분 자주 바뀌지 않는 준정적(quasi-static) 데이터입니다. 부팅할 때마다 전체를 다시 보내지 말고 다음 시점에만 전송합니다.
- CSMS가
GetReport를 발행했을 때 (필수) - 보고 대상 값이 실제로 변경되었을 때 (권장)
대상 식별
CSMS는 아래 네 값의 조합을 하나의 변수로 취급합니다.
| 필드 | 설명 |
|---|---|
component.name | 컴포넌트 이름 |
component.instance | 같은 컴포넌트가 여러 개일 때 이를 구분하는 인스턴스 이름 |
component.evse | EVSE 번호(id)와 커넥터 번호(connectorId) |
variable.name | 변수 이름 |
variableAttribute[].type | 속성 종류. 이 부록의 변수는 모두 Actual 입니다 |
컴포넌트 이름은 OCPP 2.x 표준 컴포넌트 명칭을 우선 사용하고, 표준 목록에 없는 컴포넌트는 사전에 협의된 이름을 사용합니다.
네트워크 어댑터가 두 장인데 둘 다 component.instance 없이 같은 컴포넌트 이름으로 보고하면,
CSMS는 두 보고를 같은 변수로 보고 나중에 도착한 값이 앞의 값을 덮어씁니다.
커넥터 단위 항목도 마찬가지로 component.evse.connectorId 로 구분해야 합니다.
값 제약
- 변수 값(
variableAttribute[].value)은 최대 1,000자입니다. 이를 넘는 값은 저장 시 잘립니다. - 한 변수에는 값 하나만 담습니다. 여러 항목을 JSON 문자열로 직렬화해 한 변수에 몰아 담지 않습니다. 항목마다 변수를 나누어 보고해야 CSMS에서 항목별 조회와 변경 추적이 가능합니다.
- 이 부록의 변수는 모두
mutability: "ReadOnly"로 보고합니다. CSMS가SetVariables로 쓰지 않습니다. - 부품을 교체하지 않는 한 바뀌지 않는 식별자는
constant: true로 보고합니다. attributeType을 생략하면 OCPP 기본값인Actual로 해석합니다.
생략한 필드의 처리
갱신 보고 — CSMS에 이미 그 변수가 있으면 value, mutability, dataType,
persistent, constant 를 생략해도 저장된 기존 값을 그대로 유지합니다.
보고에서 빠졌다는 이유로 기본값으로 되돌리지 않습니다.
첫 보고 — CSMS에 그 변수가 아직 없으면 유지할 기존 값이 없으므로 아래 기본값이 적용됩니다.
| 필드 | 생략 시 저장되는 값 |
|---|---|
mutability | ReadWrite |
dataType | string |
persistent | true |
constant | false |
이 부록의 컴포넌트를 처음 연동할 때는 모든 변수가 첫 보고에 해당합니다.
mutability 를 생략하면 ReadWrite 로 저장되어 읽기 전용이라는 정의와 어긋나고,
dataType 을 생략하면 MemorySize 같은 정수 값이 string 으로 저장됩니다.
첫 보고에서는 mutability 와 variableCharacteristics 를 반드시 채워서 보냅니다.
variableCharacteristics
variableCharacteristics 는 변수의 완전한 명세로 취급합니다.
이 객체를 보내면 아래와 같이 통째로 반영되므로 일부 필드만 갱신할 수는 없습니다.
보낼 때는 항상 완전한 형태로 채워서 보냅니다.
| 필드 | 필수 | 생략 시 |
|---|---|---|
dataType | 필수 | 메시지 거부 (아래 참고) |
unit, minLimit, maxLimit, valuesList | 선택 | 저장된 값이 지워집니다 |
supportsMonitoring | 선택 | false 로 덮어씁니다 |
variableCharacteristics 를 보낼 때 dataType 은 생략할 수 없습니다.
CSMS는 reportData 배열을 한 번에 해석하므로, 한 항목에서 dataType 이 빠지면
그 항목만 실패하는 것이 아니라 같은 프레임에 담긴 모든 항목이 Rejected 로 거부됩니다.
variableCharacteristics 를 채우지 않을 항목은 필드를 비우지 말고 객체 자체를 생략하십시오.
분할 전송과 변경 이력
보고할 항목이 많아 한 번에 담을 수 없으면 tbc 와 seqNo 로 분할 전송합니다.
seqNo 는 0부터 시작하고, 후속 프레임이 이어지면 tbc 를 true 로 둡니다.
분할된 모든 프레임은 같은 requestId 를 사용합니다.
CSMS는 보고된 값을 컴포넌트-변수 단위로 저장하고, 값이 바뀌면 변경 이력을 남깁니다. 따라서 부품 교체나 펌웨어 업데이트 같은 구성 변경이 이력으로 추적됩니다. 값이 바뀌지 않았다면 같은 값을 다시 보고해도 새 이력이 쌓이지 않습니다.
공통 변수
특정 컴포넌트에 종속되지 않고 여러 컴포넌트에 공통으로 쓰이는 변수입니다.
| Field Name | Type | EVSE 권한 | CSMS 권한 | Description |
|---|---|---|---|---|
| FirmwareVersion | String | ReadOnly | ReadOnly | 해당 컴포넌트의 설치 펌웨어 버전 |
FirmwareVersion
충전기 대표(메인) 펌웨어 버전은 부팅 알림의 firmwareVersion 으로 이미 관리됩니다.
따라서 이 변수는 대표 버전 외의 개별 컴포넌트(HMI, ISO 15118 모듈 등) 버전 보고에 사용하며,
대표 버전을 이 경로로 중복 보고하지 않습니다.
같은 종류의 컴포넌트가 여러 개인 경우(예: EVSE마다 별도 HMI)에는
component.instance 또는 component.evse 로 대상을 구분해야 합니다.
예시 (OCPP v1.6)
[
2,
"b914adcc-d113-46de-ad4b-edb168b96045",
"DataTransfer",
{
"vendorId": "com.skelectlink",
"messageId": "NotifyReport",
"data": {
"requestId": 1001,
"generatedAt": "2026-07-30T12:00:00Z",
"reportData": [
{
"component": {
"name": "HmiCtrlr"
},
"variable": {
"name": "FirmwareVersion"
},
"variableAttribute": [
{
"type": "Actual",
"value": "1.4.2",
"mutability": "ReadOnly"
}
]
},
{
"component": {
"name": "Iso15118Ctrlr"
},
"variable": {
"name": "FirmwareVersion"
},
"variableAttribute": [
{
"type": "Actual",
"value": "2.0.1",
"mutability": "ReadOnly"
}
]
}
]
}
}
]
예시 (OCPP v2.1)
[
2,
"b914adcc-d113-46de-ad4b-edb168b96045",
"NotifyReport",
{
"requestId": 1001,
"generatedAt": "2026-07-30T12:00:00Z",
"reportData": [
{
"component": {
"name": "HmiCtrlr"
},
"variable": {
"name": "FirmwareVersion"
},
"variableAttribute": [
{
"type": "Actual",
"value": "1.4.2",
"mutability": "ReadOnly"
}
]
},
{
"component": {
"name": "Iso15118Ctrlr"
},
"variable": {
"name": "FirmwareVersion"
},
"variableAttribute": [
{
"type": "Actual",
"value": "2.0.1",
"mutability": "ReadOnly"
}
]
}
]
}
]
Connector
Component
Connector 는 CSMS의 커스텀 컴포넌트가 아니라 OCPP 2.x 디바이스 모델의 표준 컴포넌트입니다.
커스텀 항목이 아니므로 변수명·값은 임의로 정하지 않고 OCPP 표준 정의를 그대로 사용합니다.
이 절은 CSMS가 보고를 요구하는 항목을 명시하기 위해 수록합니다.
커넥터 단위 정보를 담는 컴포넌트입니다. component.evse.id(EVSE 번호)와
component.evse.connectorId(커넥터 번호)로 대상 커넥터를 식별합니다.
Variables
| Field Name | Type | EVSE 권한 | CSMS 권한 | Description |
|---|---|---|---|---|
| ConnectorType | String | ReadOnly | ReadOnly | 커넥터의 물리 커넥터 타입 |
ConnectorType
본체(모델) 단위로 등록된 커넥터 구성만으로는 그 본체가 어떤 커넥터를 갖고 있는지까지만 알 수 있고, 어떤 커넥터 아이디가 어떤 커넥터 타입인지는 알 수 없습니다. 따라서 충전기는 커넥터마다 자신의 커넥터 타입을 보고해야 합니다. CSMS는 이 값을 커넥터 단위 커넥터 타입의 기준 데이터로 관리합니다.
값은 OCPP 표준 ConnectorEnumType 을 사용합니다. 국내에서 사용되는 값은 다음과 같습니다.
| ConnectorType | 커넥터 | CSMS 표기 |
|---|---|---|
cCCS1 | DC 콤보 (CCS1) | DC 콤보 |
cCCS2 | DC 콤보 (CCS2) | DC 콤보 |
cG105 | 차데모 (CHAdeMO) | 차데모 |
cTesla | 테슬라 (NACS) | 테슬라 |
cType1 | AC 단상 5핀 (Type 1) | AC 단상 5핀 |
cType2 | AC 3상 7핀 (Type 2) | AC 3상 7핀 |
sType2 | AC 3상 7핀 소켓 (Type 2) | AC 3상 7핀 |
타입을 확정할 수 없는 경우에만 Undetermined 또는 Unknown 을 사용합니다.
이 두 값은 커넥터 타입으로 확정되지 않으며, CSMS는 미보고와 동일하게 취급합니다.
위 표에 없는 표준값(s309-*, sBS1361, sCEE-7-7, sType3, Other1PhMax16A,
Other1PhOver16A, Other3Ph, Pan, wInductive, wResonant)도 전송할 수 있으나,
국내 충전기에서는 사용하지 않습니다. 사용이 필요하면 사전에 협의합니다.
예시 (OCPP v1.6, 2채널)
[
2,
"6f1a2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
"DataTransfer",
{
"vendorId": "com.skelectlink",
"messageId": "NotifyReport",
"data": {
"requestId": 1001,
"generatedAt": "2026-07-30T12:00:00Z",
"reportData": [
{
"component": {
"name": "Connector",
"evse": {
"id": 1,
"connectorId": 1
}
},
"variable": {
"name": "ConnectorType"
},
"variableAttribute": [
{
"type": "Actual",
"value": "cCCS1",
"mutability": "ReadOnly"
}
]
},
{
"component": {
"name": "Connector",
"evse": {
"id": 1,
"connectorId": 2
}
},
"variable": {
"name": "ConnectorType"
},
"variableAttribute": [
{
"type": "Actual",
"value": "cG105",
"mutability": "ReadOnly"
}
]
}
]
}
}
]
예시 (OCPP v2.1, 2채널)
[
2,
"6f1a2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
"NotifyReport",
{
"requestId": 1001,
"generatedAt": "2026-07-30T12:00:00Z",
"reportData": [
{
"component": {
"name": "Connector",
"evse": {
"id": 1,
"connectorId": 1
}
},
"variable": {
"name": "ConnectorType"
},
"variableAttribute": [
{
"type": "Actual",
"value": "cCCS1",
"mutability": "ReadOnly"
}
]
},
{
"component": {
"name": "Connector",
"evse": {
"id": 1,
"connectorId": 2
}
},
"variable": {
"name": "ConnectorType"
},
"variableAttribute": [
{
"type": "Actual",
"value": "cG105",
"mutability": "ReadOnly"
}
]
}
]
}
]
CustomSystemInfo
Component
충전기 제어 PC의 시스템·메인보드 정보를 담는 컴포넌트입니다.
충전기당 하나만 존재하므로 component.instance 를 사용하지 않습니다.
Variables
| Field Name | Type | EVSE 권한 | CSMS 권한 | Description |
|---|---|---|---|---|
| OSName | String | ReadOnly | ReadOnly | 운영체제 이름 (예: Windows 10 IoT Enterprise) |
| OSVersion | String | ReadOnly | ReadOnly | 운영체제 버전 또는 빌드 번호 |
| MachineId | String | ReadOnly | ReadOnly | 제어 PC를 식별하는 고유 ID (UUID 등) |
| BoardVendor | String | ReadOnly | ReadOnly | 메인보드 제조사 |
| BoardModel | String | ReadOnly | ReadOnly | 메인보드 모델명 |
| BoardSerialNumber | String | ReadOnly | ReadOnly | 메인보드 시리얼 번호 |
| BiosVersion | String | ReadOnly | ReadOnly | BIOS/UEFI 버전 |
| CpuModel | String | ReadOnly | ReadOnly | CPU 모델명 |
| MemorySize | Integer | ReadOnly | ReadOnly | 전체 메모리 크기 (단위 MB) |
MachineId, BoardSerialNumber 는 부품을 교체하지 않는 한 바뀌지 않으므로 constant: true 로 보고합니다.
CustomNetworkInterface
Component
제어 PC의 네트워크 어댑터 정보를 담는 컴포넌트입니다.
어댑터가 여러 개이므로 component.instance 에 운영체제가 인식하는 인터페이스 이름
(예: eth0, wlan0, lte0)을 반드시 채워 어댑터를 구분합니다.
instance 없이 보고하면 CSMS가 모든 어댑터를 같은 변수로 취급해 값이 서로 덮어써집니다.
Variables
| Field Name | Type | EVSE 권한 | CSMS 권한 | Description |
|---|---|---|---|---|
| MacAddress | String | ReadOnly | ReadOnly | MAC 주소 (00:1A:2B:3C:4D:5E 형식) |
| Vendor | String | ReadOnly | ReadOnly | 어댑터 제조사 |
| Model | String | ReadOnly | ReadOnly | 어댑터 모델명 |
| SerialNumber | String | ReadOnly | ReadOnly | 어댑터 시리얼 번호 |
| InterfaceType | String | ReadOnly | ReadOnly | 인터페이스 종류 — Ethernet, WiFi, Cellular 중 하나 |
| IpAddress | String | ReadOnly | ReadOnly | 보고 시점의 IP 주소 |
| LinkSpeed | Integer | ReadOnly | ReadOnly | 링크 속도 (단위 Mbps) |
MacAddress, SerialNumber 는 constant: true 로 보고합니다.
IpAddress 는 접속 환경에 따라 바뀌므로 constant 를 설정하지 않습니다.
CustomStorage
Component
제어 PC의 저장 장치 정보를 담는 컴포넌트입니다.
저장 장치가 여러 개일 수 있으므로 component.instance 에 장치 식별자
(예: disk0, disk1)를 반드시 채워 장치를 구분합니다.
Variables
| Field Name | Type | EVSE 권한 | CSMS 권한 | Description |
|---|---|---|---|---|
| Model | String | ReadOnly | ReadOnly | 저장 장치 모델명 |
| SerialNumber | String | ReadOnly | ReadOnly | 저장 장치 시리얼 번호 |
| StorageType | String | ReadOnly | ReadOnly | 장치 종류 — SSD, HDD, eMMC 중 하나 |
| Capacity | Integer | ReadOnly | ReadOnly | 전체 용량 (단위 GB) |
| HealthStatus | String | ReadOnly | ReadOnly | 장치가 보고하는 건강 상태 (예: Healthy, Warning) |
| PowerOnHours | Integer | ReadOnly | ReadOnly | 누적 전원 인가 시간 (단위 h) |
SerialNumber 는 constant: true 로 보고합니다.
HealthStatus, PowerOnHours 는 운영 중 변하므로 constant 를 설정하지 않습니다.
하드웨어 인벤토리 보고 예시
CustomSystemInfo, CustomNetworkInterface, CustomStorage 는 한 번의 리포트로 함께 보고합니다.
항목 수가 많아 한 프레임에 담기 어려우면 tbc 와 seqNo 로 분할 전송합니다.
단위가 있는 값(MemorySize, LinkSpeed, Capacity, PowerOnHours)은
variableCharacteristics.unit 으로 단위를 명시합니다.
조회 요청 예시
특정 컴포넌트만 조회하려면 componentVariable 로 대상을 좁힙니다.
생략하면 전체 인벤토리가 대상이 됩니다.
[
2,
"3d9e1f20-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"DataTransfer",
{
"vendorId": "com.skelectlink",
"messageId": "GetReport",
"data": {
"requestId": 2001,
"componentVariable": [
{
"component": {
"name": "CustomSystemInfo"
}
},
{
"component": {
"name": "CustomNetworkInterface"
}
},
{
"component": {
"name": "CustomStorage"
}
}
]
}
}
]
보고 예시 (OCPP v1.6)
[
2,
"3d9e1f20-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"DataTransfer",
{
"vendorId": "com.skelectlink",
"messageId": "NotifyReport",
"data": {
"requestId": 2001,
"generatedAt": "2026-07-30T12:00:00Z",
"seqNo": 0,
"tbc": false,
"reportData": [
{
"component": {
"name": "CustomSystemInfo"
},
"variable": {
"name": "BoardSerialNumber"
},
"variableAttribute": [
{
"type": "Actual",
"value": "MB-2024-00193847",
"mutability": "ReadOnly",
"constant": true
}
],
"variableCharacteristics": {
"dataType": "string",
"supportsMonitoring": false
}
},
{
"component": {
"name": "CustomSystemInfo"
},
"variable": {
"name": "MemorySize"
},
"variableAttribute": [
{
"type": "Actual",
"value": "8192",
"mutability": "ReadOnly"
}
],
"variableCharacteristics": {
"dataType": "integer",
"unit": "MB",
"supportsMonitoring": false
}
},
{
"component": {
"name": "CustomNetworkInterface",
"instance": "eth0"
},
"variable": {
"name": "MacAddress"
},
"variableAttribute": [
{
"type": "Actual",
"value": "00:1A:2B:3C:4D:5E",
"mutability": "ReadOnly",
"constant": true
}
],
"variableCharacteristics": {
"dataType": "string",
"supportsMonitoring": false
}
},
{
"component": {
"name": "CustomNetworkInterface",
"instance": "lte0"
},
"variable": {
"name": "MacAddress"
},
"variableAttribute": [
{
"type": "Actual",
"value": "00:1A:2B:3C:4D:5F",
"mutability": "ReadOnly",
"constant": true
}
],
"variableCharacteristics": {
"dataType": "string",
"supportsMonitoring": false
}
},
{
"component": {
"name": "CustomStorage",
"instance": "disk0"
},
"variable": {
"name": "SerialNumber"
},
"variableAttribute": [
{
"type": "Actual",
"value": "S4EWNX0N512345",
"mutability": "ReadOnly",
"constant": true
}
],
"variableCharacteristics": {
"dataType": "string",
"supportsMonitoring": false
}
}
]
}
}
]
보고 예시 (OCPP v2.1)
[
2,
"3d9e1f20-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"NotifyReport",
{
"requestId": 2001,
"generatedAt": "2026-07-30T12:00:00Z",
"seqNo": 0,
"tbc": false,
"reportData": [
{
"component": {
"name": "CustomSystemInfo"
},
"variable": {
"name": "BoardSerialNumber"
},
"variableAttribute": [
{
"type": "Actual",
"value": "MB-2024-00193847",
"mutability": "ReadOnly",
"constant": true
}
],
"variableCharacteristics": {
"dataType": "string",
"supportsMonitoring": false
}
},
{
"component": {
"name": "CustomNetworkInterface",
"instance": "eth0"
},
"variable": {
"name": "MacAddress"
},
"variableAttribute": [
{
"type": "Actual",
"value": "00:1A:2B:3C:4D:5E",
"mutability": "ReadOnly",
"constant": true
}
],
"variableCharacteristics": {
"dataType": "string",
"supportsMonitoring": false
}
},
{
"component": {
"name": "CustomStorage",
"instance": "disk0"
},
"variable": {
"name": "Capacity"
},
"variableAttribute": [
{
"type": "Actual",
"value": "512",
"mutability": "ReadOnly"
}
],
"variableCharacteristics": {
"dataType": "integer",
"unit": "GB",
"supportsMonitoring": false
}
}
]
}
]