[39_Talk2Fhem.pm] Flexible Sprachsteuerunghilfsmodul

Begonnen von Phill, 12 Dezember 2017, 12:24:09

Vorheriges Thema - Nächstes Thema

Steffen

Zitat von: RoBra81 am 22 Februar 2018, 19:34:07
Weil nach dem essen noch mindestens ein Leerzeichen kommen muss. Mach das mal mit in die klammer...

Gesendet von meinem SM-G935F mit Tapatalk


(@name) && essen (\S*) = set TestT2F $2{ /fertig/ => off, empty, /jetzt/ => on }


meintest du das mit "empty" in der Klammer, das geht leider nicht?!?

Phill

#196
Die Syntax ist bei der Typenmodifikation anders.
(@name) && essen ?(\S*) = set TestT2F $2{ /fertig/ => off, empty => on }

Wobei empty ist der wert selten, besser wäre:
(@name) && essen ?(\S*) = set TestT2F $2{ /fertig/ => off, else => on }


EDIT:
Aber das Beispiel von dir ist tricky. Denn "Das essen ist fertig" könnte ja heißen es wird mit dem essen begonnen. ;D
Sollte aber trotzdem funktionieren, da ja in $2 dann "ist" steht.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Steffen

Hallo!

Ich kämpfe mich immer wieder erneut durchs Wiki aber irgendwie verstehe ich wohl das Thema irgendwo noch falsch, ich wollte eigentlich wieder einen Satz auswerten:

ich/wir möchten jetzt frühstücken versucht habe ich es damit:
(@name) && (@zeitraum) && frühstücken = set TestT2F $2{ /jetzt/ => on, /fertig/ => off}

aber es reagiert bei "Fertig" aber nicht bei "jetzt"?

Kann mir jemand sagen und das hatte ich bis jetzt oft, warum nicht immer das erste also "jetzt" ausgewertet wird sonder "fertig"?!

Ich hoffe ihr habt noch ein wenig Geduld mit mir...

Mfg Steffen

Phill

#198
Hi, ich brauche sogar den Input von den Usern um das Programm weiter entwickelt zu können. Also bitte so viel Fragen wie geht...

"jetzt" kann nicht gefunden werden, da es sich um eine Zeitphrase handelt die automatisch entfernt wird.
Siehe: https://wiki.fhem.de/wiki/Modul_Talk2Fhem#Zeitenerkennung
Über "get log" kannst du dir die Logausgabe anzeigen lassen, da sind die einzelnen Bearbeitungsschritte die Talk2Fhem mit dem Sprachbefehl anstellt angezeigt. Das würde dir eventuell auch helfen.

Zeiten werden ja von Haus aus erkannt, was genau hast du denn vor mit @zeitraum?

Vielleicht ist hier weniger mehr?
frühstück && ?(fertig) = set TestT2F $1{ /fertig/ => off, else => on}
Reicht das nicht aus für das was du machen willst?

"wir wollen jetzt frühstücken" oder "in einer stunde frühstücken wir" oder "ich bin mit dem frühstücken fertig"
Ist damit alles abgedeckt.

Gruß

Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

swsmily

Hi.
Ich hab seit einiger Zeit eine Möglichkeit gesucht relativ einfach und ohne viel Aufwand eine Sprachsteuerung zu realisieren.
Die bisherigen Lösungen waren mir beim Einrichten zu kompliziert (oder ich hab es einfach nicht verstanden) oder konnten nicht das umsetzen, was ich mir vorgestellt habe.
Bei dem Modul Talk2Fhem ist dies anders. Innerhalb von wenigen Minuten wurden die ersten Sprachbefehle erkannt und erfolgreich umgesetzt und das obwohl ich mich mit RegEx nur extrem wenig auskenne. Aber dank Wiki, Commandref, dem Thread und auch Google kam ich sehr schnell zu einfachen Lösungen.

Was mir jedoch aufgefallen ist, schnell sagt man mal mach das Licht im Flur und in der Küche an - Ergebnis ist, dass nichts passiert, weil "an" im ersten Teil fehlt. Warum der zweite Teil auch gar nicht ausgefüht wird, weiß ich nicht. küche an allein bewirkt das Richtige CMD. Ich vermute, dass nach dem ersten Teil abgebrochen wird?
Gibt es einen Trick, wie man zwei Devices mit einem Befehl steuern kann? Klar ich könnte sagen mach das Licht im Flur an und schalte das licht in der küche ein aber so spricht man ja nicht natürlich.


Weitere Frage, kann man RegExs in Klammern verschachteln?
Hier meine Abfrage:
Bad\S*|Flur\S*|Schlafzimmer\S*|Küche\S*) && (\san\S*|ein\S*|hell\S*|aus\S*|ganz.aus\S*|farbwechsel|rot\S*) =
set $1[Badlicht, Flurlicht, Schlafzimmerlicht, Kuechenlicht] $2[Weiß, Weiß, Hell, auto, aus, Farbwechsel, rot]

