Module: TALKTOME & TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen

Begonnen von SirUli, 21 Juni 2016, 22:21:13

Vorheriges Thema - Nächstes Thema

SirUli

Hi zusammen,

in den letzten Monaten habe ich mich immer mal wieder damit auseinander gesetzt wie ich mit meiner Heimautomation kommunizieren kann. Dabei hatte ich immer die Möglichkeit mit "ihr" zu sprechen (z.B. via WebViewControl oder AutoVoice) oder zu schreiben (TELEGRAM usw.) aber diese Daten nicht weiter vernünftig zu verarbeiten. Wenn man mal angefangen hat eine Unmenge an Notify-Devices aufzubauen, weiss man nach zwei-drei Monaten nicht mehr wie was funktioniert. Zudem: Meist denkt man sich was schönes aus wie "Temperatur Wohnzimmer" und dann kommt die Partnerin und meint "Ich frage aber: 'Wie warm ist es im Wohnzimmer'". An dieser Stelle möchte ich nun ansetzen. Meine Idee war es, die Chatbots - bekannt von Webseiten wie IKEA und co - auf für FHEM einzusetzen, um richtige Dialoge zu bauen.

Nach einiger Zeit der Suche bin ich auf RiveScript gestoßen, was ideal für meinen Anwendungsfall ist: Perl und leicht konfigurierbare Sprachverarbeitung mit Rückmeldungen.

Voraussetzungen & Installation
Siehe Wiki

Was ist derzeit noch ToDo?

  • Unterscheidung von Messages aus verschiedenen Quellen mit den entsprechenden Usern (siehe oben) - derzeit geht alles über ein TALKTOUSER Gerät
  • evtl. Integration mit ROOMMATE
  • Überarbeitung der Dokumentation

Feedback
So nun lasst mal hören was ihr dazu meint?

Viele Grüße,
Uli

JoWiemann

Hallo Uli,

vielen Dank für Deine Idee / Arbeit.

Nun der erste Wermutstropfen. Das Update wird mit folgendem Fehler beendet: Got 19253 bytes for FHEM/42_TALKTOUSER.pm, expected 21405

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

SirUli

Hi Jörg,

danke für die Rückmeldung - ich hatte in der tat das controls file nicht korrekt aktualisiert. Nun sollte es aber laufen!

Viele Grüße,
Uli

JoWiemann

Hallo Uli,

kann es ein, dass 42_TALKTOME.pm in folgende Definition fehlt:

use constant RS_ERR_MATCH => "ERR: No Reply Matched";
use constant RS_ERR_REPLY => "ERR: No Reply Found";

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

SirUli

Zitat von: JoWiemann am 22 Juni 2016, 20:06:54
kann es ein, dass 42_TALKTOME.pm in folgende Definition fehlt:
Hi Jörg,

wirft das einen Fehler bei dir? Ich habe diese Meldungen absichtlich nicht so gesetzt, damit diese änderbar sind - siehe aktuell Zeile 462:
if ($reply eq RS_ERR_MATCH) {
$reply = AttrVal($sourceDeviceName, "nomatch", "Found no match. To customize this message please set attribute 'nomatch' on $sourceDeviceName");
} elsif ($reply eq RS_ERR_REPLY) {
$reply = AttrVal($sourceDeviceName, "noreply", "Found no reply. To customize this message please set attribute 'noreply' on $sourceDeviceName");
}

So kann man via den Attributen "nomatch" und "noreply" die beiden Rückmeldungen ändern.

Viele Grüße,
Uli

JoWiemann

Hallo Uli,

bekomme ohne Deklaration folgenden Fehler:

Bareword "RS_ERR_REPLY" not allowed while "strict subs" in use at /opt/fhem/FHEM/42_TALKTOME.pm line 464.
Bareword "RS_ERR_MATCH" not allowed while "strict subs" in use at /opt/fhem/FHEM/42_TALKTOME.pm line 462.
2016.06.22 20:01:06 0: Bareword "RS_ERR_REPLY" not allowed while "strict subs" in use at /opt/fhem/FHEM/42_TALKTOME.pm line 454.

Bareword "RS_ERR_REPLY" not allowed while "strict subs" in use at /opt/fhem/FHEM/42_TALKTOME.pm line 464.
Bareword "RS_ERR_MATCH" not allowed while "strict subs" in use at /opt/fhem/FHEM/42_TALKTOME.pm line 462.
Bareword "RS_ERR_REPLY" not allowed while "strict subs" in use at /opt/fhem/FHEM/42_TALKTOME.pm line 454.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

JoWiemann

Zitat von: SirUli am 21 Juni 2016, 22:21:13
Nun kommt der wichtigste Teil - die Einbindung einer Quelle. Bei mir ist das nun Telegram, welches nun zwei zusätzliche Attribute via userAttr bekommen muss:
talktouserMonitorReading talktouserModSourceDev


Hallo Uli,

kannst Du das genauer beschreiben? attr Name_des_Telegram_Device userattr talktouserMonitorReading  und dann wie weiter?

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

SirUli

Hi Jörg,

danke für das Feedback. Oben ist unter "Was heissen die Attribute?" dann kurz beschrieben was diese heissen, hilft das? Und ja, man muss diese mittels:

attr Name_des_Telegram_Device userattr talktouserMonitorReading talktouserModSourceDev


hinzufügen. Ich schaue mir gerade die Fehler bezüglich RS_ERR* an, aber noch finde ich nicht warum es bei dir nicht will, da diese von RiveScript exportiert werden. Siehe hier.

Bin noch am suchen.

Viele Grüße,
Uli

JoWiemann

Zitat von: SirUli am 22 Juni 2016, 20:45:36
Hi Jörg,

danke für das Feedback. Oben ist unter "Was heissen die Attribute?" dann kurz beschrieben was diese heissen, hilft das? Und ja, man muss diese mittels:

attr Name_des_Telegram_Device userattr talktouserMonitorReading talktouserModSourceDev


hinzufügen. Ich schaue mir gerade die Fehler bezüglich RS_ERR* an, aber noch finde ich nicht warum es bei dir nicht will, da diese von RiveScript exportiert werden. Siehe hier.

Bin noch am suchen.

Viele Grüße,
Uli

Hm, kann es daran liegen, dass ich sudo apt-get install librivescript-perl benutzt habe? Ich arbeite ungern mit CPAN, da habe ich mir schon mal Perl mit zerschossen. Die andere Frage ist, ob bei der erstmaligen Definition nach dem update RiveScript wirklich schon exportiert sind.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

SirUli

Hi Jörg

Zitat von: JoWiemann am 22 Juni 2016, 20:51:56
sudo apt-get install librivescript-perl

Kannst du mal checken ob du auf der Kommandozeile "rivescript" eingeben kannst? Und welche Version dort ausgegeben wird?

Viele Grüße,
Uli

JoWiemann

Hier das Ergebnis:


RiveScript Interpreter - Interactive Mode
-----------------------------------------
RiveScript Version: 1.26
        Reply Root: /usr/share/perl5/RiveScript/demo

You are now chatting with the RiveScript bot. Type a message and press Return to send it.
When finished, type '/quit' to exit the program. Type '/help' for other options.



Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

SirUli

Das erklärt das Problem
1.28  Aug 14 2012
  - FIXED: Typos in RiveScript::WD (Bug #77618)
- Added constants RS_ERR_MATCH and RS_ERR_REPLY.


Ich habe nur mit Version 2.0.0 getestet und in 1.42 ist leider ein zweiter wichtiger Fix eingeflossen, der ein Problem mit UTF-8-Zeichen löst

Viele Grüße,
Uli

JoWiemann

Ok, cpan ist durchgelaufen und zeigt keine Seiteneffekte. TALKTOME und RiveScript sind jetzt auch Freunde.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

SirUli

Zitat von: JoWiemann am 22 Juni 2016, 22:07:07
Ok, cpan ist durchgelaufen und zeigt keine Seiteneffekte. TALKTOME und RiveScript sind jetzt auch Freunde.
Sehr gut - danke, das ist auch gut zu wissen!

Ich bin gespannt ;)

Viele Grüße,
Uli

Esjay

Hallo zusammen,ich finde das Thema wirklich spannend, und klinke mich hier mal ein!

Ersteinmal vielen Dank für das erstellen des Moduls.
Mich würde beiläufig interessieren, wie lange es eigentlich dauert so etwas auf die Beine zu stellen?

Nun zum eigentlichen!
Könntet ihr mir kurz hilfestellung zu folgenden Punkten leisten?

ZitatDie Einrichtung von msg - das macht mir das Antworten in die diversen Kanäle sehr viel einfacher.
    Installation von RiveScript in der Version 2.0.1 (oder neuer, falls eine erscheinen sollte), am besten via CPAN.

Bedarf es denn für den ersten Punkt i-einen define oder ist durch die Hinweise im verlinkten Thema dies nur ein beiläufiger Hinweis deinerseits?
ZitatInstallation

Die Dateien werden ab dem 04.11.2015 per Update ausgeliefert.

Zu Punkt 2 wäre ich an der vorgehensweise der Installation interessiert.
Leider bin ich, was Programme über das Terminal zu installieren angeht, nicht mit dem nötigen Wissen ausgestattet.

Danke für eure Hilfe!

Grüße




SirUli

Hi Esjaycc,

Zitat von: Esjaycc am 23 Juni 2016, 10:54:31
Mich würde beiläufig interessieren, wie lange es eigentlich dauert so etwas auf die Beine zu stellen?
Da ich zwar viel Programmiere aber wenig mit Perl zu tun habe: Lange ;) Das Modul is nun bei mir seit etwa einem halben Jahr im Einsatz, aber ist durchaus ein paar Wochen lang in der Entwicklung gewesen.

Zitat von: Esjaycc am 23 Juni 2016, 10:54:31Bedarf es denn für den ersten Punkt i-einen define
Es bedarf eines defines - ich stelle das oben gleich klar!
Edit: Done

Zitat von: Esjaycc am 23 Juni 2016, 10:54:31Zu Punkt 2 wäre ich an der vorgehensweise der Installation interessiert.
Nehme ich ebenso oben auf - kleinen moment ;)
Edit: Done

Viele Grüße,
Uli

Esjay

Danke für die schnelle Antwort!

Werde es am Wochenende mal testen,und dann von mir hören lassen!

Grüße

RoBra81

Hallo,

