Natural Language User Interface 95_Babble.pm

Begonnen von Prof. Dr. Peter Henning, 28 Dezember 2017, 17:37:03

Vorheriges Thema - Nächstes Thema

hoods

Hallo zusammen,
ich lese mich gerade ein wie dieses Modul zu nutzen ist und habe meine ersten Gehversuche damit gemacht allerdings hänge ich an einer Stelle.

Ich habe versuchsweise 3 Device eingebunden. FBDECT2 und mqtt_Wohnzimmer_Panel sind auf dem rpi2, auf dem auch Babble eingerichtet ist, eingebunden. HUEDevice8 ist ein Device von einer entfernten Fhem Instanz auf einem odroid. Das Device mqtt_Wohnzimmer_Panel ist wie der Name vermuten lässt ein MQTT_DEVICE auf dem rpi2 und ein Replika des HUEDevice8 Devices auf dem odroid. FBDECT2 und mqtt_Wohnzimmer_Panel kann ich wie gewünscht über Babble steuern aber HUEDevice8 bereitet noch Probleme.

Lt. Doku sind mind. remoteFHEM und ggf. remoteToken zu setzen wenn man entfernte Fhem Instanzen einbinden möchte. Das csrf Token der odroid WEB Instanz habe ich zu testzwecken deaktiviert. Mittels Webbrowser vom Laptop lässt sich das HUEDevice8 ansteuern über "http://192.168.178.49:8083/fhem?cmd=set%20HUEDevice8%20on&XHR=1".


Internals:
   CFGFN     
   NAME       Babble
   NR         30398
   STATE      Initialized
   TYPE       Babble
   VERSION    1.1
   DATA:
     commands   
     re_articles ((der)|(die)|(das)|(den)|(des)|(dem)|(zur))
     re_devs    ((lampe)|(panel)|(deckenlampe))
     re_ids     ((hallo))
     re_places  ((batteriestatus)|(fritzbox)|(gateways)|(kalender)|(labor)|(multimedia)|(rolllaeden)|(saugroboter)|(sensoren)|(steckdosen)|(system)|(wetter)|(wohnzimmer)|(schlafzimmer)|(kinderzimmer)|(ole)|(erdgeschoss)|(obergeschoss)|(erster)|(stock)|(arbeitszimmer)|(badezimmer)|(bastelzimmer)|(esszimmer)|(küche))
     re_prepos  ((von)|(vom)|(des)|(der)|(in)|(im)|(auf)|(bei)|(am))
     re_quests  ((wie)|(wo)|(wann))
     re_status  ((status)|(wert)|(wetter)|(zeit))
     re_times   ((heute)|(morgen)|(übermorgen)|(nacht))
     re_verbparts ((zu)|(auf)|(ent)|(wider)|(ein)|(an)|(aus)|(ab)|(um))
     re_verbsc  ((schalte)|(schalten)|(schalt))
     re_verbsi  (?P<verbsi>(schalten))
     re_writes  ((status)|(wert)|(wetter)|(zeit))
     articles:
       der
       die
       das
       den
       des
       dem
       zur
     command:
       deckenlampe:
         wohnzimmer:
           schalten:
             an         set HUEDevice8 on
             aus        set HUEDevice8 off
             ein        set HUEDevice8 on
       lampe:
         wohnzimmer:
           schalten:
             an         set FBDECT2 on
             aus        set FBDECT2 off
             ein        set FBDECT2 on
       panel:
         wohnzimmer:
           schalten:
             an         set mqtt_Wohnzimmer_Panel Wohnzimmer_Panel on
             aus        set mqtt_Wohnzimmer_Panel Wohnzimmer_Panel off
             ein        set mqtt_Wohnzimmer_Panel Wohnzimmer_Panel on
     devcontacts:
       deckenlampe:
         Deckenlampe
         HUEDevice8
         1
       lampe:
         Lampe
         FBDECT2
         0
       panel:
         Panel
         mqtt_Wohnzimmer_Panel
         0
     devs:
       Lampe
       Panel
       Deckenlampe
     devsalias:
       deckenlampe:
         2
       lampe:
         0
       panel:
         1
     help:
       deckenlampe Sprich: Deckenlampe, gefolgt von
       huedevice8 Sprich: HUEDevice8, gefolgt von
       lampe      Sprich: Lampe, gefolgt von
       panel      Sprich: Panel, gefolgt von
       stehlampe  Sprich: Stehlampe, gefolgt von
     places:
       Batteriestatus
       Fritzbox
       Gateways
       Kalender
       Labor
       Multimedia
       Rolllaeden
       Saugroboter
       Sensoren
       Steckdosen
       System
       Wetter
       Wohnzimmer
       Schlafzimmer
       Kinderzimmer
       Ole
       Erdgeschoss
       Obergeschoss
       Erster
       Stock
       Arbeitszimmer
       Badezimmer
       Bastelzimmer
       Esszimmer
       Küche
     prepos:
       von
       vom
       des
       der
       in
       im
       auf
       bei
       am
     quests:
       wie
       wo
       wann
     rooms:
       Batteriestatus
       Fritzbox
       Gateways
       Kalender
       Labor
       Multimedia
       Rolllaeden
       Saugroboter
       Sensoren
       Steckdosen
       System
       Wetter
     splaces:
       Wohnzimmer
       Schlafzimmer
       Kinderzimmer
       Ole
       Erdgeschoss
       Obergeschoss
       Erster
       Stock
       Arbeitszimmer
       Badezimmer
       Bastelzimmer
       Esszimmer
       Küche
     status:
       Status
       Wert
       Wetter
       Zeit
     times:
       heute
       morgen
       übermorgen
       nacht
     verbparts:
       zu
       auf
       ent
       wider
       ein
       an
       aus
       ab
       um
     verbs:
       schalt     schalten
       schalte    schalten
       schalten   schalten
     verbsi:
       schalten
     verbsicc:
       ARRAY(0xa922c40)
     writes:
       Status
       Wert
       Wetter
       Zeit
   READINGS:
     2018-02-18 17:38:20   lockstate       unlocked
     2018-02-18 22:53:46   savedate        Sun Feb 18 22:53:46 2018
     2018-02-18 17:27:40   state           Initialized
   helper:
     bm:
       Babble_Define:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        18.02. 17:27:41
         max        0.405009984970093
         tot        0.405009984970093
         mAr:
           HASH(0x7892210)
           Babble Babble
       Babble_Get:
         cnt        50
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        18.02. 18:08:35
         max        0.00513815879821777
         tot        0.0274124145507812
         mAr:
           HASH(0x7892210)
           Babble
           tokens
       Babble_Set:
         cnt        682
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        18.02. 18:33:10
         max        0.0494551658630371
         tot        0.0962080955505371
         mAr:
           HASH(0x7892210)
           Babble
           test
Attributes:
   babbleArticles der die das den des dem zur
   babbleDevices Deckenlampe:HUEDevice8:1
   babblePlaces Wohnzimmer Schlafzimmer Kinderzimmer Ole Erdgeschoss Obergeschoss Erster Stock Arbeitszimmer Badezimmer Bastelzimmer Esszimmer Küche
   babblePrepos von vom des der in im auf bei am
   babbleQuests wie wo wann
   babbleStatus Status Wert Wetter Zeit
   babbleTimes heute morgen übermorgen nacht
   babbleVerbParts zu auf ent wider ein an aus ab um
   babbleVerbs schalt,schalte:schalten
   babbleWrites setzen ändern löschen
   remoteFHEM1 192.168.178.49:8083
   room       Labor,babbleRoom
   verbose    5



Offensichtlich übersehe ich irgendwas, hat jemand einen Tipp?
Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD

Prof. Dr. Peter Henning

#106
@hoods:
ZitatHUEDevice8 bereitet noch Probleme.

Sorry, aber das ist leider keine sinnvolle Beschreibung der Probleme. Wird das Steuerkommando nicht erkannt, ode rnicht ausgeführt ?


@ekur: Klar, da fehlte ein Teil des Kommandos

{my $json   = JSON->new->utf8;;my $jhash0 = eval{ $json->encode($defs{"Babble"}->{DATA}) };;Dumper($jhash0)}

LG

pah

hoods

Hallo pah,

entschuldige, wollte gerade noch ein Update machen aber da hattest Du schon geantwortet. Gelobe Besserung.

Mein Babble Test Input lautet: "schalte die Deckenlampe im Wohnzimmer an"
Das Ergebnis ist: "Category=1.1.0: Gerät=deckenlampe Ort=wohnzimmer Verb=schalten Ziel=an / ==> set HUEDevice8 on"

