diff --git a/custom_components/whatsapp_bridge_integration/__init__.py b/custom_components/whatsapp_bridge_integration/__init__.py index 7467eef..3805b30 100644 --- a/custom_components/whatsapp_bridge_integration/__init__.py +++ b/custom_components/whatsapp_bridge_integration/__init__.py @@ -1,47 +1,59 @@ import logging import requests -import voluptuous as vol -from homeassistant.helpers import config_validation as cv +from homeassistant.core import HomeAssistant, ServiceCall +from .const import DOMAIN, CONF_PHONE_NUMBER, CONF_ACCOUNT_NAME _LOGGER = logging.getLogger(__name__) -DOMAIN = "whatsapp_bridge_custom" - -# Definition der Service-Parameter -SERVICE_SEND_MESSAGE = "send_message" -ATTR_NUMBER = "number" -ATTR_MESSAGE = "message" - -SERVICE_SCHEMA = vol.Schema({ - vol.Required(ATTR_NUMBER): cv.string, - vol.Required(ATTR_MESSAGE): cv.string, -}) - -async def async_setup(hass, config): - """Set up the WhatsApp Bridge integration.""" +async def async_setup_entry(hass: HomeAssistant, entry): + """Setzt ein Profil (Config Entry) aus der UI-Konfiguration um.""" - def send_whatsapp_msg(call): - """Dienst-Funktion: Nachricht an das Add-on senden.""" - number = call.data.get(ATTR_NUMBER) - message = call.data.get(ATTR_MESSAGE) + # Falls noch nicht geschehen, registrieren wir den globalen Dienst + if not hass.services.has_service(DOMAIN, "send_message"): - # Die interne URL zum Add-on (standardmäßig local-whatsapp-bridge) - # Port 3000 haben wir im Dockerfile definiert - url = "http://866fd2eb-whatsapp-bridge:3000/send" - - try: - response = requests.post(url, json={ - "number": number, - "message": message - }, timeout=10) + async def handle_send_message(call: ServiceCall): + """Zentraler Dienst zum Senden von Nachrichten.""" + message = call.data.get("message") + target_account = call.data.get("account") # Optionaler Filter + target_number = call.data.get("number") # Manuelle Nummer - if response.status_code != 200: - _LOGGER.error("Fehler beim Senden: %s", response.text) - except Exception as e: - _LOGGER.error("Verbindung zum Add-on fehlgeschlagen: %s", str(e)) + # Alle installierten Profile durchsuchen + entries = hass.config_entries.async_entries(DOMAIN) + + targets = [] + + if target_number: + # Fall A: Direkte Nummer wurde im Service-Call mitgegeben + targets.append(target_number) + elif target_account: + # Fall B: Ein spezifisches Profil wurde gewählt + for e in entries: + if e.title.lower() == target_account.lower(): + targets.append(e.data.get(CONF_PHONE_NUMBER)) + else: + # Fall C: Gar kein Ziel? Dann an ALLE Profile senden + for e in entries: + targets.append(e.data.get(CONF_PHONE_NUMBER)) - hass.services.async_register( - DOMAIN, SERVICE_SEND_MESSAGE, send_whatsapp_msg, schema=SERVICE_SCHEMA - ) + # Senden an alle ermittelten Ziele + for num in targets: + url = "http://866fd2eb-whatsapp-bridge:3000/send" + try: + # Wir nutzen hass.async_add_executor_job für synchrone Requests + await hass.async_add_executor_job( + lambda: requests.post(url, json={ + "number": num, + "message": message + }, timeout=10) + ) + _LOGGER.info("WhatsApp an %s gesendet: %s", num, message) + except Exception as e: + _LOGGER.error("Fehler beim Senden an %s: %s", num, str(e)) + hass.services.async_register(DOMAIN, "send_message", handle_send_message) + + return True + +async def async_unload_entry(hass, entry): + """Profil wieder entfernen.""" return True \ No newline at end of file