[39_Talk2Fhem.pm] Flexible Sprachsteuerunghilfsmodul

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

Vorheriges Thema - Nächstes Thema

Phill

#60
Zitat# Fernseher schalten
(fernseher|tv) (\S+) = set Wohnzimmer.TV.Steckdose $2{ true => on, false => off }
Der Befehl steht in der 2. Klammer. Also $2 nicht $1. Verbose auf 4 oder 5 gibt da mehr Auskunft.

Mein d_googlespeak ist ne eignebaulösung über einen nodejs server den ich laufen habe. Das ist nicht wirklich allgemeintauglich.
Schau dir mal das Modul GOOGLECAST an. Über Googletranslate Sprachausgabe kann man da ne Ausgabe erreichen.
siehe hier
Aber der Author will gerade ein speak set befehl einbauen. quelle

ZitatUnd eventuell im Wiki Beitrag im bereich über die Google Home auf die MQTT version der anbindung ergänzen (zumindest Hinweiß).
Gerne. Wenn du hierzu was schreiben würdest würde ich es ergänzen. Ich selbst mache gar nichts mit MQTT und kann es deswegen nicht referenzieren.
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

Flipper92

Zitat von: Phill am 06 Januar 2018, 13:03:32
Der Befehl steht in der 2. Klammer. Also $2. Verbose auf 4 oder 5 gibt da mehr Auskunft.


2018.01.06 13:28:52 3: Decoding Text: tv an
2018.01.06 13:28:52 5: Using lists:
$VAR1 = 'rooms';
$VAR2 = [
          'haus|überall|wohnung',
          'wohnzimmer',
          'badS*',
          'toilette|wc',
          'schlafzimmer',
          'kinderzimmer|büro|arbeitszimmer',
          'flur|gang|diele',
          'balkon',
          'S*außeS*( haus)?|vor der tür',
          'paul'
        ];
$VAR3 = 'tempsens';
$VAR4 = [
          '',
          'Wohnzimmer.Temperatur',
          '',
          '',
          'Schlafzimmer.Temperatur',
          'Jennifer.Temperatur',
          '',
          '',
          '',
          'Paul.Temperatur'
        ];

2018.01.06 13:28:52 4: Command part: 'tv an'
2018.01.06 13:28:52 5: get_time_by_phrase. Using eventtime: Sat Jan  6 13:28:52 2018 now: Sat Jan  6 13:28:52 2018 command: tv an
2018.01.06 13:28:52 5: get_time_by_phrase. Using eventtime: Sat Jan  6 13:28:52 2018 now: Sat Jan  6 13:28:52 2018 command: tv an
2018.01.06 13:28:52 5: Commandpart after datedecoding. 'tv an'
2018.01.06 13:28:52 4: Command left: 'tv an'
2018.01.06 13:28:52 5: talk Evaluate search:
tv an =~ /laut$/i
2018.01.06 13:28:52 5: talk Evaluate search:
tv an =~ /(ein wenig|etwas|viel)? ?(lauter|leiser)/i
2018.01.06 13:28:52 5: talk Evaluate search:
tv an =~ /(fernseher|tv) (\S+)/i
2018.01.06 13:28:52 4: Hit with phrase: qr/(fernseher|tv) (\S+)/i
2018.01.06 13:28:52 5: Handle reaction cmd: set Wohnzimmer.TV.Steckdose $1{ true => on, false => off }
2018.01.06 13:28:52 4: Advanced bracket replacement. $1 true => on, false => off  = set Wohnzimmer.TV.Steckdose ###
2018.01.06 13:28:52 4: Keyword: 'tv'
2018.01.06 13:28:52 5: HASH evaluation:
$VAR1 = {
          'true' => 'on',
          'false' => 'off'
        };

2018.01.06 13:28:52 1: HASH Replacement Failed! set Wohnzimmer.TV.Steckdose ###
2018.01.06 13:28:52 1: Error on Command: 'tv an'
2018.01.06 13:28:52 3: TelegramBot_SendIt TelegramBot: Failed with :FAILED peer not found :{id}:
2018.01.06 13:28:52 3: TelegramBot_Callback TelegramBot: resulted in NonBlockingGet: returned FAILED peer not found :{id}: from SendIt
2018.01.06 13:28:52 3: sentMsgIdByPeerId return value: rg_Gast_sentMsgId:
2018.01.06 13:28:52 3: set TelegramBot _msg @{id} Error on Command: 'tv an' : FAILED peer not found :{id}:
2018.01.06 13:28:52 3: set d_googlespeak Es gab leider einen Fehler : Please define d_googlespeak first

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

Tabu

Hallo,

ich habe schon ein wenig Erfolge mit diesen tollen Modul gefeiert  ;D
vielen Dank dafür,
aber nun komme ich leider nicht weiter. Mein entsprechendes Def sieht so aus:
(schalte|setze|stelle).*Temperatur.*(@rooms).*(\d+).*Grad = set $2[@temp] desired-temp $3
Im Set steht:
schalte die Temperatur im Wohnzimmer auf 15 Grad
Im Cmd steht:
set WZHeizung_Clima desired-temp

Hier fehlt mir die Temperatur also $3

Im Log steht:
2018.01.17 22:33:08 3: Decoding Text: schalte die Temperatur im Wohnzimmer auf 15 Grad
2018.01.17 22:33:08 5: Using lists:
$VAR1 = 'rooms';
$VAR2 = [
          'haus|überall|wohnung',
          'wohnzimmer',
          'badS*',
          'toilette|wc|gäste.wc',
          'büro|arbeitszimmer|gästezimmer',
          'schlafzimmer',
          'kinderzimmer|spielzimmer|lennar(d|t)S*',
          'flur|gang|diele',
          'garten|draussen|terrasse',
          'eg|erdgeschoS*',
          'og|obergeschoS*'
        ];
$VAR3 = 'temp';
$VAR4 = [
          '',
          'WZHeizung_Clima',
          'Bad_Heizung_Clima',
          '',
          '',
          '',
          'HZ_Lennard_Clima',
          '',
          '',
          '',
          ''
        ];

2018.01.17 22:33:08 4: Command part: 'schalte die temperatur im wohnzimmer auf 15 grad'
2018.01.17 22:33:08 5: get_time_by_phrase. Using eventtime: Wed Jan 17 22:33:08 2018 now: Wed Jan 17 22:33:08 2018 command: schalte die temperatur im wohnzimmer auf 15 grad
2018.01.17 22:33:08 5: get_time_by_phrase. Using eventtime: Wed Jan 17 22:33:08 2018 now: Wed Jan 17 22:33:08 2018 command: schalte die temperatur im wohnzimmer auf 15 grad
2018.01.17 22:33:08 5: Commandpart after datedecoding. 'schalte die temperatur im wohnzimmer auf 15 grad'
2018.01.17 22:33:08 4: Command left: 'schalte die temperatur im wohnzimmer auf 15 grad'
2018.01.17 22:33:08 5: talk Evaluate search:
schalte die temperatur im wohnzimmer auf 15 grad =~ /wie.*(kalt|warm|grad|temperatur).*(haus|\S\S?berall|wohnung|wohnzimmer|badS*|toilette|wc|g\S\S?ste.wc|b\S\S?ro|arbeitszimmer|g\S\S?stezimmer|schlafzimmer|kinderzimmer|spielzimmer|lennar(d|t)S*|flur|gang|diele|garten|draussen|terrasse|eg|erdgeschoS*|og|obergeschoS*).*/i
2018.01.17 22:33:08 5: talk Evaluate search:
schalte die temperatur im wohnzimmer auf 15 grad =~ /(schalte|setze|stelle).*Temperatur.*(haus|\S\S?berall|wohnung|wohnzimmer|badS*|toilette|wc|g\S\S?ste.wc|b\S\S?ro|arbeitszimmer|g\S\S?stezimmer|schlafzimmer|kinderzimmer|spielzimmer|lennar(d|t)S*|flur|gang|diele|garten|draussen|terrasse|eg|erdgeschoS*|og|obergeschoS*).*(\d+).*Grad/i
2018.01.17 22:33:08 4: Hit with phrase: qr/(schalte|setze|stelle).*Temperatur.*(haus|\S\S?berall|wohnung|wohnzimmer|badS*|toilette|wc|g\S\S?ste.wc|b\S\S?ro|arbeitszimmer|g\S\S?stezimmer|schlafzimmer|kinderzimmer|spielzimmer|lennar(d|t)S*|flur|gang|diele|garten|draussen|terrasse|eg|erdgeschoS*|og|obergeschoS*).*(\d+).*Grad/i
2018.01.17 22:33:08 5: Handle reaction cmd: set $2[@temp] desired-temp $3
2018.01.17 22:33:08 5: Replaced bracket: set $2[@temp] desired-temp $3 -> set $2[@temp] desired-temp
2018.01.17 22:33:08 4: Advanced bracket replacement. $2@temp = set ### desired-temp
2018.01.17 22:33:08 5: Adding modlist: "","WZHeizung_Clima","Bad_Heizung_Clima","","","","HZ_Lennard_Clima","","","",""
2018.01.17 22:33:08 4: Keyword: 'wohnzimmer'
2018.01.17 22:33:08 5: ARRAY evaluation: else:  empty:
array:  WZHeizung_Clima Bad_Heizung_Clima    HZ_Lennard_Clima   
2018.01.17 22:33:08 4: Searching position of wohnzimmer in haus|\S\S?berall|wohnung wohnzimmer badS* toilette|wc|g\S\S?ste.wc b\S\S?ro|arbeitszimmer|g\S\S?stezimmer schlafzimmer kinderzimmer|spielzimmer|lennar(d|t)S* flur|gang|diele garten|draussen|terrasse eg|erdgeschoS* og|obergeschoS*
2018.01.17 22:33:08 3: Text converted to: set WZHeizung_Clima desired-temp
2018.01.17 22:33:08 3:  set WZHeizung_Clima desired-temp  : desired-temp requires parameter: [on|off|5.0..30.0]


Entweder ist es zu spät oder ich bin zu blöd...

Kann mir jemand auf die Sprünge helfen?

Vielen Dank

Phill

#64
Komisch, bei einem Test wird bei mir "set WZHeizung_Clima desired-temp 5" ausgeführt. Das ist auch korrekt denn die RegExp wie ".*" finden immer den größt möglichen Treffer, außer es wird mit ".*?" auf den kleinst möglochen treffer umgeschalten.
(schalte|setze|stelle).*Temperatur.*(@rooms).*?(\d+).* = set $2[@temp] desired-temp $3
                                            ^^^


Das sollte funktionieren, aber trotzdem wundert mich das bei dir gar keine Zahl gefunden wird. Probier das mal, ich würde das grad auch komplett weg lassen.

EDIT: Jetzt habe ich das Problem entdeckt. Da hat sich noch eine Klammer eingeschlichen...  ;D
Zitatlennar(d|t)S*
schreib das mal so
Zitatlennar\S*
oder
lennar[dt]\S*
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

Tabu

Hallo Phill,

super, vielen Dank. Nun klappt es. Bin mit regulären Ausdrücken noch nicht so bewandert. Aber die zusätzliche Klammer hatte ich gar nicht auf dem Schirm. Aber logisch ist es ja...
Mit dem .*? muss ich mich noch einmal reinlesen, wo genau der Unterschied liegt.

;D

RoBra81

#66
Hallo,

ich baue mir gerade eine Logik mit Talk2Fhem auf, die ich gern bei Gelegenheit vorstellen möchte. Dabei bin ich jedoch auf ein Problem (einen Fehler?) gestoßen, der mich gerade daran hindert, die bereits funktionierende Logik etwas hübscher zu machen: ich möchte im Antwortsatz das Ergebnis zurückgeben und benötige dafür viele $1..$n Variablen. Diese funktionieren aber leider nur bis $9, sobald ich z.B. $10 und $11 nutze, erhalte ich schalte0 und schalte1 (vermutlich wird hier $1 ausgewertet und der Rest hinten dran gehängt). Gibt es eine Möglichkeit, dies zu korrigieren?

Vielen Dank
Ronny

Phill

#67
Ich mach die tage mal ein update, da fix ich das Problem.

[EDIT] Ok das war easy. Schau mal ob es mit der angehängten Datei klappt.



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

War noch ein fehler drin. Hier versuch die.
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

RoBra81

#69
Viele Dank, es funktioniert!