ich habe es jetzt auch mal testen wollen, komme aber irgendwie nicht weiter: ich bin an dem Punkt, dass ich den Bot und den User habe und wenn ich per Telegram eine Nachricht an den Bot schicke, bekomme ich immer die Antwort "Ich konnte leider keine gute Antwort finden!" ans Telegram zurück. Im Bot scheint's anzukommen, denn es erscheinen Einträge im aktivierten Debug-Log:

[15:7:33] RiveScript: RiveScript v2.0.2 Initialized
[15:8:5] RiveScript: Get reply to [talkToUser_Ronny] Wie heißt du?
[15:8:5] RiveScript: Sorting triggers...
[15:8:5] RiveScript: Analyzing topic __begin__
[15:8:5] RiveScript: Collecting trigger list for topic __begin__ (depth=0; inheritence=0; inherited=0)
[15:8:5] RiveScript: Sorting triggers with priority 0.
[15:8:5] RiveScript: ip=0
[15:8:5] RiveScript: Sorting triggers...
[15:8:5] RiveScript: Sorting reverse triggers for %previous groups...
[15:8:5] RiveScript: Checking topic random for any %previous's.
[15:8:5] RiveScript: Processing responses to this trigger.
[15:8:5] RiveScript: Reply: ERR: No Reply Matched


Ich habe das RiveScript mit dem FHEM Verzeichnis (ich musste beim Starten ein Verzeichnis angeben, eine einzelne Datei ging nicht) mal auf der Console getestet und habe einen Haufen Fehlermeldungen bekommen (ß und Umlaute seien in Triggern nicht erlaubt). Also habe die mal rausgemacht und nun kann ich zumindest auf der Console mit SuSi reden, im FHEM funktioniert es aber leider nicht. Wo könnte mein Problem liegen?

Vielen Dank
Ronny

RoBra81

Kommando zurück! Es geht! Er hat den relativen Pfad zum Script nicht erkannt - absolut angegeben geht es jetzt  :)

Jetzt kann ich testen und bauen  :)

SirUli

Zitat von: RoBra81 am 30 Juni 2016, 15:16:13
ß und Umlaute seien in Triggern nicht erlaubt)
Das ist per Default auch korrekt - den UTF8-Support muss man separat einschalten. Guter Punkt mit dem Testen, das muss ich mal genauer fassen. Danke für den Hinweis.

Zitat von: RoBra81 am 30 Juni 2016, 15:20:10
Er hat den relativen Pfad zum Script nicht erkannt - absolut angegeben geht es jetzt  :)
Interessant - muss ich mal checken. Ich habe die Datei relativ angegeben und das lief ganz gut. Mal schauen.

Viele Grüße,
Uli

RoBra81

Ich glaube, nach dem definieren des Bots stand standardmäßig der Pfad

./TALKTOME.rive

was aber eigentlich

./FHEM/TALKTOME.rive

sein müsste...

Im FHEM funktionieren die Umlaute dann auch wieder...

Vielen Dank
Ronny

SirUli

Hi Ronny,

danke dir - tatsache. Danke dir für den Fund, ändere ich mit dem nächsten Release gleich ab.

Viele Grüße,
Uli

marvin78

Kleiner Tipp: Lass so eine "Vorkonfiguration" ganz weg aus dem Modul. Das ist, wie ich finde, nicht im Sinne von FHEM und macht sicher in dem speziellen Fall auch Probleme mit unterschiedlichen Systemen auf denen FHEM laufen kann. Die Pfade sind zum einen nicht immer gleich und noch dazu in global konfigurierbar. Dass deine Vorkonfiguration auf allen oder vielen Systemen läuft wäre also eher Zufall. Attribute sollten im Regelfall vom Anwender gesetzt werden und nicht vom Modul. Das gilt auch und insbesondere für Icons.

Das soll keine Kritik sein. Dein Modul habe ich im Testeinsatz und finde es gelungen.

SirUli

Zitat von: marvin78 am 30 Juni 2016, 15:40:53
Kleiner Tipp: Lass so eine "Vorkonfiguration" ganz weg aus dem Modul.
Mein Ansatz dazu war, dass man lediglich die Datei umbenennen muss und es einfach "läuft", aber da hatte ich mir das zu einfach gedacht - die Vorkonfiguration nehme ich raus (genauso wie die Icons) und auf in die Installationsanleitung, ist vermutlich der bessere Ansatz.

Viele Grüße,
Uli

RoBra81

Bei mir ist beim "Spielen" ein Wunsch aufgetaucht - vielleicht hast du da ja eine Idee: Ich habe folgendes in der .rive-Datei ergänzt:

+ was kannst du
- Standardkommandos:
^ /Temperaturen


Das daraufhin kann ich das /Temperaturen im Telegram direkt anklicken. Leider wird es dann aber nicht erkannt. Ich habe die Zeile

+ temperaturen


schon durch

+ [*] temperaturen


ersetzt, aber leider ohne Erfolg (außer, dass jetzt die Frage "Wie sind die Temperaturen?" funktioniert)

Ronny

SirUli

Das heisst dass du dann an FHEM auch /Temperaturen zurücksendest, korrekt? Muss ich bei mir mal nachstellen - ich hätte wie du vermutet, dass das so funktioniert, da der "/" durch den RiveScript-Parser eigentlich entfernt wird.

Viele Grüße, Uli

SirUli

Sooo dann einmal "update" please ;) Hintergrund ist, dass "/" nicht als Satzzeichen erkannt wurde. Dazu habe ich nun die ursprünglich nur im Programmcode vorhandenen Satzzeichen (.,!?;:¡¿) in ein Attribut verlegt, dass bei Vorhandensein ausgewertet wird. WICHTIG unbedingt beachten, dass die "normalen" Satzzeichen weiterhin eingetragen werden, ansonsten hat man wenig Spaß in der Erkennung ;)

Beispiel für Ronny's Fall:
attr FHEMTALKTOME rspunctuation .,!?;:¡¿/

Ich muss mal noch in die Runde fragen wie ihr am liebsten das TALKTOUSER Device bestimmen würdet. Usprünglich hatte ich dazu angedacht ein Attribut im Quelldevice anzulegen, was das steuert. Was bei Yowsup einfach ist, denn da hat jeder Absender ein eigenes Device. Bei TELEGRAMBOT ist das schon sehr viel schwieriger da das Quelldevice von mehreren Nutzern genutzt wird. Problem also: Wie ordne ich Nachrichten verschiedenen TALKTOUSER Devices zu? Ideen?

Viele Grüße,
Uli

RoBra81

Super, werde ich morgen gleich mal probieren.

Zur TALKTOUSER-Zuordnung: Was hältst du von einem Attribut im "Kommunikationsdevice", in welches man entweder den Namen des TALKTOUSER-Device einträgt (z.B. bei Yowsup) oder den Namen des Readings, in dem der Empfänger steht (z.B. bei TelegramBot) - den müsste man dann noch z.B. als Alias im TALKTOUSER-Device eintragen...
Ronny

RoBra81

Hallo Uli,

also das Modul ist echt super! Ich baue gerade meinen DOIF-ChatBot auf deine Module um. Dabei sind zwei Wünsche aufgetaucht:

1. ich bräuchte neben fhem-Aufrufen auch die Möglichkeit, perl-Funktionen aufzurufen, um komplexe Antworten zusammenbauen zu können (ich habe mir die Möglichkeit schonmal schnell selbst eingebaut, vielleicht übernimmst du das ja - siehe Anhang (Achtung: ohne Fehlerhandling - ich befürchte, FHEM könnte abstürzen, wenn man versucht, eine nicht vorhandene Funktion aufzurufen))
2. schön wäre auch die Möglichkeit, Bilder (z.B. Charts oder Kamerabilder) als Anhang zu versenden

Vielen Dank für das tolle Modul!
Ronny

SirUli

Zitat von: RoBra81 am 01 Juli 2016, 14:35:08perl-Funktionen
Ja why not - hört sich gut an. Denke das sollte kein Problem sein (auch das abfangen von ungültigen Funktionen). Ich glaube nur der Anhang ist verloren gegangen :)

Zitat von: RoBra81 am 01 Juli 2016, 14:35:08Bilder (z.B. Charts oder Kamerabilder) als Anhang
Das muss ich mir mal ansehen, denn das ist bisschen trickreich. Habe ich mir auch schon gewünscht.

RoBra81


SirUli

Schaue ich mir an, danke dir! Hast du ein Beispiel was du da machst? Nur damit ich etwas ähnliches evtl. in das Template als Beispiel aufnehmen kann.

Viele Grüße, Uli

RoBra81

Hallo,

gern stelle ich meine Ergebnisse zur Verfügung, wenn ich soweit bin - gern würde ich aber vorher noch ein Problem lösen, um ein funktionierendes Beispiel zur Verfügung zu stellen: ich schaffe es nicht, einen FHEM-Befehl auszuführen.

Ich habe folgenden Eintrag in der rive-Datei:

  + test
  - <call>fhem set Test off</call>


Wenn ich test sende bekomme nur folgende Antwort und nichts passiert:

TALKTOME: No Answer received - that should not be happening. Check with your admin

Im TALKTOME.log steht

[13:7:16] RiveScript: Trying to match "test" against test (test)
[13:7:16] RiveScript: Found a match!
[13:7:16] RiveScript: Processing responses to this trigger.
[13:7:16] RiveScript: Reply: <call>fhem set Test off</call>


Im FHEM-Log finde ich trotz verbose 5 keinen Eintrag mit "TALKTOME_helpers_fhem"

Wo liegt mein Fehler?

Ronny

SirUli

Hi Ronny,

ich tippe, dass Rivescript in diesem Falle keine Rückmeldung sendet sondern nur das Script ausführt - möglicherweise stört er sich daran. Hast du es mal analog meines Beispiels angeschaut? Probieren würde ich also:
+ test
- Befehl abgesetzt <call>fhem set Test off</call>
^ Aktueller status: <call>readingsval Test state Error</call>


Du hattest verbose 5 aber auf das TALKTOME modul gesetzt oder? Dort wird der Befehl dann ausgeführt.

Viele Grüße,
Uli

RoBra81

Hallo Uli,

die fehlende Rückmeldung stört mich erstmal nicht, aber der Befehl wird leider im FHEM nicht ausgeführt. Nachdem ich eine weitere Log-Zeile eingebaut habe, stand auch was im Log (scheinbar funktioniert der hardcodierte Modulname in der Log-Zeile nicht), aber das FHEM-Device bliebt trotz off-Befehl eingeschaltet.

Ronny

SirUli