In der zweiten Klammer wird ja auf ein und an gesucht. Da diese in einzelnen Trennern sind, muss ich ja nach $2, jeweils den einzustellenden Status angeben. Schöner wäre es, wenn ich hier \san\S*|ein\S* durch \s(a|ei)n\S* ersetzen könnte. Tue ich das stürzt aber FHEM ab.
Mach ich hier was falsch, oder funktioniert es so einfach nicht?

Vielen Dank schonmal für eure Antworten und für das tolle Modul  :)

Phill

#200
Zitat von: swsmily am 28 Februar 2018, 21:19:23
Was mir jedoch aufgefallen ist, schnell sagt man mal mach das Licht im Flur und in der Küche an - Ergebnis ist, dass nichts passiert, weil "an" im ersten Teil fehlt. Warum der zweite Teil auch gar nicht ausgefüht wird, weiß ich nicht. küche an allein bewirkt das Richtige CMD. Ich vermute, dass nach dem ersten Teil abgebrochen wird?
Der Satz wird ja bei "und" aufgeteilt und dann werden zwei eigenständige Kommandos erwartet, die in diesem Fall nicht vorliegen und er abbricht weil etwas nicht verstanden wurde.


Das ist echt ein Problem und gar nicht so leicht zu realisieren, wenn nicht die ganze Satzsemantik analysiert wird. Ich hatte mir zwar schon mal Gedanken darüber gemacht aber noch nicht die Zeit gefunden hier weiter anzusetzen. Kommt vielleicht noch. Steht jedenfalls auf der TODO.

Zitat von: swsmily am 28 Februar 2018, 21:19:23
Gibt es einen Trick, wie man zwei Devices mit einem Befehl steuern kann?
Ja. Am besten man überlegt sich für die notwendigen Ortkombinationen ein eigenes Wort (oder auch mehrere).
wie z.b. "unten" oder "Erdgeschoß" und weißt dann diesem Wort mehrere Geräte zu. Wie das geht kann man hier sehen. https://wiki.fhem.de/wiki/Modul_Talk2Fhem#T2F_modwordlist Funktioniert aber auch direkt im Kommandoteil ohne Modwordliste.


Zitat von: swsmily am 28 Februar 2018, 21:19:23
Hier meine Abfrage:
Bad\S*|Flur\S*|Schlafzimmer\S*|Küche\S*) && (\san\S*|ein\S*|hell\S*|aus\S*|ganz.aus\S*|farbwechsel|rot\S*) =
set $1[Badlicht, Flurlicht, Schlafzimmerlicht, Kuechenlicht] $2[Weiß, Weiß, Hell, auto, aus, Farbwechsel, rot]
In der zweiten Klammer wird ja auf ein und an gesucht. Da diese in einzelnen Trennern sind, muss ich ja nach $2, jeweils den einzustellenden Status angeben. Schöner wäre es, wenn ich hier \san\S*|ein\S* durch \s(a|ei)n\S* ersetzen könnte.
Habe ich nicht vorgesehen. Ist auch nicht gerade trivial. Stichwort "nested brackets".
Bei größeren Listen ist es besser du überführst es in die Keyword und Modwordlisten. Dort kannst du glaube ich Klammern. Versuche es einfach mal.
Bad\S*|Flur\S*|Schlafzimmer\S*|Küche\S*) && (@licht_cmds) =
set $1[Badlicht, Flurlicht, Schlafzimmerlicht, Kuechenlicht] $2[@licht_cmds]


attr talk T2F_keywordlist licht_cmds = \san\S*,ein\S*,hell\S*,aus\S*,ganz.aus\S*,farbwechsel,rot\S*
attr talk T2F_modwordlist licht_cmds = Weiß,Weiß,Hell,auto,aus,Farbwechsel,rot

Die Zuordnung kannst du über get @licht_cmds @licht_cmds anzeigen lassen.

Zitat von: swsmily am 28 Februar 2018, 21:19:23
Tue ich das stürzt aber FHEM ab.
Das darf natürlich nicht sein schaue ich mir nochmal an.

Zitat von: swsmily am 28 Februar 2018, 21:19:23
Vielen Dank schonmal für eure Antworten und für das tolle Modul  :)
:)
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

swsmily

#201
Wow. Danke für die schnelle Antwort!

Zitat
Das ist echt ein Problem und gar nicht so leicht zu realisieren, wenn nicht die ganze Satzsemantik analysiert wird. Ich hatte mir zwar schon mal Gedanken darüber gemacht aber noch nicht die Zeit gefunden hier weiter anzusetzen. Kommt vielleicht noch. Steht jedenfalls auf der TODO.
Das wäre ja super, wenn das umgesetzt werden kann. Macht die natürliche Spracheingabe auf jeden Fall einfacher.

