Skip to content

charger: add TIMXON Modbus charger - #32825

Draft
QiaoJiaLing wants to merge 2 commits into
evcc-io:masterfrom
QiaoJiaLing:timxon_charger_20260814
Draft

charger: add TIMXON Modbus charger#32825
QiaoJiaLing wants to merge 2 commits into
evcc-io:masterfrom
QiaoJiaLing:timxon_charger_20260814

Conversation

@QiaoJiaLing

Copy link
Copy Markdown

Summary

Adds support for TIMXON Modbus chargers.

This change includes:

  • a native Go charger implementation for TIMXON Modbus
  • a charger template so TIMXON can be selected from the setup UI
  • support for Modbus TCP/IP and RS485 configuration
  • support for connector selection

Testing

Tested with:

go test -vet=off ./util/templates
go test -vet=off ./charger -run 'TestTemplates/timxon'

@github-actions github-actions Bot added devices Specific device support enhancement New feature or request labels Aug 14, 2026

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 1 issue

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="templates/definition/charger/timxon.yaml" line_range="6" />
<code_context>
+  - brand: TIMXON
+capabilities: ["meter", "dim"]
+params:
+  - name: modbus
+    choice: ["tcpip", "rs485"]
+  - name: connector
</code_context>
<issue_to_address>
**issue (review_instructions):** The `modbus` parameter is missing an explicit `type` field, which is likely required for template params and inconsistent with how `connector` (and other templates) define choices.

In the templates directory, choice-like parameters are typically declared with an explicit `type: choice` (or another supported type) alongside the `choice` list. Here, `modbus` only defines `choice` without a `type`, while `connector` correctly uses `type: choice`. This likely violates the param definition rules in `templates/README.md` and may cause the renderer to treat `modbus` incorrectly. Please align `modbus` with the documented param schema and with existing charger templates, e.g. by adding `type: choice` or whatever type is prescribed in the README.

<details>
<summary>Review instructions:</summary>

**Path patterns:** `templates/**/*.yaml`

**Instructions:**
Verify that the changes comply to the rules defined in templates/README.md. Also check consistence (wording) with other files inside templates directory.

</details>
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread templates/definition/charger/timxon.yaml
@QiaoJiaLing

Copy link
Copy Markdown
Author

Updated the template parameter schema and all checks are passing now.

@premultiply premultiply self-assigned this Aug 14, 2026
@QiaoJiaLing

Copy link
Copy Markdown
Author

TIMXON evcc Real-Device Test Plan

This document records real-device test results for integrating TIMXON chargers with evcc. Its goal is to verify that the Modbus protocol implementation is safe and stable, and to provide test evidence for a future submission to evcc upstream.

1. Test Objectives

  • Verify that the TIMXON template can be displayed and saved in the evcc UI.
  • Verify that Modbus TCP / RS485 communication works correctly.
  • Verify that the status mapping matches the evcc A/B/C status model.
  • Verify that charging start/stop control is safe and reliable.
  • Verify that maximum current control works correctly.
  • Verify that metering data such as power, energy, current, and voltage is reasonable.
  • Verify that connector selection is correct for single-connector / dual-connector devices.

2. Test Environment Information

Item Record
Test date 2026.8.8
Tester Lumi
Device brand TIMXON
Device model
Firmware version H0-AC22-V1.07-EVCC1
Single / dual connector Single connector
Connection method Modbus TCP
Modbus ID timxon_1
TCP address 192.168.1.72
TCP port 502
Serial device RS485
Baud rate 115200
Communication format
evcc commit
evcc executable
Test config file

3. Configuration Examples

Modbus TCP

chargers:
  - name: timxon_1
    type: template
    template: tmx
    modbus: tcpip
    id: 1
    host: 192.168.1.30
    port: 502
    connector: 1

Test data:
network:
port: 7070

interval: 10s

chargers:

  • name: timxon_1
    type: template
    template: tmx
    modbus: tcpip
    host: 192.168.1.72 # replace with charger IP
    port: 502
    id: 255
    connector: 1

USB-RS485

chargers:
  - name: timxon_1
    type: template
    template: tmx
    modbus: rs485serial
    id: 1
    device: COM3
    baudrate: 9600
    comset: "8N1"
    connector: 1

Note: The current UI display name is TIMXON, while the internal template name remains tmx. If the internal template name is later changed to timxon, the template value here must be updated accordingly.

4. UI Template Selection Test

Test item Action Expected result Actual result Pass
UI display Open the add-charger page TIMXON is shown in the list
Save configuration Select TIMXON and enter Modbus parameters Saves successfully
Restart loading Restart evcc Configuration loads successfully

5. Read-Only Diagnostic Test

Do not plug in the vehicle or execute start/stop commands yet. Run read-only diagnostics first.

.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 --diagnose --timeout 5s

Record the following output:

Data item Expected result Actual result Pass
Version Version can be read, or failure does not affect other data
Serial Serial number can be read
Connector State Status code can be read
Cable State Shows disconnected when unplugged
Error Code 0 during normal operation
CP State State changes reasonably between unplugged / plugged-in
CP Value Voltage value is reasonable
PP State Charging cable capacity detection is reasonable
Current Limit Current limit value can be read
Default Max Current Matches the device setting
Default Min Current Matches the device setting
UID May be empty before RFID swipe; should change after swipe