Nun möchte ich, wie versprochen, meinen ersten Entwurf zur Diskussion vorstellen. Inspiriert hat mich die einfache Konfigurierbarkeit des Moduls TEERKO (https://forum.fhem.de/index.php/topic,72657.0.html), welches mir aber nicht mächtig genug war. Also zu meinem Entwurf:

Zunächst habe ich mir im global-Device zusätzlich UserAttribute für alle Devices definiert:

attr global userattr T2F_places T2F_properties T2F_rooms T2F_types

(Achtung: das ist nur ein Auszug, das global-Device enthält bei mir viele weitere UserAttribute)

Dann habe ich mir eine sub in der myUtils gebaut:

sub fill_T2F_keywordlist($)
{
  my ($name) = @_;
  $name =~ s/T2F_//g;
  if ($name eq 'userattr')
  {
    return;
  }
  my $currentAttr = AttrVal("talk","T2F_keywordlist","");
  my @currentAttrParts = split(/$name = /, $currentAttr);
  my $currentAttrBeg = @currentAttrParts[0];
  $currentAttrBeg = substr($currentAttrBeg, 0, -1);
  my @currentAttrEnd = split(/\n/, @currentAttrParts[1], 2);
  my @array = devspec2array('a:T2F_'.$name.'=.+');
  my @attributes = ();
  if (@array > 0 and defined($defs{$array[0]}))
  {
    foreach (@array){
      my $attrVal = AttrVal($_, 'T2F_'.$name, '');
      $attrVal =~ s/  / /g;
      $attrVal =~ s/, /,/g;
      my @attr = split(/,/, $attrVal);
      push(@attributes, @attr);
    }
  }

  my %hash   = map { $_ => 1 } @attributes;
  my @unique = keys %hash;
  my $result = $currentAttrBeg."\n".$name." = ".join(", ", @unique)."\n".@currentAttrEnd[1];
  $result =~ s/\n\n/\n/g;
  $result =~ s/  / /g;
  $result =~ s/, /,/g;
  fhem('attr talk T2F_keywordlist '.$result);
}


(mein Perl-Code ist mit Sicherheit noch optimierbar ;-))

Diese sub wird über ein Notify bei Änderung eines T2F-Attributs aufgerufen:

defmod talk.nf.fillAttr notify global:ATTR.*T2F_(places|rooms|types|properties).* {fill_T2F_keywordlist($EVTPART2)}


Dadurch wird das Attribut T2F_keywordlist meines Talk2Fhem-Devices talk gefüllt. Das Ergebnis (die Listen articles und endings wurde händisch angelegt):

attr talk T2F_keywordlist rooms = esszimmer,obergeschoss,küche,haus\
places = tür,vorn,esstisch,vorne,decke,tisch\
types = licht,lampe\
article = im,in,der,die,das,den,dem,an,am,über,auf,unter,alle\
properties = gross\
endings = en,er,e,n


Nun noch meine Def zum ein- und ausschalten eines Gerätes:

defmod talk Talk2Fhem (@article)?( )?(@article)?( )?(@properties)?(@endings)?( )?(@types)(@endings)?( )?(@article)?( )?(@article)?( )?(@rooms)?( )?(@article)?( )?(@article)?( )?(@places)?( )?(\S+) = (cmd=>'set T2F_types=.*$8.*:FILTER=T2F_rooms=.*$15.*:FILTER=T2F_properties=.*$5.*:FILTER=T2F_places=.*$21.* $23{true=>on, false=>off}', answer=>'"Gern, ich habe $1 $2 $3 $4 $5$6 $7 $8$9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $23{true=>eingeschaltet, false=>ausgeschaltet}"')

Zum Testen habe ich eine Lampe im Esszimmer mit Attributen versorgt:

defmod OG.ez.LI.Allgemein HM485 00009679_16
attr OG.ez.LI.Allgemein T2F_places decke,vorn,vorne,tür
attr OG.ez.LI.Allgemein T2F_properties gross,groß
attr OG.ez.LI.Allgemein T2F_rooms esszimmer,haus,obergeschoss
attr OG.ez.LI.Allgemein T2F_types licht,lampe


Diese kann ich nun mit folgenden Befehlen schalten:


set talk Schalte das Licht aus #schaltet alle Lichter aus
set talk Schalte das Licht im Haus aus #schaltet alle Lichter im Haus aus
set talk Schalte alle Lichter im Obergeschoss aus #schaltet alle Lichter im Obergeschoss aus
set talk Schalte das Licht im Esszimmer aus #schaltet alle Lichter im Esszimmer aus
set talk Schalte das große Licht im Esszimmer aus #schaltet konkret dieses Licht (kein anderes hat die property groß)
set talk Schalte das Licht im Esszimmer an der Decke aus #schaltet konkret dieses Licht (kein anderes hat den place Decke)


Entsprechend dem Sprachbefehl folgt dann auch die Antwort

Gern, ich habe ...

Folgende Punkte sollten beachtet werden bzw. sind noch nicht ganz ausgereift:

