Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7175522f4a | |||
| 3b99c037ae | |||
| 4f8a4304ba | |||
| bcff98b44b | |||
| 40f74f9b8b | |||
| 5e1c07cecf | |||
| 2cfb881cc0 | |||
| c5d216e458 | |||
| 4f08cbbd6d |
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,10 +1,20 @@
|
||||
# CHANGELOG - Whatsapp Bridge Integration
|
||||
|
||||
## 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.
|
||||
- **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*).
|
||||
|
||||
## Release 0.2.1 - 2026-06-15
|
||||
- **Fix:** Resolved device assignment duplication where a single global gateway card duplicated across all account tabs.
|
||||
- **Fix:** Globalized the live status sensor and the broadcast entity to instantiate exactly once for the entire integration rather than incorrectly duplicating per account.
|
||||
- **Optimization:** Code refactoring within `sensor.py` to prevent entity duplication when utilizing multiple profiles.
|
||||
|
||||
## Release 0.2.0 - 2026-06-15
|
||||
- New: Setup of a main device (WhatsApp Bridge Gateway) in the Home Assistant device registry.
|
||||
- New: Integrated global service `whatsapp_bridge.send_broadcast`, which operates independently of individual profile entities and can send messages to any number or group ID.
|
||||
- New: Added status sensor (`sensor.whatsapp_bridge_status`). This queries the add-on's new API and provides the current connection status (`CONNECTED`, `WAITING_FOR_SCAN`, `INITIALIZING`, `OFFLINE`) directly within Home Assistant.
|
||||
- Improved: The sensor is assigned to the new main device, which significantly simplifies automations (e.g., alert on connection loss).
|
||||
- **New:** Setup of a main device (WhatsApp Bridge Gateway) in the Home Assistant device registry.
|
||||
- **New:** Integrated global service `whatsapp_bridge.send_broadcast`, which operates independently of individual profile entities and can send messages to any number or group ID.
|
||||
- **New:** Added status sensor (`sensor.whatsapp_bridge_status`). This queries the add-on's new API and provides the current connection status (`CONNECTED`, `WAITING_FOR_SCAN`, `INITIALIZING`, `OFFLINE`) directly within Home Assistant.
|
||||
- **Improved:** The sensor is assigned to the new main device, which significantly simplifies automations (e.g., alert on connection loss).
|
||||
|
||||
## Release 0.1.7
|
||||
- Previous stable version
|
||||
@@ -9,22 +9,34 @@ async def async_setup(hass: HomeAssistant, config: dict):
|
||||
return True
|
||||
|
||||
async def async_setup_entry(hass: HomeAssistant, entry):
|
||||
"""Set up entry, create general device and forward to sensor platform."""
|
||||
# Lege die Daten im hass-Objekt ab
|
||||
"""Set up entry, create specific contact device, central hub and forward to platforms."""
|
||||
hass.data.setdefault(DOMAIN, {})
|
||||
hass.data[DOMAIN][entry.entry_id] = entry.data
|
||||
|
||||
# 1. Hauptgerät (General Device) im Device Registry anlegen
|
||||
device_registry = dr.async_get(hass)
|
||||
|
||||
# 1. Eigenes Gerät SPEZIFISCH für diesen Account/Kontakt anlegen
|
||||
device_registry.async_get_or_create(
|
||||
config_entry_id=entry.entry_id,
|
||||
identifiers={(DOMAIN, "general_gateway")},
|
||||
name="WhatsApp Bridge Gateway",
|
||||
identifiers={(DOMAIN, entry.entry_id)}, # Einzigartig pro Eintrag
|
||||
name=f"WhatsApp {entry.title}",
|
||||
manufacturer="Bahmcloud",
|
||||
model="Bridge Server v0.2.0",
|
||||
sw_version="0.2.0",
|
||||
model="Kontakt-Endpunkt",
|
||||
sw_version="0.2.2",
|
||||
)
|
||||
|
||||
# 2. Zentralen System-Hub NUR EINMALIG anlegen (wird an den ersten geladenen Account gekoppelt)
|
||||
if not hass.data[DOMAIN].get("hub_device_created"):
|
||||
device_registry.async_get_or_create(
|
||||
config_entry_id=entry.entry_id,
|
||||
identifiers={(DOMAIN, "global_bridge_hub")},
|
||||
name="WhatsApp Bridge Hub",
|
||||
manufacturer="Bahmcloud",
|
||||
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
|
||||
await hass.config_entries.async_forward_entry_setups(entry, ["sensor"])
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"documentation": "https://git.bahmcloud.de/bahmcloud/Whatsapp-Bridge-Integration",
|
||||
"dependencies": [],
|
||||
"codeowners": ["@bahmcloud"],
|
||||
"version": "0.2.0",
|
||||
"version": "0.2.2",
|
||||
"iot_class": "local_polling",
|
||||
"config_flow": true
|
||||
}
|
||||
@@ -10,7 +10,6 @@ from .const import DOMAIN
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
# Polling-Intervall (15 Sekunden)
|
||||
SCAN_INTERVAL = timedelta(seconds=15)
|
||||
|
||||
async def async_setup_entry(hass, entry, async_add_entities):
|
||||
@@ -37,22 +36,19 @@ async def async_setup_entry(hass, entry, async_add_entities):
|
||||
update_interval=SCAN_INTERVAL,
|
||||
)
|
||||
|
||||
# Ersten Abruf vor dem Erstellen der Entitäten erzwingen
|
||||
try:
|
||||
await coordinator.async_config_entry_first_refresh()
|
||||
except UpdateFailed:
|
||||
_LOGGER.warning("Erster Status-Abruf fehlgeschlagen. Add-on läuft eventuell noch an.")
|
||||
|
||||
# Basis-Entitäten: Account-Sensor und der neue Live-Status-Sensor
|
||||
entities = [
|
||||
WhatsAppAccountEntity(entry),
|
||||
WhatsAppStatusSensor(coordinator, entry)
|
||||
]
|
||||
# Jeder Account bekommt immer seine eigene Entität
|
||||
entities = [WhatsAppAccountEntity(entry)]
|
||||
|
||||
# Prüfen, ob die Broadcast-Entität schon existiert
|
||||
if not hass.data[DOMAIN].get("broadcast_registered"):
|
||||
# Globale Entitäten (Status & Broadcast) NUR EINMALIG für die gesamte Integration anlegen
|
||||
if not hass.data[DOMAIN].get("global_entities_registered"):
|
||||
entities.append(WhatsAppStatusSensor(coordinator))
|
||||
entities.append(WhatsAppBroadcastEntity())
|
||||
hass.data[DOMAIN]["broadcast_registered"] = True
|
||||
hass.data[DOMAIN]["global_entities_registered"] = True
|
||||
|
||||
async_add_entities(entities, True)
|
||||
|
||||
@@ -75,14 +71,14 @@ class WhatsAppAccountEntity(SensorEntity):
|
||||
|
||||
@property
|
||||
def device_info(self) -> DeviceInfo:
|
||||
"""Ordnet diesen Sensor dem Hauptgerät zu."""
|
||||
"""Ordnet diesen Sensor seinem spezifischen Personen-Gerät zu."""
|
||||
return DeviceInfo(
|
||||
identifiers={(DOMAIN, "general_gateway")},
|
||||
identifiers={(DOMAIN, self._entry.entry_id)},
|
||||
)
|
||||
|
||||
|
||||
class WhatsAppBroadcastEntity(SensorEntity):
|
||||
"""Virtual 'All Accounts' Entity."""
|
||||
"""Virtual 'All Accounts' Entity, geordnet unter dem zentralen Hub."""
|
||||
def __init__(self):
|
||||
self._attr_name = "WhatsApp Broadcast (All)"
|
||||
self._attr_unique_id = "whatsapp_bridge_broadcast_all"
|
||||
@@ -97,20 +93,19 @@ class WhatsAppBroadcastEntity(SensorEntity):
|
||||
|
||||
@property
|
||||
def device_info(self) -> DeviceInfo:
|
||||
"""Ordnet diesen Sensor dem Hauptgerät zu."""
|
||||
"""Ordnet diese Entität dem zentralen Hub-Gerät zu."""
|
||||
return DeviceInfo(
|
||||
identifiers={(DOMAIN, "general_gateway")},
|
||||
identifiers={(DOMAIN, "global_bridge_hub")},
|
||||
)
|
||||
|
||||
|
||||
class WhatsAppStatusSensor(SensorEntity):
|
||||
"""Echter Live-Status-Sensor, gekoppelt an die Add-on API."""
|
||||
"""Echter Live-Status-Sensor, geordnet unter dem zentralen Hub."""
|
||||
|
||||
def __init__(self, coordinator, entry):
|
||||
def __init__(self, coordinator):
|
||||
self.coordinator = coordinator
|
||||
self._entry = entry
|
||||
self._attr_name = "WhatsApp Bridge Status"
|
||||
self._attr_unique_id = f"{entry.entry_id}_bridge_live_status"
|
||||
self._attr_unique_id = "whatsapp_bridge_live_status_global"
|
||||
self._attr_icon = "mdi:whatsapp"
|
||||
|
||||
@property
|
||||
@@ -150,9 +145,9 @@ class WhatsAppStatusSensor(SensorEntity):
|
||||
|
||||
@property
|
||||
def device_info(self) -> DeviceInfo:
|
||||
"""Ordnet diesen Sensor dem Hauptgerät zu."""
|
||||
"""Ordnet diese Entität dem zentralen Hub-Gerät zu."""
|
||||
return DeviceInfo(
|
||||
identifiers={(DOMAIN, "general_gateway")},
|
||||
identifiers={(DOMAIN, "global_bridge_hub")},
|
||||
)
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
|
||||
Reference in New Issue
Block a user