Test data:
Total time: 765ms
Diagnostic dump:
Connector: 1
[tmx ] TRACE 2026/08/11 17:54:25 modbus: send 00 0c 00 00 00 06 ff 03 00 00 00 10
[tmx ] TRACE 2026/08/11 17:54:25 modbus: recv 00 0c 00 00 00 23 ff 03 20 48 30 2d 41 43 32 32 2d 56 31 2e 30 37 2d 45 56 43 43 31 00 00 00 00 00 00 00 00 00 00 00 00 00
Version: H0-AC22-V1.07-EVCC1
[tmx ] TRACE 2026/08/11 17:54:25 modbus: send 00 0d 00 00 00 06 ff 03 00 10 00 10
[tmx ] TRACE 2026/08/11 17:54:25 modbus: recv 00 0d 00 00 00 23 ff 03 20 33 30 31 30 30 30 32 35 30 31 31 35 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Serial: 3010002501150000
[tmx ] TRACE 2026/08/11 17:54:25 modbus: send 00 0e 00 00 00 06 ff 03 00 22 00 01
[tmx ] TRACE 2026/08/11 17:54:25 modbus: recv 00 0e 00 00 00 05 ff 03 02 00 01
Connector State: 1
[tmx ] TRACE 2026/08/11 17:54:25 modbus: send 00 0f 00 00 00 06 ff 03 00 24 00 01
[tmx ] TRACE 2026/08/11 17:54:25 modbus: recv 00 0f 00 00 00 05 ff 03 02 00 01
Cable State: 1
[tmx ] TRACE 2026/08/11 17:54:25 modbus: send 00 10 00 00 00 06 ff 03 00 26 00 01
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 10 00 00 00 05 ff 03 02 00 00
Error Code: 0
[tmx ] TRACE 2026/08/11 17:54:26 modbus: send 00 11 00 00 00 06 ff 03 00 28 00 01
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 11 00 00 00 05 ff 03 02 00 02
CP State: 2
[tmx ] TRACE 2026/08/11 17:54:26 modbus: send 00 12 00 00 00 06 ff 03 00 2a 00 01
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 12 00 00 00 05 ff 03 02 00 3e
CP Value: 6.2V
[tmx ] TRACE 2026/08/11 17:54:26 modbus: send 00 13 00 00 00 06 ff 03 00 2c 00 01
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 13 00 00 00 05 ff 03 02 00 00
PP State: 0
[tmx ] TRACE 2026/08/11 17:54:26 modbus: send 00 14 00 00 00 06 ff 03 00 32 00 01
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 14 00 00 00 05 ff 03 02 00 10
Current Limit: 16A
[tmx ] TRACE 2026/08/11 17:54:26 modbus: send 00 15 00 00 00 06 ff 03 00 77 00 01
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 15 00 00 00 05 ff 03 02 00 00
Default Max Current: 0.0A
[tmx ] TRACE 2026/08/11 17:54:26 modbus: send 00 16 00 00 00 06 ff 03 00 78 00 01
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 16 00 00 00 05 ff 03 02 00 06
Default Min Current: 0.6A
[tmx ] TRACE 2026/08/11 17:54:26 modbus: send 00 17 00 00 00 06 ff 03 00 79 00 10
[tmx ] TRACE 2026/08/11 17:54:26 modbus: recv 00 17 00 00 00 23 ff 03 20 46 32 36 39 45 33 31 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
UID: F269E312

6. Status Mapping Test

evcc uses the A/B/C status model:

  • A: No vehicle connected or charging unavailable
  • B: Vehicle connected, waiting or paused
  • C: Charging
Scenario TIMXON raw status code TIMXON status meaning Expected evcc status Actual status Pass
Unplugged 0 Available A
Plugged in, not charging 1 Preparing B
Charging 2 Charging C
EVSE suspended 3 SuspendedEVSE B
EV suspended 4 SuspendedEV B
Charging finished 5 Finishing B
Reserved state 6 Reserved B
Unavailable 7 Unavailable A
Fault 8 Faulted Record actual behavior

7. Start/Stop Test

Before testing, it is recommended to set a low current first, for example 6A.

.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -i 6

PS C:\EVCC> .\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -i 6
[main ] INFO 2026/08/11 10:25:05 using config file: .\evcc.tmx.yaml
[main ] INFO 2026/08/11 10:25:05 using sqlite database: C:\Users\Admin.evcc\evcc.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=auto_vacuum(INCREMENTAL)
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type='table' AND name="sessions" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM sessions 3
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="grid_sessions" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "grid_sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM grid_sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type='table' AND name="caches" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "caches" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM caches LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="settings" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "settings" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM settings LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM settings 4
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type='table' AND name="configs" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "configs" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM configs LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM entities WHERE entities.group = "home" AND entities.name = "home" ORDER BY entities.id LIMIT 1 1
[db ] TRACE 2026/08/11 10:25:05 UPDATE entities SET title="grid" WHERE "group" = "grid" AND title <> "grid" 0
[db ] TRACE 2026/08/11 10:25:05 pragma foreign_keys(1) 0
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "name_idx" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "group_name" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meter_ts" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""val"" %" OR sql LIKE "%val %" OR sql LIKE "%val%" OR sql LIKE "%[val]%" OR sql LIKE "% val %") -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""pos"" %" OR sql LIKE "%pos %" OR sql LIKE "%pos%" OR sql LIKE "%[pos]%" OR sql LIKE "% pos %") -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""neg"" %" OR sql LIKE "%neg %" OR sql LIKE "%neg%" OR sql LIKE "%[neg]%" OR sql LIKE "% neg %") -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""import"" %" OR sql LIKE "%import %" OR sql LIKE "%import%" OR sql LIKE "%[import]%" OR sql LIKE "% import %") -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""export"" %" OR sql LIKE "%export %" OR sql LIKE "%export%" OR sql LIKE "%[export]%" OR sql LIKE "% export %") -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%CONSTRAINT ""fk_meters_entity"" %" OR sql LIKE "%CONSTRAINT fk_meters_entity %" OR sql LIKE "%CONSTRAINT fk_meters_entity%" OR sql LIKE "%CONSTRAINT [fk_meters_entity]%" OR sql LIKE "%CONSTRAINT fk_meters_entity %") -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meters_meter_ts" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="tariffs" -1
[db ] TRACE 2026/08/11 10:25:05 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "tariffs" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM tariffs LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:05 SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "tariffs" AND name = "idx_tariffs_timestamp" -1
[eebus ] INFO 2026/08/11 10:25:05 Local SKI: 70a7bb07e270f892b20eca9e93423edd2fa76ca1
[db ] TRACE 2026/08/11 10:25:05 SELECT * FROM configs WHERE configs.class = 1 1
[tmx ] TRACE 2026/08/11 10:25:05 modbus: send 00 01 00 00 00 09 ff 10 00 32 00 01 02 00 06
[tmx ] TRACE 2026/08/11 10:25:08 modbus: recv 00 01 00 00 00 06 ff 10 00 32 00 01

Start charging:

.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -e

PS C:\EVCC> .\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -e
[main ] INFO 2026/08/11 10:25:46 using config file: .\evcc.tmx.yaml
[main ] INFO 2026/08/11 10:25:46 using sqlite database: C:\Users\Admin.evcc\evcc.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=auto_vacuum(INCREMENTAL)
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type='table' AND name="sessions" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM sessions 3
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="grid_sessions" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "grid_sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM grid_sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type='table' AND name="caches" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "caches" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM caches LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="settings" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "settings" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM settings LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM settings 4
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type='table' AND name="configs" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "configs" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM configs LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM entities WHERE entities.group = "home" AND entities.name = "home" ORDER BY entities.id LIMIT 1 1
[db ] TRACE 2026/08/11 10:25:46 UPDATE entities SET title="grid" WHERE "group" = "grid" AND title <> "grid" 0
[db ] TRACE 2026/08/11 10:25:46 pragma foreign_keys(1) 0
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "name_idx" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "group_name" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meter_ts" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""val"" %" OR sql LIKE "%val %" OR sql LIKE "%val%" OR sql LIKE "%[val]%" OR sql LIKE "% val %") -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""pos"" %" OR sql LIKE "%pos %" OR sql LIKE "%pos%" OR sql LIKE "%[pos]%" OR sql LIKE "% pos %") -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""neg"" %" OR sql LIKE "%neg %" OR sql LIKE "%neg%" OR sql LIKE "%[neg]%" OR sql LIKE "% neg %") -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""import"" %" OR sql LIKE "%import %" OR sql LIKE "%import%" OR sql LIKE "%[import]%" OR sql LIKE "% import %") -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""export"" %" OR sql LIKE "%export %" OR sql LIKE "%export%" OR sql LIKE "%[export]%" OR sql LIKE "% export %") -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%CONSTRAINT ""fk_meters_entity"" %" OR sql LIKE "%CONSTRAINT fk_meters_entity %" OR sql LIKE "%CONSTRAINT fk_meters_entity%" OR sql LIKE "%CONSTRAINT [fk_meters_entity]%" OR sql LIKE "%CONSTRAINT fk_meters_entity %") -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meters_meter_ts" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="tariffs" -1
[db ] TRACE 2026/08/11 10:25:46 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "tariffs" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM tariffs LIMIT 1 -1
[db ] TRACE 2026/08/11 10:25:46 SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "tariffs" AND name = "idx_tariffs_timestamp" -1
[eebus ] INFO 2026/08/11 10:25:46 Local SKI: 70a7bb07e270f892b20eca9e93423edd2fa76ca1
[db ] TRACE 2026/08/11 10:25:46 SELECT * FROM configs WHERE configs.class = 1 1
[tmx ] TRACE 2026/08/11 10:25:46 modbus: send 00 01 00 00 00 09 ff 10 00 34 00 01 02 00 01
[tmx ] TRACE 2026/08/11 10:25:48 modbus: recv 00 01 00 00 00 06 ff 10 00 34 00 01

Stop charging:

.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -d

PS C:\EVCC> .\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -d
[main ] INFO 2026/08/11 10:27:11 using config file: .\evcc.tmx.yaml
[main ] INFO 2026/08/11 10:27:11 using sqlite database: C:\Users\Admin.evcc\evcc.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=auto_vacuum(INCREMENTAL)
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type='table' AND name="sessions" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM sessions 3
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="grid_sessions" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "grid_sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM grid_sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type='table' AND name="caches" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "caches" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM caches LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="settings" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "settings" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM settings LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM settings 4
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type='table' AND name="configs" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "configs" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM configs LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM entities WHERE entities.group = "home" AND entities.name = "home" ORDER BY entities.id LIMIT 1 1
[db ] TRACE 2026/08/11 10:27:11 UPDATE entities SET title="grid" WHERE "group" = "grid" AND title <> "grid" 0
[db ] TRACE 2026/08/11 10:27:11 pragma foreign_keys(1) 0
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "name_idx" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "group_name" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meter_ts" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""val"" %" OR sql LIKE "%val %" OR sql LIKE "%val%" OR sql LIKE "%[val]%" OR sql LIKE "% val %") -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""pos"" %" OR sql LIKE "%pos %" OR sql LIKE "%pos%" OR sql LIKE "%[pos]%" OR sql LIKE "% pos %") -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""neg"" %" OR sql LIKE "%neg %" OR sql LIKE "%neg%" OR sql LIKE "%[neg]%" OR sql LIKE "% neg %") -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""import"" %" OR sql LIKE "%import %" OR sql LIKE "%import%" OR sql LIKE "%[import]%" OR sql LIKE "% import %") -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""export"" %" OR sql LIKE "%export %" OR sql LIKE "%export%" OR sql LIKE "%[export]%" OR sql LIKE "% export %") -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%CONSTRAINT ""fk_meters_entity"" %" OR sql LIKE "%CONSTRAINT fk_meters_entity %" OR sql LIKE "%CONSTRAINT fk_meters_entity%" OR sql LIKE "%CONSTRAINT [fk_meters_entity]%" OR sql LIKE "%CONSTRAINT fk_meters_entity %") -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meters_meter_ts" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="tariffs" -1
[db ] TRACE 2026/08/11 10:27:11 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "tariffs" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM tariffs LIMIT 1 -1
[db ] TRACE 2026/08/11 10:27:11 SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "tariffs" AND name = "idx_tariffs_timestamp" -1
[eebus ] INFO 2026/08/11 10:27:11 Local SKI: 70a7bb07e270f892b20eca9e93423edd2fa76ca1
[db ] TRACE 2026/08/11 10:27:11 SELECT * FROM configs WHERE configs.class = 1 1
[tmx ] TRACE 2026/08/11 10:27:11 modbus: send 00 01 00 00 00 09 ff 10 00 34 00 01 02 00 02
[tmx ] TRACE 2026/08/11 10:27:13 modbus: recv 00 01 00 00 00 06 ff 10 00 34 00 01