Im Log ist zu finden ist nach der Ausführung:
2018.02.19 08:36:13 5: [Babble_getdevs] finds local FHEM device FBDECT2 with babbleDevice=Lampe
2018.02.19 08:36:13 5: [Babble_getdevs] local FHEM device FBDECT2 with babbleDevice=Lampe entered into hashes with ig=0
2018.02.19 08:36:13 5: [Babble_getdevs] finds local FHEM device mqtt_Wohnzimmer_Panel with babbleDevice=Panel
2018.02.19 08:36:13 5: [Babble_getdevs] local FHEM device mqtt_Wohnzimmer_Panel with babbleDevice=Panel entered into hashes with ig=1
2018.02.19 08:36:13 5: [Babble_getdevs] remote FHEM device HUEDevice8 with babbleDevice=Deckenlampe entered into hashes with ig=2
2018.02.19 08:36:13 5: [Babble_getdevs] finds local FHEM device FBDECT2 with babbleDevice=Lampe
2018.02.19 08:36:13 5: [Babble_getdevs] local FHEM device FBDECT2 with babbleDevice=Lampe entered into hashes with ig=0
2018.02.19 08:36:13 5: [Babble_getdevs] finds local FHEM device mqtt_Wohnzimmer_Panel with babbleDevice=Panel
2018.02.19 08:36:13 5: [Babble_getdevs] local FHEM device mqtt_Wohnzimmer_Panel with babbleDevice=Panel entered into hashes with ig=1
2018.02.19 08:36:13 5: [Babble_getdevs] remote FHEM device HUEDevice8 with babbleDevice=Deckenlampe entered into hashes with ig=2


Leider wird das Device HUEDevice8 auf dem odroid nicht an-/ausgeschlatet.

Danke für die Hilfe, Sven
Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD

hoods

#108
Habs gefunden:

ein "attr global verbose 5" zeigt:
2018.02.19 08:48:13 4: WEB_192.168.178.37_56172 GET /fhem?XHR=1&fwcsrf=null&cmd.Babble={Babble_TestIt(%22Babble%22,%22schalte%20die%20Deckenlampe%20im%20wohnzim
mer%20an%22,1)}; BUFLEN:0
2018.02.19 08:48:13 5: Cmd: >{Babble_TestIt("Babble","schalte die Deckenlampe im wohnzimmer an",1)}<
2018.02.19 08:48:13 5: HttpUtils url=http://192.168.178.49:8083/fhem?XHR=1&fwcsrf=&cmd.HUEDevice8=set%20HUEDevice8%20on
2018.02.19 08:48:13 5: IP: 192.168.178.49 -> 192.168.178.49
2018.02.19 08:48:13 4: WEB: /fhem?XHR=1&fwcsrf=null&cmd.Babble={Babble_TestIt(%22Babble%22,%22schalte%20die%20Deckenlampe%20im%20wohnzimmer%20an%22,1)} / RL:197
/ text/plain; charset=UTF-8 /  /
2018.02.19 08:48:13 5: HttpUtils request header:
GET /fhem?XHR=1&fwcsrf=&cmd.HUEDevice8=set%20HUEDevice8%20on HTTP/1.0
Host: 192.168.178.49:8083
User-Agent: fhem
Accept-Encoding: gzip,deflate

2018.02.19 08:48:13 4: http://192.168.178.49:8083/fhem?XHR=1&fwcsrf=&cmd.HUEDevice8=set%20HUEDevice8%20on: HTTP response code 401
2018.02.19 08:48:13 5: HttpUtils http://192.168.178.49:8083/fhem?XHR=1&fwcsrf=&cmd.HUEDevice8=set%20HUEDevice8%20on: Got data, length: 0
2018.02.19 08:48:13 5: HttpUtils response header:
HTTP/1.1 401 Authorization Required
WWW-Authenticate: Basic realm="FHEM: login required"
Content-Length: 0


   
Mit "attr Babble remoteFHEM1 <user>:<pw>@<IP>:<Port>" gehts.

Könntest Du das noch in die Doku aufnehmen?

Gruss Sven



Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD

Prof. Dr. Peter Henning

ZitatKönntest Du das noch in die Doku aufnehmen?
Wenn ich sonst nichts Anderes zu tun habe...

LG

pah

ekur

Zitat von: Prof. Dr. Peter Henning am 19 Februar 2018, 07:52:15
@ekur: Klar, da fehlte ein Teil des Kommandos
{my $json   = JSON->new->utf8;;my $jhash0 = eval{ $json->encode($defs{"Babble"}->{DATA}) };;Dumper($jhash0)}

Ok, mit der originalen Version der 95_Babble.pm ergibt das

