Autor Thema: [39_Talk2Fhem.pm] Flexible Sprachsteuerung [NEU] mit Objektverundung!  (Gelesen 20258 mal)

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
brauch mal wieder etwas hilfe   ::)

ich wollte jetzt über einen sprachbefehl playlisten abspielen lassen und mache das ja über einen http befehl {GetHttpFile("192.168.178.21:8080","/raumserver/controller/loadPlaylist?id=Wohnzimmer&value=Rock")}

ich habe das jetzt schon mit keywordlist und modwordlist probiert, aber da funktionieren ja die http befehle nicht, durch das komma nach dem port.
ich müsste nur hinten das wort nach value= austauschen gegen die playlistnamen.

danke

edit: habs selber hinbekommen, so langsam seh ich durch hier  :D
« Letzte Änderung: 21 März 2018, 21:20:29 von Abercrombie1892 »

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 374
  • Langsam wird'n Schuh d'raus.
    • iVDR
aber da funktionieren ja die http befehle nicht, durch das komma nach dem port.

Nur der Vollständigkeit halber:
Das Komma kannst geschützt werden. Siehe Attribute im Wiki.

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

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
Nur der Vollständigkeit halber:
Das Komma kannst geschützt werden. Siehe Attribute im Wiki.

Gruß

Wieder was dazu gelernt. Danke
Hattest du dir das mit den vorspulen nochmal genauer angeschaut?

Ich weiß nicht ob es möglich wäre oder ob es möglich ist, einen Befehl zeitverzögert abzusenden aus t2f ohne jetzt über ein doif oder notify zugehen?

Mit freundlichen Grüßen
« Letzte Änderung: 22 März 2018, 10:39:33 von Abercrombie1892 »

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 374
  • Langsam wird'n Schuh d'raus.
    • iVDR
Bei der Minuten/Sekunden... Erkennung wird jetzt explicit ein in, und oder nach erwartet. Also:
in 3 minuten und 5 sekunden oder nach 3 minuten
Bedeutet: Ein "spule um 3 minuten vor" oder "spule auf 3 minuten" wird jetzt nicht mehr als Zeitphrase erkannt und kann selbst ausgewertet werden.
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

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
Bei der Minuten/Sekunden... Erkennung wird jetzt explicit ein in, und oder nach erwartet. Also:
in 3 minuten und 5 sekunden oder nach 3 minuten
Bedeutet: Ein "spule um 3 minuten vor" oder "spule auf 3 minuten" wird jetzt nicht mehr als Zeitphrase erkannt und kann selbst ausgewertet werden.

Was meinst du mit selbst ausgewertet werden?

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 374
  • Langsam wird'n Schuh d'raus.
    • iVDR
Indem du die Zahlen per RegExp erfasst und in den Kommandoteil überführst. Du kannst ja dann mit der Zahl machen was du willst. Sprich "selbst auswerten".



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

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
Indem du die Zahlen per RegExp erfasst und in den Kommandoteil überführst. Du kannst ja dann mit der Zahl machen was du willst. Sprich "selbst auswerten".

Ich probiere heut Abend mal mein Glück. Ich musste ja die Zahl noch umrechnen auf Sekunden

Mit freundlichen Grüßen

Offline n4rrOx

  • Full Member
  • ***
  • Beiträge: 210
Hallo Phill,

habe mir deine Erläuterungen nochmals in Ruhe angeschaut und versucht meine Erkenntnisse mit einigen weiteren Fragezeichen mal rauszuschreiben.
RegExp ist absolutes Neuland für mich ^^

?(link\S+|recht\S+) && rolll?(os?|\S\S?den) ?(\S+ ){0,2}(Küche|Kinderzimmer|Schlafzimmer|Wohnzimmer) (\S+ )?(auf )?(\S+)
#####################################################################################################################################################

?(link\S+|recht\S+) = optional, ob link... oder recht..., wobei "..." irgwendwelche Zeichen sein können, die keine Leerzeichen sind