Test item Action Expected result Actual result Pass
Start Execute -e Write the Start command; device allows charging
Stop Execute -d Write the Stop command; device stops charging
Repeated start/stop Run start / stop 3 consecutive times No errors and no loss of control
Status after stop Keep vehicle plugged in after stopping Status is B or A, and the vehicle no longer draws power
Network recovery Restore communication after disconnect evcc can read the status again

8. Current Limit Test

Set different current values in sequence and observe the actual device limit and vehicle-side current.

.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -i 6
.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -i 10
.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -i 16
Set value Device-displayed current limit Actual vehicle current Register unit assessment Pass
6A 1A / 0.1A
10A 1A / 0.1A
16A 1A / 0.1A

Key conclusions:

Item Conclusion
Current limit register unit
Minimum settable current
Maximum settable current
Device behavior when setting 0A
Device behavior when setting out-of-range current

PS C:\EVCC> .\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 -i 16
[main ] INFO 2026/08/11 20:21:36 using config file: .\evcc.tmx.yaml
[main ] INFO 2026/08/11 20:21:36 using sqlite database: C:\Users\Admin.evcc\evcc.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=auto_vacuum(INCREMENTAL)
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type='table' AND name="sessions" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM sessions 9
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="grid_sessions" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "grid_sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM grid_sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type='table' AND name="caches" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "caches" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM caches LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="settings" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "settings" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM settings LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM settings 4
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type='table' AND name="configs" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "configs" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM configs LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM entities WHERE entities.group = "home" AND entities.name = "home" ORDER BY entities.id LIMIT 1 1
[db ] TRACE 2026/08/11 20:21:36 UPDATE entities SET title="grid" WHERE "group" = "grid" AND title <> "grid" 0
[db ] TRACE 2026/08/11 20:21:36 pragma foreign_keys(1) 0
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "name_idx" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "group_name" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meter_ts" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""val"" %" OR sql LIKE "%val %" OR sql LIKE "%val%" OR sql LIKE "%[val]%" OR sql LIKE "% val %") -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""pos"" %" OR sql LIKE "%pos %" OR sql LIKE "%pos%" OR sql LIKE "%[pos]%" OR sql LIKE "% pos %") -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""neg"" %" OR sql LIKE "%neg %" OR sql LIKE "%neg%" OR sql LIKE "%[neg]%" OR sql LIKE "% neg %") -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""import"" %" OR sql LIKE "%import %" OR sql LIKE "%import%" OR sql LIKE "%[import]%" OR sql LIKE "% import %") -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""export"" %" OR sql LIKE "%export %" OR sql LIKE "%export%" OR sql LIKE "%[export]%" OR sql LIKE "% export %") -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%CONSTRAINT ""fk_meters_entity"" %" OR sql LIKE "%CONSTRAINT fk_meters_entity %" OR sql LIKE "%CONSTRAINT fk_meters_entity%" OR sql LIKE "%CONSTRAINT [fk_meters_entity]%" OR sql LIKE "%CONSTRAINT fk_meters_entity %") -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meters_meter_ts" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="tariffs" -1
[db ] TRACE 2026/08/11 20:21:36 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "tariffs" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM tariffs LIMIT 1 -1
[db ] TRACE 2026/08/11 20:21:36 SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "tariffs" AND name = "idx_tariffs_timestamp" -1
[eebus ] INFO 2026/08/11 20:21:36 Local SKI: 70a7bb07e270f892b20eca9e93423edd2fa76ca1
[db ] TRACE 2026/08/11 20:21:36 SELECT * FROM configs WHERE configs.class = 1 1
[main ] ERROR 2026/08/11 20:21:38 set current: dial tcp 192.168.31.116:502: connectex: No connection could be made because the target machine actively refused it.

9. Meter Data Test

Run during charging:

.\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 --timeout 5s
Data item Expected result Actual result Pass
Power Close to actual charging power, unit W
Energy Accumulated energy in kWh increases monotonically
Current L1 Matches the actual number of phases
Current L2 Matches the actual number of phases
Current L3 Matches the actual number of phases
Voltage L1 Approximately 220V / 230V
Voltage L2 Approximately 220V / 230V
Voltage L3 Approximately 220V / 230V
Power L1 Reasonable
Power L2 Reasonable
Power L3 Reasonable
ChargedEnergy Energy charged in this session increases
ChargeDuration Charging duration increases

Test data:

Power: 0W 1.911s
Energy: 0.0kWh 411ms
Current L1..L3: 0A 0A 0A 225ms
Voltage L1..L3: 227V 229V 229V 284ms
Power L1..L3: 0W 0W 0W 307ms
Charge status: A 426ms
Enabled: false 289ms
Charged: 0.0kWh 413ms
Duration: 0s 299ms
Max Current: 16.0A 237ms
Identifier: 279ms
Total time: 5.083s

Power: 0W 731ms
Energy: 0.0kWh 280ms
Current L1..L3: 0A 0A 0A 307ms
Voltage L1..L3: 227V 229V 228V 309ms
Power L1..L3: 0W 0W 0W 306ms
Charge status: B 218ms
Enabled: false 295ms
Charged: 0.0kWh 307ms
Duration: 0s 415ms
Max Current: 16.0A 297ms
Identifier: 307ms

Total time: 3.772s

