Open Assistant

Begonnen von xenos1984, 21 Februar 2021, 19:19:35

Vorheriges Thema - Nächstes Thema

xenos1984

Hat schon mal jemand von euch Open Assistant ausprobiert?

http://www.openassistant.org/

Vorteil gegenüber Cloud-basierten Diensten ist, dass die Spracherkennung komplett lokal erfolgt, und das bei minimaler CPU-Auslastung. Etwas holprig ist es noch, aber für einfache und nicht-kritische Anwendungen durchaus brauchbar.

Ich habe es heute auf einem Ubuntu System nach Anleitung auf GitHub installiert:

http://github.com/openassistant/oa-core

Zur Integration in FHEM habe ich erst einmal Telnet genommen und dafür eine neue Datei oa/modules/abilities/fhem.py angelegt. Für den Anfang soll sie nur Befehle absetzen:


import telnetlib

def execute(cmd):
    tn = telnetlib.Telnet("localhost", 7072)
    tn.write(cmd)
    tn.write(b"{ '=' }\n")
    tn.read_until(b"=")
    tn.close()


Die lässt sich nun in eigene Assistenten ("minds") einbinden, entweder z.B. in das mitgelieferte root mind oder in ein eigens angelegtes mind. So könnte man z.B. in oa/modules/mind/minds/root.py so etwas einfügen - zunächst einmal die neue FHEM ability einbinden:


from oa.modules.abilities.fhem import execute


Dann einen Sprachbefehl definieren:


@command("light on")
def light_on():
    say('Switching light on.')
    execute(b'set light on\n')


Mit dem Befehl python3 -m oa (im heruntergeladenen Verzeichnis) wird das ganze dann ausgeführt. Und wenn man nun "open assistant" und danach "light on" sagt, geht einem hoffentlich ein Licht auf (oder an).

Das ganze kann man natürlich beliebig mit weiteren Befehlen erweitern. Hier ein schönes Beispiel:

http://github.com/kidsodateless/oa-core
http://www.youtube.com/watch?v=D99V9Ge9IaE

Etwas eingeschränkt ist es allerdings. Man kann keine freien Parameter übergeben und muss für jeden Befehl eine eigene Aktion definieren. Wenn man also mehrere Lampen einzeln in je 10 Schritten dimmen will, braucht es 10 Befehle pro Lampe.

Ich denke, ich werde weiter daran basteln und das ganze zu gegebener Zeit im Wiki "verewigen".

xenos1984

Zwei kleine Verbesserungen: Da telnetlib bytearray-Variablen statt Strings erwartet, habe ich die Konvertierung in oa/modules/abilities/fhem.py verlagert. Dann kann man direkt Strings übergeben. Außerdem habe ich noch eine Funktion zum Abfragen von Readings eingebaut.


import telnetlib

def execute(cmd):
    tn = telnetlib.Telnet("localhost", 7072)
    tn.write(bytearray(cmd + '\n', 'ascii'))
    tn.write(b"{ '=' }\n")
    tn.read_until(b"=")
    tn.close()

def readingsval(device, reading, default = ''):
    tn = telnetlib.Telnet("localhost", 7072)
    tn.write(bytearray('{"=" . ReadingsVal("' + device + '", "' + reading + '", "' + default + '")}' + "\n", 'ascii'))
    tn.read_until(b"=")
    res = tn.read_until(b"\n")[:-1]
    tn.close()
    return res.decode('ascii')


Das lässt sich dann z.B. so benutzen:


@command("light on")
def light_on():
    say('Switching light on.')
    execute('set light on')

@command("bedroom temperature")
def bedroom_temperature():
    say('The current bedroom temperature is ' + readingsval('bedroom', 'temperature') + ' degrees centigrade.')