Signal Messenger mit Home Assistant nutzen

Wie man sich von Home Assistant per Signal Messenger über Ereignisse benachrichtigen lassen kann

Home Assistant bietet zahlreiche Möglichkeiten, sich über verschiedene Vorgänge benachrichtigen zu lassen. Unter den von Haus aus integrierten Protokollen findet sich beispielsweise E-Mail, Jabber (XMPP), Telegramm, Google Hangouts und viele mehr. Mein bevorzugter Messenger – Signal – ist jedoch nicht darunter.

Signal ist Open Source Software und stellt quasi die Referenz hinsichtlich End-zu-End-verschlüsselter Kommunikation dar. So wird das von Signal entwickelte Verschlüsselungsprotokoll mittlerweile u.a. von WhatsApp1, Google2 und Microsoft3 verwendet. Offiziell bietet Signal lediglich Apps für Android und iOS an, sowie eine Desktop-Version, die jedoch nicht als eigenständige Instanz, sondern nur in Verbindung mit der Smartphone-App funktioniert. Allerdings hat ein Signal-Nutzer mit signal-cli eine inoffizielle kommandozeilenbasierte Version entwickelt.

Doch auch Home Assistant hat eine sehr aktive Community und so hat sich ein Home Assistant Nutzer damit befasst, den Signal Messenger via signal-cli für Home Assistant nutzbar zu machen. Die folgende Anleitung beruht auf der Installationsanleitung von signal-cli , die auf GitHub verfügbar ist, und dem Forenbeitrag aus der Home Assistant Community, in dem ein Nutzer eine selbstentwickelte notify-Komponente für Signal vorstellt.

Vorbereitung

Um signal-cli installieren und nutzen zu können, ist Java erforderlich. Dies lässt sich auf einem Debian-basierten System mit dem folgenden Befehl installieren.

$ sudo apt install default-jre

Installation von signal-cli

Zunächst muss man die aktuelle Version von signal-cli herausfinden, die sich im GitHub-Repository findet. Hat man die aktuelle Versionsnummer, gibt man den folgenden Befehl im Terminal ein, wobei "0.6.2" durch die aktuelle Versionsnummer ersetzt werden muss (die Anführungszeichen bleiben bestehen).

$ export VERSION="0.6.2"

Anschließend lässt sich signal-cli mit den folgenden Befehlen herunterladen und installieren. ${VERSION} wird dabei automatisch durch die oben festgelegte Versionsnummer ersetzt.

$ wget https://github.com/AsamK/signal-cli/releases/download/v"${VERSION}"/signal-cli-"${VERSION}".tar.gz
$ sudo tar xf signal-cli-"${VERSION}".tar.gz -C /opt
$ sudo ln -sf /srv/signal-cli-"${VERSION}"/bin/signal-cli /usr/local/bin/

Um signal-cli mit Home Assistant nutzen zu können, muss man sich zur Registrierung einer Telefonnummer als homeassistant-Benutzer anmelden.

$ sudo su -s /bin/bash homeassistant

Nun kann eine Rufnummer, die für signal-cli genutzt werden soll, mit dem folgenden Befehl registriert werden, wobei PHONENUMBER durch die entsprechende Rufnummer im internationalen Format (z. B. +491701234567) ersetzt werden muss. Es muss sich um eine Rufnummer handeln, auf der man Sprachanrufe oder SMS empfangen kann, da man einen Verifizierungscode empfangen können muss. Bei dem folgenden Befehl erhält man den Verifizierungscode per Sprachanruf.

$ signal-cli -u PHONENUMBER register --voice

Nach wenigen Sekunden erhält man einen Anruf auf der angegebenen Rufnummer und eine Computerstimme teilt einem den Verifizierungscode mit, den man mit dem folgenden Befehl zur Verifizierung der Rufnummer nutzt.

$ signal-cli -u PHONENUMBER verify CODE

Nun kann man mit dem folgenden Befehl testen, ob man Nachrichten verschicken kann, wobei RECIPIENT durch die Rufnummer des Empfängers (ebenfalls im internationalen Format) ersetzt werden muss. Selbstverständlich muss es sich um eine Nummer handelt, die bereits bei Signal registriert ist.