Power: 2106W 1.781s
Energy: 0.0kWh 309ms
Current L1..L3: 3A 3.1A 3A 231ms
Voltage L1..L3: 226V 228V 228V 380ms
Power L1..L3: 696W 719W 701W 238ms
Charge status: C 284ms
Enabled: true 303ms
Charged: 0.0kWh 304ms
Duration: 24s 308ms
Max Current: 16.0A 222ms
Identifier: freeIdTag 293ms

Total time: 4.652s

Power: 4197W 1.054s
Energy: 0.1kWh 315ms
Current L1..L3: 6A 6.1A 6.1A 306ms
Voltage L1..L3: 226V 229V 228V 294ms
Power L1..L3: 1374W 1417W 1406W 221ms
Charge status: C 316ms
Enabled: true 2.337s
Charged: 0.1kWh 307ms
Duration: 2m30s 304ms
Max Current: 16.0A 313ms
Identifier: freeIdTag 305ms

Total time: 6.073s

10. Single-Phase / Three-Phase Test

Scenario Expected result Actual result Pass
Single-phase vehicle charging Only the actually used phases have current / power
Three-phase vehicle charging L1/L2/L3 current and power are reasonable
Idle state Current is close to 0A and power is close to 0W

Note: The current TIMXON driver does not implement the evcc PhaseSwitcher; this test only verifies data reading, not automatic 1P/3P switching.

PS C:\EVCC> .\evcc-tmx.exe -c .\evcc.tmx.yaml -l trace charger timxon_1 --timeout 5s
[main ] INFO 2026/08/11 14:46:09 using config file: .\evcc.tmx.yaml
[main ] INFO 2026/08/11 14:46:09 using sqlite database: C:\Users\Admin.evcc\evcc.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=auto_vacuum(INCREMENTAL)
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type='table' AND name="sessions" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM sessions 5
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="grid_sessions" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "grid_sessions" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM grid_sessions LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type='table' AND name="caches" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "caches" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM caches LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="settings" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "settings" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM settings LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM settings 4
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type='table' AND name="configs" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "configs" AND sql IS NOT NULL order by type = "table" desc 1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM configs LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM entities WHERE entities.group = "home" AND entities.name = "home" ORDER BY entities.id LIMIT 1 1
[db ] TRACE 2026/08/11 14:46:09 UPDATE entities SET title="grid" WHERE "group" = "grid" AND title <> "grid" 0
[db ] TRACE 2026/08/11 14:46:09 pragma foreign_keys(1) 0
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "name_idx" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "group_name" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meter_ts" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""val"" %" OR sql LIKE "%val %" OR sql LIKE "%val%" OR sql LIKE "%[val]%" OR sql LIKE "% val %") -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""pos"" %" OR sql LIKE "%pos %" OR sql LIKE "%pos%" OR sql LIKE "%[pos]%" OR sql LIKE "% pos %") -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""neg"" %" OR sql LIKE "%neg %" OR sql LIKE "%neg%" OR sql LIKE "%[neg]%" OR sql LIKE "% neg %") -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""import"" %" OR sql LIKE "%import %" OR sql LIKE "%import%" OR sql LIKE "%[import]%" OR sql LIKE "% import %") -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%""export"" %" OR sql LIKE "%export %" OR sql LIKE "%export%" OR sql LIKE "%[export]%" OR sql LIKE "% export %") -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type='table' AND name="entities" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "entities" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM entities LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type = "index" AND tbl_name = "entities" AND name = "entities_group_name" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type='table' AND name="meters" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "meters" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM meters LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type = "table" AND tbl_name = "meters" AND (sql LIKE "%CONSTRAINT ""fk_meters_entity"" %" OR sql LIKE "%CONSTRAINT fk_meters_entity %" OR sql LIKE "%CONSTRAINT fk_meters_entity%" OR sql LIKE "%CONSTRAINT [fk_meters_entity]%" OR sql LIKE "%CONSTRAINT fk_meters_entity %") -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count() FROM sqlite_master WHERE type = "index" AND tbl_name = "meters" AND name = "meters_meter_ts" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(
) FROM sqlite_master WHERE type='table' AND name="tariffs" -1
[db ] TRACE 2026/08/11 14:46:09 SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "tariffs" AND sql IS NOT NULL order by type = "table" desc 2
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM tariffs LIMIT 1 -1
[db ] TRACE 2026/08/11 14:46:09 SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "tariffs" AND name = "idx_tariffs_timestamp" -1
[eebus ] INFO 2026/08/11 14:46:09 Local SKI: 70a7bb07e270f892b20eca9e93423edd2fa76ca1
[db ] TRACE 2026/08/11 14:46:09 SELECT * FROM configs WHERE configs.class = 1 1
[tmx ] TRACE 2026/08/11 14:46:09 modbus: send 00 01 00 00 00 06 ff 03 00 70 00 02
[tmx ] TRACE 2026/08/11 14:46:11 modbus: recv 00 01 00 00 00 07 ff 03 04 00 00 08 3a
[tmx ] TRACE 2026/08/11 14:46:11 modbus: send 00 02 00 00 00 06 ff 03 00 72 00 02
[tmx ] TRACE 2026/08/11 14:46:11 modbus: recv 00 02 00 00 00 07 ff 03 04 00 00 00 00
[tmx ] TRACE 2026/08/11 14:46:11 modbus: send 00 03 00 00 00 06 ff 03 00 64 00 03
[tmx ] TRACE 2026/08/11 14:46:11 modbus: recv 00 03 00 00 00 09 ff 03 06 00 1e 00 1f 00 1e
[tmx ] TRACE 2026/08/11 14:46:11 modbus: send 00 04 00 00 00 06 ff 03 00 67 00 03
[tmx ] TRACE 2026/08/11 14:46:12 modbus: recv 00 04 00 00 00 09 ff 03 06 08 d6 08 ed 08 e4
[tmx ] TRACE 2026/08/11 14:46:12 modbus: send 00 05 00 00 00 06 ff 03 00 6a 00 06
[tmx ] TRACE 2026/08/11 14:46:12 modbus: recv 00 05 00 00 00 0f ff 03 0c 00 00 02 b8 00 00 02 cf 00 00 02 bd
[tmx ] TRACE 2026/08/11 14:46:12 modbus: send 00 06 00 00 00 06 ff 03 00 22 00 01
[tmx ] TRACE 2026/08/11 14:46:12 modbus: recv 00 06 00 00 00 05 ff 03 02 00 02
[tmx ] TRACE 2026/08/11 14:46:12 modbus: send 00 07 00 00 00 06 ff 03 00 34 00 01
[tmx ] TRACE 2026/08/11 14:46:13 modbus: recv 00 07 00 00 00 05 ff 03 02 00 01
[tmx ] TRACE 2026/08/11 14:46:13 modbus: send 00 08 00 00 00 06 ff 03 00 74 00 01
[tmx ] TRACE 2026/08/11 14:46:13 modbus: recv 00 08 00 00 00 05 ff 03 02 00 00
[tmx ] TRACE 2026/08/11 14:46:13 modbus: send 00 09 00 00 00 06 ff 03 00 75 00 02
[tmx ] TRACE 2026/08/11 14:46:13 modbus: recv 00 09 00 00 00 07 ff 03 04 00 00 00 18
[tmx ] TRACE 2026/08/11 14:46:13 modbus: send 00 0a 00 00 00 06 ff 03 00 32 00 01
[tmx ] TRACE 2026/08/11 14:46:13 modbus: recv 00 0a 00 00 00 05 ff 03 02 00 10
[tmx ] TRACE 2026/08/11 14:46:13 modbus: send 00 0b 00 00 00 06 ff 03 00 79 00 10
[tmx ] TRACE 2026/08/11 14:46:14 modbus: recv 00 0b 00 00 00 23 ff 03 20 66 72 65 65 49 64 54 61 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Power: 2106W 1.781s
Energy: 0.0kWh 309ms
Current L1..L3: 3A 3.1A 3A 231ms
Voltage L1..L3: 226V 228V 228V 380ms
Power L1..L3: 696W 719W 701W 238ms
Charge status: C 284ms
Enabled: true 303ms
Charged: 0.0kWh 304ms
Duration: 24s 308ms
Max Current: 16.0A 222ms
Identifier: freeIdTag 293ms