$VAR1 = undef;
FHEM 5.8 auf Intel NUC, Visualisierung TabletUI auf Lenovo Tab10, Datenlogging MySQL
CUL_HM  HM-CC-RT-DN, HM-RC, HM-LC-BL1-FM, HM-PBI-4-FM, HM-SEC-SD, HM-SEC-SCo
ZWave
OWDevice:DS1420,DS18B20 an Intel NUC

Prof. Dr. Peter Henning

Nun ja: Dass der Datenhash $defs{"Babble"}->{DATA} korrekt befüllt wird, haben wir oben schon getestet. Die Umwandlung in ein JSON-Konstrukt schlägt also fehl.

Das ist aber kein Problem, das ich nachstellen oder lösen kann - offenbar ist das JSON-Modul nicht korrekt installiert worden.

LG

pah

ekur

Ich habe bisher kein Problem mit dem JSON Modul feststellen können. Ich werde es aber mal auf dem Raspberry deinstallieren und nochmals installieren, mal sehen ob sich etwas ändert.
FHEM 5.8 auf Intel NUC, Visualisierung TabletUI auf Lenovo Tab10, Datenlogging MySQL
CUL_HM  HM-CC-RT-DN, HM-RC, HM-LC-BL1-FM, HM-PBI-4-FM, HM-SEC-SD, HM-SEC-SCo
ZWave
OWDevice:DS1420,DS18B20 an Intel NUC

Phiolin

#113
Leider läuft das Babble Modul offenbar nicht unter Perl 5.26.x:

2018.02.20 10:58:28 1: reload: Error:Modul 95_Babble deactivated:
Experimental keys on scalar is now forbidden at ./FHEM/95_Babble.pm line 1123.
Type of arg 1 to keys must be hash or array (not hash element) at ./FHEM/95_Babble.pm line 1123, near "})"
Experimental keys on scalar is now forbidden at ./FHEM/95_Babble.pm line 1280.
Type of arg 1 to keys must be hash or array (not hash element) at ./FHEM/95_Babble.pm line 1280, near "})"

2018.02.20 10:58:28 0: Experimental keys on scalar is now forbidden at ./FHEM/95_Babble.pm line 1123.
Type of arg 1 to keys must be hash or array (not hash element) at ./FHEM/95_Babble.pm line 1123, near "})"
Experimental keys on scalar is now forbidden at ./FHEM/95_Babble.pm line 1280.
Type of arg 1 to keys must be hash or array (not hash element) at ./FHEM/95_Babble.pm line 1280, near "})"


Hier sind offenbar einige Code Teile in neueren Perl Versionen (offenbar schon seit 5.23) nicht mehr erlaubt.
Scheint mir aber wohl ein eher einfacheres Problem zu sein. Man muss wahrscheinlich nur dafür sorgen, dass der Typ der an keys übergebenen Variable passt (oder diese korrekt initialisieren?).

Fehlermeldungen sind von einem einfachen "define Babble Babble".

Prof. Dr. Peter Henning

Versuchen wir doch noch mal ein paar Dinge.

Was liefert die Eingabe von {my $json   = JSON->new->utf8;;my $jhash0 = eval{ $json->encode( ["a","b"]  ) };;Dumper($jhash0)} in der Kommandozeile ?
Und was {my $json   = JSON->new->utf8;;my $jhash0 = eval{ $json->encode( ["a","b","c",["d","e"]]  ) };;Dumper($jhash0)}
Und was {Dumper($defs{"Babble"}->{DATA}{"verbsicc"})}
Und was {my $json   = JSON->new->utf8;;my $jhash0 = eval{ $json->encode($defs{"Babble"}->{DATA}{"verbsicc"}) };;Dumper($jhash0)}

LG

pah

Phiolin

Ich hatte hier gerade geantwortet, dann wurde mir aber klar, dass sich diese Fragen wohl auf das json Problem vom Posting über meinem beziehen.
Bei mir geht's natürlich um das Babble Modul selbst. JSON läuft prima. :)

Prof. Dr. Peter Henning

@Phiolin:
ZitatHier sind offenbar einige Code Teile in neueren Perl Versionen (offenbar schon seit 5.23) nicht mehr erlaubt.
Das ist so nicht richtig - denn das sind experimentelle Erweiterungen von Perl.

Aber egal, ich habe diese Fallen aus der Version 1.22 entfernt und diese eingecheckt.

LG

pah

Phiolin


Phiolin