Zitat
Ja. Am besten man überlegt sich für die notwendigen Ortkombinationen ein eigenes Wort (oder auch mehrere).
Hmm... Das wenn man mehrere Devices im Wohnzimmer hat ja - das hab ich im Wiki auch so verstanden.
Mir ging es hier, eher um die Dynamik. Mir ist klar, mit UND getrennte Spracheingaben werden einzeln ausgewertet. Aber zumindest im natürlichen Sprachgebrauch macht man das ja eher weniger. Da sagt man eher "mach das Bad- und Flurlicht aus und Küche an.".
Daher ist mit Ortskombinationen nicht ganz so das flexible, dynamische gegegeben. (Außer ich sehe es falsch - ist nicht leicht alles aus dem Thread, Commandref und Wiki im Überblick zu behalten  ;))

Zitat
Stichwort "nested brackets".
Ich hab da leider keine Ahnung, wie groß der Programmieraufwand ist. Wäre sozusagen Nice-to-have - aber so wie ich es bis jetzt eingetragen haben funktioniert es - das ist die Hauptsache.
In Attribute Auslagern ist nicht so meins. Ich hab es lieber alles in einer "konfig", als an unterschiedlichen Stellen. Zumal die Werte je nach Raum auch variieren können.



Was mir nun bei weiteren Tests noch aufgefallen ist, die Uhrzeit im Befehl wird nicht wirklich angenommen. Um ... Uhr wird fast nie angenommen.
Egal ob "mach Flur um 9 hell" oder "mach Flur um 9 Uhr hell" (zahlen auch als Wörter geschrieben) bringt immer nur CMD: set Flurlicht Hell.
Mit "mach morgen um 9 den Flur hell" wird die Uhrzeit mit ins at übernommen.





Phill

Wenn die Zeiten nicht erkannt werden schicke mir bitte die Log Ausgabe (get talk log).
Dann passe ich es im Modul an.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

swsmily

Gerne  :)

Talk2Fhem Version: 0.4.4
Decoding Text: flurlicht um 9 uhr hell
Using User Filter: \bbitte\b,\bauch\b,\bkann\b,\bsoll\b
Command part: 'flurlicht um 9 uhr hell'
Timephrase found: =~ s/\bum (\d+|neun\S*|zehn\S*|elf\S*|(ein\S*|erste\S*)|fünf\S*|zwölf\S*|sieb\S*|(drei\S*|dritt\S*)|vier\S*|acht\S*|sechs\S*|zwei\S*) (uhr)?\b/
TIMEPHRASEDATA mod: 'time' raw: '"$1"' result: '9' opt: '9   uhr'
Extracted Timephrase. 'um 9 uhr '
Commandpart after datedecoding. 'flurlicht   hell'
Time is in past: 1519856908 1519804800
Command left: 'flurlicht hell'
talk Evaluate search:
flurlicht hell =~ /(Bad\S*|Flur\S*|Schlafzimmer\S*|Küche\S*) && (\san\S*|ein\S*|hell\S*|aus\S*|ganz.aus\S*|farbwechsel|rot\S*)/i
Keylists: $VAR1 = undef;

Filled lists: $VAR1 = '(Bad\\S*|Flur\\S*|Schlafzimmer\\S*|K\\S\\S?che\\S*)';
$VAR2 = '(\\san\\S*|ein\\S*|hell\\S*|aus\\S*|ganz.aus\\S*|farbwechsel|rot\\S*)';

Words: $VAR1 = '';
$VAR2 = 'flurlicht';
$VAR3 = 'hell';

Match: flurlichthell
Unmatch:
Hit with phrase: qr/(Bad\S*|Flur\S*|Schlafzimmer\S*|Küche\S*) && (\san\S*|ein\S*|hell\S*|aus\S*|ganz.aus\S*|farbwechsel|rot\S*)/i
Handle reaction cmd: set $1[Badlicht, Flurlicht, Schlafzimmerlicht, Kuechenlicht] $2[Weiß, Weiß, Hell, auto, aus, Farbwechsel, rot]
Advanced bracket replacement. $2Weiß, Weiß, Hell, auto, aus, Farbwechsel, rot = set $1[Badlicht, Flurlicht, Schlafzimmerlicht, Kuechenlicht] ###
Keyword (2): '$VAR1 = 'hell';
'
ARRAY evaluation: else:  empty:
array: Weiß Weiß Hell auto aus Farbwechsel rot
Clipnumber 2 is no array! Try to extract by seperator '|'
Searching position of hell in \san\S* ein\S* hell\S* aus\S* ganz.aus\S* farbwechsel rot\S*
Advanced bracket replacement. $1Badlicht, Flurlicht, Schlafzimmerlicht, Kuechenlicht = set ### Hell
Keyword (1): '$VAR1 = 'flurlicht';
'
ARRAY evaluation: else:  empty:
array: Badlicht Flurlicht Schlafzimmerlicht Kuechenlicht
Clipnumber 1 is no array! Try to extract by seperator '|'
Searching position of flurlicht in Bad\S* Flur\S* Schlafzimmer\S* K\S\S?che\S*
Result of cmd: $VAR1 = {
          'cmd' => 'set Flurlicht Hell'
        };

