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.