Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1d85bd7905 | |||
| d4ede6669a | |||
| eb6be8cdf4 | |||
| 2c62edfa44 | |||
| faed01cd8f |
@@ -1,9 +1,13 @@
|
|||||||
# CHANGELOG - Whatsapp Bridge Integration
|
# CHANGELOG - Whatsapp Bridge Integration
|
||||||
|
|
||||||
|
## Release 0.2.3 - 2026-06-15
|
||||||
|
- **New (Orphaned Devices Cleaner):** Added an automatic database cleanup utility. On startup, the integration now automatically identifies and removes orphaned or "ghost" devices left behind by previous configuration changes or older versions.
|
||||||
|
- **Fix:** Decoupled the central "WhatsApp Bridge Hub" device from specific config entry bindings. The Hub is now persistent and indestructible, preventing global entities (Broadcast and Live Status) from disappearing when individual user profiles are deleted or re-added.
|
||||||
|
|
||||||
## Release 0.2.2 - 2026-06-15
|
## Release 0.2.2 - 2026-06-15
|
||||||
- **Architecture Change:** Introduced a dedicated "WhatsApp Bridge Hub" device. This central device acts as a single point of reference for global components, preventing UI clutter.
|
- **Architecture Change:** Introduced a dedicated "WhatsApp Bridge Hub" device. This central device acts as a single point of reference for global components, preventing UI clutter.
|
||||||
- **Fix:** Moved the global live status sensor and the virtual broadcast entity to the new WhatsApp Bridge Hub device. This ensures they remain fully visible and accessible across the Home Assistant UI, automations, and service calls without being duplicated across individual user accounts.
|
- **Fix:** Moved the global live status sensor and the virtual broadcast entity to the new WhatsApp Bridge Hub device. This ensures they remain fully visible and accessible across the Home Assistant UI, automations, and service calls without being duplicated across individual user accounts.
|
||||||
- **Improvement:** Maintained isolated, clean individual devices for each configured account profile (*Larissa, Rene, Work*).
|
- **Improvement:** Maintained isolated, clean individual devices for each configured account profile.
|
||||||
|
|
||||||
## Release 0.2.1 - 2026-06-15
|
## Release 0.2.1 - 2026-06-15
|
||||||
- **Fix:** Resolved device assignment duplication where a single global gateway card duplicated across all account tabs.
|
- **Fix:** Resolved device assignment duplication where a single global gateway card duplicated across all account tabs.
|
||||||
|
|||||||
@@ -9,33 +9,48 @@ async def async_setup(hass: HomeAssistant, config: dict):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, entry):
|
async def async_setup_entry(hass: HomeAssistant, entry):
|
||||||
"""Set up entry, create specific contact device, central hub and forward to platforms."""
|
"""Set up entry, create devices, and clean up old orphaned devices."""
|
||||||
hass.data.setdefault(DOMAIN, {})
|
hass.data.setdefault(DOMAIN, {})
|
||||||
hass.data[DOMAIN][entry.entry_id] = entry.data
|
hass.data[DOMAIN][entry.entry_id] = entry.data
|
||||||
|
|
||||||
device_registry = dr.async_get(hass)
|
device_registry = dr.async_get(hass)
|
||||||
|
|
||||||
# 1. Eigenes Gerät SPEZIFISCH für diesen Account/Kontakt anlegen
|
# 1. Automatisches Aufräumen von alten Geister-Geräten
|
||||||
|
active_entry_ids = set(hass.config_entries.async_entries(DOMAIN))
|
||||||
|
active_ids = {e.entry_id for e in active_entry_ids}
|
||||||
|
|
||||||
|
# Durchsuche die HA-Datenbank nach Geräten unserer Integration
|
||||||
|
devices_to_clean = [
|
||||||
|
dev for dev in device_registry.devices.values()
|
||||||
|
if any(identifier[0] == DOMAIN for identifier in dev.identifiers)
|
||||||
|
]
|
||||||
|
|
||||||
|
for device in devices_to_clean:
|
||||||
|
# Falls ein Gerät zu einem gelöschten Config Entry gehört -> Löschen!
|
||||||
|
# Der globale Hub ("global_bridge_hub") wird ignoriert und bleibt erhalten.
|
||||||
|
for config_id in device.config_entries:
|
||||||
|
if config_id not in active_ids and not any(idx == "global_bridge_hub" for _, idx in device.identifiers):
|
||||||
|
_LOGGER.info(f"Entferne verwaistes WhatsApp-Gerät: {device.name}")
|
||||||
|
device_registry.async_remove_device(device.id)
|
||||||
|
|
||||||
|
# 2. Eigenes Gerät SPEZIFISCH für dieses aktive Konto anlegen
|
||||||
device_registry.async_get_or_create(
|
device_registry.async_get_or_create(
|
||||||
config_entry_id=entry.entry_id,
|
config_entry_id=entry.entry_id,
|
||||||
identifiers={(DOMAIN, entry.entry_id)}, # Einzigartig pro Eintrag
|
identifiers={(DOMAIN, entry.entry_id)},
|
||||||
name=f"WhatsApp {entry.title}",
|
name=f"WhatsApp {entry.title}",
|
||||||
manufacturer="Bahmcloud",
|
manufacturer="Bahmcloud",
|
||||||
model="Kontakt-Endpunkt",
|
model="Kontakt-Endpunkt",
|
||||||
sw_version="0.2.2",
|
sw_version="0.2.3",
|
||||||
)
|
)
|
||||||
|
|
||||||
# 2. Zentralen System-Hub NUR EINMALIG anlegen (wird an den ersten geladenen Account gekoppelt)
|
# 3. Zentralen System-Hub VOLLKOMMEN UNABHÄNGIG anlegen (ohne feste config_entry_id Bindung)
|
||||||
if not hass.data[DOMAIN].get("hub_device_created"):
|
device_registry.async_get_or_create(
|
||||||
device_registry.async_get_or_create(
|
identifiers={(DOMAIN, "global_bridge_hub")},
|
||||||
config_entry_id=entry.entry_id,
|
name="WhatsApp Bridge Hub",
|
||||||
identifiers={(DOMAIN, "global_bridge_hub")},
|
manufacturer="Bahmcloud",
|
||||||
name="WhatsApp Bridge Hub",
|
model="Bridge Server",
|
||||||
manufacturer="Bahmcloud",
|
sw_version="0.2.3",
|
||||||
model="Bridge Server",
|
)
|
||||||
sw_version="0.2.2",
|
|
||||||
)
|
|
||||||
hass.data[DOMAIN]["hub_device_created"] = True
|
|
||||||
|
|
||||||
# Forward the setup to the sensor platform to create entities
|
# Forward the setup to the sensor platform to create entities
|
||||||
await hass.config_entries.async_forward_entry_setups(entry, ["sensor"])
|
await hass.config_entries.async_forward_entry_setups(entry, ["sensor"])
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"documentation": "https://git.bahmcloud.de/bahmcloud/Whatsapp-Bridge-Integration",
|
"documentation": "https://git.bahmcloud.de/bahmcloud/Whatsapp-Bridge-Integration",
|
||||||
"dependencies": [],
|
"dependencies": [],
|
||||||
"codeowners": ["@bahmcloud"],
|
"codeowners": ["@bahmcloud"],
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"iot_class": "local_polling",
|
"iot_class": "local_polling",
|
||||||
"config_flow": true
|
"config_flow": true
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ class WhatsAppBroadcastEntity(SensorEntity):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def device_info(self) -> DeviceInfo:
|
def device_info(self) -> DeviceInfo:
|
||||||
"""Ordnet diese Entität dem zentralen Hub-Gerät zu."""
|
"""Ordnet diese Entität dem permanenten, zentralen Hub-Gerät zu."""
|
||||||
return DeviceInfo(
|
return DeviceInfo(
|
||||||
identifiers={(DOMAIN, "global_bridge_hub")},
|
identifiers={(DOMAIN, "global_bridge_hub")},
|
||||||
)
|
)
|
||||||
@@ -145,7 +145,7 @@ class WhatsAppStatusSensor(SensorEntity):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def device_info(self) -> DeviceInfo:
|
def device_info(self) -> DeviceInfo:
|
||||||
"""Ordnet diese Entität dem zentralen Hub-Gerät zu."""
|
"""Ordnet diese Entität dem permanenten, zentralen Hub-Gerät zu."""
|
||||||
return DeviceInfo(
|
return DeviceInfo(
|
||||||
identifiers={(DOMAIN, "global_bridge_hub")},
|
identifiers={(DOMAIN, "global_bridge_hub")},
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user