rolll?(os?|\S\S?den) = l? => l ist optional, dann entweder Endung os oder ein oder zwei Zeichen, wobei ein Umlaut wie ä umgeschrieben wird

?(\S+ ){0,2} = 0 bis 2 Wörter => wäre auch das richtig: ?(\S+){0,2} ?????

< Wieso kommt nachfolgend kein Leerzeichen bzw. darf eins kommen ????? >

(Küche|Kinderzimmer|Schlafzimmer|Wohnzimmer) = Eins der Zimmer ...

(\S+ )? = irgendeine optionale Zeichenfolge (außer Leerzeichen) => wäre auch das richtig: ?(\S+) ??????

< Wieso kommt nachfolgend kein Leerzeichen bzw. darf eins kommen ????? >

(auf )? = auf ist optional

(\S+) = irgendeine Zeichenfolge (außer Leerzeichen)

Bzgl. der Sprach-Befehlszusammensetzung kann "links/rechts" irgendwo im Satz sein ... nach "roll..." kommen ggf. bis zu 2 Wörter dann MUSS ein Raum kommen, gefolgt von ggf. einem Wort, sowie ggf. "auf" sowie noch einer abschließenden Zeichenfolge, richtig?

Also kann ich nicht sagen:
Fahre in der Küche den Rolladen auf 50 % ???

=> Wo müsste oder könnte ich noch weitere && setzen?
___________
Hätte noch einen Vorschlag, abseits meiner RegEx-Fragen:
Es ist ja möglich zu sagen, dass z. B. das Licht in 5 min ausgeschaltet werden soll.
Anschließend wird ein Timer generiert, welcher die Lampe in 5 min ausschaltet.
Wenn jetzt die Lampe aber gar nicht an war, wird einfach nach 5 min trotzdem ein off Befehl gesendet.

Wäre es nicht bei solchen Zeitangaben sinnvoll immer zu prüfen, ob das Gerät bereits den gegenteiligen Zustand hat (in diesem Fall Lampe bereits an) und wenn nicht diese anzuschalten und dann nach der vorgegebenen Zeit wieder zu deaktivieren? Weil mit diesem Befehl geht man ja davon aus, dass diese momentan an ist.

Somit könnte der Sprachbefehl wie folgt verkürzt werden (Ausgangszustand: Lampe aus):
Schalte die Lampe an und in 5 min wieder aus.      =>      Schalte die Lampe in 5 min aus.


Gruß
Mathias

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
(minuten|sekunden) && vorspulen|spule auf (\S+) =
  {GetHttpFile("192.168.178.21:8080","/raumserver/controller/seek?id=Wohnzimmer&value=".($2{numeral=>"$2"}*$1[60,1,empty,60]))}

funzt jetzt perfekt. danke für deine arbeit. geniales modul

mich würde trotzdem mal interessieren ob man hier ein wait einbauen könnte.? ::)
« Letzte Änderung: 22 März 2018, 21:42:32 von Abercrombie1892 »

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 374
  • Langsam wird'n Schuh d'raus.
    • iVDR
(minuten|sekunden) && vorspulen|spule auf (\S+) =
  {GetHttpFile("192.168.178.21:8080","/raumserver/controller/seek?id=Wohnzimmer&value=".($2{numeral=>"$2"}*$1[60,1,empty,60]))}
funzt jetzt perfekt. danke für deine arbeit. geniales modul
mich würde trotzdem mal interessieren ob man hier ein wait einbauen könnte.? ::)
Danke für die Blumen. Wie meinst du das nochmal mit dem wait? 


RegExp ist absolutes Neuland für mich ^^
Ich finde es klasse, dass ich durch mein Modul zum Verständnis von RegExp beitrage. :)

Zitat
rolll?(os?|\S\S?den)   =   l? => l ist optional, dann entweder Endung os oder ein oder zwei Zeichen, wobei ein Umlaut wie ä umgeschrieben wird
Damit hab ich folgende Wörter erfasst.
Rollladen, rollläden, rollo, rollos. Vielleicht würde auch ein roll\S+ genügen, wenn man sonst kein Wort mehr beginnend mit roll verwendet. 