- ist der Detaillierungsgrad zu gering werden anders als bei z.B. Alexa ohne Rückfrage alle passenden Lampen geschaltet => evtl. möchte ich in der Antwort noch alle geschalteten Geräte auflisten
- die Antwort bei "schalte ein und in 5 Minuten wieder aus" ist suboptimal
- die Werte in den T2F-Attributen müssen klein geschrieben werden, damit die Filter funktionieren

Als nächstes möchte ich im gleichen Stil noch Befehle für folgende Geräte bauen:

- Heizung
- RGB-Lampen
- Radios (Lautstärke, Senderwahl)

Gern nehme ich Optimierungsvorschläge entgegen. Sollte Interesse bestehen, werde ich auch meine weiteren Ergebnisse hier posten.

Ronny

MadMax-FHEM

Hi Ronny,

liest sich ja grandios!

Aktuell teste ich auch noch TEERKO ;)

Für Alexa habe ich alexa-fhem (und ha-bridge auf einem weiteren System) im Einsatz und bzgl. der Einbindung von Google Home teste ich noch...

Talk2Fhem und Babble stehen noch auf der "ToTest-Liste"...

Mit der hier von dir beschriebenen "automatisierung" funktioniert es ja ähnlich wie bei alexa-fhem :)

Also: klar! Wenn du mehr hast, dann immer her damit!

Wenn ich mal für mich herausgefunden hab was ich nun für die Google Home Integration nehme, dann kann der "große Test" starten: Alexa gegen Google Home! ;)

Aktuell liegt Alexa vorne, sie versteht die Sätze bzgl. Hausautomations-Steuerung (noch) deutlich besser!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

RoBra81

Hier nun der erste Entwurf der Heizung:

Zunächst eine kleine Anpassung der UserAttribute:

attr global userattr T2F_places T2F_properties T2F_rooms T2F_types_heating T2F_types_switch

Und hier die relevanten Teile des Talk2Fhem-Devices (inklusive kleiner Anpassung der Licht-Logik):

defmod talk Talk2Fhem (@article)?( )?(@properties)?(@endings)?( )?(@types_switch)(@endings)?( )?(@article)?( )?(@article)?( )?(@rooms)?( )?(@article)?( )?(@article)?( )?(@places)?( )?(\S+) = (cmd=>'set T2F_types_switch=.*$6.*:FILTER=T2F_rooms=.*$13.*:FILTER=T2F_properties=.*$3.*:FILTER=T2F_places=.*$19.* $21{true=>on, false=>off}', answer=>'"Gern, ich habe $1 $2 $3$4 $5 $6$7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $21{true=>eingeschaltet, false=>ausgeschaltet}"')\
\
(@article)?( )?(@types_heating)(@endings)?( )?(@article)?( )?(@article)?( )?(@rooms)?( )?(@article)?( )?(@article)?( )?(@places)?( )?(auf)?( )?(\d+) grad = (cmd=>'set T2F_types_heating=.*$3.*:FILTER=T2F_rooms=.*$10.*:FILTER=T2F_places=.*$16.* desired-temp $20', answer=>'"Gern, ich habe die Heizung $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 auf $20 Grad gestellt. Aktuell sind $6 $7 $8 $9 $10 ".averageTemp("$10")." Grad"')
attr talk T2F_keywordlist rooms = esszimmer,obergeschoss,kinderschlafzimmer,haus,küche\
places = vorne,vorn,steckdose,tür,tisch,esstisch,decke\
article = im,in,der,die,das,den,dem,an,am,über,auf,unter,alle\
properties = gross,hell,groß\
endings = en,er,e,\
types_switch = licht,nachtlicht,eule,lampe\
types_heating = heizung\


Hinweis: bis auf die Listen article und endings werden diese automatisch erstellt.

Außerdem eine kleine sub in der MyUtils, welche die Durchschnittstemperatur für die Antwort ermittelt:

sub averageTemp($)
{
  my ($room) = @_;
  my @tempDevices = devspec2array('T2F_rooms=.*'.$room.'.*:FILTER=measured-temp=\d+.*');
  my $count = 0;
  my $measuredTemp = 0;
  if (@tempDevices > 0 and defined($defs{$tempDevices[0]})){
    foreach (@tempDevices){
      $measuredTemp = $measuredTemp + ReadingsVal($_, "measured-temp", "");
      $count = $count + 1;
    }
    return $measuredTemp / $count;
  }
  return 0;
}


Wie gesagt, alles noch im Werden und Entstehen...

Ronny

Phill

