Top AC Portable EV Charger
Top AC Portable EV Charger is a Powered By Shelly smart AC charging device designed for electric vehicles. It provides safe and flexible home or on-the-go charging, supporting both single- and three-phase setups. The charger exposes live per-phase telemetry and allows you to start or stop sessions, limit charging current, and enforce global time or energy limits.
For more information about the original Top AC Portable EV Charger consult: Top AC Portable EV Charger.
The following components are available in Top AC Portable EV Charger:
Supported virtual components:
Supported BTHome components:
Virtual Component Configuration
The Top AC Portable EV Charger has the following virtual components:
| Virtual Component | Type | Access | Description |
|---|---|---|---|
work_state | enum | read | Reports the charger's state (wait, charging, pause, etc.) |
current_limit | number | read/write | Sets the charging current. |
phase_info | object | read | Live per-phase electrical telemetry (voltage/current/power) with aggregated total active energy (kWh). |
start_charging | boolean | read/write | Starts or stops the charging session. |
energy_charge | number | read | Session energy consumption (kWh). |
time_charge | number | read | Session duration. |
Service Configuration
See the Service Configuration Example section for a full example.
| Property | Type | Description | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| object | Configures load balancing with an external Shelly EM/EM1 device. When enabled, the charger adjusts its current limit to keep total site current under the configured threshold.
| |||||||||||||||
| boolean | When enabled, charging starts automatically as soon as the connector is plugged into the vehicle. | |||||||||||||||
| number | Session energy cap (kWh) (0–1000). When reached, charging stops and a status flag is raised. | |||||||||||||||
| number | Session duration cap (minutes) (0–1440). When reached, charging stops and a status flag is raised. | |||||||||||||||
| number | Service id. |
Method Examples
How to check the working state
- Enum.GetStatus HTTP GET Request
- Enum.GetStatus Curl Request
- Enum.GetStatus Mos Request
http://192.168.33.1/rpc/Enum.GetStatus?owner="service:0"&role="work_state"
curl -X POST -d '{"id":1,"method":"Enum.GetStatus","params":{"owner":"service:0","role":"work_state"}}' http://${SHELLY}/rpc
mos --port ${PORT} call Enum.GetStatus '{"owner":"service:0","role":"work_state"}'
Response
- Enum.GetStatus HTTP GET Response
- Enum.GetStatus Curl Response
- Enum.GetStatus Mos Response
{
"value": "charger_free",
"source": "",
"last_update_ts": 0
}
{
"id": 1,
"src": "evcharger-543204516524",
"params": {
"value": "charger_free",
"source": "",
"last_update_ts": 0
}
}
{
"value": "charger_free",
"source": "",
"last_update_ts": 0
}
How to set the current charging limit (to 10 A)
- Number.Set HTTP GET Request
- Number.Set Curl Request
- Number.Set Mos Request
http://192.168.33.1/rpc/Number.Set?owner="service:0"&role="current_limit"&value=10
curl -X POST -d '{"id":1,"method":"Number.Set","params":{"owner":"service:0","role":"current_limit","value":10}}' http://${SHELLY}/rpc
mos --port ${PORT} call Number.Set '{"owner":"service:0","role":"current_limit","value":10}'
Response
- Number.Set HTTP GET Response
- Number.Set Curl Response
- Number.Set Mos Response
null
{
"id": 1,
"src": "evcharger-543204516524",
"params": null
}
null
How to check the phase info
- Object.GetStatus HTTP GET Request
- Object.GetStatus Curl Request
- Object.GetStatus Mos Request
http://192.168.33.1/rpc/Object.GetStatus?owner="service:0"&role="phase_info"
curl -X POST -d '{"id":1,"method":"Object.GetStatus","params":{"owner":"service:0","role":"phase_info"}}' http://${SHELLY}/rpc
mos --port ${PORT} call Object.GetStatus '{"owner":"service:0","role":"phase_info"}'
Response
- Object.GetStatus HTTP GET Response
- Object.GetStatus Curl Response
- Object.GetStatus Mos Response
{
"value": {
"counter": {
"total": 0,
"minute_ts": 1761642960,
"by_minute": [
0,
0,
0
]
},
"total_current": 0,
"total_power": 0,
"total_act_energy": 0,
"phase_a": {
"voltage": 0,
"current": 0,
"power": 0
},
"phase_b": {
"voltage": 0,
"current": 0,
"power": 0
},
"phase_c": {
"voltage": 0,
"current": 0,
"power": 0
}
},
"source": "sys",
"last_update_ts": 1761643021
}
{
"id": 1,
"src": "evcharger-543204516524",
"params": {
"value": {
"counter": {
"total": 0,
"minute_ts": 1761642960,
"by_minute": [
0,
0,
0
]
},
"total_current": 0,
"total_power": 0,
"total_act_energy": 0,
"phase_a": {
"voltage": 0,
"current": 0,
"power": 0
},
"phase_b": {
"voltage": 0,
"current": 0,
"power": 0
},
"phase_c": {
"voltage": 0,
"current": 0,
"power": 0
}
},
"source": "sys",
"last_update_ts": 1761643021
}
}
{
"value": {
"counter": {
"total": 0,
"minute_ts": 1761642960,
"by_minute": [
0,
0,
0
]
},
"total_current": 0,
"total_power": 0,
"total_act_energy": 0,
"phase_a": {
"voltage": 0,
"current": 0,
"power": 0
},
"phase_b": {
"voltage": 0,
"current": 0,
"power": 0
},
"phase_c": {
"voltage": 0,
"current": 0,
"power": 0
}
},
"source": "sys",
"last_update_ts": 1761643021
}
How to start a charging session
- Boolean.Set HTTP GET Request
- Boolean.Set Curl Request
- Boolean.Set Mos Request
http://192.168.33.1/rpc/Boolean.Set?owner="service:0"&role="start_charging"&value=true
curl -X POST -d '{"id":1,"method":"Boolean.Set","params":{"owner":"service:0","role":"start_charging","value":true}}' http://${SHELLY}/rpc
mos --port ${PORT} call Boolean.Set '{"owner":"service:0","role":"start_charging","value":true}'
Response
- Boolean.Set HTTP GET Response
- Boolean.Set Curl Response
- Boolean.Set Mos Response
null
{
"id": 1,
"src": "evcharger-543204516524",
"params": null
}
null
How to check the session energy consumption
- Number.GetStatus HTTP GET Request
- Number.GetStatus Curl Request
- Number.GetStatus Mos Request
http://192.168.33.1/rpc/Number.GetStatus?owner="service:0"&role="energy_charge"
curl -X POST -d '{"id":1,"method":"Number.GetStatus","params":{"owner":"service:0","role":"energy_charge"}}' http://${SHELLY}/rpc
mos --port ${PORT} call Number.GetStatus '{"owner":"service:0","role":"energy_charge"}'
Response
- Number.GetStatus HTTP GET Response
- Number.GetStatus Curl Response
- Number.GetStatus Mos Response
{
"value": 5.37,
"source": "sys",
"last_update_ts": 1761637872
}
{
"id": 1,
"src": "evcharger-543204516524",
"params": {
"value": 5.37,
"source": "sys",
"last_update_ts": 1761637872
}
}
{
"value": 5.37,
"source": "sys",
"last_update_ts": 1761637872
}
How to check the session duration
- Number.GetStatus HTTP GET Request
- Number.GetStatus Curl Request
- Number.GetStatus Mos Request
http://192.168.33.1/rpc/Number.GetStatus?owner="service:0"&role="time_charge"
curl -X POST -d '{"id":1,"method":"Number.GetStatus","params":{"owner":"service:0","role":"time_charge"}}' http://${SHELLY}/rpc
mos --port ${PORT} call Number.GetStatus '{"owner":"service:0","role":"time_charge"}'
Response
- Number.GetStatus HTTP GET Response
- Number.GetStatus Curl Response
- Number.GetStatus Mos Response
{
"value": 128,
"source": "sys",
"last_update_ts": 1761643238
}
{
"id": 1,
"src": "evcharger-543204516524",
"params": {
"value": 128,
"source": "sys",
"last_update_ts": 1761643238
}
}
{
"value": 128,
"source": "sys",
"last_update_ts": 1761643238
}
Service Configuration Example
- Service.GetConfig HTTP GET Request
- Service.GetConfig Curl Request
- Service.GetConfig Mos Request
http://192.168.33.1/rpc/Service.GetConfig?id=0
curl -X POST -d '{"id":1,"method":"Service.GetConfig","params":{"id":0}}' http://${SHELLY}/rpc
mos --port ${PORT} call Service.GetConfig '{"id":0}'
Response
- Service.GetConfig HTTP GET Response
- Service.GetConfig Curl Response
- Service.GetConfig Mos Response
{
"auto_balance": {
"enable": false,
"em_ip": null,
"max_current": 24,
"exclude_self_current": true
},
"auto_charge": true,
"global_charge_limit": null,
"global_time_limit": null,
"id": 0
}
{
"id": 1,
"src": "evcharger-543204516524",
"params": {
"auto_balance": {
"enable": false,
"em_ip": null,
"max_current": 24,
"exclude_self_current": true
},
"auto_charge": true,
"global_charge_limit": null,
"global_time_limit": null,
"id": 0
}
}
{
"auto_balance": {
"enable": false,
"em_ip": null,
"max_current": 24,
"exclude_self_current": true
},
"auto_charge": true,
"global_charge_limit": null,
"global_time_limit": null,
"id": 0
}