Total time: 4.652s

11. Dual-Connector Test

If the device has dual connectors, test connector: 1 and connector: 2 separately.

Test item Connector 1 result Connector 2 result Pass
Status readout
Start charging
Stop charging
Current limit setting
Real-time power
Accumulated energy
Current / voltage
Both connectors plugged in at the same time
Both connectors charging at the same time

Confirm these points carefully:

Item Conclusion
Connector 1 status register is correct
Connector 2 status register is correct
Connector 1 command register is correct
Connector 2 command register is correct
Metering data for the two connectors does not interfere with each other

12. Full evcc Runtime Test

Start full evcc:

.\evcc-tmx.exe -c .\evcc.tmx.yaml -l debug

Open the UI:

http://127.0.0.1:7070
Scenario Expected result Actual result Pass
Add TIMXON TIMXON can be selected in the UI
Save configuration No configuration errors after saving
Status display A/B/C status is correct
Now mode Charging can be started
Off mode Charging can be stopped
Change maximum current Device current limit follows the change
Run for 10 minutes No continuous error logs
Run for 30 minutes Status and metering data remain stable

PS C:\EVCC> .\evcc-tmx.exe -c .\evcc.tmx.yaml -l debug
[main ] INFO 2026/08/11 19:34:55 evcc 0.0.0
[main ] INFO 2026/08/11 19:34:55 using config file: .\evcc.tmx.yaml
[main ] INFO 2026/08/11 19:34:55 using sqlite database: C:\Users\Admin.evcc\evcc.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=auto_vacuum(INCREMENTAL)
[eebus ] INFO 2026/08/11 19:34:55 Local SKI: 70a7bb07e270f892b20eca9e93423edd2fa76ca1
[main ] INFO 2026/08/11 19:34:55 OCPP local url: ws://127.0.0.1:8887/
[eebus ] DEBUG 2026/08/11 19:34:55 mdns: Avahi provider failed, attempting Zeroconf fallback:avahi provider failed to start (interfaces: 1, autoReconnect: false)
[main ] INFO 2026/08/11 19:34:55 UI local url: http://127.0.0.1:7070
[lp-1 ] DEBUG 2026/08/11 19:34:55 set title: H0
[lp-1 ] DEBUG 2026/08/11 19:34:55 set priority: 0
[lp-1 ] DEBUG 2026/08/11 19:34:55 set smart cost limit:
[lp-1 ] DEBUG 2026/08/11 19:34:55 set smart feed-in limit:
[lp-1 ] DEBUG 2026/08/11 19:34:55 set thresholds: {Enable:{Delay:1m0s Threshold:0} Disable:{Delay:3m0s Threshold:0}}
[lp-1 ] DEBUG 2026/08/11 19:34:55 set plan energy: 0kWh @ 0001-01-01 08:00:00 +0800 CST
[lp-1 ] DEBUG 2026/08/11 19:34:55 set plan strategy: continuous=false, precondition=0s
[lp-1 ] DEBUG 2026/08/11 19:34:55 set battery boost limit: 100
[lp-1 ] DEBUG 2026/08/11 19:34:55 set session energy limit: 0
[lp-1 ] DEBUG 2026/08/11 19:34:55 set session soc limit: 0
[lp-1 ] DEBUG 2026/08/11 19:34:55 set min soc: 0
[lp-1 ] DEBUG 2026/08/11 19:34:55 set soc config: {Poll:{Mode:charging Interval:1h0m0s} Estimate:0x20534dd00408}
[lp-1 ] DEBUG 2026/08/11 19:34:55 set ui config: {MinTemp:0 MaxTemp:100}
[lp-1 ] DEBUG 2026/08/11 19:34:55 set default mode:
[lp-1 ] DEBUG 2026/08/11 19:34:55 set phases: 3
[lp-1 ] DEBUG 2026/08/11 19:34:55 set max current: 32
[lp-1 ] DEBUG 2026/08/11 19:34:55 charge total import: 0.500kWh
[site ] INFO 2026/08/11 19:34:55 site config:
[site ] INFO 2026/08/11 19:34:56 meters: grid ✗ pv ✗ battery ✗
[site ] INFO 2026/08/11 19:34:56 tariffs:
[site ] INFO 2026/08/11 19:34:56 grid: ✗
[site ] INFO 2026/08/11 19:34:56 feed-in: ✗
[site ] INFO 2026/08/11 19:34:56 co2: ✗
[site ] INFO 2026/08/11 19:34:56 solar: ✗
[lp-1 ] INFO 2026/08/11 19:34:56 loadpoint 1:
[lp-1 ] INFO 2026/08/11 19:34:56 mode: off
[lp-1 ] INFO 2026/08/11 19:34:56 charger: power ✓ energy ✓ currents ✓ phases ✗ wakeup ✗
[lp-1 ] INFO 2026/08/11 19:34:56 meters: charge ✓
[lp-1 ] INFO 2026/08/11 19:34:56 charge: power ✓ energy ✓ currents ✓
[lp-1 ] DEBUG 2026/08/11 19:34:56 phase timer inactive
[lp-1 ] DEBUG 2026/08/11 19:34:56 pv timer inactive
[lp-1 ] DEBUG 2026/08/11 19:34:56 set charge current limit: 6A
[site ] INFO 2026/08/11 19:34:56 interval <30s can lead to unexpected behavior, see https://docs.evcc.io/docs/reference/configuration/interval
[site ] DEBUG 2026/08/11 19:34:56 ----
[lp-1 ] DEBUG 2026/08/11 19:34:56 charge power: 0W
[lp-1 ] DEBUG 2026/08/11 19:34:56 charge currents: [0 0 0]A
[site ] DEBUG 2026/08/11 19:34:56 pv power: 0W
[site ] DEBUG 2026/08/11 19:34:56 site power: 0W
[lp-1 ] DEBUG 2026/08/11 19:34:56 charge voltages: [231 0 0]V
[lp-1 ] DEBUG 2026/08/11 19:34:56 detected connected phases: 1p
[lp-1 ] DEBUG 2026/08/11 19:34:56 charge total import: 0.500kWh
[lp-1 ] DEBUG 2026/08/11 19:34:56 charger status: A
[lp-1 ] INFO 2026/08/11 19:34:56 car disconnected
[lp-1 ] DEBUG 2026/08/11 19:34:56 set battery boost: false
[lp-1 ] DEBUG 2026/08/11 19:34:56 set session soc limit: 0
[lp-1 ] DEBUG 2026/08/11 19:34:56 set session energy limit: 0
[lp-1 ] DEBUG 2026/08/11 19:34:56 charger disable
[site ] DEBUG 2026/08/11 19:35:06 ----
[lp-1 ] DEBUG 2026/08/11 19:35:06 charge power: 0W
[lp-1 ] DEBUG 2026/08/11 19:35:06 charge currents: [0 0 0]A
[site ] DEBUG 2026/08/11 19:35:06 pv power: 0W
[site ] DEBUG 2026/08/11 19:35:06 site power: 0W
[lp-1 ] DEBUG 2026/08/11 19:35:06 charge voltages: [232 0 0]V
[lp-1 ] DEBUG 2026/08/11 19:35:06 detected connected phases: 1p
[lp-1 ] DEBUG 2026/08/11 19:35:06 session energy: 0.500kWh
[lp-1 ] DEBUG 2026/08/11 19:35:06 charge total import: 0.500kWh
[lp-1 ] DEBUG 2026/08/11 19:35:06 charger status: A
[site ] DEBUG 2026/08/11 19:35:16 ----
[lp-1 ] DEBUG 2026/08/11 19:35:16 charge power: 0W
[lp-1 ] DEBUG 2026/08/11 19:35:16 charge currents: [0 0 0]A
[site ] DEBUG 2026/08/11 19:35:16 pv power: 0W
[site ] DEBUG 2026/08/11 19:35:16 site power: 0W
[lp-1 ] DEBUG 2026/08/11 19:35:16 charge voltages: [231 0 0]V
[lp-1 ] DEBUG 2026/08/11 19:35:16 detected connected phases: 1p
[lp-1 ] DEBUG 2026/08/11 19:35:16 charge total import: 0.500kWh
[lp-1 ] DEBUG 2026/08/11 19:35:16 charger status: A
[site ] DEBUG 2026/08/11 19:35:26 ----
[lp-1 ] DEBUG 2026/08/11 19:35:26 charge power: 0W
[lp-1 ] DEBUG 2026/08/11 19:35:26 charge currents: [0 0 0]A
[site ] DEBUG 2026/08/11 19:35:26 pv power: 0W
[site ] DEBUG 2026/08/11 19:35:26 site power: 0W
[lp-1 ] DEBUG 2026/08/11 19:35:26 charge voltages: [231 0 0]V
[lp-1 ] DEBUG 2026/08/11 19:35:26 detected connected phases: 1p
[lp-1 ] DEBUG 2026/08/11 19:35:26 charge total import: 0.500kWh
[lp-1 ] DEBUG 2026/08/11 19:35:26 charger status: B
[lp-1 ] INFO 2026/08/11 19:35:26 car connected
[lp-1 ] DEBUG 2026/08/11 19:35:26 pv timer elapse
[lp-1 ] DEBUG 2026/08/11 19:35:26 pv timer inactive
[lp-1 ] DEBUG 2026/08/11 19:35:26 charge total import: 0.500kWh
[lp-1 ] DEBUG 2026/08/11 19:35:26 charger vehicle id: freeIdTag
[lp-1 ] DEBUG 2026/08/11 19:35:26 !! plan: plan time zero
[lp-1 ] DEBUG 2026/08/11 19:35:29 set charge mode: now
[lp-1 ] DEBUG 2026/08/11 19:35:29 pv timer reset
[lp-1 ] DEBUG 2026/08/11 19:35:29 pv timer inactive
[site ] DEBUG 2026/08/11 19:35:29 ----

