- Add CHINT DDSU666 profile (ddsu666.yaml): FC03 holding registers, voltage/ current/active power (kW)/reactive power (kvar)/PF/frequency, import+export active energy. Word/byte order left at big-endian as a documented best guess (manual has no float example) — to be confirmed on-device. - Add DDSU666-Modbus-Protocol.md reference extracted from the official manual, plus the source PDF (parity with the SDM120 reference). - Generalize driver.read_blocks to dispatch FC03 (holding) or FC04 (input) based on a function_code argument (default 4, SDM120 behaviour unchanged); the code is validated before any connection is attempted. - Wire profile.function_code through the CLI read command, the background poller, and the device /test endpoint — previously the profile field was declared but never honoured (read path was hardcoded to FC04). - Tests: default -> FC04, function_code=3 -> FC03 holding, invalid FC rejected before connecting.
83 lines
2.8 KiB
YAML
83 lines
2.8 KiB
YAML
name: ddsu666
|
||
description: CHINT DDSU666 single-phase smart meter
|
||
function_code: 3 # holding registers (FC03) — DDSU666 has NO input registers (no FC04)
|
||
word_order: big # high register first — ASSUMED; verify with a known voltage reading
|
||
byte_order: big # high byte first within each register (confirmed by manual CRC example)
|
||
|
||
# NOTE: the manual gives no worked float-decode example, so word_order is a best-guess
|
||
# (standard big-endian, high register first, matching sdm120). After wiring the meter,
|
||
# read 0x2000 (voltage) — it should decode to ~230 V. If it decodes to garbage, the
|
||
# device uses the opposite word order and this profile (and the decoder) need adjusting.
|
||
# Byte order is confirmed big-endian from the manual (Appendix A, Table A.4: 0x1388 -> 13 88).
|
||
|
||
blocks:
|
||
# Instantaneous quantities 0x2000–0x200F: voltage, current, P, Q, (rsv), PF, (rsv), Freq.
|
||
# 16 contiguous registers — single bulk read. (DDSU666 manual Table 9.)
|
||
- { start: 0x2000, count: 0x0010 }
|
||
# Active energy — import (0x4000) and export (0x400A) read as two small blocks rather
|
||
# than one span, to avoid touching the undocumented/reserved 0x4002–0x4009 gap.
|
||
- { start: 0x4000, count: 0x0002 }
|
||
- { start: 0x400A, count: 0x0002 }
|
||
|
||
metrics:
|
||
# Addresses are the raw Modbus protocol addresses (hex) from DDSU666 manual Table 9,
|
||
# read via FC03. Each float32 occupies two consecutive 16-bit registers.
|
||
|
||
- key: voltage
|
||
address: 0x2000 # U — Voltage (V)
|
||
type: float32
|
||
unit: "V"
|
||
device_class: voltage
|
||
ha_component: sensor
|
||
|
||
- key: current
|
||
address: 0x2002 # I — Current (A)
|
||
type: float32
|
||
unit: "A"
|
||
device_class: current
|
||
ha_component: sensor
|
||
|
||
- key: active_power
|
||
address: 0x2004 # P — Active power. Manual unit is kW (NOT W like sdm120).
|
||
type: float32
|
||
unit: "kW"
|
||
device_class: power
|
||
ha_component: sensor
|
||
|
||
- key: reactive_power
|
||
address: 0x2006 # Q — Reactive power (kvar)
|
||
type: float32
|
||
unit: "kvar"
|
||
device_class: reactive_power
|
||
ha_component: sensor
|
||
|
||
- key: power_factor
|
||
address: 0x200A # PF — Power factor (dimensionless)
|
||
type: float32
|
||
unit: ""
|
||
device_class: power_factor
|
||
ha_component: sensor
|
||
|
||
- key: frequency
|
||
address: 0x200E # Freq — Frequency (Hz)
|
||
type: float32
|
||
unit: "Hz"
|
||
device_class: frequency
|
||
ha_component: sensor
|
||
|
||
- key: import_energy
|
||
address: 0x4000 # Ep — positive/forward active energy (kWh)
|
||
type: float32
|
||
unit: "kWh"
|
||
device_class: energy
|
||
state_class: total_increasing
|
||
ha_component: sensor
|
||
|
||
- key: export_energy
|
||
address: 0x400A # -Ep — reverse active energy (kWh)
|
||
type: float32
|
||
unit: "kWh"
|
||
device_class: energy
|
||
state_class: total_increasing
|
||
ha_component: sensor
|