Hi Ronny,

good catch - das ist hardcodiert gewesen und wird daher dann ausgefiltert, sofern global nicht auf verbose 5 steht. Fixe ich.

Bezüglich der Rückmeldung stehe ich noch etwas im Wald. Ich habe die Zeilen mal bei mir rein
+ test
- Befehl abgesetzt <call>fhem set Test off</call>

und bekomme auch gleich ein Feedback:
2016.07.03 15:12:20 5: TALKTOME: called function TALKTOME_helpers_fhem with command: set Test off
2016.07.03 15:12:20 3: set Test off : Please define Test first
2016.07.03 15:12:20 5: TALKTOME_DispatchToInterpreter: reply is: Befehl abgesetzt Please define Test first
2016.07.03 15:12:20 5: TALKTOME_Write: Variable answer - Befehl abgesetzt Please define Test first (UTF8: 1 / Valid: 1)
2016.07.03 15:12:20 5: TALKTOME dispatch TALKTOUSER###TALKTOUSER_ULI###REPLY###TELEGRAMBOT_SUSI###TelegramBot###TELEGRAMBOT_SUSI:@IREPLACEDTHENUMBER###Befehl abgesetzt Please define Test first
2016.07.03 15:12:20 4: TALKTOUSER_Parse TALKTOME: Variable TALKTOUSER: TALKTOUSER / device: TALKTOUSER_ULI / answertype: REPLY / sourceDeviceName: TELEGRAMBOT_SUSI / sourceDeviceType: TelegramBot / modSourceDeviceName: TELEGRAMBOT_SUSI:@IREPLACEDTHENUMBER / answer: Befehl abgesetzt Please define Test first
2016.07.03 15:12:20 5: TALKTOUSER_Parse TALKTOME: Variable answer - Befehl abgesetzt Please define Test first (UTF8: )
2016.07.03 15:12:20 4: TALKTOUSER_Parse TALKTOME: Updating TELEGRAMBOT_SUSI with the reply
2016.07.03 15:12:20 5: msg @TELEGRAMBOT_SUSI:@IREPLACEDTHENUMBER 0 | | Befehl abgesetzt Please define Test first


Dann habe ich Test so definiert:
define Test dummy

Und bekomme:
2016.07.03 15:19:55 5: TALKTOME: called function TALKTOME_helpers_fhem with command: set Test off
2016.07.03 15:19:55 5: TALKTOME_DispatchToInterpreter: reply is: Befehl abgesetzt
2016.07.03 15:19:55 5: TALKTOME_Write: Variable answer - Befehl abgesetzt  (UTF8: 1 / Valid: 1)
2016.07.03 15:19:55 5: TALKTOME dispatch TALKTOUSER###TALKTOUSER_ULI###REPLY###TELEGRAMBOT_SUSI###TelegramBot###TELEGRAMBOT_SUSI:@IREPLACEDTHENUMBER###Befehl abgesetzt
2016.07.03 15:19:55 4: TALKTOUSER_Parse TALKTOME: Variable TALKTOUSER: TALKTOUSER / device: TALKTOUSER_ULI / answertype: REPLY / sourceDeviceName: TELEGRAMBOT_SUSI / sourceDeviceType: TelegramBot / modSourceDeviceName: TELEGRAMBOT_SUSI:@IREPLACEDTHENUMBER / answer: Befehl abgesetzt
2016.07.03 15:19:55 5: TALKTOUSER_Parse TALKTOME: Variable answer - Befehl abgesetzt  (UTF8: )
2016.07.03 15:19:55 4: TALKTOUSER_Parse TALKTOME: Updating TELEGRAMBOT_SUSI with the reply
2016.07.03 15:19:55 5: msg @TELEGRAMBOT_SUSI:@IREPLACEDTHENUMBER 0 | | Befehl abgesetzt


Und mein Dummy ist eingeschalten. Jetzt habe ich als Problem, dass ich es nicht nachvollziehen kann. Ich fixe mal das mit dem Log und baue noch ein paar mehr ausgaben ein, dann kann man das vielleicht besser sehen.

Viele Grüße,
Uli

SirUli

Hi Ronny,

Zitat von: RoBra81 am 03 Juli 2016, 15:06:52aber das FHEM-Device bliebt trotz off-Befehl eingeschaltet.

Fehler gefunden. Du hast da was ausgeklammert (falls du noch die Datei von oben verwendest). Zeile 188:
return #fhem($command);

Du kannst auch einfach ein update ausführen - ich habe nun die Perl funktion übernommen und mal einen einen eval block drum rum gepackt um das gegen fhem zu schirmen. Musst mal probieren - ich habe noch keinen Anwendungsfall dafür.

Viele Grüße,
Uli

RoBra81

Vielen Dank! Jetzt tut's! Jetzt kann ich auch ein erstes Beispiel posten:

Zunächst habe ich zwei subs in der myutils, um zum Einen alle eingeschalteten und zum Anderen alle ausgeschalteten Lampen zu suchen und für Telegram als Liste aufzuarbeiten (aus . wir _ und es wird ein / vorangestellt, damit es im Telegram anklickbar ist):

sub
chatBot_getLightsOn
{
  my @lights = devspec2array('.*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy');;
  my $msg = "Es sind folgende Lichter eingeschaltet:\n \n";;
  my $room = "";
 
  if (@lights > 0 and defined($defs{$lights[0]})){
    foreach (@lights){
      if ($room ne AttrVal($_, "room", $_))
      {
        if ($room ne "")
        {
          $msg .= "/".$room."_Aus \n";
        }
        $room = AttrVal($_, "room", $_);
        $msg .= $room.": \n";
      }
      $_ =~ s/\./__/g;
      $msg .= "/".$_." \n";
    }
    if ($room ne "")
    {
      $msg .= "/".$room."_Aus \n";
    }
    $msg .= " \n/Alle_Aus
             \n/abbrechen
            ";;
  }else{
    $msg = "Es sind alle Lichter ausgeschaltet.";;
    $msg .= "\n/Hauptmenue
            ";;
  }
  return $msg;
}

sub
chatBot_getLightsOff
{
  my @lights = devspec2array('.*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy');;
  my $msg = "Es sind folgende Lichter ausgeschaltet:\n \n";;
  my $room = "";
 
  if (@lights > 0 and defined($defs{$lights[0]})){
    foreach (@lights){
      if ($room ne AttrVal($_, "room", $_))
      {
        if ($room ne "")
        {
          $msg .= "/".$room."_Ein \n";
        }
        $room = AttrVal($_, "room", $_);
        $msg .= $room.": \n";
      }
      $_ =~ s/\./__/g;
      $msg .= "/".$_." \n";
    }
    if ($room ne "")
    {
      $msg .= "/".$room."_Ein \n";
    }
    $msg .= " \n/Alle_Ein
             \n/abbrechen
            ";;
  }else{
    $msg = "Es sind alle Lichter eingeschaltet.";;
    $msg .= "\n/Hauptmenue
            ";;
  }
  return $msg;
}


So wird zum Beipiel aus DG.wz.LI.Allgemein ein /DG_wz_LI_Allgemein (meine Geräte haben alle das Format ETAGE.raum.TYP.Beschreibung)

Dann habe ich folgende Inhalte in der .rive-Datei

! array levels  = eg og dg au
! array rooms   = ku ez ba fk sp ks wz bu sz
// Trick, um _ in Triggern verwenden zu können
! array spacer = __ _

+ was kannst du
- Standardkommandos:
^ /Licht_Aus
^ /Licht_An

/*****************************************************************************\
* FHEM Licht aus                                                            *
\*****************************************************************************/
+ licht(@spacer)aus
- <call>perl chatBot_getLightsOn</call>{topic=licht_aus}

> topic licht_aus

  + [*] (abbrechen|hauptmenue) [*]
  - Untermenü verlassen{topic=random}

  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*)
  - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}_{formal}<star9>{/formal}>Schalte Licht <get licht> aus
  ^ <call>fhem set <get licht> off</call>

  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)
  - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}>Schalte Licht <get licht> aus
  ^ <call>fhem set <get licht> off</call>

  + alle(@spacer)aus
  - Schalte alle Lichter aus
  ^ <call>fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy off</call>
 
  + (*)(@spacer)(*)(@spacer)aus
  - <set room={formal}<star1>{/formal}_{formal}<star4>{/formal}>Schalte Licht in <get room> aus
  ^ <call>fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> off</call>
 
  + (*)(@spacer)aus
  - <set room={formal}<star1>{/formal}>Schalte Licht in <get room> aus
  ^ <call>fhem set .*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> off</call> 
 
< topic

/*****************************************************************************\
* FHEM Licht an                                                             *
\*****************************************************************************/
+ licht(@spacer)an
- <call>perl chatBot_getLightsOff</call>{topic=licht_an}

> topic licht_an

  + [*] (abbrechen|hauptmenue) [*]
  - Untermenü verlassen{topic=random}

  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)(@spacer)(*)
  - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}_{formal}<star9>{/formal}>Schalte Licht <get licht> ein
  ^ <call>fhem set <get licht> on</call>

  + (@levels)(@spacer)(@rooms)(@spacer)li(@spacer)(*)
  - <set licht={uppercase}<star1>{/uppercase}.<star3>.LI.{formal}<star6>{/formal}>Schalte Licht <get licht> ein
  ^ <call>fhem set <get licht> on</call>
 
  + alle(@spacer)ein
  - Schalte alle Lichter ein
  ^ <call>fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy on</call>
 
  + (*)(@spacer)(*)(@spacer)ein
  - <set room={formal}<star1>{/formal}_{formal}<star4>{/formal}>Schalte Licht in <get room> ein
  ^ <call>fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> on</call>
 
  + (*)(@spacer)ein
  - <set room={formal}<star1>{/formal}>Schalte Licht in <get room> ein
  ^ <call>fhem set .*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify:FILTER=TYPE!=readingsProxy:FILTER=room=<get room> on</call>
 
< topic



Damit kann ich nun einzelne oder alle Lichter eines Raumes ein bzw. ausschalten...

Daraus resultiert folgender beispielhafter Chat-Verlauf:

Ronny, [03.07.16 22:20]
was kannst du

FHEM, [03.07.16 22:20]
Standardkommandos:
/Licht_Aus
/Licht_An

Ronny, [03.07.16 22:20]
/Licht_An

FHEM, [03.07.16 22:20]
Es sind folgende Lichter ausgeschaltet:

Aussenwelt:
/AU__ho__LI__Markise
/AU__ho__LI__Terrasse
/Aussenwelt_Ein
Buero:
/DG__bu__LI__Flur
/DG__bu__LI__Schornstein
/DG__bu__LI__Schreibtisch
/Buero_Ein
Schlafzimmer:
/DG__sz__LI__Hinten_Halogen
/DG__sz__LI__Hinten_Led
/DG__sz__LI__Kleiderschrank
/DG__sz__LI__Vorn
/Schlafzimmer_Ein
Esszimmer:
/OG__ez__LI__Allgemein
/OG__ez__LI__Bogen
/OG__ez__LI__Esstisch
/OG__ez__LI__Vitrine
/Esszimmer_Ein
Flur_Kinder:
/OG__fk__LI__Allgemein
/Flur_Kinder_Ein
Hausflur:
/OG__hf__LI__Schuhschrank
/OG__hf__LI__Treppe
/Hausflur_Ein
Kinderschlafzimmer:
/OG__ks__LI__Allgemein
/OG__ks__LI__Bett
/OG__ks__LI__Sterne
/Kinderschlafzimmer_Ein
Kueche:
/OG__ku__LI__Besenschrank
/OG__ku__LI__Kuechenschrank
/OG__ku__LI__Kuechenzeile
/OG__ku__LI__Kuehlschrank
/OG__ku__LI__Theke
/Kueche_Ein
Spielzimmer_Kinder:
/OG__sp__LI__Baggerheck_Schreibtisch
/OG__sp__LI__Baggerschaufel_Podest
/Spielzimmer_Kinder_Ein
Treppe:
/OG__tr__LI__Handlauf_Fenster
/Treppe_Ein

/Alle_Ein

/abbrechen

Ronny, [03.07.16 22:20]
/Buero_Ein

FHEM, [03.07.16 22:20]
Schalte Licht in Buero ein

Ronny, [03.07.16 22:20]
abbrechen

FHEM, [03.07.16 22:20]
Untermenü verlassen

Ronny, [03.07.16 22:20]
Licht_aus

FHEM, [03.07.16 22:20]
Es sind folgende Lichter eingeschaltet:

Buero:
/DG__bu__LI__Flur
/DG__bu__LI__Schornstein
/DG__bu__LI__Schreibtisch
/Buero_Aus
Wohnzimmer:
/DG__wz__LI__Allgemein
/Wohnzimmer_Aus

/Alle_Aus

/abbrechen

Ronny, [03.07.16 22:20]
/DG__bu__LI__Schornstein

FHEM, [03.07.16 22:20]
Schalte Licht DG.bu.LI.Schornstein aus

Ronny, [03.07.16 22:20]
/Buero_Aus

FHEM, [03.07.16 22:20]
Schalte Licht in Buero aus

Ronny, [03.07.16 22:20]
abbrechen

FHEM, [03.07.16 22:20]
Untermenü verlassen


Ronny

SirUli

Das sieht ja cool aus :D Ich verlinke das mal im ersten Beitrag. Merci für die detaillierte Beschreibung!

Viele Grüße,
Uli

RoBra81

Guten Morgen,

ich hätte einen weiteren Wunsch (bestimmt nicht der letzte  ;)): wäre es möglich, dass man in einer der nächsten Versionen anstelle des Dateinamens einen Ordner angeben kann, in welchen das "Brain" liegt? Ich würde gern die einzelnen Funktionen (Licht, Heizung, ...) in separaten Dateien pflegen - das würde es auch erleichtern, mal ein Wiki mit Beispielen für die Funktionen anzulegen...

Ronny

SirUli

Moin Ronny, klar sollte sich machen lassen. Gibt ja von der Bibliothek schon eine Funktion dazu. Baue ich die Tage ein :)

Viele Grüsse, Uli


Sent from my iPhone using Tapatalk

RoBra81

So, ich habe jetzt eine Lichtsteuerung mit (mehr oder weniger) natürlicher Sprache gebaut und dabei einen neuen Wunsch (bzw. vielleicht geht's ja schon und ich seh's nicht):

Hier der Auszug aus der rive-Datei:

! person badezimmer = OG.ba.
! person buero = DG.bu.
! person esszimmer = OG.ez.
! person flur_kinder = OG.fk.
! person hausflur = OG.hf.
! person kinderschlafzimmer = OG.ks.
! person kueche = OG.ku.
! person schlafzimmer = DG.sz.
! person spielzimmer_kinder = OG.sp.
! person treppe = OG.tr.
! person unten_kueche = EG.uk.
! person unten_stube = EG.st.
! person waschhaus = EG.wh.
! person wohnzimmer = DG.wz.

! sub büro = buero
! sub bad = badezimmer
! sub flur kinder = flur_kinder
! sub kinderflur = flur_kinder
! sub spielzimmer kinder = spielzimmer_kinder
! sub spielzimmer = spielzimmer_kinder
! sub kinderspielzimmer = spielzimmer_kinder
! sub kinderzimmer = spielzimmer_kinder
! sub kueche unten = unte_kueche
// Deckenlicht heißt bei mir meistens "Allgemein"
! sub decke = allgemein


/*****************************************************************************\
* FHEM Befehle                                                               *
\*****************************************************************************/
! array schaltenaliaseinschalten = an|on|ein
! array schaltenaliasausschalten = aus|off
! array schaltenaliasartikel   = der|die|das
! array schaltenaliasfuellwoerter = schalte|mach
! array schaltenaliasorte     = in|am|auf|an|im|auf dem
! array schaltenaliashoeflich     = bitte
! array roomsfull                   = badezimmer|buero|esszimmer|flur_kinder|hausflur|kinderschlafzimmer|kueche|schlafzimmer|spielzimmer_kinder|treppe|unten_kueche|unten_stube|waschhaus|wohnzimmer

// einzelnes Licht ein- bzw. ausschalten
// Bsp: [Bitte] schalte das Licht im Wohnzimmer an der Decke (ein|aus)
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] (@roomsfull) [@schaltenaliasorte] [@schaltenaliasartikel] _ (@schaltenaliaseinschalten)
- <set light={person}<star1>{/person}LI.{formal}<star2>{/formal}>Schalte Licht <get light> ein
^ <call>fhem set <get light> on</call>

+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] (@roomsfull) [@schaltenaliasorte] [@schaltenaliasartikel] _ (@schaltenaliasausschalten)
- <set light={person}<star1>{/person}LI.{formal}<star2>{/formal}>Schalte Licht <get light> aus
^ <call>fhem set <get light> off</call>

// einzelnes Licht ein- bzw. ausschalten - anderer Satzbau
// Bsp: [Bitte] schalte das Licht an der Decke im Wohnzimmer (ein|aus)
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliaseinschalten)
- <set light={person}<star2>{/person}LI.{formal}<star1>{/formal}>Schalte Licht <get light> ein
^ <call>fhem set <get light> on</call>

+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliasausschalten)
- <set light={person}<star2>{/person}LI.{formal}<star1>{/formal}>Schalte Licht <get light> aus
^ <call>fhem set <get light> off</call>

// einzelnes Licht mit zweiteiligem Namen ein- bzw. ausschalten
// Bsp: [Bitte] schalte das Licht im Schlafzimmer hinten halogen (ein|aus)
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] zwei worte _ _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliaseinschalten)
- <set light={person}<star3>{/person}LI.{formal}<star1>{/formal}_{formal}<star2>{/formal}>Schalte Licht <get light> ein
^ <call>fhem set <get light> on</call>

+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] [@schaltenaliasartikel] zwei worte _ _ [@schaltenaliasorte] (@roomsfull) (@schaltenaliasausschalten)
- <set light={person}<star3>{/person}LI.{formal}<star1>{/formal}_{formal}<star2>{/formal}>Schalte Licht <get light> aus
^ <call>fhem set <get light> off</call>

// Licht in einem Zimmer ein- bzw. ausschalten
// Bsp: [Bitte] schalte das Licht im Schlafzimmer (ein|aus)
+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] (@roomsfull) (@schaltenaliaseinschalten)
- <set light={person}<star>{/person}LI.>Licht {formal}<star>{/formal} wird eingeschaltet
^ <call>fhem set <get light>.* on</call>

+ [@schaltenaliashoeflich] [@schaltenaliasfuellwoerter] [@schaltenaliashoeflich] [@schaltenaliasartikel] licht [@schaltenaliasorte] (@roomsfull) (@schaltenaliasausschalten)
- <set light={person}<star>{/person}LI.>Licht {formal}<star>{/formal} wird ausgeschaltet
^ <call>fhem set <get light>.* off</call>



Das funktioniert mit Telegram, ist aber eigentlich nicht dafür gebaut. Die eigentliche Idee dahinter ist, hierfür die Spracheingabe von AMAD zu nutzen: die AMADCommBridge bekommt den Sprachbefehl, führt ihn aus und antwortet (achtung, hier kommt mein Wunsch:) per Sprachnachricht auf das Gerät, das den Befehl gesendet hat. Ich bräuchte also die Möglichkeit, die Antwort nicht per text (oder push) zu senden, sondern per audio (tts). msg kann das bereits, aber ich weiß nicht, ob dein Modul das bereits unterstützt und ich es nicht finde, oder ob das tatsächlich noch umgesetzt werden muss...

Ronny

SirUli

Hi Ronny,

prinzipiell nutzt mein Modul nur msg um Befehle zurück zu senden. In der TALKTOUSER steht diese Zeile:
fhem("msg $device $msgPriority $msgTitle $msgMessage");

Mein Verständnis wäre, dass das msg Modul dann sich ansieht, was der default Pfad für das gewünschte Gerät wäre und diesen dann wählt. Allerdings sehe ich hier auch, dass default "text" als Receiver vergeben wird, falls nicht explizit was anderes gewählt wird. Hätte vermutet, dass man am Zieldevice was setzen kann - das muss ich mir nochmal genau ansehen. Du hast aber recht - aktuell geht es nicht über eine Konfiguration an meinem Modul(en).

Viele Grüße,
Uli

RoBra81

Hallo Uli,

ich habe mal ein bisschen getestet: Ich kann nun über AMAD mit FHEM sprechen und die Lichter werden auch geschaltet  ;D
Leider gibt es mMn kein Attribut am Device um msg-Nachrichten von Text auf Audio umzuleiten (zumal AMAD auch Text unterstützen würde) - ich bekomme also keine Antwort auf's Handy...

Ronny

RoBra81

Hallo Uli,

ich hoffe, dass es in deinem Sinne ist: da ich die Tage meine Beispiele veröffentlichen will, habe ich mit deinen Infos mal ein Wiki angelegt: http://www.fhemwiki.de/wiki/TALKTOME_%26_TALKTOUSER_-_Sprachverarbeitung_f%C3%BCr_Nutzerinteraktionen

Ronny

RoBra81

Guten Morgen,

Zitat von: SirUli am 04 Juli 2016, 16:41:18
Hi Ronny,

prinzipiell nutzt mein Modul nur msg um Befehle zurück zu senden. In der TALKTOUSER steht diese Zeile:
fhem("msg $device $msgPriority $msgTitle $msgMessage");

Mein Verständnis wäre, dass das msg Modul dann sich ansieht, was der default Pfad für das gewünschte Gerät wäre und diesen dann wählt. Allerdings sehe ich hier auch, dass default "text" als Receiver vergeben wird, falls nicht explizit was anderes gewählt wird. Hätte vermutet, dass man am Zieldevice was setzen kann - das muss ich mir nochmal genau ansehen. Du hast aber recht - aktuell geht es nicht über eine Konfiguration an meinem Modul(en).

Durch Konfiguration geht's leider nicht, aber ich denke, ich habe eine einfache Möglichkeit gefunden (kann es leider gerade nicht testen) indem man die obene genannte Zeile durch folgende ersetzt:

fhem("msg audio|text $device $msgPriority $msgTitle $msgMessage");


Dann brauche ich für AMAD nur noch die Möglichkeit, im Attribut receiveVoiceDevice ein Reading anzugeben, dessen Wert verwendet werden soll...

Ronny

RoBra81

Zitat von: RoBra81 am 05 Juli 2016, 15:58:48
Hallo Uli,

ich hoffe, dass es in deinem Sinne ist: da ich die Tage meine Beispiele veröffentlichen will, habe ich mit deinen Infos mal ein Wiki angelegt: http://www.fhemwiki.de/wiki/TALKTOME_%26_TALKTOUSER_-_Sprachverarbeitung_f%C3%BCr_Nutzerinteraktionen

Ronny

So, jetzt sind auch die ersten Beispiele drin...

SirUli

Hi Ronny,

Zitat von: RoBra81 am 05 Juli 2016, 15:58:48ich hoffe, dass es in deinem Sinne ist
Ist es :) Vielen Dank! Ich verweise aus meinem ersten Eintrag einfach ins Wiki - top!

Zitat von: RoBra81 am 06 Juli 2016, 08:08:10Indem man die obene genannte Zeile durch folgende ersetzt:
fhem("msg audio|text $device $msgPriority $msgTitle $msgMessage");
Ich frage mal beim Author von msg nach ob man da nicht einen Default Wert setzen kann. Ich tippe mal ja ;) Ansonsten muss ich mal schauen wie man das am besten realisiert.

Viele Grüße,
Uli

SirUli

Hi zusammen,

update:
* Added possibility to load a complete directory with rivescript files (ending .rs or .rive) through attribute rsbraindir
* Fixed logging of helper functions


Die helper funktionen können nur mittels attr global verbose 5 gedebugged werden. Hintergrund ist, dass rivescript in dem Moment nichts von FHEM weiss. D.h. leider auch nicht in welchem Gerät es ist.

Und rsbraindir erlaubt nun das laden eine Verzeichnisses - default wäre ./FHEM/TALKTO.

Viele Grüße,
Uli

kud


Christoph

Auch von mir ein wenig OT :P. Könnte jemand seine Konfiguration mit Telegram und msg posten? Ich bin glaub zu blöde das hinzubekommen  >:(
Gruß Christoph

RoBra81

Hallo Christoph,

msg kann Telegram von Haus aus und zur Einrichtung von Telegram gibt's glaube ich ein Wiki...

Ronny

SirUli

Zitat von: kud am 08 Juli 2016, 19:27:00
OT. Aber kennt Jemand die API.ai?

Habe ich auch gesehen aber ich wollte etwas was bei mir auch "offline" und mit FHEM funktioniert - insofern die wahl zu Rivescript. Evtl. könnte man in das vorliegende Modul da andere Befragungsmöglichkeiten noch integrieren. Etwa wie Alexa oder API, welche dann per Befehl bei Bedarf befragt werden.

Cori

Hallo Uli,
bin begeistert von dem Modul. Bin gerade dabei meinen Perlcode der zwar weitaus mächtiger, aber doch extrem unübersichtlich ist.
Leider funktionierte der Perl-Aufruf nur ohne Parameter. Wenn man den Sub normal über sub("") aufruft, kommen sogar Fehler.
Also habe ich mir mal den Code angeschaut und ein paar Änderungen vorgenommen.
Der Aufruf über RiveScript lautet somit <call>perl subname parameter1 parameter2 ...</call>
Für die Dokumentation wird $command mit Subname#P1,P2,... gesetzt, aber nicht mehr für den Aufruf benutzt.

Denke, kannst du so übernehmen, bei mir läuft es so vernünftig.


# Wrapper function for calling perl functions
sub TALKTOME_helpers_perl(@) {
# A sub always gets the bot as first argument - we'll just remove that
shift(@_); 
my $psub = shift(@_);
my $command = $psub . '#' . join(',', @_);

# At this point, rivescript just calls a method but has no idea about fhem devices.
# Therefore to debug this function, you need to set the vorbosity level 5 on the "global" device
Log3 undef, 5, "TALKTOME: called function TALKTOME_helpers_perl with command: $command";

my $result = "If you see this text, then something went seriously wrong";
# Now we'll call the perl function and then give it's result back. As we do not trust the perl stuff
# some error handling is required. Source: https://stackoverflow.com/questions/10342875
eval {
$result = &{\&{$psub}}(@_);
};
if (my $e = $@) {
$result = "Something went wrong: $e";
}

return $result;
}


Noch eine Frage zur Speicherung der ReadingsVal-Aufrufe. Ich bekomme die calls normal angezeigt bei einer Ausgabe. Aber eine direkte Speicherung in einer Variable ohne Anzeige bekomme ich einfach nicht hin. Denke ich hier falsch? Mein Aufruf <set reading=<call>readingsval Name reading FEHLER</call>>

Vielen Dank schon mal
diverse HomeMatic-Komponenten per HMLan und HMUART als IODevs und einige HUE-Lampen über HUE-Bridge2 an BananaPis mit Debian

SirUli

Hi Cori,

Zitat von: Cori am 12 Juli 2016, 05:07:47bin begeistert von dem Modul.
Danke ;)

Zitat von: Cori am 12 Juli 2016, 05:07:47Leider funktionierte der Perl-Aufruf nur ohne Parameter.
Interessantes Problem - muss ich mir mal ansehen. Denn eigentlich sollte das nicht so sein. Deine Lösung gefällt mir erstmal :)

Edit: Nachvollziehbar dass es so ist - ich baue das um ;)

Zitat von: Cori am 12 Juli 2016, 05:07:47
Denke ich hier falsch? Mein Aufruf <set reading=<call>readingsval Name reading FEHLER</call>>
Ich denke nicht dass du da falsch liegst, dieser Weg sollte klappen. Ich schau mir das mal an - evtl. muss ich das an den RiveScript-Author übergeben.

Viele Grüße,
Uli

Christoph

Zitat von: RoBra81 am 09 Juli 2016, 17:14:06
Hallo Christoph,

msg kann Telegram von Haus aus und zur Einrichtung von Telegram gibt's glaube ich ein Wiki...

Ronny

Danke Ronny  :)

devil77

Hallo,

wollte jetzt das ganze auch mal probieren. Scheinbar hat erstmal alles soweit funktioniert was die Einrichtung angeht.
Aber beim erstellen der eigenen Befehle komme ich nicht weiter. Mein Code zum testen sieht bisher so aus
! sub hauptmenü = hauptmenue

+ [*] (abbrechen|hauptmenue) [*]
- Hauptmenü:
^ /CapuAn
^ /CapuAus

+ CapuAn
- Befehl abgesetzt <call>fhem set WZ.Power.CapuBar_Sw_Schalter on</call>
^ Aktueller status: <call>readingsval WZ.Power.CapuBar_Sw_Schalter state Error</call>

+ CapuAus
- Befehl abgesetzt <call>fhem set WZ.Power.CapuBar_Sw_Schalter off</call>
^ Aktueller status: <call>readingsval WZ.Power.CapuBar_Sw_Schalter state Error</call>

+ leave
- Untermenü verlassen \n \s \n {@ hauptmenue}


Sende ich über telegram die Nachricht "Hauptmenü" ab dann erhalte ich folgende Antwort
Hauptmenü:/CapuAn/CapuAus
Schon einmal alles zusammen geschrieben und ich kann damit die einzelnen Befehle nicht anklicken.

Schicke ich jetzt folgenden Befehl zurück
/CapuAn
Dann erhalte ich nur ein
Ich konnte leider keine gute Antwort finden!

Momentan stehe ich etwas auf dem Schlauch und weiß nicht wo da mein Fehler liegt.

RoBra81

Hallo,

da scheint ein Fehler zu sein, den ich auch des Öfteren mache: in JiveScript werden alle Anfragen zunächst in Kleinbuchstaben umgewandelt, sodass du

+ CapuAn
- Befehl abgesetzt <call>fhem set WZ.Power.CapuBar_Sw_Schalter on</call>
^ Aktueller status: <call>readingsval WZ.Power.CapuBar_Sw_Schalter state Error</call>


in

+ capuan
- Befehl abgesetzt <call>fhem set WZ.Power.CapuBar_Sw_Schalter on</call>
^ Aktueller status: <call>readingsval WZ.Power.CapuBar_Sw_Schalter state Error</call>


ändern musst.

Bei dem Hauptmenü muss du noch entweder explizite Zeilenumbrüche setzen, oder die impliziten vorher an und anschließend ausschalten:

+ [*] (abbrechen|hauptmenue) [*]
- Hauptmenü: \n
^ /CapuAn \n
^ /CapuAus


oder

+ [*] (abbrechen|hauptmenue) [*]
! local concat = newline

- Hauptmenü:
^ /CapuAn
^ /CapuAus

! local concat = none


Ronny

devil77

Danke für die Tips, dass mit dem Zeilenumbruch funktioniert.
Aber auch mit Kleinschreibung wird der Befehl nicht umgesetzt.

RoBra81

Hast du mal

CapuAn

gesendet?