#118
In der Babble_DoIt Funktion fehlt im Bereich "no command found, but chatbot available" der Replacer für $PARAM0,$PARAM1 für die helpFunc. Gleiches gilt für die "OhKee" Standardantwort. Auch hier hätte ich gerne die PARAMs übergeben, damit ich weiß, wohin das OhKee geschickt werden muss.
Hintergrund: Ich sende vom TelegramBot die Nachrichten an Babble und hätte natürlich auch gerne die Antworten zurück. Dafür muss ich aber wissen, wer der Absender war, was ich über PARAM0 und PARAM1 in der helpFunc regle. Außerdem wäre es schön, wenn man das "OhKee" selber definieren könnte, denn für die Sprachausgabe ist das bestimmt phonetisch prima, im Chat liest sich das aber komisch. :)

diff 95_Babble.pm.orig 95_Babble.pm
1341a1342,1344
>       for(my $i=0;$i<int(@parms);$i++){
>         $func =~ s/\$PARM$i/$parms[$i]/g;
>       }


Außerdem hab ich es irgendwie geschafft, dass mein Babble jetzt wohl etwas verwirrt ist. Es loggt beim Aufruf der Babble UI immer "undef" im Log und beim list finde ich ein Devalias "0", das vielleicht dieses Problem verursacht. Wenn ich den Chatbot "was kannst du steuern" frage, sagt er dann auch immer:
Ich kenne die folgenden Geräte: und wetter
Da ist wohl irrtümlich irgendwie ein undef irgendwo in den Internals des Moduls abgelegt worden, dass als Gerät betrachtet wird. Wie auch immer ich das hinbekommen habe.
Es geht auf jeden Fall nicht mehr weg. ;)

2018.02.20 13:19:26 5: [Babble_getdevs] finds local FHEM device wu.Gladbeck with babbleDevice=Wetter
2018.02.20 13:19:26 5: [Babble_getdevs] local FHEM device wu.Gladbeck with babbleDevice=Wetter entered into hashes with ig=0
2018.02.20 13:19:26 1:          undef

2018.02.20 13:19:26 1:          undef


devcontacts:
       wetter:
         Wetter
         wu.Gladbeck
         0
     devs:
       Wetter
     devsalias:
       wetter:
         0


Glücklicherweise hab ich nur wenige Einstellungen bisher gemacht, so dass ich das Device einfach neu erstellen kann.
Ich bin mir relativ sicher, dass der Fehler kam, nachdem ich eine leere Gerätezeile über das UI eingefügt und das dann auch noch gespeichert habe. Versuche aber noch mal, dass zu reproduzieren. :)

Ein neu erstellen des Gerätes ändert da leider auch nichts. Sobald ich beim ersten Device das babbleDevice Attribut setze, sind die "undef" Logmeldungen wieder da und auch die Rivescript Funktion liefert wieder "Ich kenne die folgenden Geräte: und Wetter".

2018.02.20 13:46:35 1: [Babble_getdevs] No entry in command table under wetter for local FHEM device wu.Gladbeck with attribute babbleDevice=Wetter
2018.02.20 13:46:35 1: PERL WARNING: Use of uninitialized value $l in print at /opt/fhem/fhem.pl line 4924.
2018.02.20 13:46:35 3: eval: {Babble_Html("Babble")}
2018.02.20 13:46:35 1:          undef

2018.02.20 13:46:35 1:          undef

2018.02.20 13:46:35 1:          undef

2018.02.20 13:46:35 1:          undef

2018.02.20 13:46:35 1:          undef

2018.02.20 13:46:35 1:          undef



Was mir noch aufgefallen ist: Nicht durch Leerzeichen abgesetzte Satzzeichen, wie bei "Wie wird das Wetter morgen?" werden an $VALUE mit übergeben, was dann dazu führt, dass man z.B. bei dem Wetter Beispiel aus dem Wiki keinen Erfolg hat, da hier "morgen?" eq "morgen" verglichen wird.
Habe das jetzt mal über babblePreSubs gelöst, wo ich das ? dann einfach durch nichts ersetze. Aber vielleicht macht hier eine allgemeinere Lösung Sinn?

Und noch was: Wenn man beim Device Hilfe-Text Anführungszeichen verwendet (einfach oder doppelte, egal), wird der Text nicht an die helpFunc übergeben. Genau genommen wird in dem Fall bei mir die helpFunc nicht mal aufgerufen. Fehler sehe ich allerdings auch keine. Lasse ich die Anführungszeichen raus aus dem Hilfetext, klappt alles.

Prof. Dr. Peter Henning

Sieh an, ein echter Unterstützer, danke. Ist behoben und eingecheckt.

LG

pah