11"""Sensor platform for the integration."""
22from __future__ import annotations
33
4+ import copy
45import logging
56
67from homeassistant .config_entries import ConfigEntry
1516from .PowersensorPlugEntity import PowersensorPlugEntity
1617from .PowersensorSensorEntity import PowersensorSensorEntity
1718from .SensorMeasurements import SensorMeasurements
18- from .const import DOMAIN
19+ from .const import POWER_SENSOR_UPDATE_SIGNAL , DOMAIN
1920_LOGGER = logging .getLogger (__name__ )
2021
2122
@@ -30,22 +31,60 @@ async def async_setup_entry(
3031
3132
3233 async def create_plug (plug_mac_address : str ):
33- this_plug_sensors = [PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .WATTS ),
34- PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .VOLTAGE ),
35- PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .APPARENT_CURRENT ),
36- PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .ACTIVE_CURRENT ),
37- PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .REACTIVE_CURRENT ),
38- PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .SUMMATION_ENERGY )]
34+ this_plug_sensors = [
35+ PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .WATTS ),
36+ PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .VOLTAGE ),
37+ PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .APPARENT_CURRENT ),
38+ PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .ACTIVE_CURRENT ),
39+ PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .REACTIVE_CURRENT ),
40+ PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .SUMMATION_ENERGY ),
41+ PowersensorPlugEntity (hass , plug_mac_address , PlugMeasurements .ROLE ),
42+ ]
3943
4044 async_add_entities (this_plug_sensors , True )
4145
4246 for plug_mac in dispatcher .plugs .keys ():
4347 await create_plug (plug_mac )
4448
49+
50+ # Role update support
51+ async def handle_role_update (mac_address : str , new_role : str ):
52+ persist_entry = False
53+ new_data = copy .deepcopy ({ ** entry .data })
54+
55+ if new_role is not None :
56+ devices = new_data ['devices' ]
57+ if mac_address in devices .keys ():
58+ info = devices [mac_address ]
59+ have_role = True if 'role' in info .keys () else False
60+ old_role = info ['role' ] if have_role else None
61+ if (not have_role ) or (have_role and info ['role' ] != new_role ):
62+ _LOGGER .debug (f"Updating role for { mac_address } from { old_role } to { new_role } " )
63+ info ['role' ] = new_role
64+ persist_entry = True
65+
66+ if new_role == 'solar' :
67+ new_data ['with_solar' ] = True # Remember for next time we start
68+ persist_entry = True
69+
70+ if persist_entry :
71+ hass .config_entries .async_update_entry (entry , data = new_data )
72+
73+ # These events are sent by the entities when their cached role updates
74+ entry .async_on_unload (
75+ async_dispatcher_connect (
76+ hass , f"{ DOMAIN } _update_role" , handle_role_update
77+ )
78+ )
79+
80+
81+ # Automatic plug discovery
4582 async def handle_discovered_plug (plug_mac_address : str , host : str , port : int , name : str ):
4683 await create_plug (plug_mac_address )
4784 async_dispatcher_send (hass , f"{ DOMAIN } _plug_added_to_homeassistant" ,
4885 plug_mac_address , host , port , name )
86+ async_dispatcher_send (hass , f"{ DOMAIN } _update_role" ,
87+ plug_mac_address , "appliance" ) # default role
4988
5089 entry .async_on_unload (
5190 async_dispatcher_connect (
@@ -54,19 +93,19 @@ async def handle_discovered_plug(plug_mac_address: str, host: str, port: int, na
5493 )
5594 await dispatcher .process_plug_queue ()
5695
57- async def handle_discovered_sensor (sensor_mac : str , sensor_role : str ):
58- if sensor_role == 'solar' :
59- new_data = { ** entry .data }
60- new_data ['with_solar' ] = True # Remember for next time we start
61- hass .config_entries .async_update_entry (entry , data = new_data )
6296
97+ # Automatic sensor discovery
98+ async def handle_discovered_sensor (sensor_mac : str , sensor_role : str ):
6399 new_sensors = [
64100 PowersensorSensorEntity (hass , sensor_mac , SensorMeasurements .Battery ),
65101 PowersensorSensorEntity (hass , sensor_mac , SensorMeasurements .WATTS ),
66102 PowersensorSensorEntity (hass , sensor_mac , SensorMeasurements .SUMMATION_ENERGY ),
103+ PowersensorSensorEntity (hass , sensor_mac , SensorMeasurements .ROLE ),
67104 ]
68105 async_add_entities (new_sensors , True )
69106 async_dispatcher_send (hass , f"{ DOMAIN } _sensor_added_to_homeassistant" , sensor_mac , sensor_role )
107+ # Trigger initial entity role update
108+ async_dispatcher_send (hass , f"{ POWER_SENSOR_UPDATE_SIGNAL } _{ sensor_mac } _role" , 'role' , { 'role' : sensor_role })
70109
71110 entry .async_on_unload (
72111 async_dispatcher_connect (
0 commit comments