Wenn das geht, musst du vermutlich noch das Attribut rspunctuation setzen:

attr FHEMTALKTOME rspunctuation .,!?;:¡¿/

Ronny

SirUli

Zitat von: RoBra81 am 04 Juli 2016, 15:16:22
Ich bräuchte also die Möglichkeit, die Antwort nicht per text (oder push) zu senden, sondern per audio (tts).
Hi Ronny,

mir kam grad noch: hast du mal das attribut "talktouserModSourceDev" auf "audio %DEVICE%" gesetzt?

Viele Grüße,
Uli

RoBra81

Hallo Uli,

Zitat von: SirUli am 22 Juli 2016, 09:48:45
Hi Ronny,

mir kam grad noch: hast du mal das attribut "talktouserModSourceDev" auf "audio %DEVICE%" gesetzt?

Viele Grüße,
Uli

Nein, habe ich nicht, aber ein Blick in den Quellcode lässt vermuten, dass es nicht gehen wird, da du dann ein "@" vor das "audio" setzt:

my $device = "\@" . $modSourceDeviceName;


Die Antwort per Audio habe ich mir durch die Zeile

fhem("msg audio|text $device $msgPriority $msgTitle $msgMessage");


eingebaut, allerdings kann ich das Device aktuell nur fest vorgeben, aber leider noch nicht aus einem Reading ermitteln (was in diesem Fall notwendig wäre)...

Ronny

devil77

Danke, jetzt funktioniert erstmal alles wie gewollt.
Das Thema Punktion hatte ich gelesen konnte es aber noch nichz zuordnen.
Das mit der Kleinschreibung muss ich aber völlig überlesen haben.

Evtl. wären die beiden Punkte noch als Ergänzung im Wiki sinnvoll.

Zitat von: RoBra81 am 21 Juli 2016, 15:33:42
Hast du mal

CapuAn

gesendet?

Wenn das geht, musst du vermutlich noch das Attribut rspunctuation setzen:

attr FHEMTALKTOME rspunctuation .,!?;:¡¿/

Ronny

RoBra81

Zitat von: devil77 am 22 Juli 2016, 09:58:31
Evtl. wären die beiden Punkte noch als Ergänzung im Wiki sinnvoll.

Kann ich gerne bei Gelegenheit nachziehen...

SirUli

Hallo zusammen,

es gibt nun eine neue Version mit den Fixes für die Übergabe von Parametern an die Perl Aufrufe sowie einem geänderten Handling des "@" Zeichens für das %DEVICE% - ist aber transparent für den Nutzer.

@Ronny:
Zitat von: RoBra81 am 22 Juli 2016, 09:56:39
Nein, habe ich nicht, aber ein Blick in den Quellcode lässt vermuten, dass es nicht gehen wird
Verdammt richtig - aber nun ;) Habe den Teil mit dem @ vor den Rivescript Call gelegt. Somit sollte das nun wie vorgeschlagen klappen können?

@Cori:
Zitat von: Cori am 12 Juli 2016, 05:07:47
Noch eine Frage zur Speicherung der ReadingsVal-Aufrufe. Ich bekomme die calls normal angezeigt bei einer Ausgabe. Aber eine direkte Speicherung in einer Variable ohne Anzeige bekomme ich einfach nicht hin. Denke ich hier falsch? Mein Aufruf <set reading=<call>readingsval Name reading FEHLER</call>>

ich habe folgenden RiveScript-Code probiert:
+ readingsetcall
- Reading the Reading: <set reading=<call>readingsval KU_SWITCH_COFFEE_Sw state Error</call>>
^ Getting the Reading: <get reading>


Und bekomme korrekterweise folgenden Output:
Reading the Reading:
Getting the Reading: off


Wie sah denn dein Code aus?

Viele Grüße,
Uli

Cori

Hmm, das ist sehr komisch ...

Wenn ich folgenden RiveScript-Code habe:
+ *
- Oh, das konnte ich (noch) nicht deuten. {@user nicht verstanden <star>}

+ user nicht verstanden *
- <set reading=<call>readingsval Telegram msgPeer FEHLER</call>>
^ <call>fhem trigger Meldung.Mail Cori nicht verstandene Nachricht von <get reading>: <star></call>


und Razupaltuff schreibe, bekomme ich über Telegram folgendes:
ZitatOh, das konnte ich (noch) nicht deuten. : razupaltuff</call>
und per Mail (trigger Meldung.Mail ist mein eigener Mail-Service, daran liegt es aber definitiv nicht):
Zitatnicht verstandene Nachricht von <call>readingsval Telegram msgPeer FEHLER

Wenn ich aber den <call> für den FHEM-Befehl weglasse:
- <set reading=<call>readingsval Telegram msgPeer FEHLER</call>>
^ fhem trigger Meldung.Mail Cori nicht verstandene Nachricht von <get reading>: <star>


Erhalte ich korrekter Weise direkt in Telegram (wie von dir getestet):
ZitatOh, das konnte ich (noch) nicht deuten. fhem trigger Meldung.Mail Cori nicht verstandene Nachricht von Cori: razupaltuff

Habe aber keine Ahnung, woran das liegen könnte ...

Noch eine Anmerkung: für das TALKTOUSER-Device funktioniert der querytotarget Befehl nicht für Telegram, wenn man einen Benutzer via Telegram:@peer angibt. Es liegt an der Prüfung in Zeile 271, ob das Device definiert ist, da der komplette Ausdruck und nicht nur das eigentliche Device vor dem Doppelpunkt. Wenn ich diese auskommentiere, klappt es.
Daher mein Vorschlag für diese Zeile:
my $targetDeviceCheck = $targetDevice;
$targetDeviceCheck =~ s/:.*//;
return "set $name querytotarget requires a correct target device" if(!defined($defs{$targetDeviceCheck}));


VG Cori
diverse HomeMatic-Komponenten per HMLan und HMUART als IODevs und einige HUE-Lampen über HUE-Bridge2 an BananaPis mit Debian

d.schoen

Hallo zusammen, zunächst mal vielen Dank für das Modul. Ich habe es mir vorgestern installiert, komme aber leider nicht wirklich weiter.

Mein TALKTOUSER Modul ist entsprechend konfiguriert und das TALKTOME wird als IODev sauber angezeigt. Die Antworten vom TALKTOME werden auch im TALKTOUSER angezeigt. Soweit passt alles.

Ich würde die Antworten gern an mein TelegramBot Device namens "tgbot" zurückspielen und zwar an meinen Account "@2239....".

Im globalMsg wurden daher hinterlegt:
attr globalMsg msgContactPush tgbot
attr globalMsg msgRecipientPush 2239....


Was stimmt daran nicht? Die Nachrichten kommen leider nicht an. Auch wenn ich manuell ein "msg TALKTOUSER 0 | | Test ausführe geht nix...

Vielen Dank für eure Hilfe.
FHEM 5.7 auf RasPi2
COC 868MHz, Jeelink Clone
Devices: IT, HomeMatic, LaCrosse, ENIGMA2, LG-TV, Thinkingcleaner (iRobot Roomba), LIFX Wifi-Bulbs
Helper: TelegramBot, Homebridge (Siri), Geofency

SirUli

Zitat von: d.schoen am 05 August 2016, 07:18:46
Was stimmt daran nicht? Die Nachrichten kommen leider nicht an.
Hi,
also ich denke da sind ein paar Sachen durcheinander geraten :)

  • Die globalen variablen auf dem globalMsg ziehen nur wenn du eine Nachricht lossendest, die keinen Empfänger hat. Also beispielsweise "msg foo"
  • Wenn du via Telegram kommunizieren willst, solltest du (wie hier beschrieben), die Attribute talktouserMonitorReading sowie talktouserModSourceDev setzen

Für Telegram ist das bei dir wohl so:
attr tgbot talktouserMonitorReading msgText
attr tgbot talktouserModSourceDev %DEVICE%:@%%msgPeerId%%


Hilft dir das?

d.schoen

Danke!

Die Attribute sind aber leider genau so eingetragen. Ich muss ja %%msgPeerId%% und %DEVICE% nicht durch die expliziten Deklarationen ersetzen, oder?
FHEM 5.7 auf RasPi2
COC 868MHz, Jeelink Clone
Devices: IT, HomeMatic, LaCrosse, ENIGMA2, LG-TV, Thinkingcleaner (iRobot Roomba), LIFX Wifi-Bulbs
Helper: TelegramBot, Homebridge (Siri), Geofency

hartenthaler

Diese Modul macht echt Freude! Nachdem ich im Telegram-Chatbot nun ziemlich viel mit Text gearbeitet habe, habe ich just eine Möglichkeit gesucht eine Frage mit einem Plot aus FHEM zu beantworten. Beispielsweise möchte ich auf die Frage "Wie hoch ist der CO2 Gehalt?" die Überblicksgrafik für den aktuellen Tag zugeschickt bekommen. Ging dann eigentlich auch ganz einfach:

im RiveScript-file (habe das File übrigens TALKTOME.rive.cfg genannt, damit ich es einfach mit dem fhem-Editor per "Edit files" bearbeiten kann)

+ wie [hoch] ist [der] co2 [*]
- <call>perl send_plot_telegram SVG_FileLog_NETATMO_CO2</call>


und eine Funktion in 99_myUtils.pm

### Plot per Telegram verschicken
# Beispiel: send_plot_telegram("SVG_FileLog_NETATMO_CO2");
sub send_plot_telegram($) {
my ($plot) = @_;
$plot = "{plotAsPng('".$plot."')}";
TelegramBot_ExecuteCommand($defs{"Telegram.Bot"}, "xxx", $plot);
}

wobei xxx die Telegram Ziel-ID ist.

Dann kommt auf die Frage prompt die Grafik im Chat angesaust. Allerdings kleckert da noch ein "<stream:29805>" hinterher. Kann man das unterdrücken?
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

andreas13

Hallo hartenthaler,

wenn Du Deiner Routine noch ein "return" spendiert, ist die Meldung weg.

Gruß

Andreas
Maintainer des Vitoconnect Moduls
In Betrieb: FritzBox 7590, Homematic
piko Wechelrichter (HTTPMOD). Sonos ....
noch: IT

hartenthaler

ein return; oder ein return ""; verschlimmbessert es leider noch. Dann kommt neben der Grafik noch die anschließende Meldung "TALKTOME: No Answer received - that should not be happening. Check with your admin". Und wie meist bei solchen Meldungen bin ich selbst der unwissende admin ;-)
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

andreas13

Zitat von: hartenthaler am 21 August 2016, 03:16:50
ein return; oder ein return ""; verschlimmbessert es leider noch. Dann kommt neben der Grafik noch die anschließende Meldung "TALKTOME: No Answer received - that should not be happening. Check with your admin". Und wie meist bei solchen Meldungen bin ich selbst der unwissende admin ;-)

Also bei mir geht's. Wie rufst du die Funktion auf?


Gesendet von iPad mit Tapatalk
Maintainer des Vitoconnect Moduls
In Betrieb: FritzBox 7590, Homematic
piko Wechelrichter (HTTPMOD). Sonos ....
noch: IT

andreas13

Moin,

ich liebe dieses Modul! Nur eine Sache bekomme ich nicht hin:

TALKTOUSER_ANDI 0 | | Die Temperatur im Wohnzimmer beträgt 23.0 °C (2016-08-20 14:28:56)

Warum steht vor jeder meiner Antwort meines Bots "TALKTOUSER_ANDI 0 | | "?

Den Bot habe ich eingerichtet:
talktouserModSourceDev %DEVICE%:@%%msgPeerId%%
talktouserMonitorReading msgText


Den Bot in globalMsg eingetragen:
msgContactPush  MeinBot

TALKTOME und TALKTOUSER Devices sind angelegt und soweit ich verstehe auch korrekt.

Ich hätte erwartet, dass "TALKTOUSER_ANDI" durch "@meinBot" ersetzt würde. Habe ich da irgendwas falsch verstanden oder konfiguriert?

Viele Grüße

Andreas

Maintainer des Vitoconnect Moduls
In Betrieb: FritzBox 7590, Homematic
piko Wechelrichter (HTTPMOD). Sonos ....
noch: IT

hartenthaler

Ich habe neben meinem Problem mit dem Senden von Bildern und Dokumenten (dazu morgen mehr) noch ein Problem mit Umlauten, die in einem Reading vorkommen und an den Telegram-Client geschickt werden sollen.

! array termintage   = heute|morgen
! array terminehaben = habe ich|haben wir|stehen|gibt es

+ welche termine (@terminehaben) [im kalender] [für] (@termintage) [im kalender|an]
* <star2> == heute => <call>readingsval cv_KalenderGH sprache_heute Error</call>
* <star2> == morgen => <call>readingsval cv_KalenderGH sprache_morgen Error</call>


Das Reading sprache_heute in meinem Kalender enthält z.B. "Für heute stehen keine Termine im Kalender.". Wenn ich das aber im Dialog - so wie oben zu sehen - mit "Welche Termine habe ich heute" abfrage, dann erhalte ich im Client die Antwort "Für heute stehen keine Termine im Kalender.". Es scheint irgendetwas mit der UTF8-Codierung schief zu gehen. Wenn ich dieses Reading direkt in fhem per Telegram-Modul verschicke, dann landen die Umlaute korrekt beim Client, also müsste es ein Problem im Systemmakro <call>readingsval ...</call> von TALKTOME sein.

Und ja, ich würde den Vorspann vor jeder Antwort (bei mir "TalkToUser_Hermann 0 | | ") auch gerne wegbekommen.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

SirUli

Hi zusammen,

sorry der Urlaub hatte meine Antwortgeschwindigkeit etwas negativ beeinflusst.

Zitat von: andreas13 am 21 August 2016, 12:12:40
Warum steht vor jeder meiner Antwort meines Bots "TALKTOUSER_ANDI 0 | | "
Interessant - ich habe gerade mal wieder ein FHEM update gemacht und bekomme das nun auch. Ich mache mich mal auf die Suche...

Zitat von: hartenthaler am 28 August 2016, 04:23:56Es scheint irgendetwas mit der UTF8-Codierung schief zu gehen.

Checke ich mal.

thats

Hallo,
ich hab mir das Modul angesehen und bin richtig begeistert davon (:
Leider hab ich ein kleines Problem, dass die Antworten nicht so recht raus wollen. TALKTOME empfängt sie, verarbeitet sie, kann sie aber offenbar nicht via Telegram weiter geben.

Ich hab das wie folgt konfiguriert. Ist da ein Fehler?

define TelegramBot TelegramBot 267XXXXX:AAFHcXXXXX
attr TelegramBot userattr talktouserMonitorReading talktouserModSourceDev
attr TelegramBot allowUnknownContacts 0
attr TelegramBot cmdFavorites /cmd
attr TelegramBot cmdKeyword MXXXX
attr TelegramBot favorites [BadHzg]=setXXXX
attr TelegramBot pollingTimeout 180
attr TelegramBot room Zentrale
attr TelegramBot talktouserModSourceDev %DEVICE%:@%%msgPeerId%%
attr TelegramBot talktouserMonitorReading msgText

define TelegramSVGsend notify TelegramBot:msgText:./SVG {TelegramBot_ExecuteCommand($defs{"TelegramBot"}, 74789398, '{plotAsPng("Grafik_Temperatur_Bad")}');; return;;}

define globalMsg msgConfig
attr globalMsg comment FHEM Global Configuration for command 'msg'
attr globalMsg group Global
attr globalMsg stateFormat fhemMsgState
attr globalMsg verbose 3

define FHEMTALKTOME TALKTOME
attr FHEMTALKTOME room Zentrale
attr FHEMTALKTOME rsbrainfile ./FHEM/TALKTOME.rive
attr FHEMTALKTOME rspunctuation .,!?;;:¡¿/
define TALKTOUSER_Christoph TALKTOUSER
attr TALKTOUSER_Christoph IODev FHEMTALKTOME
attr TALKTOUSER_Christoph nomatch Ich konnte leider keine gute Antwort finden!
attr TALKTOUSER_Christoph noreply Ich weiss leider nicht was ich darauf sagen soll!
attr TALKTOUSER_Christoph realname TALKTOUSER_Christoph
attr TALKTOUSER_Christoph room Zentrale

Trotzdem bekomme ich immer diesen Fehler im Log:
2016.09.26 11:02:58 3: msg TALKTOUSER_Christoph 0 | | Sorry, ich habe das nicht verstanden. Ein paar Beispiele für Kommandos:"Wie warm ist es in der Küche?""Wie ist das Wetter heute?" : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

Was mach ich hier falsch?
Danke für die Hilfe!

Christoph

hartenthaler

Hallo @SirUli!
Ich weiß: bei den ToDos ist noch offen, dass mehrere Nutzer unterstützt werden. Ich selber rede schon länger mit meinem Chatbot und hole mir so Infos und lasse ihn fhem steuern. Nun wollte ich das heute auch für meine Frau einrichten. Ich habe sie in meinem TelegramBot im Attribut cmdRestrictedPeer als berechtigten zweiten Nutzer hinzugefügt. Nun kann sie Chat-Nachrichten an meinen Rivescript-Chatbot schicken, der auch brav antwortet; allerdings gehen - verständlicherweise - die Antworten aber an den mir zugeordneten Telegram-Chat und meine Frau bekommt keine Antworten. Ideal wäre natürlich: sie chattet unabhängig von mir, so ja wohl das Konzept mit dem Modul TALKTOUSER. Akzeptabel wäre aber auch, dass die Chatbot-Antworten immer an beide Nutzer (also mich und meine Frau) rausgehen würden. Geht das?

Oder kann ich alternativ einfach alles doppelt aufsetzen, also zwei mal Telegram, zwei mal TALKOTOME, zwei mal TALKTOUSER und ? zwei mal msg?
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

McUles

Zitat von: thats am 26 September 2016, 11:14:47
Trotzdem bekomme ich immer diesen Fehler im Log:
2016.09.26 11:02:58 3: msg TALKTOUSER_Christoph 0 | | Sorry, ich habe das nicht verstanden. Ein paar Beispiele für Kommandos:"Wie warm ist es in der Küche?""Wie ist das Wetter heute?" : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

Hast du das Problem lösen können? Sitze gerade über der selben Meldung ^^
FHEM @Proxmox, 27" Touchscreen@PI3
1xZME_UZB1@PI2, 1xZME_RAZ_EU@PI2, 1xZME_WALLC-S, 1xFIBEFGS-222, 2xFIBEFGS-212, 6xFIB_FGMS-001, 4xZME_05467
1xMAXCube, 12xMAX! Heizkörper-Thermostat+
1xHM-LGW-O-TW-W-EU, 5xHM-CC-RT-DN, 2xHM-TC-IT-WM-W-EU, 1xHM-LC-Sw4-DR, 1xKeymatic, 3xHM-ES-PMSw1-Pl
Liste zu lang...

thats

Zitat von: McUles am 27 November 2016, 11:00:55
Hast du das Problem lösen können? Sitze gerade über der selben Meldung ^^

Leider nein.. Warte selbst noch auf Hilfe.. Hab's auch versucht alles nochmal von Neuem aufzubauen, allerdings ohne Erfolg. Zwischenzeitlich hatte ich auch einen Wechsel von Raspi1 auf Raspi2, leider auch hier selbes Problem.

hartenthaler

@thats und @McUles: Die Fehlermeldung ist doch sehr präzise: "Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush", d.h. es fehlt ein Eintrag im Attribut msgContactPush. Bei mir steht dort:
attr globalMsg msgContactPush Telegram.James.Bot
Also die Telegram-Instanz, die für den Chat verantwortlich ist.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

fhemhurz

So jetzt kommt nach thats und McUles der Nächste mit dem msContactPush-Problem. Auch ich hatte die Fehlermeldung ""Could not find any Push or Mail contact for device globalMsg..." erhalten. Beim Versuch msgContactPush zu setzen, wird in der Attribut-Liste jedoch kein msgContact<Type> (also auch kein msgContactPush) angeboten. Schreibe ich das Attribut direkt per Editor in die fhem.cfg

define globalMsg msgConfig
attr globalMsg comment FHEM Global Configuration for command 'msg'
attr globalMsg group Global
attr globalMsg msgContactPush Telegram
attr globalMsg stateFormat fhemMsgState
attr globalMsg verbose 3


bekomme ich nach dem erneuten Einlesen der Konfiguration den Fehler

globalMsg: unknown attribute msgContactPush. Type 'attr globalMsg ?' for a detailed list.

Die "detailed list" sieht dann so aus:

globalMsg: unknown attribute ?, choose one of
alias comment eventMap group room suppressReading userReadings verbose msgCmdAudio msgCmdAudioShort
msgCmdAudioShortPrio msgCmdLight msgCmdLightHigh msgCmdLightLow msgCmdMail msgCmdMailHigh
msgCmdMailLow msgCmdPush msgCmdPushHigh msgCmdPushLow msgCmdScreen msgCmdScreenHigh
msgCmdScreenLow msgFwPrioAbsentAudio msgFwPrioAbsentLight msgFwPrioAbsentScreen
msgFwPrioEmergencyAudio msgFwPrioEmergencyLight msgFwPrioEmergencyPush msgFwPrioEmergencyScreen
msgFwPrioGoneAudio msgFwPrioGoneLight msgFwPrioGoneScreen msgLocationDevs msgPriorityAudio msgPriorityLight
msgPriorityMail msgPriorityPush msgPriorityScreen msgPriorityText msgResidentsDev msgSwitcherDev msgThPrioHigh
msgThPrioNormal msgThPrioAudioEmergency msgThPrioAudioHigh msgThPrioTextEmergency msgThPrioTextNormal
msgThPrioGwEmergency msgTitleAudio msgTitleAudioShort msgTitleAudioShortPrio msgTitleLight msgTitleLightHigh
msgTitleLightLow msgTitleMail msgTitleMailHigh msgTitleMailLow msgTitlePush msgTitlePushHigh msgTitlePushLow
msgTitleScreen msgTitleScreenHigh msgTitleScreenLow msgTitleText msgTitleTextHigh msgTitleTextLow msgType
event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat
timestamp-on-change-reading cmdIcon devStateIcon devStateStyle icon onOffDevice sortby webCmd widgetOverride
userattr


Da bei anderen Anwendern das Zusammenspiel zwischen Msg und Telegram zu klappen scheint, sind wir Drei wohl an dasselbe (Konfigurations-)Problem geraten...

CUL 868, CUL 433, Signalduino, HUE, deCONZ, ESPEasy, Intertechno, Siro, FritzBox 7490, Raspberry Pi 1 2 3

SalvadoreXXL

Hi,

ich habe auch das Problem hier. Hab gestern TALKTOME für Telegram bei mir eingerichtet. Antworten bekomme ich nur mit


attr globalMsg msgContactPush MeinBot


Habe einige Stunden damit zugebracht, den Fehler zu suchen. Bei jeder Antwort erscheint nun am Anfang der Zeile der Devicename von TALKTOUSER. Ist das normal und kann man das abstellen?

hartenthaler

Zitat von: fhemhurz am 14 Januar 2017, 16:26:23
Da bei anderen Anwendern das Zusammenspiel zwischen Msg und Telegram zu klappen scheint, sind wir Drei wohl an dasselbe (Konfigurations-)Problem geraten...

Ich verstehe erst jetzt Dein Problem - obwohl es offensichtlich war: Du kannst kein Attribut msgContactPush für globalMsg angeben. Das muss als User-Attribut definiert werden!

Bei mir steht in global (! nicht globalMsg) als userattr u.a. folgendes

attr global userattr alarmDevice ... icon msgContactAudio msgContactLight msgContactMail msgContactPush msgContactScreen msgRecipient msgRecipientAudio msgRecipientLight msgRecipientMail msgRecipientPush msgRecipientScreen msgRecipientText ...

so dass ich das msgContactPush problemlos definieren konnte (wird im FHEM wiki für Msg https://wiki.fhem.de/wiki/Msg im Abschnitt "Attribute für alle FHEM Devices" beschrieben).
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

hartenthaler

Ich weiß nicht, wer hier überhaupt einen Chatbot mit RiveScript am laufen hat. Ich habe einiges ausprobiert und finde es spannend so etwas im Kleinen auszuprobieren, was Siri oder Alexa im Großen zu Stande bringen. Zu Beginn meiner Ausbildung, vor Jahrzehnten, hatte ich mal Kontakt mit einem in BASIC programmierten Programm namens ELIZA und seither finde ich Chatbots äußerst spannend. Anbei sind ein paar Files, die ich erstellt habe. Nicht alles wird für jeden interessant sein, aber vielleicht sind ein paar spannende Bausteine für einige von Euch dabei. Die Files begin.rive und standard.rive braucht man in irgendeiner Weise auf jeden Fall, der Rest ist Kür und muss natürlich auf die eigenen Bedingungen angepasst werden. Ich habe meine persönlichen Daten jeweils durch xxx ersetzt. Natürlich würde mich auch sehr dafür interessieren was ihr so umgesetzt habt. Super fände ich es, wenn mein Chatbot sich mit Rezepten und Kochen auskennen würde, wenn er auf Wolfram Alpha oder wikipedia zugreifen könnte oder wenn er Schach spielen könnte. Als nächstes möchte ich noch etwas mehr für die Sicherheit tun, etwa beim Öffnen der Garage eine Zwei-Faktor-Authentifizierung einbauen. Bleibt also noch einiges zu tun.
Viele Grüße Hermann
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

ripper

Hallo Hermann

ich hatte Taltktome in Verbindung mit einem TelegramBot vor einiger Zeit (eig. als das Modul hier vorgestellt wurde) einmal ausprobiert. Allerdings hatte ich da gerade erst mit Fhem angefangen, und konnte die Beispiele nicht nachbauen um bei mir auch effektiv etwas zu schalten.
Mittlerweile, kann ich zwar immer noch nicht programmieren, aber mit Vorlage bekomme ich doch die ein oder andere if else abfrage zusammen. Ich habe mir mit Hilfe des Forums eine kleine Menüsteuerung zusammengebaut, wollte aber eig. schon gerne nocheinmal einen Versuch mit RiveScript starten.
Hast du eine Lösung, dass zwei Telegram User mit dem Bot sprechen können?? Die Antworten sollten natürlich nur an den Schreibenden gehn...wenn ich da an den WAF denke..der würde ganz schön in den Keller gehen wenn meine Frau jedes mal die Antworten von dem Bot bekommen würde, wenn ich ihn anschreibe.

Viele Grüsse
Flo

djfflow

Hallo,
ich habe das Modul nach einigen Versuchen auch mit Telegram am laufen.
Super Arbeit.
Was mich etwas stört ist, dass wenn ich die .rive Datei änder ich jedesmall FHEM neustarten muss. Ist dies einfacher möglich?

JoeALLb

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

hartenthaler

Ich habe mir dazu extra ein Kommando "reloadrs" definiert, das noch einmal ein paar Tastendrücke einspart.
defmod c_reloadrs cmdalias reloadrs AS set TalkToMe reload
attr c_reloadrs group Systembefehle
attr c_reloadrs room System
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

yrwyddfa

Hallo Hartenthaler,

vielen Dank für deine rivescript-Dateien! Rivescript macht ja echt super viel Spaß (will mich daran probieren, unterschiedliche Antworten auszugeben, je nach dem, wie der bot gelaunt ist  ;D ). Wie ich sehe, nutzt du (ganz rivescript-konform auch mehrere Dateien in einem separaten Verzeichnis. Sehe ich das richtig, dass man das Verzeichnis mit rsbraindir definiert? Und wo legst du das ab? Kann man das gefahrenlos in das ./FHEM als Unterverzeichnis legen oder läuft man da Gefahr, dass es beim Update wegrationalisiert wird?

Danke schon mal für den tollen Input!
If every day has its number, Monday would be a zero division.

JoeALLb

Zur Info: Mit Tasker now lässt sic h die Google-Now Sprachsteuerung relativ einfach 1:1 auf die Rive-scripts umleiten, rückmeldung kann darüver über Telegram gegeben werden! So machts gleich noch mehr spaß!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

yrwyddfa

Dank Ripper läuft das jetzt bei mir auch super!

Einziger Wermutstropfen ist die "Präfix"  TALKTOUSER_ME 0 | |

Gibt es hier hier mittlerweile etwas neues?
If every day has its number, Monday would be a zero division.

yrwyddfa

PS, bezüglich dieser seltsamen Ausgabe, das hier wurde mitgeloggt:


msg globalMsg: ID=1493836657.08328.1 TYPE=push ROUTE=TelegramBot STATUS=OK PRIORITY=0 TITLE='' MSG='TALKTOUSER_ME 0 | | Hallo


Vielleicht hilft das?
If every day has its number, Monday would be a zero division.

regenbieger

@yrwyddfa

Ich habe das Problem auch gehabt und folgendermaßen für mich gelöst:
Öffne die 42_TALKTOUSER.pm in /opt/fhem/FHEM mit deinem Lieblingseditor.
Suche folgende Zeile (so ca. Nr.376):
fhem("msg $device $msgPriority $msgTitle $msgMessage");
Mach dir ne Kopie davon, die kannst du dann auskommentieren und das Original folgendermaßen ändern:
fhem("msg $msgMessage");
Dann sollte das so ungefähr aussehen:
my $msgMessage = $answer;



# Dump it to fhem (lets hope for the best ;) )

Log3 $name, 5, "msg $modSourceDeviceName $msgPriority $msgTitle $msgMessage";

#fhem("msg $device $msgPriority $msgTitle $msgMessage");

fhem("msg $msgMessage");

}

return $devHash->{NAME};

dann speichern, in FHEM shutdown restart
ausprobieren und wenns klappt freuen

mfg regenbieger
FHEM und WEEWX auf Raspberry

yrwyddfa

Großartig! Meinen Respekt, Regenbieger, ich folge mal deiner Aufforderung und freue mich! Daran lags!

Sicherheitshalber habe ich mir die alte beibehalten, habe aber die geänderte Version auch noch mal als 42_TALKTOME.pmfix gespeichert, nicht dass bei einem Update die Datei überschrieben wird und der Fehler wieder kommt - dann habe ich den Bugfix zumindest direkt im Verzeichnis und kann die Datei wieder herstellen.

Vielen herzlichen Dank!
If every day has its number, Monday would be a zero division.

yrwyddfa

Hallo SirUli,
die Kommunikation über Talktome läuft wirklich super, tolle Arbeit!

Darf ich ein feature-Request loswerden?

Ich nehme mal an, dass die Message aus #91 zur Unterscheidung dienen soll, wer da gerade am reden ist. Nun würde ich dem setting aber gern eine Sprachausgabe drauf setzen via tts. Da ist dieses Feature natürlich eher hinderlich. Daher öeine Frage:
Wäre es möglich, diesen "Präfix" deaktivierbar zu machen (z.B. via Attribut)?
Das würde die Nutzung deutlich angenehmer gestalten (und erspart den Griff ins Modul nach jedem Update) :)
If every day has its number, Monday would be a zero division.