$ signal-cli -u PHONENUMBER send -m "This is a test message" RECIPIENT

Signal als notify-Komponente in Home Assistant einrichten

Nun kann man in der configuration.yaml von Home Assistant pro Empfängernummer folgenden Eintrag hinzufügen und entsprechend anpassen.

  • sender_nr ist die Nummer des Absenders, d. h. die Nummer, mit der signal-cli registriert wurde.
  • recp_nr ist die Nummer des Empfängers, also z. B. die Mobilfunknummer, mit der Signal auf dem Smartphone registriert ist.
  • signal_cli_path ist der Pfad, in den signal-cli installiert wurde. /usr/local/bin entspricht dabei dem Pfad, in dem sich signal-cli bei der obigen Installationsmethode befindet.
notify:
 - name: [choose your notification name]
   platform: signalmessenger
   sender_nr: "+491701234567"
   recp_nr: "+1234567890"
   signal_cli_path: /usr/local/bin

Schließlich muss Signal noch als notify-Komponente in Home Assistant installiert werden. Dies geschieht, indem im Home Assistant Verzeichnis (dort, wo die Konfigurationsdateien liegen) im Ordner custom_components ein Ordner namens signalmessenger angelegt und darin eine Datei namens notify.py mit dem folgenden Inhalt erstellt wird:

"""
Signal Messenger for notify component.
Place this in homeassistant/components/signalmessenger/notify.py
"""
import pathlib
import subprocess
import logging
import voluptuous as vol

from os import path
from homeassistant.components.notify import (
     ATTR_DATA, ATTR_TITLE, ATTR_TITLE_DEFAULT, PLATFORM_SCHEMA,
     BaseNotificationService)
from homeassistant.const import CONF_API_KEY
import homeassistant.helpers.config_validation as cv

REQUIREMENTS = []

_LOGGER = logging.getLogger("signalmessenger")

CONF_SENDER_NR = 'sender_nr'
CONF_RECP_NR = 'recp_nr'
CONF_SIGNAL_CLI_PATH = 'signal_cli_path'

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_SENDER_NR): cv.string,
vol.Optional(CONF_RECP_NR): cv.string,
vol.Optional(CONF_SIGNAL_CLI_PATH): cv.string,
})

def get_service(hass, config, discovery_info=None):
    """Get the Join notification service."""
    sender_nr = config.get(CONF_SENDER_NR)
    recp_nr = config.get(CONF_RECP_NR)
    signal_cli_path = config.get(CONF_SIGNAL_CLI_PATH)

    if sender_nr is None or recp_nr is None or signal_cli_path is None:
        _LOGGER.error("No device was provided. Please specify sender_nr"
                      ", recp_nr, or signal_cli_path")
        return False

    return SignalNotificationService(sender_nr, recp_nr, signal_cli_path)

class SignalNotificationService(BaseNotificationService):
    """Implement the notification service for Join."""

    def __init__(self, sender_nr, recp_nr, signal_cli_path):
        """Initialize the service."""
        self.sender_nr = sender_nr
        self.recp_nr = recp_nr
        self.signal_cli_path = path.join(signal_cli_path, "signal-cli")

    def send_message(self, message="", **kwargs):
        """Send a message to a user."""

        # Raise an Exception if something goes wrong
        p = subprocess.Popen([self.signal_cli_path, "-u", self.sender_nr, "send", "-m", message, self.recp_nr], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

        # Wait for completion
        p.wait()
        output, err = p.communicate()

        ret = p.returncode

        if ret != 0:
            _LOGGER.error("output {} - err {}".format(output, err))
            raise Exception("Signal Error {}".format(ret))

Nach einem Neustart von Home Assistant kann man sich fortan per Signal Messenger von Home Assistant benachrichtigen lassen.

/img/home_assistant/notify_signal.png

Signal-Nachricht über Home Assistant verschicken

Die folgenden Beiträge könnten Dich auch interessieren: