@@ -52,16 +52,17 @@ async def handle_role_update(mac_address: str, new_role: str):
5252 persist_entry = False
5353 new_data = copy .deepcopy ({ ** entry .data })
5454
55+ # We only persist actual roles. If a device forgets its role, we want
56+ # to keep what we've previously learned.
5557 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
58+ if 'roles' not in new_data .keys ():
59+ new_data ['roles' ] = {}
60+ roles = new_data ['roles' ]
61+ old_role = roles .get (mac_address , None )
62+ if old_role is None or old_role != new_role :
63+ _LOGGER .debug (f"Updating role for { mac_address } from { old_role } to { new_role } " )
64+ roles [mac_address ] = new_role
65+ persist_entry = True
6566
6667 if new_role == 'solar' :
6768 new_data ['with_solar' ] = True # Remember for next time we start
@@ -104,6 +105,11 @@ async def handle_discovered_sensor(sensor_mac: str, sensor_role: str):
104105 ]
105106 async_add_entities (new_sensors , True )
106107 async_dispatcher_send (hass , f"{ DOMAIN } _sensor_added_to_homeassistant" , sensor_mac , sensor_role )
108+ if sensor_role is None :
109+ persisted_role = entry .data .get ('roles' , {}).get (sensor_mac , None )
110+ if persisted_role is not None :
111+ _LOGGER .info (f"Restored role { persisted_role } for { sensor_mac } due to sensor not reporting role" )
112+ sensor_role = persisted_role
107113 # Trigger initial entity role update
108114 async_dispatcher_send (hass , f"{ POWER_SENSOR_UPDATE_SIGNAL } _{ sensor_mac } _role" , 'role' , { 'role' : sensor_role })
109115
0 commit comments