13. Exceptional Scenario Test

Scenario Action Expected result Actual result Pass
Device power loss Turn off charger power evcc reports a communication error, but does not crash
Network disconnected Disconnect the network cable or turn off the Modbus gateway evcc reports a communication error and can continue after recovery
Incorrect Modbus ID Configure an incorrect ID Should report a communication or no-response error
Incorrect IP / serial port Configure an incorrect address Should report a connection error
Fault state Trigger or simulate a fault manually evcc can read the abnormal status or error code

14. Logs and Evidence

Please save the following materials for a future evcc issue / PR:

  • --diagnose output log.
  • Start/stop and current limit logs with -l trace.
  • Screenshot of the TIMXON selection page in the UI.
  • UI screenshots before charging, during charging, and after stopping.
  • Screenshots of the device model and firmware version.
  • Modbus protocol register table.
  • TCP / RS485 test conclusion.
  • Single-connector / dual-connector test conclusion.

15. Final Conclusion

Item Conclusion
Recommend merging into evcc
Supports only Modbus TCP
Supports RS485
Supports dual connectors
Supports built-in meter
Supports RFID identification
Supports 1P/3P switching Not currently implemented
Any safety risks
Code areas that need changes

16. Summary for evcc Maintainers

TIMXON charger support has been tested with a real device.