Das ist echt toll wie du das angehst. Komplett anders wie ich das mache. Das muss ich mir erst mal genauer anschauen.

Ich wollte nur kurz auf deine definition von talk eingehen, da du diese etwas übersichtlicher schreiben kannst. Ab dem "=" kannst du nämlich Zeilenumbrüche einfügen. Nur zum Beispiel:

#                         1       2       3      4       5             6      7      8        9     10      11     12      13      14    15     16     17      18     19     20      21    22   23
defmod talk Talk2Fhem (@article)?( )?(@article)?( )?(@properties)?(@endings)?( )?(@types)(@endings)?( )?(@article)?( )?(@article)?( )?(@rooms)?( )?(@article)?( )?(@article)?( )?(@places)?( )?(\S+) =
(cmd => 'set T2F_types=.*$8.*
:FILTER=T2F_rooms=.*$15.*
:FILTER=T2F_properties=.*$5.*
:FILTER=T2F_places=.*$21.* $23{true=>on, false=>off}'
,answer => '"Gern, ich habe $1 $2 $3 $4 $5$6 $7 $8$9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $23{true=>eingeschaltet, false=>ausgeschaltet}"')


Warum klammerst du die leerzeichen genau?

Ich bin gerade noch dabei eine Möglichkeit zu implementieren die Reihenfolge der RegExp's variable zu gestalten. Damit würde dann "schalte das licht im Haus aus" genauso funktionieren wie "schalte im haus das licht aus".
Das geht in der oben angehängten Datei schon folgendermaßen mit dem Operator &&:
<regexp> && <regexp> && <regexp> && ...
Allerdings werden momentan nur die Klammern des letzten <regexp> berücksichtigt. Da bin ich gerade noch dran.
Nur zur Info dass du da nicht selbst was baust.
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

RoBra81

Zitat von: Phill am 19 Januar 2018, 23:28:43
Ich wollte nur kurz auf deine definition von talk eingehen, da du diese etwas übersichtlicher schreiben kannst. Ab dem "=" kannst du nämlich Zeilenumbrüche einfügen. Nur zum Beispiel:

#                         1       2       3      4       5             6      7      8        9     10      11     12      13      14    15     16     17      18     19     20      21    22   23
defmod talk Talk2Fhem (@article)?( )?(@article)?( )?(@properties)?(@endings)?( )?(@types)(@endings)?( )?(@article)?( )?(@article)?( )?(@rooms)?( )?(@article)?( )?(@article)?( )?(@places)?( )?(\S+) =

Das finde ich gut, das erleichtert die ganze Zählerei  ;D

Zitat von: Phill am 19 Januar 2018, 23:28:43
Warum klammerst du die leerzeichen genau?
Das Problem ist, dass bei "in der Küche" zwei Artikel und damit zwei Leerzeichen sind und bei "im Esszimmer" nur ein Artikel mit einem Leerzeichen. Wenn ich die Fragezeichen beim Leerzeichen weglasse, wären auch bei "im  Esszimmer" zwei Leerezichen drin und der Satz wird nicht erkannt (zumindest nach meiner Erfahrung) und ich war mit nicht sicher, ob ich ein Leerzeichen und ein Fragezeichen ohne die Klammern schreiben kann. Am einfachsten wäre es natürlich, wenn alle doppelten Leerzeichen vor der Erkennung entfernt würden, dann könnte ich auf die Klammerung und die Fragezeichen verzichten...

Zitat von: Phill am 19 Januar 2018, 23:28:43
Ich bin gerade noch dabei eine Möglichkeit zu implementieren die Reihenfolge der RegExp's variable zu gestalten. Damit würde dann "schalte das licht im Haus aus" genauso funktionieren wie "schalte im haus das licht aus".
Das geht in der oben angehängten Datei schon folgendermaßen mit dem Operator &&:
<regexp> && <regexp> && <regexp> && ...
Allerdings werden momentan nur die Klammern des letzten <regexp> berücksichtigt. Da bin ich gerade noch dran.
Ich freue mich auf zukünftige Erweiterungen :) und auf die Reaktion meines Vaters, falls ich es dank Talk2Fhem schaffe, alles so einzurichten, dass er seine Smartwatch nach dem Zustand der Haustür fragen kann  ;D.

Ronny

Phill

Du brauchst die Klammer dafür nicht, da die Metacharacter hier "?" immer auf das zuvor angrenzende Zeichen wirken.
Das Fragezeichen muss aber sein, das ist richtig.
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