-
Notifications
You must be signed in to change notification settings - Fork 2
Home
- IP des MQTT-Brokers eingeben
- Portnummer des MQTT-Brokers eingeben (1883 ist vorbelegt)
- Auswahl zwischen dem Typ %prefix%/%topic%/ (vorbelegt) oder %topic%/%prefix%/ (Homeassstant bzw. setoption19 1 Typ)
- Falls die Topics mit einem Großbuchstaben anfangen, dann diese Checkbox wählen. Es werden dann ALLE Topics (= devices, = Geräte) mit einem führenden Großbuchstaben erzeugt. Das bedeutet gleichzeitig, dass KEIN weiterer Großbuchstabe z. B. wie TH10, TH16 oder POW vorkommen darf. Dies bezieht sich allerdings auch auf die Schreibweise der auszuwertenden Sensordaten (Datei SensorKeywords.voc)
- ModuleKeyword.voc: Enthält die deutschen Topics (MQTT-Gerätenamen) wie "Pumpe", "Fernseher"
- ActionKeyword.voc: Enthält die Schaltfunktionen wie "an", "aus"
- CommandKeyword.voc: Enthält die Auslöserworte wie schalte, mache für die Funktion __build_automation_command(self)
- SensorKeyword.voc: Enthält Triggerworte für das Auslesen von Sensordaten wie "Temperatur" oder "Luftdruck" aber auch das Schlüsselwort "Schaltzustand" zur Abfrage von an oder aus.
- RequestKeyword.voc Enthält die Trigger (wie, welcher, welche, ...) für die Aktivierung der Funktion __build_dataRequest_command(self)
Die Antworten sind größtenteils direkt in der __init__.py
hinterlegt und werden mit der Methode self.speak() und NICHT mit self.speak_dialog() ausgeben. Mag sein, dass dies noch geändert wird.
- "Hey Mycroft, schalte die Pumpe an": schaltet (Power) das Gerät (bzw. den ersten Kanal bei Mehrkanalgeräten) mit den Namen "Pumpe" an (ON). Als MQTT-Statement: cmnd/Pumpe/Power (= fulltopic) ON (= message, payload). Das Gerät wird per MQTT-Statement an- oder ausgeschaltet. (Homeassistant-Modus: Pumpe/cmnd/POWER ON)
- "Hey Mycroft, wie(1) sind die Sensordaten(2) vom Außenthermometer(3)?": 1 = RequestKeyword, 2 = SensorKeyword, 3 = ModuleKeyword. Sensordaten können sowohl Wetterdaten als auch Angaben zum Stromverbrauch sein. Es wird der status 11 per MQTT abgerufen und als Antwort ausgegeben. Da eine Vielzahl an Sensoren an die Geräten angeschlossen werden können, muss für die Auswertung der Antwort des Tasmota-Gerätes, die Bezeichnung des Sensors in der on_message Funktion manuell eingetragen werden (Zeile 410 bzw 414 in der init.py Für die Sensoren SI7021 und DHT11.
- "Hey Mycroft, wie ist der Schaltzustand der Pumpe": Der Status 10 wird abgerufen und nach Power ON/OFF ausgewertet.
- "Hey Mycroft, welche Zeitpläne sind am Fernseher gesetzt": Ruft die Timer des angegebene Gerätes ab bzw. teilt mit, ob Timer gesetzt sind. Zu Timern werden Timernummer, Uhrzeit und Schaltfunktion (einschalten/ausschalten) genannt. Das Setzen von Timern ist (noch) nicht möglich. Zur Timerauswertung werden zwei temporäre Dateien (timers.log, timersets.log) geschrieben. Diese werden im Verzeichnis mycroft-core abgelegt, um ein zu häufiges Neuladen des Skills zu vermeiden.
Fast alle Funktionen und Methoden haben Doc-Strings bzw. inline (#) Kommentare. Sie helfen hoffentlich beim Verständnis des Skriptes. Da ich nur ein Freizeit-Programmierer und Autodidakt bin, gibt es sicherlich für manche Funktion elegantere Lösungen.
Für die deutsche Sprache gibt es ein paar Grundanpassungen:
Zeile 68 Funktion translate_to_german_number_syntax()
: Austausch von Punkten zu Kommas, damit die deutsche Aussprache von (Dezimal-) Zahlen korrekt ist.
Zeile 61, 217 ff. : Anpassung an die gewählte FullTopicSyntax, Schreibweise der Topics (218), und Grundstruktur für die request-Fuktion (309).
- Topics sind case sensitive, also mit dem Topic "Schalter" wird ein anderes Gerät angesprochen als mit dem Topic "schalter"
- deutsche Umlaute (ä,ö,ü,ß,Ä,Ö,Ü) sind erlaubt
- Leerzeichen sind nicht erlaubt bzw. werden bei der Eingabe durch den Unterstrich ersetzt
- Funktions-Topics wie cmnd, tele, stat sind case sensitive. Für diese Prefixes sind nur Kleinbuchstaben erlaubt
- Aktions-Topics wie Power, Status, Hostname etc. sind case in-sensitive. Hier ist die Schreibweise (groß, klein, gemischt) egal.
Bei der Vergabe der topics für Tasmota-Geräte (= MQTT-Gerätenamen) muss man sich grundsätzlich entscheiden, ob die topics mit einem Großbuchstaben anfangen oder nicht. Die default-Konfiguration ist, dass topics in kleinen Buchstaben geschrieben werden. In der Konfiguration des Skills gibt es allerdings die Möglichkeit, die Checkbox in der Rubrik Capitalization zu aktivieren. Dann ersetzt der Skill JEDEN Anfangsbuchstaben eines (Geräte-)Topics durch einen Großbuchstaben und ALLE weiteren Buchstaben durch Kleinbuchstaben mit Hilfe folgender Methode: mdl_name.capitalize(). Das bedeutet dann aber auch, dass Gerätenamen aus mehreren Großbuchstaben (z. B. TH10 oder POW_1) NICHT benutzt werden sollten. Hinweis: Tasmota setzt als MQTT-Gerätenamen Variablen ein wie "DVES_%06X". Der Namensteil "_%06X" wird durch die letzten vier Positionen der MAC-Adresse ersetzt. Solche Namen können von diesem Skript NICHT verarbeitet werden - es sei denn, man programmiert sich Ausnahmen in den Quellcode (Beispiele im nächsten Absatz)! Es müssen menschlich (und von Mycroft ;-)) verstehbare Namen wie "Pumpe", "Küchenlicht", "Fernseher" usw. in der im Deutschen üblichen Schreibweise mit großem Anfangsbuchstaben und folgenden Kleinbuchstaben als Gerätenamen (topics) verwendet werden - oder alles in Kleinschreibung definieren und ohne capitalization arbeiten.
Besonderheiten der deutschen Spracherkennung von Mycroft: Da wir im Deutschen neue Substantive aus anderen Substantiven zusammensetzen können, z. B. Werkstattradio aus Werkstatt und Radio, kommt Mycroft nicht in allen Fällen zum richtigen Ergebnis. Das Beispielwort "Werkstattradio" wird von Mycroft (oder Google speech) als "werkstatt radio" ausgewertet, die Bezeichnung "Außenthermometer" allerdings wird korrekt als zusammengesetztes Wort interpretiert. Diese Fälle muss man in der Datei ModuleKeywords berücksichtigen also mit aufnehmen. Im Hauptprogramm werden solche Leerstellen (spaces) zwischen erkannten Wörtern durch Bindestrich "-" ersetzt. Entsprechend müssen Topics angelegt sein. Leider konnte ich kein Regel feststellen, welche Komposita Mycroft zuverlässig erkennt und welche nicht. Eine andere Option wäre das Einfügen von if-Abfragen an allen Stellen, wo ein ModuleKeyword gebraucht wird und zu ersetzen wäre (vor der capitalization!). Beispiel:
if " " in mdl_name:
`mdl_name = mdl_name.replace(" ","")`
oder Einzelfall bezogen:
if mdl_name == "werkstatt radio":
`mdl_name = "werkstattradio"`
Denkbar wäre auch ein dictionary, in denen die korrekten also für die Kommunikation mit den Geräten erforderlichen Namen mdl_name als Key(s) angelegt werden und als Values, die Worte, die Mycroft in manchen Ausdrücken erkennt.
To be continued....