Verified:
- Template is visible as TIMXON in the UI
- Modbus connection works
- Charger status mapping works
- Enable / disable charging works
- Max current control works
- Meter values are readable and plausible
- Diagnostic output works

Tested connection types:
- Modbus TCP: yes / no
- RS485: yes / no

Tested connectors:
- Connector 1: yes / no
- Connector 2: yes / no

Known limitations:
- 1P/3P switching is not implemented
- Please fill in additional limitations if found during testing

Start evcc


.\evcc-tmx.exe

PS C:\EVCC> .\evcc-tmx.exe
[main ] INFO 2026/08/10 17:25:58 evcc 0.0.0
[main ] INFO 2026/08/10 17:25:58 config file not found, database-only mode
[main ] INFO 2026/08/10 17:25:58 using sqlite database: C:\Users\Admin.evcc\evcc.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=auto_vacuum(INCREMENTAL)
[eebus ] INFO 2026/08/10 17:25:58 Local SKI: 70a7bb07e270f892b20eca9e93423edd2fa76ca1
[main ] INFO 2026/08/10 17:25:58 OCPP local url: ws://127.0.0.1:8887/
[main ] INFO 2026/08/10 17:25:58 UI local url: http://127.0.0.1:7070
[lp-1 ] ERROR 2026/08/10 17:26:05 charge total import: dial tcp 192.168.1.72:502: i/o timeout
[site ] INFO 2026/08/10 17:26:05 site config:
[site ] INFO 2026/08/10 17:26:05 meters: grid ✗ pv ✗ battery ✗
[site ] INFO 2026/08/10 17:26:05 tariffs:
[site ] INFO 2026/08/10 17:26:05 grid: ✗
[site ] INFO 2026/08/10 17:26:05 feed-in: ✗
[site ] INFO 2026/08/10 17:26:05 co2: ✗
[site ] INFO 2026/08/10 17:26:05 solar: ✗
[lp-1 ] INFO 2026/08/10 17:26:05 loadpoint 1:
[lp-1 ] INFO 2026/08/10 17:26:05 mode: now
[lp-1 ] INFO 2026/08/10 17:26:05 charger: power ✓ energy ✓ currents ✓ phases ✗ wakeup ✗
[lp-1 ] INFO 2026/08/10 17:26:05 meters: charge ✓
[lp-1 ] INFO 2026/08/10 17:26:05 charge: power ✓ energy ✓ currents ✓
[lp-1 ] ERROR 2026/08/10 17:26:08 charger enabled: dial tcp 192.168.1.72:502: i/o timeout

Comment thread charger/timxon.go
func (wb *Timxon) Enable(enable bool) error {
var command uint16 = 2 // Stop
if enable {
command = 1 // Start

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks to me like starting and stopping a charge session which is NOT intented?

Enable()/Enabled() deals with granting or revoking permission to charge.

Comment thread charger/timxon.go
Comment on lines +250 to +258
// ChargedEnergy implements the api.ChargeRater interface
func (wb *Timxon) ChargedEnergy() (float64, error) {
energy, err := wb.readUint16(wb.base + timxonRegConChargedEnergy)
if err != nil {
return 0, err
}

return float64(energy) / 10, nil
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this tested?

When does it start and stop counting the charged energy?

Comment thread charger/timxon.go
Comment on lines +307 to +315
// ChargeDuration implements the api.ChargeTimer interface
func (wb *Timxon) ChargeDuration() (time.Duration, error) {
duration, err := wb.readUint32(wb.base + timxonRegConChargeDuration)
if err != nil {
return 0, err
}

return time.Duration(duration) * time.Second, nil
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this tested?

When does it start and stop?

Comment thread charger/timxon.go
8: // Faulted
return api.StatusA, nil
case
1, // Preparing

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which status is returned during waiting for rfid card swipe?

@premultiply

Copy link
Copy Markdown
Member

Thanks for your PR. Please attach the full Modbus reference documentation this PR is based on.

@premultiply
premultiply marked this pull request as draft August 18, 2026 08:10
@premultiply premultiply added the waiting for feedback Suspended progress label Aug 18, 2026
@github-actions github-actions Bot added the stale Outdated and ready to close label Aug 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

devices Specific device support enhancement New feature or request stale Outdated and ready to close waiting for feedback Suspended progress

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants