22from bleak .backends .scanner import AdvertisementData
33
44from ..devicebase import DeviceBase
5+ from ..entity import controls
6+ from ..entity .base import dynamic
57from ..model import (
68 DirectBmsMDeltaHeartbeatPack ,
79 DirectEmsDeltaHeartbeatPack ,
@@ -140,11 +142,13 @@ async def data_parse(self, packet: Packet) -> bool:
140142
141143 return processed
142144
145+ @controls .outlet (ac_ports )
143146 async def enable_ac_ports (self , enabled : bool ):
144147 payload = bytes ([1 if enabled else 0 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ])
145148 packet = Packet (0x21 , 0x05 , 0x20 , 0x42 , payload , version = 2 )
146149 await self ._conn .sendPacket (packet )
147150
151+ @controls .outlet (dc_12v_port )
148152 async def enable_dc_12v_port (self , enabled : bool ):
149153 payload = bytes ([0x01 if enabled else 0x00 ])
150154 packet = Packet (0x21 , 0x05 , 0x20 , 0x51 , payload , version = 2 )
@@ -160,6 +164,7 @@ async def enable_ac_always_on(self, enabled: bool):
160164 packet = Packet (0x21 , 0x02 , 0x20 , 0x5F , payload , version = 2 )
161165 await self ._conn .sendPacket (packet )
162166
167+ @controls .switch (energy_backup )
163168 async def enable_energy_backup (self , enabled : bool ):
164169 reserve = (
165170 self .energy_backup_battery_level
@@ -172,14 +177,21 @@ async def enable_energy_backup(self, enabled: bool):
172177 packet = Packet (0x21 , 0x02 , 0x20 , 0x5E , payload , version = 2 )
173178 await self ._conn .sendPacket (packet )
174179
175- async def set_energy_backup_battery_level (self , value : int ) -> bool :
180+ @controls .battery (
181+ energy_backup_battery_level ,
182+ min = dynamic (battery_charge_limit_min ),
183+ max = dynamic (battery_charge_limit_max ),
184+ availability = dynamic (energy_backup ),
185+ )
186+ async def set_energy_backup_battery_level (self , value : float ) -> bool :
176187 percent = max (0 , min (int (value ), 100 ))
177188 payload = bytes ([0x01 , percent , 0x00 , 0x00 ])
178189 packet = Packet (0x21 , 0x02 , 0x20 , 0x5E , payload , version = 2 )
179190 await self ._conn .sendPacket (packet )
180191 return True
181192
182- async def set_battery_charge_limit_min (self , limit : int ) -> bool :
193+ @controls .battery (battery_charge_limit_min , max = dynamic (battery_charge_limit_max ))
194+ async def set_battery_charge_limit_min (self , limit : float ) -> bool :
183195 limit = max (0 , min (int (limit ), 30 ))
184196 if (
185197 self .battery_charge_limit_max is not None
@@ -191,28 +203,35 @@ async def set_battery_charge_limit_min(self, limit: int) -> bool:
191203 await self ._conn .sendPacket (packet )
192204 return True
193205
194- async def set_battery_charge_limit_max (self , limit : int ) -> bool :
206+ @controls .battery (battery_charge_limit_max , min = dynamic (battery_charge_limit_min ))
207+ async def set_battery_charge_limit_max (self , limit : float ) -> bool :
195208 if self .battery_charge_limit_min is not None and limit < int (
196209 self .battery_charge_limit_min
197210 ):
198211 return False
199212
200- packet = Packet (0x21 , 0x03 , 0x20 , 0x31 , limit .to_bytes (), version = 2 )
213+ packet = Packet (0x21 , 0x03 , 0x20 , 0x31 , int ( limit ) .to_bytes (), version = 2 )
201214 await self ._conn .sendPacket (packet )
202215 return True
203216
204- async def set_dc_charging_amps_max (self , value : int ) -> bool :
205- packet = Packet (0x21 , 0x05 , 0x20 , 0x47 , value .to_bytes (), version = 2 )
217+ @controls .current (dc_charging_max_amps , max = dynamic (dc_charging_current_max ))
218+ async def set_dc_charging_amps_max (self , value : float ) -> bool :
219+ packet = Packet (0x21 , 0x05 , 0x20 , 0x47 , int (value ).to_bytes (), version = 2 )
206220 await self ._conn .sendPacket (packet )
207221 return True
208222
209- async def set_dc_mode (self , value : DCMode ) -> bool :
223+ @controls .select (dc_mode , options = DCMode )
224+ async def set_dc_mode (self , value : DCMode ):
210225 packet = Packet (0x21 , 0x05 , 0x20 , 0x52 , value .to_bytes (), version = 2 )
211226 await self ._conn .sendPacket (packet )
212- return True
213227
214- async def set_ac_charging_speed (self , value : int ):
215- payload = value .to_bytes (2 , "little" ) + b"\xff "
228+ @controls .power (
229+ ac_charging_speed ,
230+ min = dynamic (min_ac_charging_power ),
231+ max = dynamic (max_ac_charging_power ),
232+ )
233+ async def set_ac_charging_speed (self , value : float ):
234+ payload = int (value ).to_bytes (2 , "little" ) + b"\xff "
216235 packet = Packet (0x21 , 0x05 , 0x20 , 0x45 , payload , version = 2 )
217236 await self ._conn .sendPacket (packet )
218237 return True
0 commit comments