@@ -15,20 +15,30 @@ class Energy(SmartModule, EnergyInterface):
15
15
16
16
REQUIRED_COMPONENT = "energy_monitoring"
17
17
18
+ async def _post_update_hook (self ) -> None :
19
+ if "voltage_mv" in self .data .get ("get_emeter_data" , {}):
20
+ self ._supported = (
21
+ self ._supported | EnergyInterface .ModuleFeature .VOLTAGE_CURRENT
22
+ )
23
+
18
24
def query (self ) -> dict :
19
25
"""Query to execute during the update cycle."""
20
26
req = {
21
27
"get_energy_usage" : None ,
22
28
}
23
29
if self .supported_version > 1 :
24
30
req ["get_current_power" ] = None
31
+ req ["get_emeter_data" ] = None
32
+ req ["get_emeter_vgain_igain" ] = None
25
33
return req
26
34
27
35
@property
28
36
@raise_if_update_error
29
37
def current_consumption (self ) -> float | None :
30
38
"""Current power in watts."""
31
- if (power := self .energy .get ("current_power" )) is not None :
39
+ if (power := self .energy .get ("current_power" )) is not None or (
40
+ power := self .data .get ("get_emeter_data" , {}).get ("power_mw" )
41
+ ) is not None :
32
42
return power / 1_000
33
43
# Fallback if get_energy_usage does not provide current_power,
34
44
# which can happen on some newer devices (e.g. P304M).
@@ -58,7 +68,10 @@ def _get_status_from_energy(self, energy: dict) -> EmeterStatus:
58
68
@raise_if_update_error
59
69
def status (self ) -> EmeterStatus :
60
70
"""Get the emeter status."""
61
- return self ._get_status_from_energy (self .energy )
71
+ if "get_emeter_data" in self .data :
72
+ return EmeterStatus (self .data ["get_emeter_data" ])
73
+ else :
74
+ return self ._get_status_from_energy (self .energy )
62
75
63
76
async def get_status (self ) -> EmeterStatus :
64
77
"""Return real-time statistics."""
@@ -87,13 +100,15 @@ def consumption_total(self) -> float | None:
87
100
@raise_if_update_error
88
101
def current (self ) -> float | None :
89
102
"""Return the current in A."""
90
- return None
103
+ ma = self .data .get ("get_emeter_data" , {}).get ("current_ma" )
104
+ return ma / 1000 if ma else None
91
105
92
106
@property
93
107
@raise_if_update_error
94
108
def voltage (self ) -> float | None :
95
109
"""Get the current voltage in V."""
96
- return None
110
+ mv = self .data .get ("get_emeter_data" , {}).get ("voltage_mv" )
111
+ return mv / 1000 if mv else None
97
112
98
113
async def _deprecated_get_realtime (self ) -> EmeterStatus :
99
114
"""Retrieve current energy readings."""
0 commit comments