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

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page