Zitat
?(\S+ ){0,2}      =   0 bis 2 Wörter => wäre auch das richtig: ?(\S+){0,2} ?????
Damit werden die Präpositionen und Artikel erfasst.
Im, in der, auf der, in, usw...
Zur Frage: Nein. Weil ich nach mindestens 2 Wörtern suche. Und diese werden nun mal in der Regel mit einem Leerzeichen getrennt.  ;)
Ich benutze innerhalb von T2F auch das dafür. Ist etwas expliziter wenn es interssiert.
'(([ai][nm]|beim?|auf|unter|hinter|über|vo[rnm]) )?((de[rmns]|die|das) )?'Ich sehe gerade das "?" am Anfang ist überflüssig wenn nicht sogar schädlich.

Zitat
< Wieso kommt nachfolgend kein Leerzeichen bzw. darf eins kommen ????? >
Das ist ja in der Klammer schon drin. (\S+ ) bedeutet ja beliebig lange Zeichenkette mit anschließendem Leerzeichen.

Zitat
(\S+ )?         =   irgendeine optionale Zeichenfolge (außer Leerzeichen) => wäre auch das richtig: ?(\S+) ??????
Für den fall das hier rechts/links steht. Das kann mittlerweile weg, denn dein Problem hat mich dazu veranlasst in der aktuellen Version eine Änderung umzusetzen, womit die gefundenen RegExp-Teile (&&) aus der Zeichenkette entfernt werden.
Wenn du "_?(\S+)_" meinst, Jein. Geht aber würde ich nicht machen, da dann eventuell gar kein Leerzeichen mehr übrig bleibt.
Zitat
< Wieso kommt nachfolgend kein Leerzeichen bzw. darf eins kommen ????? >
Selbe wie oben

Zitat
Bzgl. der Sprach-Befehlszusammensetzung kann "links/rechts" irgendwo im Satz sein ... nach "roll..." kommen ggf. bis zu 2 Wörter dann MUSS ein Raum kommen, gefolgt von ggf. einem Wort, sowie ggf. "auf" sowie noch einer abschließenden Zeichenfolge, richtig?
Ja.

Zitat
Also kann ich nicht sagen:
Fahre in der Küche den Rolladen auf 50 % ???
=> Wo müsste oder könnte ich noch weitere && setzen?

Wenn "alles" an unbekannten Stellen steht. Entsteht das Problem das man die Richtung des Rolladen von hinten Suchen muss. Man könnte auch zwei Konfigs erstellen in dem Raum und Rollo gedreht sind. Oder man sucht das Adejktiv wie gesagt von hinten. 
?(link\S+|recht\S+) && rolll?(os?|\S\S?den) && (Küche|Kinderzimmer|Schlafzimmer|Wohnzimmer) && ([^\s%]+)(%| %| prozent)?$ =
set $3[ku_Rolladenaktor, kz_Rolladenaktor, sz_Rolladenaktor,
$1[wz_Rolladenaktor_links, wz_Rolladenaktor_rechts, empty, "'wz_Rolladenaktor_links,wz_Rolladenaktor_rechts'"]] pct $4{ true => 100 , false => 0 , integer => "$4" }
Erklärung:
\S ist das selbe wie [^\s]. Mit [^\s%] schließe ich ebenso das % aus, weil ich das nicht benötige.
(%| %| prozent)?$ bedeutet Satzende mit optionalem Prozent in verschiedenen Schreibweisen.

Teste das mal bitte mit allen möglichen Satzkonstellationen. Gefällt mir fast besser und könnte dann ins wiki.
-------------------------------------------------------------------------------------------------------------------------------
Zitat
Wäre es nicht bei solchen Zeitangaben sinnvoll immer zu prüfen, ob das Gerät bereits den gegenteiligen Zustand hat (in diesem Fall Lampe bereits an) und wenn nicht diese anzuschalten und dann nach der vorgegebenen Zeit wieder zu deaktivieren? Weil mit diesem Befehl geht man ja davon aus, dass diese momentan an ist.
Somit könnte der Sprachbefehl wie folgt verkürzt werden (Ausgangszustand: Lampe aus):
Schalte die Lampe an und in 5 min wieder aus.      =>      Schalte die Lampe in 5 min aus.
Immer halte ich es für sehr riskant. Aus unterschiedlichen Gründen u.a. weil es ja nicht immer nur 2 Zustände gibt. Optional könnte ich es mir vorstellen. Das muss ich mir aber erst mal in Ruhe durch den Kopf gehen lassen.
« Letzte Änderung: 23 März 2018, 09:28:29 von Phill »
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

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
Danke für die Blumen. Wie meinst du das nochmal mit dem wait?

Ich meinte damit einen Befehl zeitverzögert abzusenden direkt aus t2f, ähnlich wie bei einem doif.

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 374
  • Langsam wird'n Schuh d'raus.
    • iVDR
Hast du mal offset=300 versucht? Zeitenmodifikation
Ich in Bezug auf Verzögerung ehrlich gesagt noch nicht.  ;) Kann also sein das vorher explizit eine Zeit angegeben werden muss. Probiers mal bitte. Ansonsten wirds gefixt.
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

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
Bisher hab ich noch nix weiter getestet. Werd es heut Abend mal probieren ob ich das ganze umsetzen kann.

edit: ich weiss jetzt nicht ob ich das so richtig gemacht habe, aber er schaltet sofort an und wartet nicht mit dem befehl 10 sekunden

Test\S* (\S+) = (offset=>10, cmd=>'set Nvidia on')


ich schalte ja hiermit die raumfeld geräte ein

#Musik Wohnzimmer,Küche und Badezimmer an#
?(@rooms) && Musik\b (\S*) = set StandbyRF $1[@RFStandby] $1[cmd_1,cmd_3,cmd_2,cmd_5,empty,cmd_1]
ich hätte nun gerne auch das er mir die geräte abschaltet. im moment schaltet er ja die geräte auch ein wenn ich sage mach musik im wohnzimmer aus. ::)
« Letzte Änderung: 23 März 2018, 17:32:13 von Abercrombie1892 »

Offline swsmily

  • Jr. Member
  • **
  • Beiträge: 66
Zitat
Ich finde es klasse, dass ich durch mein Modul zum Verständnis von RegExp beitrage

Dafür kann ich mich auch nur bedanken. RegEx ist zwar für mich immernoch sehr verworren, aber schon die Ansätze, durch dieses Modul haben mir sogar beruflich schon geholfen  ;D

Offline Abercrombie1892

  • Jr. Member
  • **
  • Beiträge: 99
hallo,

hab ein kleines problem bei der lampensteuerung aus dem wiki für bunte lampen.

#Fernseher#
Fernseher\S* (\S+) = set Nvidia $1{true=>on, false=>off}
Test\S* (\S+) = (offset=>10, cmd=>'set Nvidia on')

#Musik Wohnzimmer,Küche und Badezimmer an#
?(@rooms) && Musik\b (\S*) = set StandbyRF $1[@RFStandby] $1[cmd_1,cmd_3,cmd_2,cmd_5,empty,cmd_1]
überall && Musik an\b = {GetHttpFile("192.168.178.21:8080","/raumserver/controller/leaveStandby")};'{GetHttpFile("192.168.178.21:8080","/raumserver/controller/loadPlaylist?id=Wohnzimmer&value=Livesets")}
überall aus\b = {GetHttpFile("192.168.178.21:8080","/raumserver/controller/enterManualStandby")}
spiele && (@Playlist) = {GetHttpFile("192.168.178.21:8080","/raumserver/controller/loadPlaylist?id=Wohnzimmer&value=$1[@RFPlaylisttest]")}
   

