|
4 | 4 |
|
5 | 5 | import logging |
6 | 6 | from datetime import timedelta |
7 | | -from typing import Any |
| 7 | +from typing import Any, Dict |
8 | 8 |
|
9 | 9 | from homeassistant.config_entries import ConfigEntry |
10 | 10 | from homeassistant.core import HomeAssistant |
@@ -143,22 +143,43 @@ def ip_address(self) -> str | None: |
143 | 143 | def mac_address(self) -> str | None: |
144 | 144 | return self._uid if ":" in self._uid and not self._uid.startswith("IP:") else None |
145 | 145 |
|
| 146 | + |
146 | 147 | @property |
147 | | - def extra_state_attributes(self) -> dict[str, Any]: |
148 | | - dev = self._find_device() or {} |
149 | | - deriv = dev.get("derived") or {} |
150 | | - return { |
151 | | - "vendor": dev.get("vendor"), |
152 | | - "device_type": dev.get("device_type"), |
153 | | - "network_role": dev.get("network_role"), |
154 | | - "vlan_id": dev.get("vlan_id"), |
155 | | - "sources": dev.get("sources"), |
156 | | - "first_seen": dev.get("first_seen"), |
157 | | - "last_seen": dev.get("last_seen"), |
| 148 | + def extra_state_attributes(self) -> Dict[str, Any]: |
| 149 | + # Start with whatever the base TrackerEntity would normally expose (mac/ip/source_type, etc.) |
| 150 | + base: Dict[str, Any] = {} |
| 151 | + try: |
| 152 | + base = dict(super().extra_state_attributes or {}) # type: ignore[attr-defined] |
| 153 | + except Exception: |
| 154 | + base = {} |
| 155 | + |
| 156 | + d = self._find_device() or {} |
| 157 | + mac = (d.get("mac") or "").upper() or None |
| 158 | + ip = d.get("ip") or ((d.get("ips") or [None])[0]) |
| 159 | + |
| 160 | + deriv = d.get("derived") or {} |
| 161 | + |
| 162 | + # Add/override with your integration-specific attributes |
| 163 | + base.update({ |
| 164 | + # Explicitly expose MAC/IP for Lovelace tables |
| 165 | + "mac": mac, |
| 166 | + "ip": ip, |
| 167 | + # Optional aliases (handy when cards expect these names) |
| 168 | + "mac_address": mac, |
| 169 | + "ip_address": ip, |
| 170 | + |
| 171 | + "vendor": d.get("vendor"), |
| 172 | + "device_type": d.get("device_type"), |
| 173 | + "network_role": d.get("network_role"), |
| 174 | + "vlan_id": d.get("vlan_id"), |
| 175 | + "sources": d.get("sources"), |
| 176 | + "first_seen": d.get("first_seen"), |
| 177 | + "last_seen": d.get("last_seen"), |
158 | 178 | "derived": deriv, |
159 | 179 | "directory_name": deriv.get("directory_name"), |
160 | 180 | "directory_desc": deriv.get("directory_desc"), |
161 | | - } |
| 181 | + }) |
| 182 | + return base |
162 | 183 |
|
163 | 184 | @property |
164 | 185 | def name(self) -> str: |
|
0 commit comments