8static constexpr uint16_t SELEC_TOTAL_ACTIVE_ENERGY = 0x0000;
9static constexpr uint16_t SELEC_IMPORT_ACTIVE_ENERGY = 0x0002;
10static constexpr uint16_t SELEC_EXPORT_ACTIVE_ENERGY = 0x0004;
11static constexpr uint16_t SELEC_TOTAL_REACTIVE_ENERGY = 0x0006;
12static constexpr uint16_t SELEC_IMPORT_REACTIVE_ENERGY = 0x0008;
13static constexpr uint16_t SELEC_EXPORT_REACTIVE_ENERGY = 0x000A;
14static constexpr uint16_t SELEC_APPARENT_ENERGY = 0x000C;
15static constexpr uint16_t SELEC_ACTIVE_POWER = 0x000E;
16static constexpr uint16_t SELEC_REACTIVE_POWER = 0x0010;
17static constexpr uint16_t SELEC_APPARENT_POWER = 0x0012;
18static constexpr uint16_t SELEC_VOLTAGE = 0x0014;
19static constexpr uint16_t SELEC_CURRENT = 0x0016;
20static constexpr uint16_t SELEC_POWER_FACTOR = 0x0018;
21static constexpr uint16_t SELEC_FREQUENCY = 0x001A;
22static constexpr uint16_t SELEC_MAXIMUM_DEMAND_ACTIVE_POWER = 0x001C;
23static constexpr uint16_t SELEC_MAXIMUM_DEMAND_REACTIVE_POWER = 0x001E;
24static constexpr uint16_t SELEC_MAXIMUM_DEMAND_APPARENT_POWER = 0x0020;
27static constexpr uint8_t EM4M_REGISTER_COUNT = 114;
30static constexpr uint16_t EM4M_VOLTAGE = 0x0006;
31static constexpr uint16_t EM4M_CURRENT = 0x0016;
32static constexpr uint16_t EM4M_ACTIVE_POWER = 0x002A;
33static constexpr uint16_t EM4M_REACTIVE_POWER = 0x002C;
34static constexpr uint16_t EM4M_APPARENT_POWER = 0x002E;
35static constexpr uint16_t EM4M_POWER_FACTOR = 0x0036;
36static constexpr uint16_t EM4M_FREQUENCY = 0x0038;
37static constexpr uint16_t EM4M_MAXIMUM_DEMAND_ACTIVE_POWER = 0x0046;
38static constexpr uint16_t EM4M_MAXIMUM_DEMAND_REACTIVE_POWER = 0x0048;
39static constexpr uint16_t EM4M_MAXIMUM_DEMAND_APPARENT_POWER = 0x004A;
40static constexpr uint16_t EM4M_IMPORT_ACTIVE_ENERGY = 0x0058;
41static constexpr uint16_t EM4M_EXPORT_ACTIVE_ENERGY = 0x005A;
42static constexpr uint16_t EM4M_IMPORT_REACTIVE_ENERGY = 0x0068;
43static constexpr uint16_t EM4M_EXPORT_REACTIVE_ENERGY = 0x006A;
44static constexpr uint16_t EM4M_AVERAGE_VOLTAGE_LL = 0x000E;
48static constexpr uint16_t EM4M_NET_ACTIVE_ENERGY_MAINS = 0x003A;
49static constexpr uint16_t EM4M_NET_REACTIVE_ENERGY_MAINS = 0x003C;
50static constexpr uint16_t EM4M_NET_APPARENT_ENERGY_MAINS = 0x003E;
51static constexpr uint16_t EM4M_NET_ACTIVE_ENERGY_DG = 0x0040;
52static constexpr uint16_t EM4M_NET_REACTIVE_ENERGY_DG = 0x0042;
53static constexpr uint16_t EM4M_NET_APPARENT_ENERGY_DG = 0x0044;
56static constexpr uint16_t EM4M_VOLTAGE_L1 = 0x0000;
57static constexpr uint16_t EM4M_VOLTAGE_L2 = 0x0002;
58static constexpr uint16_t EM4M_VOLTAGE_L3 = 0x0004;
59static constexpr uint16_t EM4M_VOLTAGE_L12 = 0x0008;
60static constexpr uint16_t EM4M_VOLTAGE_L23 = 0x000A;
61static constexpr uint16_t EM4M_VOLTAGE_L31 = 0x000C;
62static constexpr uint16_t EM4M_CURRENT_L1 = 0x0010;
63static constexpr uint16_t EM4M_CURRENT_L2 = 0x0012;
64static constexpr uint16_t EM4M_CURRENT_L3 = 0x0014;
65static constexpr uint16_t EM4M_ACTIVE_POWER_L1 = 0x0018;
66static constexpr uint16_t EM4M_ACTIVE_POWER_L2 = 0x001A;
67static constexpr uint16_t EM4M_ACTIVE_POWER_L3 = 0x001C;
68static constexpr uint16_t EM4M_REACTIVE_POWER_L1 = 0x001E;
69static constexpr uint16_t EM4M_REACTIVE_POWER_L2 = 0x0020;
70static constexpr uint16_t EM4M_REACTIVE_POWER_L3 = 0x0022;
71static constexpr uint16_t EM4M_APPARENT_POWER_L1 = 0x0024;
72static constexpr uint16_t EM4M_APPARENT_POWER_L2 = 0x0026;
73static constexpr uint16_t EM4M_APPARENT_POWER_L3 = 0x0028;
74static constexpr uint16_t EM4M_POWER_FACTOR_L1 = 0x0030;
75static constexpr uint16_t EM4M_POWER_FACTOR_L2 = 0x0032;
76static constexpr uint16_t EM4M_POWER_FACTOR_L3 = 0x0034;
77static constexpr uint16_t EM4M_IMPORT_ACTIVE_ENERGY_L1 = 0x004C;
78static constexpr uint16_t EM4M_IMPORT_ACTIVE_ENERGY_L2 = 0x004E;
79static constexpr uint16_t EM4M_IMPORT_ACTIVE_ENERGY_L3 = 0x0050;
80static constexpr uint16_t EM4M_EXPORT_ACTIVE_ENERGY_L1 = 0x0052;
81static constexpr uint16_t EM4M_EXPORT_ACTIVE_ENERGY_L2 = 0x0054;
82static constexpr uint16_t EM4M_EXPORT_ACTIVE_ENERGY_L3 = 0x0056;
83static constexpr uint16_t EM4M_IMPORT_REACTIVE_ENERGY_L1 = 0x005C;
84static constexpr uint16_t EM4M_IMPORT_REACTIVE_ENERGY_L2 = 0x005E;
85static constexpr uint16_t EM4M_IMPORT_REACTIVE_ENERGY_L3 = 0x0060;
86static constexpr uint16_t EM4M_EXPORT_REACTIVE_ENERGY_L1 = 0x0062;
87static constexpr uint16_t EM4M_EXPORT_REACTIVE_ENERGY_L2 = 0x0064;
88static constexpr uint16_t EM4M_EXPORT_REACTIVE_ENERGY_L3 = 0x0066;
89static constexpr uint16_t EM4M_APPARENT_ENERGY_L1 = 0x006C;
90static constexpr uint16_t EM4M_APPARENT_ENERGY_L2 = 0x006E;
91static constexpr uint16_t EM4M_APPARENT_ENERGY_L3 = 0x0070;
95static constexpr uint16_t EM4M_PHASE_STRIDE = 2;
96#define SELEC_EM4M_CHECK_STRIDE(name) \
97 static_assert(EM4M_##name##_L2 == EM4M_##name##_L1 + EM4M_PHASE_STRIDE && \
98 EM4M_##name##_L3 == EM4M_##name##_L1 + 2 * EM4M_PHASE_STRIDE, \
99 #name " per-phase registers must be EM4M_PHASE_STRIDE apart");
111#undef SELEC_EM4M_CHECK_STRIDE
114static constexpr uint16_t EM4M_SERIAL_NUMBER = 0x02AC;
115static constexpr uint16_t EM4M_DG_SENSING = 0x02C6;
SELEC_EM4M_CHECK_STRIDE(CURRENT) SELEC_EM4M_CHECK_STRIDE(ACTIVE_POWER) SELEC_EM4M_CHECK_STRIDE(REACTIVE_POWER) SELEC_EM4M_CHECK_STRIDE(APPARENT_POWER) SELEC_EM4M_CHECK_STRIDE(POWER_FACTOR) SELEC_EM4M_CHECK_STRIDE(IMPORT_ACTIVE_ENERGY) SELEC_EM4M_CHECK_STRIDE(EXPORT_ACTIVE_ENERGY) SELEC_EM4M_CHECK_STRIDE(IMPORT_REACTIVE_ENERGY) SELEC_EM4M_CHECK_STRIDE(EXPORT_REACTIVE_ENERGY) SELEC_EM4M_CHECK_STRIDE(APPARENT_ENERGY) static const expr uint16_t EM4M_SERIAL_NUMBER=0x02AC