Executing Command: set Flurlicht Hell
Pushed: set Flurlicht Hell

Steffen

Zitat von: Phill am 28 Februar 2018, 20:50:26

frühstück && ?(fertig) = set TestT2F $1{ /fertig/ => off, else => on}
Reicht das nicht aus für das was du machen willst?

Gruß

Guten Morgen,

Ja genau so macht es was soll, doch kann man diesem Cmd noch ein zweites Cmd mitgeben an ein anderes Device?

Der Plan das erste Cmd wird den Tv ausschalten, ein zweites soll das Radio anschalten.

Mfg Steffen

Phill

#205
Ja das geht. Da kannst du alle Möglichkeiten von FHEM ausschöpfen. Für komplexe Schaltungen erstellt man vielleicht ein Dummy und reagiert darauf dann mit einem Notify oder erstellt ein DOIF und lässt das die multiplen Kommandos ausführen.

Aber bei nur 2 Geräten sollte es auch einfacher gehen. z.B.
frühstück && ?(fertig) = set TV $1{ /fertig/ => "", else => off};; set RADIO $1{ /fertig/ => off, else => on}
oder besser noch
frühstück && ?(fertig) = $1{ /fertig/ => "set was anderes", else => "set Radio on;; set TV off"}
Was soll den nach dem Frühstück passieren? Fernseher wieder an Radio wieder aus?

Die zwei Semikolon sind momentan noch wichtig, da es sonst nicht mit Zeiten richtig funktioniert.
[EDIT] ab version 0.4.5 wird das aber nicht mehr notwendig sein.  :)
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Phill

@ swsmily: Problem hier ist das die 9 Uhr in der Vergangenheit gelegen hat. Sprich du wolltest vermutlich morgen um 9 Uhr haben richtig?
Ich könnte eventuell mir vorstellen wenn die Zeit länger als eine Stunde in der Vergangenheit liegt einen Tag drauf zu zählen. Muss ich mir mal überlegen ob das mit allen anderen Möglichkeiten kompatibel ist.

Momentan funktioniert auch nicht die Erkennung von 8 Uhr wenn 20 Uhr  gemeint ist. Man muss immer die eindeutige Uhrzeit sagen.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

swsmily

ah okay. Dann lag das beim Testen wohl daran, dass die Zeit evtl wirklich schon in der Vergangenheit lag.

Ich hab mir nun zum testen einen Befehl rein gemacht
tu was = ( cmd => "set tue es" , answer => ("Erledigt") )

Sage ich nun "tu was um 12 uhr 15" (über spracherkennung kam set mit tu was um 12:15 uhr) wird es aber sofort ausgeführt (aktuelle Uhrzeit beim Testen war 12:10 Uhr)

Phill

#208
Ja das ist so gewollt. Ich habe mal einen Hinweis im Wiki ergänzt. Steht sonst nur eher beiläufig im Wiki.

Answer soll nur dafür verwendet werden eine direktes Feedback zu geben. Willst du eine Ausgabe zu der gewünschten Zeit haben musst du das mit in das FHEM Kommando packen.
tu was = ( cmd => "set tue es;; set tts speak Erledigt!" , answer => ("Mach ich") )

Ist vielleicht sogar ein besseres Beispiel für das Wiki!

gruß

EDIT: gleiche bei https://wiki.fhem.de/wiki/Modul_Talk2Fhem#Ereignisbezogene_Meldungen
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Abercrombie1892

hallo,

phill du hattest mir ja schon oft geholfen

laut$              =  set Raumfeld_WZ volume 90
(ein wenig|etwas|viel)? ?(lauter|leiser)  =  { fhem("set Raumfeld_WZ volume ".(ReadingsVal("Raumfeld_WZ","volume", 0)$2[+,-]$1[3,5,10,empty,7])) }


ich nutze jetzt die Lautstärke von dir wie beschrieben und bin mit der sache super zufrieden.

ich würde das ganze aber nun gerne etwas ändern.

ich möchte das er das ganze zb nur raum bezogen macht. also mach ganz leise im wohnzimmer,küche, badezimmer.
und würde es auch gehen wenn ich zb sage mache ganz leise im wohnzimmer und in der küche?

mfg.