Unifi Switch: PoE-Ports per Script steuern
In meinem Netzwerk werden einige Geräte, wie z.B. meine Überwachungskameras per Power over Ethernet (PoE) mit Strom versorgt. Die PoE Funktion kann zwar über die Unifi Controller Software verwaltet werden, aber damit die PoE-Geräte in die Hausautomatisierung automatisch ein- und ausgeschaltet werden können, muss eine Home Assitant Integration her. Grundsätzlich sollte das mit den Switch-Devices der Unifi Controller Integration funktioneren. Allerdings wurden bei mir die PoE Geräte nciht wirklich zuverlässig identifiziert.
Daher habe ich ein Bash-Script geschrieben, dass dann anschließend per Command-Line-Siwtches in Home Assistant aufgerufen werden kann.
Vorbereitung in Unifi Controller
Damit der SSH-Login mit dem Script später funktioniert muss in der Unifi Controller Software zunächst ein SSH-Pulic-Key hinterlegt werden, mit dem sich der Home Assistant User anmelden kann. Dazu wird im Kontext des Benutzers unter dem Home Assistant ausgeführt wird ein SSH-Schlüssel per sudo -u homeassistant ssh-keygen
erzeugt. dabei wird der Schlüssel im Home-Verzeichnis des Homeassistant-Benutezr unter ~./ssh
abgelegt.
Der öffentliche Teil des Schlüssels (*.pub
) wird in der Unifi Controller Software unter Settings > Network Settings > Device Authentication
im Abschnitt SSH-Keys hinterlegt. Vorher muss auf der gleichen Seite natürlich die SSH-Authentisierung erstmal aktiviert werden.
Ist die Provisionierung entsprechend abgeschlossen und der neue Schlüssel auf den Switchen verteilt, dann muss die Verbindung geprüft und der jeweilige Host-Key der Switche bestätigt werden. Dazu wird für jeden Switch der per SSH gesteuert werden soll einmalig eine SSH-Verbindung im Kontext des Home Assistant Benutzers per sudo -u homeassistant admin@<switch-ip>
aufgebaut und der Host-Key bei der ersten Verbindung bestätigt. Wenn das funktioniert, kann das Script angelegt werden.
Bash-Script
Das Bash-Script funktioniert folgendermaßen: Zunächst müssen die Parameter geprüft werden, damit nicht irgendwelche unvorhergesehenen Kommandos auf dem Switch ausgeführt werden können. Der Switch auf dem der PoE-Port geändert werden soll, muss als IP-Adresse oder Host-Name angegeben werden. Die eigentliche Aktion ist auf on
oder off
einzuschränken, wobei die Groß-/Kleinschreibung egal sein sollte. Zu guter Letzt muss es sich bei der Portnummer um eine Zahl handeln. Alles andere sollte abgewiesen werden.
Danach muss nur noch in Abhängigkeit der Aktion (on oder off) das entsprechende Kommando an den switch gesendet werden. Wegen des verschachtelten Telnet-Aufrufs innerhalb der SSH-Sitzung ist Kommando etwas kompliziert ausgefallen:
#!/bin/bash
function usage {
echo
echo $"Usage: $0 <on|off> "
echo
echo "Example: $0 192.168.178.12 on 8"
echo
}
function is_number {
[[ "$1" =~ ^[0-9]+$ ]] && return 0 || return 1
}
function is_host {
[[ "$1" =~ ^[0-9a-zA-Z.:-]+$ ]] && return 0 || return 1
}
function valid_action {
[[ "${1,,}" =~ ^on|off$ ]] && return 0 || return 1
}
# check if hostname or IP is provided as target switch
if ! is_host "$1"; then
usage
echo -e "ERROR: Target switch must be a valid host name or IPv4/v6 address!\n"
exit 2
fi
# check if on or off is provided as action
if ! valid_action "$2"; then
usage
echo -e "ERROR: action must be on or off!\n"
exit 2
fi
# check if port-parameter is number
if ! is_number "$3" ; then
usage
echo -e "ERROR: portnumber contains non-numerical characters!\n"
exit 3
fi
cmd_pre="enable\n$password\nconfigure\n"
cmd_on="interface 0/$3\npoe opmode auto\nexit"
cmd_off="interface 0/$3\npoe opmode shutdown\nexit"
cmd_status="show poe status 0/$3"
cmd_post="\nexit\nexit\n"
case "${2,,}" in
on)
ssh admin@$1 '(echo "enable" ; echo "configure" ; echo "interface 0/'$3'" ; echo "poe opmode auto" ; echo "exit" ; echo "exit"; echo "exit" ) | telnet localhost 23 ; exit;'
;;
off)
ssh admin@$1 '(echo "enable" ; echo "configure" ; echo "interface 0/'$3'" ; echo "poe opmode shutdown" ; echo "exit" ; echo "exit"; echo "exit" ) | telnet localhost 23 ; exit;'
;;
*)
usage
exit 2
;;
esac
Home Assistant Einbindung
Wenn das script funktioniert, kann es in Home Assitatn mit einem Coomand-Line-Switch eingebunden werden. Den Status des Switches überprüfe ich dabei per PING. Erhalte ich eine Antwort von dem Gerät, dass an den Port angeschlossen ist, so ist das Gerät an ansonsten gehe ich davon aus, dass PoE für den Port entsprechend ausgeschaltet ist. Alternativ kann das Script beispielsweise auch um die Aktion status
erweitert werden, mit der der PoE-Status des Ports abgefragt wird.
switch:
- platform: command_line
switches:
cam_wohn:
command_on: '/usr/bin/unifi-poe sw-wohn on 8'
command_off: '/usr/bin/unifi-poe sw-wohn off 8'
command_state: '/bin/ping -c 1 -q cam-flur | /bin/grep "1 received"'
friendly_name: Kamera Flur
Kommentare