#Lautstärkeregelung Raumfeld#
überall leise\b = set Raumfeld_WZ volume 50; set Raumfeld_Badezimmer,Raumfeld_Kueche volume 13
überall (entspannte|normale lautstärke) = set Raumfeld_WZ volume 60; set Raumfeld_Badezimmer,Raumfeld_Kueche volume 30
überall laut\b = set Raumfeld_WZ volume 80; set Raumfeld_Badezimmer,Raumfeld_Kueche volume 45
?(@rooms) && leise\b = set Raumfeld_$1[@RF] volume $1[50,13,13,(65,30,30),empty,50]
?(@rooms) && (entspannte|normale) lautstärke =  set Raumfeld_$1[@RF] volume $1[60,30,30,empty,60]
?(@rooms) && alles|laut\b = set Raumfeld_$1[@RF] volume $1[80,55,55,empty,80]
?(@rooms) && (ein wenig|etwas|viel)? ?(lauter|leiser)  =
  { fhem("set Raumfeld_$1[@RF] volume ".(ReadingsVal("Raumfeld_$1[@RF]","volume", 0)$3[+,-]$2[3,6,11,empty,7])) }

#Titel vor/zurück und spulen#
weiter|vor$ = {GetHttpFile("192.168.178.21:8080","/raumserver/controller/next")};set EchoDot_WZ next
zurück|anfang$ = {GetHttpFile("192.168.178.21:8080","/raumserver/controller/prev")};set EchoDot_WZ previous
(minuten|sekunden) && vorspulen|spule auf (\S+) =
  {GetHttpFile("192.168.178.21:8080","/raumserver/controller/seek?id=Wohnzimmer&value=".($2{numeral=>"$2"}*$1[60,1,empty,60]))}


#Lichtsteuerung#
licht (\S+ ){0,2}(@rooms) (\S+) = set $2[@lights] $3{ true => on, false => off }


#   1              2               3             4              5               6
 ?(bitte) && (@T2F_types_color) && ?(@T2F_rooms) && ?(@T2F_places) && (@colors)( schalten| stellen)?$ =
 (cmd=>'set T2F_types_color=.*$2@.*:FILTER=T2F_rooms=.*$3@.*:FILTER=T2F_places=.*$4@.* rgb $5[@rgb]')


?(@rooms) && (ein wenig|etwas|viel)? ?(heller|dunkler)  =
  { fhem("set Lampen_$1[@dimmen] pct ".(ReadingsVal("Lampen_$1[@dimmen]","pct", 0)$3[+,-]$2[10,15,30,empty,10])) }

#Spiegelschrank Badezimmer
Spiegelschrank\S* (\S+) = set Spiegelschrank_BZ $1{true=>on, false=>off}
#Deckenlampe (\S+ ){0,2}(@rooms) (\S+) = set Deckenlampe_$1[@deckenlampen] $2{ true => on, false => off }


alle lampen haben jetzt ihre attribute bekommen. nur hab ich immer das problem wenn ich zb sage mach das licht im wohnzimmer blau, reagieren immer 2 lampen garnicht ( immer 2 andere ) und es gehen auch in den anderen räumen die lampen an.

den fehler hab ich im log

2018.03.30 15:51:34 1: 192.168.178.40:23 reappeared (WZ.Pioneer)
2018.03.30 17:34:04 3: Decoding Text: MACH DAS LICHT IM WOHNZIMMER GRÜN
2018.03.30 17:34:04 3: Result of cmd: $VAR1 = {
          'cmd' => 'set T2F_types_color=.*Licht.*:FILTER=T2F_rooms=.*.*:FILTER=T2F_places=.*.* rgb 006400'
        };

2018.03.30 17:34:04 2: HUEDevice: http request failed: http://192.168.178.43/api/3ZoNBpdIjaWubmWzan856OuQjYbrByx5tErr0VaX/lights/2/state: empty answer received
« Letzte Änderung: 30 März 2018, 17:37:10 von Abercrombie1892 »

 

decade-submarginal