readingsSingleUpdate($hash, "test_" . lc($room), $room, 1);
$room = encode('iso-8859-1', $room);
readingsSingleUpdate($hash, "test_" . lc($room), $room, 1);
print setlocale(LC_CTYPE);
meint en_US.UTF-8, meine FHEM-Instanz ist auf englisch eingestellt.Zitat von: drhirn am 18 Februar 2021, 17:36:21Mal schauen, ob das noch jemand kompetentes erklärt...
Hätte es halt gerne verstanden.
ZitatmakeReadingName ist eine super Sache! Damit ist mein Problem gelöst.Thx für die Rückmeldung!
ZitatUndefined subroutine &main::RHASSPY_Define called at fhem.pl line 3830.
$hash->{DefFn} = \&RHASSPY_Define;
$hash->{UndefFn} = \&RHASSPY_Undefine;
$hash->{SetFn} = \&RHASSPY_Set;
$hash->{AttrFn} = \&RHASSPY_Attr;
$hash->{AttrList} = "IODev defaultRoom rhasspyIntents:textField-long shortcuts:textField-long rhasspyMaster response:textField-long " . $readingFnAttributes;
$hash->{OnMessageFn} = \&RHASSPY_onmessage;
Zitat von: Beta-User am 19 Februar 2021, 13:19:30
Das sollte erst mal gegen den Absturz helfen:Code Auswählen
$hash->{DefFn} = \&RHASSPY_Define;
$hash->{UndefFn} = \&RHASSPY_Undefine;
$hash->{SetFn} = \&RHASSPY_Set;
$hash->{AttrFn} = \&RHASSPY_Attr;
$hash->{AttrList} = "IODev defaultRoom rhasspyIntents:textField-long shortcuts:textField-long rhasspyMaster response:textField-long " . $readingFnAttributes;
$hash->{OnMessageFn} = \&RHASSPY_onmessage;
ZitatWas "packages" angeht, mag man geteilter Meinung sein. Ich finde das zwischenzeitlich deutlich besser, weil man schlicht und ergreifend nicht aufpassen muss, dass man versehentlich irgendwas aus dem main-Kontext in den Abgrund reißt. Außerdem kann man manche Funktionen klarer adressieren (min vs. minNum).
clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE
Damit hat er den auch in das Clients-Internal aufgenommen, das müßte daher eigentlich passen...Zitat von: Beta-User am 19 Februar 2021, 13:56:19
Es gibt zum Thema packaging keine wirklichen Vorgaben, aber eine nette Diskussion in der Perl-Ecke: https://forum.fhem.de/index.php/topic,110048.msg1040632.html#msg1040632.
Zitat
Das habe ich am M2_CLIENT mal per Attribut versucht:Code AuswählenclientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE
Damit hat er den auch in das Clients-Internal aufgenommen, das müßte daher eigentlich passen...
ZitatMittelfristig gefällt mir der Hybrid nicht, ich würde eigentlich dazu neigen, das komplett auf die M2-IO's zuzuschneiden (vornehmlich CLIENT). Damit hat man dann 0 externe Abhängigkeiten mehr und kann aus SSL.
Zitat von: drhirn am 19 Februar 2021, 14:09:22Na ja, immerhin kommst du irgendwie zurande mit deinem Umbau, also so schlimm kann es eigentlich nicht sein...
Den Thread hab ich sogar mal bei meinen Recherchen gelesen. Alles Bahnhof für mich. Keine Ahnung von Perl, wie gesagt. Und von anderen Programmiersprachen eigentlich auch nicht. Logo, das hab ich noch verstanden. Damals, als kleiner Bub.
Zitat von: drhirn am 19 Februar 2021, 11:49:39Ich bin in etwa auch bei "0" gestartet, was Programmierkenntnisse angeht, und diese Art der "formalisierten Kritik" (und die mehr oder weniger freundlichen Hinweise von RichardCZ zu "meinen" Modulen) haben dann schon was gebracht mit der Zeit. Bei vielem habe ich dann auch erst "häh?!?" gedacht, aber zwischenzeitlich schaue ich mir auch "cruel" an ;D (und erlaube mir dann, manches da zu ignorieren...). Da ist dann auch wieder vieles dabei, was schlicht zur Beschleunigung beiträgt...
Das ist ja eine coole Seite! Ich staune
ZitatJup. Wenn, dann gscheid. Sehe ich auch so.OK, dann bauen wir das in die Richtung um, sobald du das Signal gibst!
Zitat von: Beta-User am 19 Februar 2021, 14:23:57Na ja, immerhin kommst du irgendwie zurande mit deinem Umbau, also so schlimm kann es eigentlich nicht sein...
ZitatOK, dann bauen wir das in die Richtung um, sobald du das Signal gibst!
Zitat von: drhirn am 19 Februar 2021, 15:03:20Na ja, mit etwas Glück sollte es in der zuletzt geposteten Version erst mal mit beiden IO's laufen.
Ich muss da kein Signal geben. Würde mich sehr freuen, wenn du dir die Arbeit antust und helfe gerne mit Tests und Erklärungen zu Rhasspy. Aber es ist nicht "mein" Modul. Kann jeder daran rumschrauben, der das möchte.
ZitatD.h. ich sollte mich mal mit MQTT2_X auseinandersetzen...Abgesehen von diesem Attribut am Interface (und ggf. der Implementierung von "forceNEXT" in RHASSPY) braucht es dazu m.E. keine wirkliche Einarbeitung. Die IODev sind Interfaces und sollten im Hintergrund laufen, ohne den User mit irgendwelchen Details zu langweilen...
defmod rhasspyMQTT2 MQTT2_CLIENT rhasspy:12183
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE
defmod Rhasspy RHASSPY rhasspyMQTT2 Wohnzimmer
attr Rhasspy IODev rhasspyMQTT2
version: '2'
services:
rhasspy:
image: "rhasspy/rhasspy"
container_name: rhasspy
depends_on:
- fhem
restart: unless-stopped
volumes:
- ".config/rhasspy/profiles:/profiles"
ports:
- "12101:12101"
- "12183:12183"
command: --user-profiles /profiles --profile de
fhem:
container_name: fhem-test
restart: unless-stopped
ports:
- "8083:8083"
image: fhem/fhem
volumes:
- ./opt/fhem/:/opt/fhem/
environment:
TZ: Europe/Vienna
rhasspysat:
image: "rhasspy/rhasspy"
container_name: rhasspysat
depends_on:
- fhem
- rhasspy
restart: unless-stopped
volumes:
- ".config/rhasspysat/profiles:/profiles"
- "./asound.conf:/etc/asound.conf"
ports:
- "13101:12101"
command: --user-profiles /profiles --profile de
environment:
- PULSE_SERVER=host.docker.internal
pcm.!default {
type pulse
hint.description "Default Audio Device"
}
ctl.!default {
type pulse
}
version: '3'
services:
rhasspy:
image: "rhasspy/rhasspy"
container_name: rhasspy
restart: unless-stopped
volumes:
- ".config/rhasspy/profiles:/profiles"
- "/etc/localtime:/etc/localtime:ro"
- "/etc/asound.conf:/etc/asound.conf"
ports:
- "12101:12101"
- "12183:12183"
command: --user-profiles /profiles --profile de
devices:
- "/dev/snd:/dev/snd"
ipc: host
RHASSPY: [Rhasspy] Parse (MQTT2_CLIENT : 'rhasspyMQTT2'): Msg: hermes/intent/de.fhem_SetOnOff => {"input": "lampe wohnzimmer an", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "lampe"}, "slotName": "Device", "rawValue": "lampe", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "wohnzimmer"}, "slotName": "Room", "rawValue": "wohnzimmer", "confidence": 1.0, "range": {"start": 6, "end": 16, "rawStart": 6, "rawEnd": 16}}, {"entity": "OnOffValue", "value": {"kind": "Unknown", "value": "an"}, "slotName": "Value", "rawValue": "ein", "confidence": 1.0, "range": {"start": 17, "end": 19, "rawStart": 17, "rawEnd": 20}}], "sessionId": "wohnzimmer-snowboy-36079a54-2f9f-4f14-a4c0-294511c4c5e6", "customData": null, "asrTokens": [[{"value": "lampe", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "wohnzimmer", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 16, "time": null}, {"value": "an", "confidence": 1.0, "rangeStart": 17, "rangeEnd": 19, "time": null}]], "asrConfidence": null, "rawInput": "lampe wohnzimmer ein", "wakewordId": "snowboy", "lang": null}
Zitat von: Beta-User am 19 Februar 2021, 17:48:23
Von daher wäre eher die Frage, ob man es von da nimmt?
qr/^hermes\/intent\/.*[:_]/
qr/^hermes\/intent\/.*[._]fhem[.:_]/
Zitat von: Beta-User am 20 Februar 2021, 11:53:10
Keine Idee, was das für Einflüsse auf FHEMWEB haben könnte. Betrifft das nur das RHASSPY-Device oder allgemein? (Wenn ersteres: kann sein, dass da manche Readings nur aktualisiert werden, wenn MQTT als IO verwendet wird).
Zitat von: drhirn am 20 Februar 2021, 16:49:20Gerne, aber die eine oder andere exemplarisch aufgezeigte Baustelle darfst du dann selber bearbeiten ;) .
Übrigens: Ich bin dir sehr dankbar dafür, dass du dir die Arbeit antust!
Zitat von: Beta-User am 20 Februar 2021, 17:27:41
Gerne, aber die eine oder andere exemplarisch aufgezeigte Baustelle darfst du dann selber bearbeiten ;) .
Zitat
Und wer weiß, vielleicht schaue ich mir Rhasspy doch auch noch an, eine lokale Sprachsteuerungslösung ohne Cloud hat einen gewissen Reiz :) ...
Zitat von: Beta-User am 21 Februar 2021, 09:30:42
Bzgl. "de" nehme ich das mal auf die Liste für den Umbau und werde ggf. versuchen, ein paar "Planken" in die aufgezeigte Richtung einzubauen (falls nicht jemand Kompetenteres bessere Lösungen vorschlägt).
Zitat
IODev aus DEF kannst du für 0.2.1 selbst ausbauen, oder?
Zitat
Generell: Ich schreib' halt auf, was mir auffällt, das ist nicht böse gemeint, und muss auch nicht immer "richtig" (oder berechtigt) sein.
ZitatHmpf, das wollte ich eigentlich vermeiden. Ich weiß nicht, ob ich mit der Verantwortung umgehen kann ;). Aber ich schau mir mal die Voraussetzungen an.
Es wäre ggf. besser, wenn du einen Developer-Status beantragst und wir das in der Developer-Ecke weiterdiskutieren
Zitat von: JensS am 20 Februar 2021, 21:15:35Will mich nicht in den anderen Thread einklinken, daher hier bzgl. $main:
Irgendwie wird mein ResponseOnOff($DEVICE) nicht mehr ausgeführt.
https://forum.fhem.de/index.php/topic,113180.msg1119611.html#msg1119611 (https://forum.fhem.de/index.php/topic,113180.msg1119611.html#msg1119611)
Es dauert lange, bis der Befehl ausgeführt wird. Ein Response findet nicht statt.
::ResponseOnOff($DEVICE)
sub RHASSPY_execute {
my $hash = shift // return;
my $device = shift // carp q[No target device provided!] && return;
my $cmd = shift // carp q[No command provided!] && return;
my $value = shift // carp q[No value provided!] && return;
my $siteId = shift // $hash->{helper}{defaultRoom};
$siteId = $hash->{helper}{defaultRoom} if $siteId eq "default";
# Nutervariablen setzen
my %specials = (
'$DEVICE' => $device,
'$VALUE' => $value,
'$ROOM' => $siteId
);
for my $special (keys %specials) {
$special =~ s{\$}{\\\$}gxms;
$cmd =~ s{$special}{$specials{$special}}gxms;
}
# CMD ausführen
#my $returnVal = eval $cmd;
return AnalyzePerlCommand( $hash, $cmd );
}
PERL WARNING: Use of uninitialized value within %specials in substitution iterator at ./FHEM/10_RHASSPY.pm line 279.
2021.02.22 11:31:22.387 1: ERROR evaluating {ResponseOnOff()}: Not enough arguments for main::ResponseOnOff at (eval 615) line 1, near "()"
sub RHASSPY_execute {
my $hash = shift // return;
my $device = shift // carp q[No target device provided!] && return;
my $cmd = shift // carp q[No command provided!] && return;
my $value = shift // carp q[No value provided!] && return;
my $siteId = shift // $hash->{helper}{defaultRoom};
$siteId = $hash->{helper}{defaultRoom} if $siteId eq "default";
# Nutervariablen setzen
my %specials = (
'%DEVICE' => $device,
'%VALUE' => $value,
'%ROOM' => $siteId
);
$cmd = EvalSpecials($cmd, %specials);
# CMD ausführen
#my $returnVal = eval $cmd;
return AnalyzePerlCommand( $hash, $cmd );
}
Zitat von: Beta-User am 22 Februar 2021, 11:51:56
Hier noch ein Versuch mit EvalSpecials (=>Import):
Zitat von: drhirn am 22 Februar 2021, 13:29:15Ufff...
Der funktioniert! Danke!
ZitatJein...
Sprache sehe ich mir gleich an. Wo würdest du da die unterschiedlichen Ausdrücke platzieren? In %languagevars nehm ich an?
Zitat von: Beta-User am 21 Februar 2021, 08:41:56Der Code sollte bis hierher erst mal nur den 2. Spiegelstrich erfüllen, ohne dass die Funktionalität leidet, da, wo jetzt statt des harten "de" $language bzw. ${language} steht...
Meine Ideen (ohne Anspruch auf Vollständigkeit oder optimierte Gestaltung):
- die Textbausteine in einen Hash packen und den zentral ablegen (irgendwo unter $hash->{helper})
- ein language-Attribut bzw. Internal vorzusehen (per default aus global zu füllen)
- den Internal-Wert dann bei der regex (${language}.fhem) mit berücksichtigen und beim Aufbau des Hashs
- Die Texte sollten dann außerhalb des Moduls abgelegt werden (separate config-file), das ganze dann so, dass configDB es auch versteht (FileRead nutzen und Internal .configfile setzen (?)). Am einfachsten vermutlich im JSON-Format (?). Dann können die User das separat bearbeiten und ggf. viel einfacher wechselseitig austauschen.
$deviceData =qq({"intents/$language.fhem.Shortcuts.ini":"[$language.fhem:Shortcuts]\n);
geht nicht$deviceData='{"intents/'.$language.'.fhem.Shortcuts.ini":"['.$language.'.fhem:Shortcuts]\n';
das geht
$deviceData =qq({"intents/${language}.fhem.Shortcuts.ini":"[${language}.fhem:Shortcuts]\n);
$deviceData->{qq(${language}.fhem.Device)} = \@devices if @devices;
Zitat von: drhirn am 22 Februar 2021, 14:19:08Verstehe. Also, ich kann berichten: Es funktioniert mal nichts nicht. Die Slots/Sentences werden wie erwartet jetzt mit "en.fhem.xxx" benannt. Ansonsten tu ich mir mit dem Testen gerade ein bisschen schwer. Da muss ich mir in einer Pause etwas überlegen.Ziel sollte wie gesagt erst mal sein, dass "de" weiter funktioniert wie gehabt. Dann bauen wir ggf. den Hash (für de) auf, und erst danach könnten/sollten wir uns mit "en" beschäftigen, da gibt es im Moment ja nichts, was wir testen könnten.
ZitatDarf ich dich bitten, mal die aktuelle testing-Branch runter zu laden und dort weiter zu machen. Da sind auch sonst noch ein paar kleine Änderungen von mir dabei. Würde mir das Zusammenführen einfacher machen....hab's mal versucht, gleich 00_MQTT.pm ausgebaut und verwurstelt, was mit spontan vor die Flinte gelaufen ist...
$deviceData =qq({"intents/${language}.fhem.Shortcuts.ini":"[${language}.fhem:Shortcuts]\\n);
Zitat von: drhirn am 22 Februar 2021, 17:26:048)
Ansonsten funktioniert alles.
Zitat von: JensS am 22 Februar 2021, 17:36:03Habe ich gesehen, kann aber im Moment nicht zuordnen, was die Rückmeldung bedeutet und ob das noch aktuell ist...?
Nachdem ich gestern Abend die 0.2.0 getestet habe, wurde mein Logfile (./log/Rhasspy_Intent.log Rhasspy:lastIntentPayload.*) nicht weiter gefüllt.
Es scheint, als wurde kein Event ausgelöst.
Gruß Jens
# Attribute setzen / löschen
sub RHASSPY_Attr {
my $command = shift;
my $name = shift;
my $attribute = shift // return;
my $value = shift;
# Device anlegen
sub RHASSPY_Define { my $hash = shift;
my $def = shift // return; #Beta-User: Perl defined-or
Mit diesem Schlagwort hättest du wohl auch dann was im Inet gefunden ;) . (Und du kannst die dann ruhig rauslöschen, wenn du es "zur Kenntnis genommen" hast...) my $device = shift // carp q[No target device provided!] && return;
Zitat von: Beta-User am 23 Februar 2021, 07:58:03
Das language-Problem hing mit der Parameterübergabe zusammen, beim Löschen wird als Attributwert nichts übergeben, so wäre es richtig:Code Auswählen# Attribute setzen / löschen
sub RHASSPY_Attr {
my $command = shift;
my $name = shift;
my $attribute = shift // return;
my $value = shift;
Zitat von: drhirn am 23 Februar 2021, 08:33:35...dafür gibt's "diff"-Werkzeuge ::) , aber ich hätte ja auch eine Bedienungsanleitung schreiben können (wenn es die schon gegeben hätte, manches hat sich halt auch einfach so ergeben im Lauf der Zeit ::) .)
Ich dachte, das war als Hinweis gedacht, dass du mein if (defined... rausgelöscht hast
2021.02.23 14:03:59.072 5: rhasspyMQTT2: dispatch autocreate=no\000rhasspyMQTT2\000hermes/dialogueManager/sessionStarted\000{"sessionId": "wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925", "siteId": "wohnzimmer", "customData": "snowboy", "lang": null}
2021.02.23 14:03:59.073 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/dialogueManager/sessionStarted => {"sessionId": "wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925", "siteId": "wohnzimmer", "customData": "snowboy", "lang": null}
2021.02.23 14:03:59.073 5: Parsed value: wohnzimmer for key: siteId
2021.02.23 14:03:59.073 5: Parsed value: wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925 for key: sessionId
2021.02.23 14:03:59.073 5: Starting notify loop for Rhasspy, 1 event(s), first is listening_wohnzimmer: 1
2021.02.23 14:03:59.074 5: End notify loop for Rhasspy
2021.02.23 14:04:02.566 5: rhasspyMQTT2: dispatch autocreate=no\000rhasspyMQTT2\000hermes/intent/de.fhem_SetOnOff\000{"input": "deckenlampe aus", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "deckenlampe"}, "slotName": "Device", "rawValue": "deckenlampe", "confidence": 1.0, "range": {"start": 0, "end": 11, "rawStart": 0, "rawEnd": 11}}, {"entity": "OnOffValue", "value": {"kind": "Unknown", "value": "aus"}, "slotName": "Value", "rawValue": "aus", "confidence": 1.0, "range": {"start": 12, "end": 15, "rawStart": 12, "rawEnd": 15}}], "sessionId": "wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925", "customData": null, "asrTokens": [[{"value": "deckenlampe", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 11, "time": null}, {"value": "aus", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 15, "time": null}]], "asrConfidence": null, "rawInput": "deckenlampe aus", "wakewordId": "snowboy", "lang": null}
2021.02.23 14:04:02.567 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_SetOnOff => {"input": "deckenlampe aus", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "deckenlampe"}, "slotName": "Device", "rawValue": "deckenlampe", "confidence": 1.0, "range": {"start": 0, "end": 11, "rawStart": 0, "rawEnd": 11}}, {"entity": "OnOffValue", "value": {"kind": "Unknown", "value": "aus"}, "slotName": "Value", "rawValue": "aus", "confidence": 1.0, "range": {"start": 12, "end": 15, "rawStart": 12, "rawEnd": 15}}], "sessionId": "wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925", "customData": null, "asrTokens": [[{"value": "deckenlampe", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 11, "time": null}, {"value": "aus", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 15, "time": null}]], "asrConfidence": null, "rawInput": "deckenlampe aus", "wakewordId": "snowboy", "lang": null}
2021.02.23 14:04:02.567 5: Parsed value: wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925 for key: sessionId
2021.02.23 14:04:02.567 5: Parsed value: deckenlampe aus for key: input
2021.02.23 14:04:02.567 5: Parsed value: 1 for key: probability
2021.02.23 14:04:02.568 5: Parsed value: wohnzimmer for key: siteId
2021.02.23 14:04:02.568 5: Parsed value: SetOnOff for key: intent
2021.02.23 14:04:02.568 5: Parsed value: deckenlampe for key: Device
2021.02.23 14:04:02.568 5: Parsed value: deckenlampe aus for key: rawInput
2021.02.23 14:04:02.568 5: Parsed value: aus for key: Value
2021.02.23 14:04:02.569 5: handleIntentSetOnOff called
2021.02.23 14:04:02.569 5: Device selected: lampe1
2021.02.23 14:04:02.569 5: rhasspyMapping selected: cmdOn=on,cmdOff=off
2021.02.23 14:04:02.569 5: Cmd: >set lampe1 off<
2021.02.23 14:04:02.569 4: dummy set lampe1 off
2021.02.23 14:04:02.570 5: Running command [off] on device [lampe1]
2021.02.23 14:04:02.570 5: Starting notify loop for Rhasspy, 4 event(s), first is lastIntentTopic: hermes/intent/de.fhem_SetOnOff
2021.02.23 14:04:02.570 5: End notify loop for Rhasspy
2021.02.23 14:04:03.400 5: rhasspyMQTT2: dispatch autocreate=no\000rhasspyMQTT2\000hermes/dialogueManager/sessionEnded\000{"termination": {"reason": "nominal"}, "sessionId": "wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925", "siteId": "wohnzimmer", "customData": "snowboy"}
2021.02.23 14:04:03.400 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/dialogueManager/sessionEnded => {"termination": {"reason": "nominal"}, "sessionId": "wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925", "siteId": "wohnzimmer", "customData": "snowboy"}
2021.02.23 14:04:03.401 5: Parsed value: wohnzimmer-snowboy-64242b0e-c8a2-4237-929c-f2aba9c4e925 for key: sessionId
2021.02.23 14:04:03.401 5: Parsed value: wohnzimmer for key: siteId
2021.02.23 14:04:03.401 5: Starting notify loop for Rhasspy, 1 event(s), first is listening_wohnzimmer: 0
2021.02.23 14:04:03.401 5: End notify loop for Rhasspy
#Beta-User: return value should be reviewed. If there's an option to return the name of the devices triggered by Rhasspy, then this could be a better option than just RHASSPY's own name.
Odd number of elements in anonymous hash at ./FHEM/10_RHASSPY.pm line 55
Can't use an undefined value as a HASH reference at ./FHEM/10_RHASSPY.pm line 930
my %languagevars = (
my %mutated_vowels = \%languagevars{$language}->{mutated_vowels};
Zitat von: drhirn am 23 Februar 2021, 15:30:29Na ja, sollte auch nur erläutern, wie das Prinzip gedacht war; aber wenn es eh' nicht funktioniert, ist es ggf. besser, das an der Stelle asap (ganz) auszubauen.
Ich glaub, das %umlauts brauchen wir gar nicht mehr. Hab das eh durch "makeReadingName" ersetzt. Nur noch nicht genügend getestet.
defmod lampe2 dummy
attr lampe2 rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off\
GetOnOff:currentVal=state,valueOff=off
attr lampe2 rhasspyName lampe,radio
attr lampe2 rhasspyRoom wohnzimmer,schlafzimmer
attr lampe2 room Rhasspy
attr lampe2 setList toggle on off
Msg: hermes/intent/de.fhem_SetOnOff => {"input": "radio an", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "radio"}, "slotName": "Device", "rawValue": "radio", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}, {"entity": "OnOffValue", "value": {"kind": "Unknown", "value": "an"}, "slotName": "Value", "rawValue": "ein", "confidence": 1.0, "range": {"start": 6, "end": 8, "rawStart": 6, "rawEnd": 9}}], "sessionId": "wohnzimmer-snowboy-009282bf-8a7d-4e2b-937f-fa6a15d83268", "customData": null, "asrTokens": [[{"value": "radio", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "an", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 8, "time": null}]], "asrConfidence": null, "rawInput": "radio ein", "wakewordId": "snowboy", "lang": null}
2021.02.24 08:08:29.091 5: Parsed value: wohnzimmer-snowboy-d7762105-c690-44bd-9b39-61d92274ad69 for key: sessionId
2021.02.24 08:08:29.091 5: Parsed value: wohnzimmer for key: siteId
2021.02.24 08:08:29.091 5: mutated_vowels regex is SCALAR(0x5605cc54fe10)
2021.02.24 08:08:29.092 5: RHASSPY: [Rhasspy] Parse returned ARRAY(0x5605cc62e000)
2021.02.24 08:08:32.186 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_SetOnOff => {"input": "deckenlampe an", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "deckenlampe"}, "slotName": "Device", "rawValue": "deckenlampe", "confidence": 1.0, "range": {"start": 0, "end": 11, "rawStart": 0, "rawEnd": 11}}, {"entity": "OnOffValue", "value": {"kind": "Unknown", "value": "an"}, "slotName": "Value", "rawValue": "ein", "confidence": 1.0, "range": {"start": 12, "end": 14, "rawStart": 12, "rawEnd": 15}}], "sessionId": "wohnzimmer-snowboy-d7762105-c690-44bd-9b39-61d92274ad69", "customData": null, "asrTokens": [[{"value": "deckenlampe", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 11, "time": null}, {"value": "an", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 14, "time": null}]], "asrConfidence": null, "rawInput": "deckenlampe ein", "wakewordId": "snowboy", "lang": null}
2021.02.24 08:08:32.186 5: Parsed value: wohnzimmer-snowboy-d7762105-c690-44bd-9b39-61d92274ad69 for key: sessionId
2021.02.24 08:08:32.187 5: Parsed value: wohnzimmer for key: siteId
2021.02.24 08:08:32.187 5: Parsed value: an for key: Value
2021.02.24 08:08:32.187 5: Parsed value: SetOnOff for key: intent
2021.02.24 08:08:32.187 5: Parsed value: deckenlampe for key: Device
2021.02.24 08:08:32.187 5: Parsed value: 1 for key: probability
2021.02.24 08:08:32.187 5: Parsed value: deckenlampe an for key: input
2021.02.24 08:08:32.187 5: Parsed value: deckenlampe ein for key: rawInput
2021.02.24 08:08:32.188 5: handleIntentSetOnOff called
2021.02.24 08:08:32.188 5: Device selected: lampe1
2021.02.24 08:08:32.188 5: rhasspyMapping selected: cmdOn=on,cmdOff=off
2021.02.24 08:08:32.188 5: Running command [on] on device [lampe1]
2021.02.24 08:08:32.189 5: RHASSPY: [Rhasspy] Parse returned ARRAY(0x5605cc781420)
2021.02.24 08:08:32.979 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/dialogueManager/sessionEnded => {"termination": {"reason": "nominal"}, "sessionId": "wohnzimmer-snowboy-d7762105-c690-44bd-9b39-61d92274ad69", "siteId": "wohnzimmer", "customData": "snowboy"}
2021.02.24 08:08:32.979 5: Parsed value: wohnzimmer for key: siteId
2021.02.24 08:08:32.979 5: Parsed value: wohnzimmer-snowboy-d7762105-c690-44bd-9b39-61d92274ad69 for key: sessionId
2021.02.24 08:08:32.979 5: mutated_vowels regex is SCALAR(0x5605cc54fe10)
2021.02.24 08:08:32.980 5: RHASSPY: [Rhasspy] Parse returned ARRAY(0x5605cc62d670)
Zitat von: Beta-User am 24 Februar 2021, 12:24:20
Hm, einen habe ich doch noch, nämlich das mit der anonymen sub in RHASSPY_ReplaceReadingsVal()...
Zitat von: drhirn am 24 Februar 2021, 12:26:33Danke für die Rückmeldung!
Woooooow, jetzt funktioniert's wirklich wieder. Das Update der Devices mein ich. Danke! 8)
ZitatVermutlich wird 4. recht einfach zu lösen sein, wenn du durch 2. mal soweit durch bist (das ist nur eine vage Vermutung). Das mit dem Aufräumen geht dann vermutlich auch "nebenbei". Dabei halt aufpassen, ob das, was die Prototypes suggerieren auch richtig ist (siehe unseren Attribute-Fall).
Meine To-Dos sind momentan:
1. überlegen, was ich zu Mittag esse
2. versuchen, deine ganzen Verbesserungen zu verstehen
3. den Timer verbessern
4. überprüfen, warum die FHEM-Befehle bei Shortcuts nicht mehr ausgeführt werden
5. Code aufräumen
Dazu eine Frage:
Wenn ich da wirklich siteIDs auslesen soll, wie das im anderen Thread überlegt wurde, sollte ich das fast bei Initalisierung des Moduls machen. Wie verpönt ist das? Und wie gehe ich das am Besten (=FHEM konformsten) an?
Zitat von: drhirn am 24 Februar 2021, 12:29:16Ersetzungen vornehmen. Aber das Ding sah' von der Struktur her "schwierig" aus (eher: man muß wissen, nach was man sucht, um es umzubauen), deswegen dachte ich, es würde dir gefallen, wenn es von der Liste käme... Deiner Rückmeldung entnehme ich, dass auch der Teil weiter funktioniert?
Haha, perfekt! Die wollte ich auch schon mal angehen. Aber keine Ahnung, was die tut. Jetzt erspar ich mir das :D
Zitat von: Beta-User am 24 Februar 2021, 12:50:47
Dann ist der wichtigste Schritt in Richtung 0.3 wohl gegangen...?
Zitat
Vermutlich wird 4. recht einfach zu lösen sein, wenn du durch 2. mal soweit durch bist (das ist nur eine vage Vermutung).
Zitat
Was mehrere Sprachen/RHASSPY-Instanzen angeht, hatte ich auch schon die Frage im Hinterkopf, ob es nicht sinnvoll wäre, das ähnlich zu machen wie bei MGB: Da kann man für jede Instanz ein eigenes "MQTT-Präfix" definieren, das dann in den (global verfügbaren) Attributnamen wieder auftaucht.
Zitat
Weiter fand ich es "befremdlich", bei einem "onOff"-Device überhaupt ein Mapping angeben zu müssen (jedenfalls war es bei dem Muster-dummy dabei, was mir suggeriert, man würde es benötigen). Ich würde mal pauschal annehmen, dass das der Default für alle Devices ist. Eventuell schwirren dann noch Stichworte wie genericDeviceType im Raum, wobei ich noch keine Idee habe, wie und wo man das nutzen kann...
Zitat
Ggf. solltest du dir mal jsonlist und jsonlist2 zu Gemüte führen.
Zitat
Aber das Ding sah' von der Struktur her "schwierig" aus (eher: man muß wissen, nach was man sucht, um es umzubauen), deswegen dachte ich, es würde dir gefallen, wenn es von der Liste käme... Deiner Rückmeldung entnehme ich, dass auch der Teil weiter funktioniert?
Zitat von: drhirn am 24 Februar 2021, 14:34:52Falls ich was beitragen kann, bräuchte ich eine Anleitung für dummies und passende topic/payload-Schnipsel + RAW-defs ;) .
4 dürfte in der Tat eher leicht sein. Das Kommando wird richtig gebaut, kommt aber irgendwie falsch an. Tippe auf ein "Umwandlungsproblem" der geschwungenen Klammern.
ZitatDann wäre auch hier Schritt 1, alle Vorkommen des Präfixes im Code durch eine entsprechende Variable zu ersetzen. Die kann dann aus der DEF kommen, Code dazu fände sich in MGB (btw.: die cref von RHASSPY ist an der Stelle überholt).
Klingt nach einem guten Plan!
ZitatDas Mapping ist keine Pflicht. Du kannst ohne halt den Status des Gerät nicht abfragen ;) .Na ja, wenn man als default von einen onOff-Gerät und on bzw. off (als lc(state)) ausgeht, sollte das häufig schon befriedigende Ergebnisse erbringen...
ZitatMan könnte ihn fragen. Aber es spricht ja nichts dagegen, eine Mapping-Option zu haben, nur eben nicht verpflichtend, sondern "//" ;) .
Warum Thyraz das damals so gelöst hat, weiß ich nicht. Ich schätze mal, um flexibel zu bleiben. Es soll ja Geräte geben, deren "Ein-Status" nicht "on" ist.
ZitatIch hatte die lange nicht auf dem Radar ::) . Darüber bekommst du Rückmeldung, welche Setter ein Device hat, so dass darüber auch rauszubekommen sein sollte, ob onOff zulässig ist, ohne dass man es explizit in irgendeinem mapping angibt...
Kenn ich ausnahmsweise mal beide :)
Warum?
ZitatMir ist in einem Kurztest nichts Negatives aufgefallen. Bin mir halt nicht sicher, warum Thyraz eine abgespeckte Variante gebaut hat. Und nicht-sprechende Variablen sind halt ein bisschen mühsam ;) .Den Grund kenne ich auch nicht (s.o.), aber der Code kam mir an der Stelle irgendwie verbogen vor, daher der Versuch, das funktionsgleich "sauber" zu machen. Ob es Abgespeckt war, hat mich an der Stelle nicht unbedingt interessiert.
attr Rhasspy shortcuts ton aus={fhem ("set RXV777 off")}\
ton an={fhem ("set RXV777 on")}\
du bist cool={fhem ("set Rhasspy speak siteId='wohnzimmer' text='Danke du auch'")}
Msg: hermes/intent/de.fhem_Shortcuts => {"input": "ton an", "intent": {"intentName": "de.fhem:Shortcuts", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-snowboy-4f44e811-513a-4f44-9144-97b7b221f66f", "customData": null, "asrTokens": [[{"value": "ton", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 3, "time": null}, {"value": "an", "confidence": 1.0, "rangeStart": 4, "rangeEnd": 6, "time": null}]], "asrConfidence": null, "rawInput": "ton an", "wakewordId": "snowboy", "lang": null}
Zitat von: Beta-User am 24 Februar 2021, 16:43:03Hab' mir den shortcut-Pfad mal angesehen. Tendenziell würde ich die ganze Syntax und auch den Ablauf ändern...
Ist aber schwierig zu konfigurieren.
attr Rhasspy shortcuts i="ton aus" f="set RXV777 off" n=RXV777\
i="ton an" f="set $NAME on" n=RXV777\
i="du bist cool" f="set $NAME speak siteId='wohnzimmer' text='Danke du auch'"\
i="führe Perl myFunction aus" p='myFunction("argument")' n="device1,device2"
{"input": "ton an", "intent": {"intentName": "de.fhem:Shortcuts",...
attr DEVICE userReadings charger_state:car.* { my $val = ReadingsVal($name,"car","none");; my %rets = ("none" => "-1","1" => "Ready","2" => "Charging","3" => "waiting for car","4" => "Charging finished",);; $rets{$val}}
Zitat von: Beta-User am 25 Februar 2021, 13:57:34
Eine Anmerkung noch:
Dieser Stil gefällt mir nicht so, erst mal eine Ladung Variablen zu definieren und die dann zu füllen. Abgesehen von "außerhalb conditionals" zu definierenden Variablen (und wirklich wichtigem Zeug) mache ich das zwischenzeitlich immer so, dass eine Variable genau dann definiert wird, wenn ich sie das erste Mal brauche. MAn. ist das so herum sauberer, weil man sich sonst ständig die Frage stellt, welchen Wert die Variable denn hat und wo das herkommt...
attr RHASSPY shortcuts ton aus={fhem ("set RXV777 off")}\
i="du bist cool" f="set $NAME speak siteId='wohnzimmer' text='Danke du auch'"\
i="ton an" p={fhem ("set $NAME on")} n=RXV777
$room = $room // $siteId;
$cmd = "defmod timer_$room at +$time set $name speak siteId=\"$siteId\" text=\"taimer abgelaufen\";;setreading $name timer_".$room." 0";
vs. $cmd = "defmod timer_$room at +$time set $name speak siteId=\"$room\" text=\"taimer abgelaufen\";;setreading $name timer_".$room." 0";
$room = $room // $siteId;
Bedeutet: $room bleibt $room, wenn es definiert ist, ansonsten erhält es den Wert von $siteId. return [$name];
$device = split m{,}x, $shortcut->{NAME};
ERROR: >ARRAY(0x55b208b39008)< returned by the RHASSPY ParseFn is invalid, notify the module maintainer
Zitat von: JensS am 28 Februar 2021, 11:51:49(Danke für den Mut zum Testen und die Rückmeldung!)
@drhirn: Hab die gestrige Version von Beta-User installiert. Läuft alles - bis auf die Shortcuts natürlich.
[...]
i="mute off" f"=set receiver mute off"
oder mute off='fhem("set receiver mute off")'
Zitat von: Beta-User am 25 Februar 2021, 18:05:14Also funktionieren sollten:
Hab's mal mit diesen Attributinhalten versucht, aber noch nicht vollständig durchgetestetCode Auswählenattr RHASSPY shortcuts ton aus={fhem ("set RXV777 off")}\
i="du bist cool" f="set $NAME speak siteId='wohnzimmer' text='Danke du auch'"\
i="ton an" p={fhem ("set $NAME on")} n=RXV777
Die Änderungen bzgl. der Auswertung des Attributs kann man an einfachsten in einem list sehen.
Zitat von: drhirn am 28 Februar 2021, 12:28:50Na ja, an der einen oder anderen Stelle meine ich, dass da was verändert wurde, und das (bis auf die benannte Stelle in der cref) sinnvoll! Darfst gerne nachfragen, wenn was unklar ist...
Perfekt, ich danke vielmalst!
Natürlich sehe ich mir die Änderungen an. Passiert bei einem DIFF zwangsläufig ;) . Aber ich will ja wissen, was du da machst. Auch wenn ich manchmal viel nicht verstehe.
Can't use an undefined value as a HASH reference at ./FHEM/10_RHASSPY.pm line 1036
my $mutated_vowels = \%languagevars{$language}->{mutated_vowels};
PERL WARNING: %languagevars{...} in scalar context better written as $languagevars{...} at ./FHEM/10_RHASSPY.pm line 1038, <$fh> line 114.
PERL WARNING: Useless use of push with no values at ./FHEM/10_RHASSPY.pm line 1108, <$fh> line 114.
PERL WARNING: Reference found where even-sized list expected at ./FHEM/10_RHASSPY.pm line 57, <$fh> line 114.
Zitat
Zeile 1295: "Beta-User: warum eigentlich nicht direkt nur den Befehl absetzen...?"
Zitat von: drhirn am 01 März 2021, 14:53:39...ich erst recht nicht...
Das ist schon richtig. Könnte aber natürlich auch sein, dass ich mit einer Alexa nicht die selben Geräte steuern möchte. Aber ist wahrscheinlich eher selten der Fall (außer man testet - wie ich - schon seit Jahren eine "beste" Lösung). Weiß auch nicht, was da schlauer ist.
ZitatIch bin da auch nicht "durch" und finde es an der Stelle auch nachvollziehbar, weil sich ja (theoretisch) immer mal wieder was ändern kann, und da ist es dann einfacher, wenn die Parameter sauber untereinander weg kommen...
Geht auch. Ich bin es einfach so gewohnt, dass ich mir zuerst die "Config" zusammenschreibe und danch den Befehl bastle. Macht's für mich übersichtlicher. Und ich kann den Befehl dann einfach nur kopieren und irgendwo anders genau so wieder einfügen.
PERL WARNING: Use of uninitialized value in substitution iterator at ./FHEM/10_RHASSPY.pm line 1081.
$room =~ s/($keys)/$mutated_vowels->{$1}/g;
Zitat von: drhirn am 01 März 2021, 15:17:36Irgendwie finde ich es (noch) nicht logisch, dass (nur) da die Listen leer sein sollen, müßte man sich ansehen, und an dem direkten join sollte es auch nicht liegen...? Habe mal ein Log eingebaut:
Gelogen. Nur set speak geht nicht.
Da bleiben $unnamedParams und $namedParams leer. Interessantes Detail am Rande: Genau das war der Grund, warum ich angefangen habe, das Modul umzubauen. Hat nämlich damals auch genau deswegen nicht funktioniert. :D
print Dumper([$anon,$h,$name,$command,@values]);
$VAR1 = [
[],
{
'text' => 'test',
'siteId' => 'wohnzimmer'
},
'Rhasspy',
'speak'
];
set Rhasspy speak siteId="wohnzimmer" text="das ist ein text"
$dispatch = {
speak => \&RHASSPY_speak,
textCommand => \&RHASSPY_textCommand,
play => \&RHASSPY_playWav
};
Zitat von: drhirn am 01 März 2021, 16:30:36na ja, in dem Fall ist es eher beuruhigend...
Unsere Zeilennummer werden immer andere sein. Der GitHub-Stand ist nie der aktuellste. Das soll dich nicht beunruhigen.
ZitatTotal lines: 2140Je nachdem würde mich dann auch interessieren, welche Sprache wir grade sprechen, rudimentäres English sollte zwar auch gehen, aber das ist in der Tat ein leerer Hash...
Code lines: 1311
Comment lines: 312
Data lines: 1
Blank lines: 398
POD lines: 118
Total violations: 131
Severity 5: 22
Severity 4: 9
Severity 3: 100
Total subroutines: 59
Average McCabe: 7.88
Zitat von: drhirn am 01 März 2021, 17:15:14textCommand hatte ich verbogen :o , habe jetzt den Hash-Verweis auch noch entsprechend angepasst, siehe Anhang.
Der Befehl lautete bis jetzt:Code Auswählenset Rhasspy speak siteId="wohnzimmer" text="das ist ein text"
Der Versuch ist durchwachsen. Jetzt geht auch textCommand nicht mehr. Weiß aber noch nicht, warum.
Hast du RHASSPY_allRhasspyShortcuts absichtlich nicht mehr drinnen?
Zitat von: Beta-User am 01 März 2021, 17:21:31
Hinweis: Wenn "mal wieder" Prototypen wegfallen, sollte FHEM auch wieder neu gestartet werden, das kann sonst komische Effekte geben
ZitatJe nachdem würde mich dann auch interessieren, welche Sprache wir grade sprechen, rudimentäres English sollte zwar auch gehen, aber das ist in der Tat ein leerer Hash...
ZitattextCommand hatte ich verbogen :o , habe jetzt den Hash-Verweis auch noch entsprechend angepasst, siehe Anhang.
Zitat
Für RHASSPY_allRhasspyShortcuts zähle ich noch einen (auskommentierten) Treffer => brauchen wir in der Form m.E. nicht mehr, ist durch den Attribut-Parser ersetzt.
Zitat von: drhirn am 01 März 2021, 17:28:56Wenn aus
Was meinst du mit "Prototypen wegfallen"?
sub RHASSPY_getMapping($$$$;$) {
sowas hier wird:sub RHASSPY_getMapping {
ZitatUnd was ist das für eine interessante Auflistung?http://perlcritic.com/critique/file (http://perlcritic.com/critique/file) => show stats
Zitat von: Beta-User am 01 März 2021, 14:29:17Will sagen: Ich habe einen Versuch unternommen, den "Sprach-Hash" aufzubohren und an der Stelle mal anzuzapfen, weiß aber noch nicht, ob das funktioniert ::) ... (oder eben Fehler wirft).
Könnte sein, dass das mit den Umlauts jetzt geht und dann auch die Rückmeldungen für Timer-Befehle in de und en funktionieren 8) . Ist aber nicht wirklich getestet...
ZitatHatte ich dann nicht mehr gesehen, aber doppelt genäht und so...
Ja. Auch gefunden. Mein Edit war zur selben Zeit, wie dein Posting.
ZitatSo ähnlich sollte man dann einen Parser aufbauen, der die "Device-Attribute" auswertet; dafür bräuchten wir dann vermutlich einen setter oder wir müßten Events abhören (=> NotifyFn). Letzteres finde ich hier aber fast overdone, (wenn wir sonst keine benötigen und sowieso in der Eventloop eingeklinkt wären).
Verstehe. Perfekt!
set Rhasspy speak siteId="wohnzimmer" text="das ist ein text"
set Rhasspy speak 'siteId="wohnzimmer" text="das ist ein text"'
sub get_unique {
my @arr = sort shift; #we may need to sort, see https://stackoverflow.com/a/30448251
my $sorted = shift; #true if shall be sorted (longest first!)
my %seen;
#method 2 from https://stackoverflow.com/a/43873983
my @unique = grep {!$seen{$_}++} @arr;
return @unique if !$sorted;
my @sorted = sort { length($b) <=> length($a) } @unique;
return @sorted;
}
%seen wird definiert, und dann die noch nicht vorhandenen Hash-Elemente mit "Zahlen" belegt. Ist also eigentlich auch nichts anderes wie das, was vorher da stand, nur etwas komprimierter. Wenn's nicht funktioniert, muss da dann einfach statt "method 2" die alte Zeile rein:# Doubletten rausfiltern
%roomsHash = map { if (defined($_)) { $_, 1 } else { () } } @rooms;
@rooms = keys %roomsHash;
Zitat von: drhirn am 02 März 2021, 10:22:25Na ja, nach dem, was du schilderst, kommen nicht alle raus...
Danke für die Infos! Ich schau mir das an. Im Moment wundere ich mich noch ein bißchen, dass in get_unique nicht alle Devices ankommen. Aber das kann meinem fehlendem Perl-Grundverständnis geschuldet sein.
ZitatGuter Hinweis! Das mit dem Auskommentieren wäre eine Idee, dann können wir ggf. auch weiter recht einfach testen :) .
Rückbau? Warum sollten wir etwas zurück bauen? Der Timer ist gerichtet, wenn man eine Zeile ein- und eine andere auskommentiert. Der Rest funktioniert ja soweit. Sofern man kein Reload des Moduls macht ;) .
ZitatTopic für welchen Rückmeldesatz hättest du gerne?Eigentlich weniger der Rückmeldesatz, sondern das Timer-Kommando; was dann rauskommt, sollte ja im Reading "voiceResponse" zu sehen sein, oder? Werden die Parameter aufgelöst, müßte da dann ja auch was lesbares stehen...
Updating Rhasspy Slots with data (de): {"de.fhem.Color":["grün","blau","gelb","rot"],"de.fhem.Device":[["Musik","deckenlampe","licht","lampe","radio","licht"]],"de.fhem.MediaChannels":[["orf eins","orf zwei","orf drei"]],"de.fhem.NumericType":["Helligkeit"],"de.fhem.Room":[["bad","küche","bad","wohnzimmer","schlafzimmer"]]}
Msg: hermes/intent/de.fhem_SetTimer => {"input": "taimer im bad auf 10 minuten", "intent": {"intentName": "de.fhem:SetTimer", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "bad"}, "slotName": "Room", "rawValue": "bad", "confidence": 1.0, "range": {"start": 10, "end": 13, "rawStart": 10, "rawEnd": 13}}, {"entity": "rhasspy/number", "value": {"kind": "Number", "value": 10}, "slotName": "Value", "rawValue": "zehn", "confidence": 1.0, "range": {"start": 18, "end": 20, "rawStart": 18, "rawEnd": 22}}, {"entity": "Unit", "value": {"kind": "Unknown", "value": "minuten"}, "slotName": "Unit", "rawValue": "minuten", "confidence": 1.0, "range": {"start": 21, "end": 28, "rawStart": 23, "rawEnd": 30}}], "sessionId": "wohnzimmer-snowboy-a4ab8b5e-da43-402f-bf90-4dc8a6bb17d7", "customData": null, "asrTokens": [[{"value": "taimer", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 6, "time": null}, {"value": "im", "confidence": 1.0, "rangeStart": 7, "rangeEnd": 9, "time": null}, {"value": "bad", "confidence": 1.0, "rangeStart": 10, "rangeEnd": 13, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 14, "rangeEnd": 17, "time": null}, {"value": "10", "confidence": 1.0, "rangeStart": 18, "rangeEnd": 20, "time": null}, {"value": "minuten", "confidence": 1.0, "rangeStart": 21, "rangeEnd": 28, "time": null}]], "asrConfidence": null, "rawInput": "taimer im bad auf zehn minuten", "wakewordId": "snowboy", "lang": null}
defmod timer_bad at 2021-03-02T13:35:17 set Rhasspy speak siteId="bad" text="taimer abgelaufen";;setreading Rhasspy timer_bad 0
Taimer in $room gesetzt auf $value $unit.
$VAR1 = 'Musik';
$VAR1 = 'Musik';
$VAR2 = 'deckenlampe';
$VAR3 = 'licht';
$VAR4 = 'lampe';
$VAR5 = 'radio';
$VAR6 = 'licht';
$VAR1 = 'Musik';
$VAR2 = 'deckenlampe';
$VAR3 = 'licht';
$VAR4 = 'lampe';
$VAR5 = 'radio';
$VAR6 = 'licht';
$VAR7 = 1;
defmod lampe1 dummy
attr lampe1 userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 rhasspyChannels:textField-long rhasspyColors:textField-long
attr lampe1 readingList brightness rgb
attr lampe1 rhasspyChannels orf eins=set lampe1 on\
orf zwei=set lampe1 off\
orf drei=set lampe1 on
attr lampe1 rhasspyColors rot=rgb FF0000\
grün=rgb 00FF00\
blau=rgb 0000FF\
gelb=rgb 00F000
attr lampe1 rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off\
GetOnOff:currentVal=state,valueOff=off\
GetNumeric:currentVal=brightness,type=Helligkeit\
SetNumeric:currentVal=brightness,minVal=0,maxVal=255,map=percent,cmd=brightness,step=1,type=Helligkeit\
attr lampe1 rhasspyName deckenlampe,licht
attr lampe1 rhasspyRoom küche,bad
attr lampe1 room Rhasspy
attr lampe1 setList brightness rgb toggle on off
attr lampe1 useSetExtensions 1
Zitat von: Beta-User am 02 März 2021, 15:28:45
Nachtrag: Wenn ich noch ein Beispiel für CustomIntent (Attribut + myUtils-Codeschnipsel) bekomme, kann ggf. auch mal checken, ob man das noch vereinfachen kann bzw. auch im helper-hash vorhalten. Werde im Moment aber aus dem Code nicht recht schlau, was der eigentlich im einzelnen tun soll...
Updating Rhasspy Slots with data (de): {"de.fhem.Color":["HASH(0x56360372fdf8)"],"de.fhem.Device":["HASH(0x56360372f870)"]....
:D
sub Respeak(){
my $name = "Rhasspy"; # Rhasspy durch eigenen Rhasspy-Device-Namen ersetzen
my $Response = ReadingsVal($name,"voiceResponse","Ich kann mich nicht mehr erinnern");
return $Response;
}
attr Rhasspy rhasspyIntents Respeak=Respeak()
Updating Rhasspy Slots with data (de): {"de.fhem.Color":1,"de.fhem.Device":1,"de.fhem.MediaChannels":1,"de.fhem.NumericType":1,"de.fhem.Room":1}
set <rhasspy> reinit language
neu einzulesen, wenn man was angepasst hat.attr <rhasspy> configFile./rhasspy-de.cfg
Zitat von: drhirn am 05 März 2021, 11:04:19Kein Problem, so hatte ich auch Ruhe, um den einen oder anderen Gedanken auszutesten (nachdem ich mir überlegt hatte, wie man das ohne Rhasspy testen kann)...
Ich habe - wie gesagt - zur Zeit ein bisschen viel um die Ohren. Drum war ich da so still. Heute sieht's aber ganz gut aus. Werde daher gleich mal anfangen zu testen. Hab da ja einiges aufzuholen.
Zitat8)
Zuerst mal: Der aktuelle Stand von dir ist im Github in Version 0.4.0beta verewigt. Die rhasspy-de.cfg habe ich auch ins Repo aufgenommen.
Dann: Das funktioniert :) . Zumindest hat ein Kurz-Test nichts Gegenteiliges ergeben.
ZitatMache ich bei Gelegenheit.
Eine Bitte hätte ich noch: Könntest du bitte bei Gelegenheit die CRef mal überfliegen? Ich bin mir nicht ganz sicher, ob ich da alles dokumentiert habe. Und richtig. Ich mach mich in der Zwischenzeit ans Testen.
ZitatUnd zuletzt: Danke!Gerne!
Total lines: | 2439 |
Code lines: | 1549 |
Comment lines: | 317 |
Data lines: | 1 |
Blank lines: | 410 |
POD lines: | 162 |
Total violations: | 70 |
Severity 5: | 0 |
Severity 4: | 0 |
Severity 3: | 70 |
Total subroutines: | 64 |
Average McCabe: | 6,95 |
Zitat von: Beta-User am 05 März 2021, 11:17:09
(nachdem ich mir überlegt hatte, wie man das ohne Rhasspy testen kann)
ZitatIst denn (in groben Zügen) klar, wie es funktioniert?
Zitat von: drhirn am 05 März 2021, 11:57:08Au; wenn, dann unbeabsichtigt... :o >:(
Hast du in der letzten 10_RHASSPY.pm Änderungen von gestern wieder rückgängig gemacht? Bin gerade ein bisschen verwirrt.
Zitat von: drhirn am 05 März 2021, 11:42:50Danke für's Angebot, aber so einfach ist es vermutlich dann doch nicht:
Ich bin jederzeit gerne bereit, dich bei einer Rhasspy-Test-Installation zu begleiten. Mit Docker ist das fix erledigt. Und kann rückstandslos wieder gekübelt werden. Brauchst nur ein Mikro/Webcam für den Betrieb. Wenn's dich interessiert.
ZitatGrundzüge sind erst mal ok, in die Details kommt man am einfachsten rein, wenn man sich die Struktur der Sprachdaten im list anzeigen läßt.
Im Detail hab ich's mir noch nicht angesehen.
Zitat von: Beta-User am 05 März 2021, 12:14:43
Danke für's Angebot, aber so einfach ist es vermutlich dann doch nicht:
Zitat von: Beta-User am 05 März 2021, 12:14:43
(Super wäre eine handy-app, die man kurz aktivieren kann, damit die den "Sound" an die Zentrale schickt, aber sowas scheint es nicht zu geben).
defmod MQTT2_rhasspyMQTT2 MQTT2_DEVICE rhasspyMQTT2
attr MQTT2_rhasspyMQTT2 IODev rhasspyMQTT2
attr MQTT2_rhasspyMQTT2 model shellymotion
attr MQTT2_rhasspyMQTT2 readingList rhasspyMQTT2:shellies/announce:.* { json2nameValue($EVENT) }\
rhasspyMQTT2:shellies/shellymotionsensor-60A42397610C/status:.* { json2nameValue($EVENT) }\
rhasspyMQTT2:shellies/shellymotionsensor-60A42397610C/online:.* online
Zitat von: drhirn am 05 März 2021, 15:19:12OK, anbei der Versuch, das playWav wieder auf deinen Stand zurückzudrehen, Media Control sollte jetzt auch spanisch können...
playWav geht nicht mehr. $namedParams ist leer.
Drum hatte ich das umgebaut. In $cmd steht eh alles drinnen, was wir brauchen.
Zitat von: drhirn am 05 März 2021, 15:39:43Prinzipiell sollte das Erweitern der subscriptions (und Aktivieren von autocreate/simple) der richtige Weg sein, es kommt ja auch was an.
Aber mal was ganz was anderes, damit ich das auch noch verstehe.
[...]
Da ich mir sicher bin, dass die Frage irgendwann kommt: Ist das die richtige Vorgangsweise und wie bekomme ich die anderen Readings auch noch?
Zitat von: JensS am 05 März 2021, 15:47:10Vielleicht nochmal in dem Zusammenhang eine kurze Bezugnahme auf das hier:
@drhirn && Beta-User
Die Möglichkeiten von Rhasspy sind u.a. durch CustomIntents erweiterbar. Ist es möglich/ratsam, die Erweiterungen in separate .pms in einem Unterordner RHASSPY zu legen und diese über Github zentral zur Verfügung zu stellen? So könnte man sich sein Rhasspy, je nach Bedarf, durch wenige Anpassungen zusammenstellen.
Zitat von: Beta-User am 04 März 2021, 08:04:54
- Der Parser für die eigenen Intents ist umgebaut, und der Weg macht nach meinem jetzigen Verständnis auch Sinn, wenn man Parameter aus der Rhasspy-Analyse mitgeben will (wie bei der Wikipedia-Anfrage). Anm.: Für parameterlose Perl-aufrufe ist m.E. der Shortcuts-Weg der elegantere.
Allerdings ist mir völlig unklar, warum da scheinbar immer der $hash (->RHASSPY-Instanz) mit übergeben wird? Müßte eigentlich bei der hier üblichen Notation der Perl-Funktionen in myUtils mit Prototypen Mismatches werfen. Aber vielleicht übersehe ich auch mal wieder was...
Stand: Ungetestet.
Zitat von: drhirn am 05 März 2021, 16:16:43Laß, wie ist, schadet kaum. Du wirst sonst irgendwann wieder an mich denken, wenn du einen Tasmota in Betrieb nimmst oder sonst irgendwas, was grade noch nicht rumfleucht...
Und die bridgeRegexp, lass ich die so? Shellie kommt ja vor. Oder soll ich da alle anderen Einträge löschen?
Zitat von: Beta-User am 04 März 2021, 08:04:54Ok, habe jetzt rund um die App-Beiträge gesehen, wann es eingebaut wurde.
Allerdings ist mir völlig unklar, warum da scheinbar immer der $hash (->RHASSPY-Instanz) mit übergeben wird? Müßte eigentlich bei der hier üblichen Notation der Perl-Funktionen in myUtils mit Prototypen Mismatches werfen. Aber vielleicht übersehe ich auch mal wieder was...
Zitat von: Beta-User am 04 März 2021, 16:33:17Die Hash-Struktur war irgendwie sehr aus dem Handgelenk geschüttelt, wenn es also mit den ganzen Referenzierungen klappt wie erhofft, sollte man die m.E. schnellstmöglich überarbeiten, ich glaube nämlich _nicht_, dass mir an der Stelle mehr gelungen ist wie "funktioniert halt irgendwie und ist nicht komplett seltsam"...
Wenn das klappt, müßte man erst überlegen, ob die JSON-Struktur so "gut" (auch im Sinne von ggf. ausbaufähig) ist [...]
sub RHASSPY_handleCustomIntent {
my $hash = shift // return;
my $intentName = shift;
my $data = shift;
if (!defined $hash->{helper}{custom} || !defined $hash->{helper}{custom}{$intentName}) {
Log3($hash->{NAME}, 2, "handleIntentShortcuts called with invalid $intentName key");
return;
}
my $custom = $hash->{helper}{custom}{$intentName};
Log3($hash->{NAME}, 5, "handleCustomIntent called with $intentName key");
my ($intent, $response, $room);
if (exists $data->{Device} ) {
$room = RHASSPY_roomName($hash, $data);
$data->{Device} = RHASSPY_getDeviceByName($hash, $room, $data->{Device}); #Beta-User: really...?
}
my $subName = $custom->{function};
my @paramNames = $custom->{args};
if (defined $subName) { #might not be necessary...
my @params;
for (@paramNames) {
if ($_ eq 'NAME') {
$_ = $hash->{NAME};
} elsif ($_ eq 'HASH') {
$_ = $hash;
} elsif ($_ eq 'DATA') {
$_ = $data;
} elsif (defined $data->{$_}) {
$_ = $data->{$_}
}
}
my $params = join q{,}, @params;
my $cmd = qq{ $subName( $params) };
Log3($hash->{NAME}, 5, "Calling sub: $cmd");
my $error = AnalyzePerlCommand($hash, $cmd);
$response = $error if $error !~ m{Please.define.*first}x;
}
$response = $response // RHASSPY_getResponse($hash, 'DefaultError');
# Antwort senden
return RHASSPY_respond ($hash, $data->{requestType}, $data->{sessionId}, $data->{siteId}, $response);
}
Zitat von: JensS am 06 März 2021, 11:09:39Biete mal 3-4 Alternativen an:
@Beta-User
Wie sieht dann mein Respeak aus?Code Auswählensub Respeak(){
my $name = "Rhasspy"; # Rhasspy durch eigenen Rhasspy-Device-Namen ersetzen
my $Response = ReadingsVal($name,"voiceResponse","Ich kann mich nicht mehr erinnern");
return $Response;
}
Gruß Jens
sub Respeak{
my $name = "Rhasspy"; # Rhasspy durch eigenen Rhasspy-Device-Namen ersetzen
my $Response = ReadingsVal($name,"voiceResponse","Ich kann mich nicht mehr erinnern");
return $Response;
}
sub Respeak {
my $name = shift // q{Rhasspy};; # Rhasspy durch eigenen Rhasspy-Device-Namen ersetzen
my $Response = ReadingsVal($name,"voiceResponse","Ich kann mich nicht mehr erinnern");
return $Response;
}
sub Respeak {
my $hash = shift // return;
my $name = $hash->{NAME};
my $Response = ReadingsVal($name,"voiceResponse","Ich kann mich nicht mehr erinnern");
return $Response;
}
Zitat von: JensS am 06 März 2021, 13:06:52::)
@Beta-User
Alternative 2.a) hatte ich genau so gemacht. [...] Allerdings bringt shift nichts - es wird immer die Ersetzung bei undef gemacht. Sobald ich "Rhasspie" schreibe, hat Alexa Alzheimer.
sub RHASSPY_handleCustomIntent {
my $hash = shift // return;
my $intentName = shift;
my $data = shift;
if (!defined $hash->{helper}{custom} || !defined $hash->{helper}{custom}{$intentName}) {
Log3($hash->{NAME}, 2, "handleIntentShortcuts called with invalid $intentName key");
return;
}
my $custom = $hash->{helper}{custom}{$intentName};
Log3($hash->{NAME}, 5, "handleCustomIntent called with $intentName key");
my ($intent, $response, $room);
if (exists $data->{Device} ) {
$room = RHASSPY_roomName($hash, $data);
$data->{Device} = RHASSPY_getDeviceByName($hash, $room, $data->{Device}); #Beta-User: really...?
}
my $subName = $custom->{function};
my @params = $custom->{args};
if (defined $subName) { #might not be necessary...
for (@params) {
if ($_ eq 'NAME') {
$_ = $hash->{NAME};
} elsif ($_ eq 'DATA') {
$_ = $data;
} elsif (defined $data->{$_}) {
$_ = $data->{$_}
}
}
my $params = join q{,}, @params;
my $cmd = qq{ $subName( $params) };
Log3($hash->{NAME}, 5, "Calling sub: $cmd");
my $error = AnalyzePerlCommand($hash, $cmd);
$response = $error if $error !~ m{Please.define.*first}x;
}
$response = $response // RHASSPY_getResponse($hash, 'DefaultError');
# Antwort senden
return RHASSPY_respond ($hash, $data->{requestType}, $data->{sessionId}, $data->{siteId}, $response);
}
Zitat von: Beta-User am 05 März 2021, 17:27:32
und ein paar Klammern etc. habe ich auch noch "erlegt" (in der Hoffnung, dass es trotzdem noch korrekt tut, aber übersichtlicher ist...
starte{Command:play} die wiedergabe $de.fhem.Device{Device}
----Device----
defmod lampe1 dummy
attr lampe1 userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 rhasspyChannels:textField-long rhasspyColors:textField-long
attr lampe1 readingList brightness rgb
attr lampe1 rhasspyChannels orf eins=set lampe1 on\
orf zwei=set lampe1 off\
orf drei=set lampe1 on
attr lampe1 rhasspyColors rot=rgb FF0000\
grün=rgb 00FF00\
blau=rgb 0000FF\
gelb=rgb 00F000
attr lampe1 rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=Okidoki\
GetOnOff:currentVal=state,valueOff=off\
GetNumeric:currentVal=brightness,type=Helligkeit\
SetNumeric:currentVal=brightness,minVal=0,maxVal=255,map=percent,cmd=brightness,step=1,type=Helligkeit\
Status:response=Die Temperatur in der Küche beträgt [lampe1:brightness] Grad\
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next\
attr lampe1 rhasspyName deckenlampe,licht,radio
attr lampe1 rhasspyRoom küche,bad
attr lampe1 room Rhasspy
attr lampe1 setList brightness rgb toggle on off play stop pause next previous
----Payloads----
SetMute
Msg: hermes/intent/de.fhem_SetMute => {"input": "on", "intent": {"intentName": "de.fhem:SetMute", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Value", "value": {"kind": "Unknown", "value": "on"}, "slotName": "Value", "rawValue": "gute nacht", "confidence": 1.0, "range": {"start": 0, "end": 2, "rawStart": 0, "rawEnd": 10}}], "sessionId": "wohnzimmer-snowboy-4db538ac-d4ad-4633-af0d-79134ea856c7", "customData": null, "asrTokens": [[{"value": "on", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 2, "time": null}]], "asrConfidence": null, "rawInput": "gute nacht", "wakewordId": "snowboy", "lang": null}
Msg: hermes/intent/de.fhem_SetMute => {"input": "off", "intent": {"intentName": "de.fhem:SetMute", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Value", "value": {"kind": "Unknown", "value": "off"}, "slotName": "Value", "rawValue": "guten morgen", "confidence": 1.0, "range": {"start": 0, "end": 3, "rawStart": 0, "rawEnd": 12}}], "sessionId": "wohnzimmer-snowboy-9cafa03f-726f-4076-a123-25634dd8899f", "customData": null, "asrTokens": [[{"value": "off", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 3, "time": null}]], "asrConfidence": null, "rawInput": "guten morgen", "wakewordId": "snowboy", "lang": null}
Shortcuts:
Msg: hermes/intent/de.fhem_Shortcuts => {"input": "ton an", "intent": {"intentName": "de.fhem:Shortcuts", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-snowboy-cc4118d8-cb3b-4eb5-b4ed-99f18bb0fd85", "customData": null, "asrTokens": [[{"value": "ton", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 3, "time": null}, {"value": "an", "confidence": 1.0, "rangeStart": 4, "rangeEnd": 6, "time": null}]], "asrConfidence": null, "rawInput": "ton an", "wakewordId": "snowboy", "lang": null}
SetOnOff:
Msg: hermes/intent/de.fhem_SetOnOff => {"input": "licht küche aus", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "licht"}, "slotName": "Device", "rawValue": "licht", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "küche"}, "slotName": "Room", "rawValue": "küche", "confidence": 1.0, "range": {"start": 6, "end": 11, "rawStart": 6, "rawEnd": 11}}, {"entity": "OnOffValue", "value": {"kind": "Unknown", "value": "aus"}, "slotName": "Value", "rawValue": "aus", "confidence": 1.0, "range": {"start": 12, "end": 15, "rawStart": 12, "rawEnd": 15}}], "sessionId": "wohnzimmer-snowboy-2ee5ec15-58f4-41ad-aef7-63ec373714ab", "customData": null, "asrTokens": [[{"value": "licht", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "küche", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 11, "time": null}, {"value": "aus", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 15, "time": null}]], "asrConfidence": null, "rawInput": "licht küche aus", "wakewordId": "snowboy", "lang": null}
GetOnOff:
Msg: hermes/intent/de.fhem_GetOnOff => {"input": "läuft radio wohnzimmer", "intent": {"intentName": "de.fhem:GetOnOff", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Status", "value": {"kind": "Unknown", "value": "läuft"}, "slotName": "Status", "rawValue": "läuft", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}, {"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "radio"}, "slotName": "Device", "rawValue": "radio", "confidence": 1.0, "range": {"start": 6, "end": 11, "rawStart": 6, "rawEnd": 11}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "wohnzimmer"}, "slotName": "Room", "rawValue": "wohnzimmer", "confidence": 1.0, "range": {"start": 12, "end": 22, "rawStart": 12, "rawEnd": 22}}], "sessionId": "wohnzimmer-snowboy-9b65e415-bbd3-408b-80ae-651a0c9b7c2e", "customData": null, "asrTokens": [[{"value": "läuft", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "radio", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 11, "time": null}, {"value": "wohnzimmer", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 22, "time": null}]], "asrConfidence": null, "rawInput": "läuft radio wohnzimmer", "wakewordId": "snowboy", "lang": null}
SetNumeric:
Msg: hermes/intent/de.fhem_SetNumeric => {"input": "deckenlampe auf 50 prozent", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "deckenlampe"}, "slotName": "Device", "rawValue": "deckenlampe", "confidence": 1.0, "range": {"start": 0, "end": 11, "rawStart": 0, "rawEnd": 11}}, {"entity": "rhasspy/number", "value": {"kind": "Number", "value": 50}, "slotName": "Value", "rawValue": "fünfzig", "confidence": 1.0, "range": {"start": 16, "end": 18, "rawStart": 16, "rawEnd": 23}}, {"entity": "Unit", "value": {"kind": "Unknown", "value": "prozent"}, "slotName": "Unit", "rawValue": "prozent", "confidence": 1.0, "range": {"start": 19, "end": 26, "rawStart": 24, "rawEnd": 31}}], "sessionId": "wohnzimmer-snowboy-0ae191fc-c0d7-47f5-9ead-8d19e7302c39", "customData": null, "asrTokens": [[{"value": "deckenlampe", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 11, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 15, "time": null}, {"value": "50", "confidence": 1.0, "rangeStart": 16, "rangeEnd": 18, "time": null}, {"value": "prozent", "confidence": 1.0, "rangeStart": 19, "rangeEnd": 26, "time": null}]], "asrConfidence": null, "rawInput": "deckenlampe auf fünfzig prozent", "wakewordId": "snowboy", "lang": null}
Msg: hermes/intent/de.fhem_SetNumeric => {"input": "deckenlampe auf 25", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "deckenlampe"}, "slotName": "Device", "rawValue": "deckenlampe", "confidence": 1.0, "range": {"start": 0, "end": 11, "rawStart": 0, "rawEnd": 11}}, {"entity": "rhasspy/number", "value": {"kind": "Number", "value": 25}, "slotName": "Value", "rawValue": "fünfundzwanzig", "confidence": 1.0, "range": {"start": 16, "end": 18, "rawStart": 16, "rawEnd": 30}}], "sessionId": "wohnzimmer-snowboy-8f199cba-d4c6-46e5-989e-08ec167c20ea", "customData": null, "asrTokens": [[{"value": "deckenlampe", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 11, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 15, "time": null}, {"value": "25", "confidence": 1.0, "rangeStart": 16, "rangeEnd": 18, "time": null}]], "asrConfidence": null, "rawInput": "deckenlampe auf fünfundzwanzig", "wakewordId": "snowboy", "lang": null}
GetNumeric:
Msg: hermes/intent/de.fhem_GetNumeric => {"input": "Helligkeit deckenlampe im bad", "intent": {"intentName": "de.fhem:GetNumeric", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Type", "value": {"kind": "Unknown", "value": "Helligkeit"}, "slotName": "Type", "rawValue": "helligkeit", "confidence": 1.0, "range": {"start": 0, "end": 10, "rawStart": 0, "rawEnd": 10}}, {"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "deckenlampe"}, "slotName": "Device", "rawValue": "deckenlampe", "confidence": 1.0, "range": {"start": 11, "end": 22, "rawStart": 11, "rawEnd": 22}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "bad"}, "slotName": "Room", "rawValue": "bad", "confidence": 1.0, "range": {"start": 26, "end": 29, "rawStart": 26, "rawEnd": 29}}], "sessionId": "wohnzimmer-snowboy-b6d9df29-fb48-48b5-b0bb-1658e229e8dd", "customData": null, "asrTokens": [[{"value": "Helligkeit", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 10, "time": null}, {"value": "deckenlampe", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 22, "time": null}, {"value": "im", "confidence": 1.0, "rangeStart": 23, "rangeEnd": 25, "time": null}, {"value": "bad", "confidence": 1.0, "rangeStart": 26, "rangeEnd": 29, "time": null}]], "asrConfidence": null, "rawInput": "helligkeit deckenlampe im bad", "wakewordId": "snowboy", "lang": null}
Status:
Msg: hermes/intent/de.fhem_Status => {"input": "wie ist der status licht bad", "intent": {"intentName": "de.fhem:Status", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Status", "value": {"kind": "Unknown", "value": "status"}, "slotName": "Status", "rawValue": "status", "confidence": 1.0, "range": {"start": 12, "end": 18, "rawStart": 12, "rawEnd": 18}}, {"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "licht"}, "slotName": "Device", "rawValue": "licht", "confidence": 1.0, "range": {"start": 19, "end": 24, "rawStart": 19, "rawEnd": 24}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "bad"}, "slotName": "Room", "rawValue": "bad", "confidence": 1.0, "range": {"start": 25, "end": 28, "rawStart": 25, "rawEnd": 28}}], "sessionId": "wohnzimmer-snowboy-6906f9f6-f7bf-416c-bc07-78da7bc2ef7d", "customData": null, "asrTokens": [[{"value": "wie", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 3, "time": null}, {"value": "ist", "confidence": 1.0, "rangeStart": 4, "rangeEnd": 7, "time": null}, {"value": "der", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 11, "time": null}, {"value": "status", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 18, "time": null}, {"value": "licht", "confidence": 1.0, "rangeStart": 19, "rangeEnd": 24, "time": null}, {"value": "bad", "confidence": 1.0, "rangeStart": 25, "rangeEnd": 28, "time": null}]], "asrConfidence": null, "rawInput": "wie ist der status licht bad", "wakewordId": "snowboy", "lang": null}
MediaControls:
Msg: hermes/intent/de.fhem_MediaControls => {"input": "previous lied radio bad", "intent": {"intentName": "de.fhem:MediaControls", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Command", "value": {"kind": "Unknown", "value": "previous"}, "slotName": "Command", "rawValue": "voriges", "confidence": 1.0, "range": {"start": 0, "end": 8, "rawStart": 0, "rawEnd": 7}}, {"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "radio"}, "slotName": "Device", "rawValue": "radio", "confidence": 1.0, "range": {"start": 14, "end": 19, "rawStart": 13, "rawEnd": 18}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "bad"}, "slotName": "Room", "rawValue": "bad", "confidence": 1.0, "range": {"start": 20, "end": 23, "rawStart": 19, "rawEnd": 22}}], "sessionId": "wohnzimmer-snowboy-7b7bdb95-93f5-4a3a-b386-d3cff3e37828", "customData": null, "asrTokens": [[{"value": "previous", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 8, "time": null}, {"value": "lied", "confidence": 1.0, "rangeStart": 9, "rangeEnd": 13, "time": null}, {"value": "radio", "confidence": 1.0, "rangeStart": 14, "rangeEnd": 19, "time": null}, {"value": "bad", "confidence": 1.0, "rangeStart": 20, "rangeEnd": 23, "time": null}]], "asrConfidence": null, "rawInput": "voriges lied radio bad", "wakewordId": "snowboy", "lang": null}
GetTime:
Msg: hermes/intent/de.fhem_GetTime => {"input": "wie spät ist es", "intent": {"intentName": "de.fhem:GetTime", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-snowboy-e0312349-ae17-4e92-905a-cce515525efe", "customData": null, "asrTokens": [[{"value": "wie", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 3, "time": null}, {"value": "spät", "confidence": 1.0, "rangeStart": 4, "rangeEnd": 8, "time": null}, {"value": "ist", "confidence": 1.0, "rangeStart": 9, "rangeEnd": 12, "time": null}, {"value": "es", "confidence": 1.0, "rangeStart": 13, "rangeEnd": 15, "time": null}]], "asrConfidence": null, "rawInput": "wie spät ist es", "wakewordId": "snowboy", "lang": null}
GetWeekday:
Msg: hermes/intent/de.fhem_GetWeekday => {"input": "welcher tag ist heute", "intent": {"intentName": "de.fhem:GetWeekday", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-snowboy-02724c86-d588-45e4-9a7e-5a17345b04f8", "customData": null, "asrTokens": [[{"value": "welcher", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "tag", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 11, "time": null}, {"value": "ist", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 15, "time": null}, {"value": "heute", "confidence": 1.0, "rangeStart": 16, "rangeEnd": 21, "time": null}]], "asrConfidence": null, "rawInput": "welcher tag ist heute", "wakewordId": "snowboy", "lang": null}
MediaChannels:
Msg: hermes/intent/de.fhem_MediaChannels => {"input": "Schalte um auf orf zwei", "intent": {"intentName": "de.fhem:MediaChannels", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.MediaChannels", "value": {"kind": "Unknown", "value": "orf zwei"}, "slotName": "Channel", "rawValue": "orf zwei", "confidence": 1.0, "range": {"start": 15, "end": 23, "rawStart": 15, "rawEnd": 23}}], "sessionId": "wohnzimmer-snowboy-6665801a-8946-4ff2-82a8-d3be87fcc60c", "customData": null, "asrTokens": [[{"value": "Schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "um", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 10, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 14, "time": null}, {"value": "orf", "confidence": 1.0, "rangeStart": 15, "rangeEnd": 18, "time": null}, {"value": "zwei", "confidence": 1.0, "rangeStart": 19, "rangeEnd": 23, "time": null}]], "asrConfidence": null, "rawInput": "schalte um auf orf zwei", "wakewordId": "snowboy", "lang": null}
SetColor:
Msg: hermes/intent/de.fhem_SetColor => {"input": "schalte deckenlampe blau", "intent": {"intentName": "de.fhem:SetColor", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "deckenlampe"}, "slotName": "Device", "rawValue": "deckenlampe", "confidence": 1.0, "range": {"start": 8, "end": 19, "rawStart": 8, "rawEnd": 19}}, {"entity": "de.fhem.Color", "value": {"kind": "Unknown", "value": "blau"}, "slotName": "Color", "rawValue": "blau", "confidence": 1.0, "range": {"start": 20, "end": 24, "rawStart": 20, "rawEnd": 24}}], "sessionId": "wohnzimmer-snowboy-cad9a0ea-d333-4fde-81a9-924fb576cbc0", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "deckenlampe", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 19, "time": null}, {"value": "blau", "confidence": 1.0, "rangeStart": 20, "rangeEnd": 24, "time": null}]], "asrConfidence": null, "rawInput": "schalte deckenlampe blau", "wakewordId": "snowboy", "lang": null}
SetTimer:
Msg: hermes/intent/de.fhem_SetTimer => {"input": "taimer im wohnzimmer auf 10 sekunden", "intent": {"intentName": "de.fhem:SetTimer", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "wohnzimmer"}, "slotName": "Room", "rawValue": "wohnzimmer", "confidence": 1.0, "range": {"start": 10, "end": 20, "rawStart": 10, "rawEnd": 20}}, {"entity": "rhasspy/number", "value": {"kind": "Number", "value": 10}, "slotName": "Value", "rawValue": "zehn", "confidence": 1.0, "range": {"start": 25, "end": 27, "rawStart": 25, "rawEnd": 29}}, {"entity": "Unit", "value": {"kind": "Unknown", "value": "sekunden"}, "slotName": "Unit", "rawValue": "sekunden", "confidence": 1.0, "range": {"start": 28, "end": 36, "rawStart": 30, "rawEnd": 38}}], "sessionId": "wohnzimmer-snowboy-63e0d711-7842-4e99-9a65-9a764c9952b3", "customData": null, "asrTokens": [[{"value": "taimer", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 6, "time": null}, {"value": "im", "confidence": 1.0, "rangeStart": 7, "rangeEnd": 9, "time": null}, {"value": "wohnzimmer", "confidence": 1.0, "rangeStart": 10, "rangeEnd": 20, "time": null}, {"value": "auf", "confidence": 1.0, "rangeStart": 21, "rangeEnd": 24, "time": null}, {"value": "10", "confidence": 1.0, "rangeStart": 25, "rangeEnd": 27, "time": null}, {"value": "sekunden", "confidence": 1.0, "rangeStart": 28, "rangeEnd": 36, "time": null}]], "asrConfidence": null, "rawInput": "taimer im wohnzimmer auf zehn sekunden", "wakewordId": "snowboy", "lang": null}
defmod RHASSPY RHASSPY devspec=room=Rhasspy,room=MQTT2_DEVICE,lampe3,alexaName=.+
defmod RHASSPY RHASSPY fhemId=fhem2
starte{Command:play} die wiedergabe $de.fhem.Device{Device}
Da frage ich mich, warum dann nicht gleich das passende Mapping an dieser Stelle mitgegeben wird:starte{Command:cmdPlay} die wiedergabe $de.fhem.Device{Device}
Das ist auch für einen Franzosen vermutlich recht einfach anzupassen, oder...?Zitat von: Beta-User am 08 März 2021, 13:26:51
Was ich schon immer "seltsam" fand, war das mit dem "Zwangsraum". Daher gibt es jetzt als Vorschlag einen Parameter für die DEF mit dem sinnigen Namen "devspec". Damit kann man jetzt (hoffentlich) z.B. auch folgendes machen (auch für das folgende: alle Parameter sind optional!):Code Auswählendefmod RHASSPY RHASSPY devspec=room=Rhasspy,room=MQTT2_DEVICE,lampe3,alexaName=.+
ZitatWeiter habe ich den Verdacht, dass man ggf. auch weitere Topics bzw. Unterscheidungsmerkmale braucht, wenn man z.B. unterschiedliche FHEM-Instanzen und/oder mehrere User hat, die unterschiedliches dürfen bzw. per RHASSPY ansteuern können sollen. Daher gibt es jetzt vorsorglich mal den Vorschlag, eine "fhemId" vergeben zu können...?Code Auswählendefmod RHASSPY RHASSPY fhemId=fhem2
ZitatGenerell scheint es so zu sein, dass wir auf der "de->en"-Mapping-Seite ziemlich beschäftigt damit sind, zwischenzeitlich(!) unglücklich gewordene Entscheidungen aus der Vergangenheit wieder gradezubiegen.
Zitat
Paradebeispiel:Code Auswählenstarte{Command:play} die wiedergabe $de.fhem.Device{Device}
Da frage ich mich, warum dann nicht gleich das passende Mapping an dieser Stelle mitgegeben wird:Code Auswählenstarte{Command:cmdPlay} die wiedergabe $de.fhem.Device{Device}
Das ist auch für einen Franzosen vermutlich recht einfach anzupassen, oder...?
ZitatWenn "brightness" nicht mehr Helligkeit heißt, kann man auch "raten", dass ein setter/Reading "brightness" ggf. der Wert ist, den man wissen bzw. steuern will, eventuell wäre sogar "pct" in der FHEM-Welt die erste Wahl, die man austestet.
Und wenn es keinen rhasspyName gibt, aber einen alexaName und die devspec paßt, warum sollte man dann nicht die homebridgeMappings ausschlachten und das Device durch RHASSPY ansteuerbar machen?
ZitatJetzt wünsche ich erst mal viel Spaß beim Testen und freue mich über Rückmeldungen zu meinen Gedanken...
Zitat von: drhirn am 08 März 2021, 13:49:22Dann erst mal viel Spaß!
Ich mache mich frisch und fröhlich ans Werk...
Danke dir!
Zitat von: drhirn am 08 März 2021, 13:49:22Da liegt ganz klar die Prio!
Könnte man :D
Aber wieder Aufwand. Ich hätte lieber gerne vorerst eine Version, in der mal alles funktioniert, was es bisher an Features gab. Danach bin ich für alles offen.
ZitatDer Raum in der DEF dient nur als "Ausweichraum", sollte im Befehl kein Raum gesprochen werden (aber mehrere Devices mit dem selben rhasspyName in unterschiedlichen rhasspyRooms vorkommen).Da sprechen wir von unterschiedlichen Dingen, sorry, wenn ich da in die falsche Kiste gegriffen habe: der default-room hat mich bisher nicht wirklich beschäftigt, aber "devspec" wird bei der Ermittlung der überhaupt zu beobachtenden Devices eine wesentliche Rolle (bisher starr: "room=Rhasspy"). Dieser Parameter sollte also die Ersteinrichtung deutlich vereinfachen (ich arbeite da an der Stelle potentiell auch für mich selbst...).
ZitatDas entzieht sich vollkommen meiner Expertise. FHEM ist bei mir nur Backend. Die User bedienen Schalter oder TabletUI. Ich sehe für sowas also - für mich - keine Verwendung. Und würde das Thema auch nicht angehen, bevor nicht der Wunsch danach kommt. Das wird sonst alles zu kompliziert.Na ja, ich bin auch "Einheitsuser", alles läuft in einem System, bisher stressfrei. Es gibt aber einige User, die einige FHEM parallel betreiben. Da kann es durchaus vorkommen, dass die unterschiedliche Befehle an unterschiedliche FHEM schicken wollen. Noch viel mehr denke ich allerdings über die Frage nach, wie sich das verhält, wenn unterschiedliche User ins Spiel kommen. Kann aber durchaus sein, dass mir da irgendein Bausteinchen auf der Rhasspy-Seite fehlt ::) . Aber wenn ich mit FHEM sprechen kann, wollen das ziemlich sicher noch ein paar mehr, und das muss dann so klappen, dass mir keiner die Musik leiser dreht, der nicht auch im Raum ist...
ZitatSchon klar, dass das erst mal für den "Eigenbedarf" konzipiert war. Ich komme jetzt eben da irgendwie "quer" rein und versuche, das ganze irgendwie abstrakt zu verstehen und generisch auszulegen, damit "jeder" es relativ leicht auf seine Bedürfnisse anpassen kann - auch, was z.B. die Rückmeldesätze an sich angeht. Bisher hat das nach meinem Eindruck relativ gut geklappt, ohne dass wir (dauerhaft) massive Probleme bekommen hätten. Btw.: die Grundstruktur von Thyraz ist und war m.E. solide ausgearbeitet, alles baut solide aufeinander auf und man kann "die Planken" recht gut nach und nach wechseln.
Es war einfach nie ein "fertiges" Modul. Für die wenigen deutschsprachigen User hat's gereicht, was Thyraz gemacht hat.
ZitatDann sollten wir das in diese Richtung weiterverfolgen, auch was "Helligkeit" und Co. angeht.
Hab ich mir auch schon überlegt. Spricht nichts dagegen.
defmod Rhasspy RHASSPY devspec=room=Musik Wohnzimmer de
Zitat von: drhirn am 08 März 2021, 14:42:21;D
Ich habe jetzt mal die DEF angepasst:Code Auswählendefmod Rhasspy RHASSPY devspec=room=Musik Wohnzimmer de
Und dann ein updateSlots gemacht. Dabei hat er mir nur noch die Devices hoch geladen, die im Raum "Musik" sind. Das scheint also zu funktionieren.
defmod Rhasspy RHASSPY devspec=room=Musik defaultRoom=Wohnzimmer language=de
my @unitHours = ('stunde','stunden','hour','hours','heure','heures');
my @siteIds = split /,/,$hash->{helper}{siteIds};
my $timerRoom = $siteId;
if ( grep {/^$room$/i} @siteIds ) {$timerRoom = $room};
my $timerRoom = $hash->{helper}{siteIds}->{$siteId} // ... (=> default room);
Zitat von: drhirn am 08 März 2021, 17:21:39Ach so, das war vorher gar nicht da...? ???
Die Doppelung ist einfach nur zum Spaß da. Als Notnagel, falls das mit dem Internal nicht funktioniert ;) .
ZitatIch finde Internal aber schöner. Sonst werden's langsam ganz schön viele Readings. Und wenn man's schafft, dass das Internal eh gleich beim Start geschrieben wird, ist es ja egal, wenn's keinen Neustart überlebt.Na ja, wenn die Readings nur geschrieben werden, wenn was (halbwegs) wichtiges passiert, finde ich das mit vielen Readings nicht schlimm, v.a., wenn man darauf achtet, nicht zu viele Trigger-loops auszulösen. Von daher kann man den update auch bedingt durch das Vorhandensein des Readings auslösen, falls sich sowieso kaum was ändert?
mache $de.fhem.Device{Device} heller{brightness:up}
mache $de.fhem.Device{Device} leiser{volume:down}
bzw. (der Spur nach):mache $de.fhem.Device{Device} leiser{Command:volDown}
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=Lautstärke
Msg: hermes/intent/de.fhem_SetNumeric => {"input": "mach radio lauter", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 0.6666666666666667}, "siteId": "default", "id": "cf521ed9-8de4-4bc2-82ae-77ed9a854e0c", "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "radio"}, "slotName": "Device", "rawValue": "radio", "confidence": 1.0, "range": {"start": 5, "end": 10, "rawStart": 5, "rawEnd": 10}}, {"entity": "Change", "value": {"kind": "Unknown", "value": "lauter"}, "slotName": "Change", "rawValue": "lauter", "confidence": 1.0, "range": {"start": 11, "end": 17, "rawStart": 11, "rawEnd": 17}}], "sessionId": "cf521ed9-8de4-4bc2-82ae-77ed9a854e0c", "customData": null, "asrTokens": [[{"value": "mach", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 4, "time": null}, {"value": "radio", "confidence": 1.0, "rangeStart": 5, "rangeEnd": 10, "time": null}, {"value": "lauter", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 17, "time": null}]], "asrConfidence": null, "rawInput": "mach das radio lauter", "wakewordId": null, "lang": null}
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volumeSound
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10
Da wir einen "passenden" Namen "volume" haben, könnten wir ggf. auch einfach "tippen", dass sich der Modulautor des Zielgeräts an https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV) gehalten hatte und sich (per default) auch ableiten läßt, dass currentVal=volume auch zugleich das cmd-Reading ist...Da müßte man sich dann nur noch klar werden, ob das durch volumeSound erstetzte "Matchword" in RHASSPY nicht gleich nur "volume" heißen sollte bzw. der "value" statt "lauter" eben "volUp"...Msg: hermes/intent/de.fhem_SetNumeric => {"input": "mach radio lauter", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 0.6666666666666667}, "siteId": "default", "id": "cf521ed9-8de4-4bc2-82ae-77ed9a854e0c", "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "radio"}, "slotName": "Device", "rawValue": "radio", "confidence": 1.0, "range": {"start": 5, "end": 10, "rawStart": 5, "rawEnd": 10}}, {"entity": "Change", "value": {"kind": "Unknown", "value": "volUp"}, "slotName": "Change", "rawValue": "lauter", "confidence": 1.0, "range": {"start": 11, "end": 17, "rawStart": 11, "rawEnd": 17}}], "sessionId": "cf521ed9-8de4-4bc2-82ae-77ed9a854e0c", "customData": null, "asrTokens": [[{"value": "mach", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 4, "time": null}, {"value": "radio", "confidence": 1.0, "rangeStart": 5, "rangeEnd": 10, "time": null}, {"value": "lauter", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 17, "time": null}]], "asrConfidence": null, "rawInput": "mach das radio lauter", "wakewordId": null, "lang": null}
(oder eben gleich nur "up" bzw. "down", vermutlich (!) ist es egal, grade machen wir ja auch nur pauschal "upward" in der cfg...)Zitat#Beta-User: könnte effizienter notiert werden, wenn sicher ist, dass es nur diese beiden $type geben kann...
Zitat von: drhirn am 09 März 2021, 15:51:54Wie wäre es dann mit
Zeile 1354 bei dir:
Es kann nur diese beiden Typen geben.
$type eq 'voice' ?
readingsBulkUpdate($hash, 'voiceResponse', $response)
: readingsBulkUpdate($hash, 'textResponse', $response);
Zitat von: drhirn am 09 März 2021, 15:40:26Dann werden wir das wohl versuchen, in diese Richtung umzubauen, oder?
Was von Rhasspy kommt, können wir selber festlegen. Da gibt's keine Vorgabe. Die User müssen sich dann einfach nur dran halten.
ZitatGrundsätzlich sollte die Flexibilität nicht unter den Vorschlägen leiden, der Saugrobi sollte/könnte dann eben auf "cmdPlay" reagieren. Der Plan wäre, zumindest die Mapping-Möglichkeiten so zu erhalten, wie sie heute sind, nur ggf. diese leiser/lauter-zurück-Geschichte ggf. dann irgendwann (!) auszubauen und statt Helligkeit dann eben brightness zu verwenden (weil die zusätzliche Prüfung eben etwas Performance kostet)...
Ich möchte aber schon ein bisschen Flexibilität bei behalten. Zum einen ist das mit "an Guidelines halten" so eine Sache. Zum anderen kann man das Zeug so absichtlich "missbrauchen". Ich steuer z.B. meinen Saugroboter über MediaControls ;) .
ZitatDas hört man doch gerne 8) .
Aber das mit dem genericDeviceType ist eigentlich eine gute Idee!
Zitat von: Beta-User am 09 März 2021, 16:00:52
Grundsätzlich sollte die Flexibilität nicht unter den Vorschlägen leiden, der Saugrobi sollte/könnte dann eben auf "cmdPlay" reagieren. Der Plan wäre, zumindest die Mapping-Möglichkeiten so zu erhalten, wie sie heute sind, nur ggf. diese leiser/lauter-zurück-Geschichte ggf. dann irgendwann (!) auszubauen und statt Helligkeit dann eben brightness zu verwenden (weil die zusätzliche Prüfung eben etwas Performance kostet)...
\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [(prozent|grad|dezibel){Unit}] [(heller|dunkler|wärmer|kälter|lauter|leiser){Change}]
\[mach] $de.fhem.Device{Device} lauter{Change:volumeUp}
\[mach] $de.fhem.Device{Device} leiser{Change:volumeDown}
if ($mute) {
$data->{requestType} = $message =~ m{${fhemId}.textCommand}x ? 'text' : 'voice';
RHASSPY_respond($hash, $data->{requestType}, $data->{sessionId}, $data->{siteId}, q{ });
return \@updatedList;
}
Zitat von: drhirn am 09 März 2021, 16:05:09Ich habe dazu auch noch keine abschließende Meinung; grundsätzlich ist "pct" halt in FHEM alles, was man zwsischen 0 und 100 (bzw. 99=>ZWave) regeln kann. Von daher würde sich das anbieten.
Wie gesagt, wir sind da vollkommen flexibel. Wir können auch - wie von dir vorgeschlagen - pct nehmen.
ZitatKorrekt, wobei mein bisheriger Eindruck vom Code der war, dass "percent" eine separate Kategorie ist, die nicht deckungsgleich sein muss mit "Helligkeit" (dann: ggf. "pct")
Wir müssen nur dran denken, dass zwischen "stell die lampe auf 50" und "stell die lampe auf 50 prozent" ein Unterschied ist ;)
Zitat von: drhirn am 09 März 2021, 16:13:16Sory, das war mir rausgegangen...
Und - weil's mir gerade wieder einfällt - $device ist eigentlich nicht, was ich bei der Sprachausgabe hören will. Ich möchte das als Sprachausgabe bekommen, was ich zuvor gesprochen habe. Deswegen habe ich bei RHASSPY_handleIntentGetOnOff "$deviceName" eingeführt. Damit ich nicht den FHEM-Namen zurück bekomme, sondern den rhasspyName.
Zitat von: drhirn am 09 März 2021, 16:26:13Ins Unreine - geht so etwas:
Bisher war's so, dass ich eigentlich alle SetNumeric-Geschichten in Rhasspy mit einem Satz abdecken konnte:Code Auswählen\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [(prozent|grad|dezibel){Unit}] [(heller|dunkler|wärmer|kälter|lauter|leiser){Change}]
\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [dezibel{Unit:decibel}][grad{Unit:degree}][prozent{Unit:percent}] [(heller|wärmer|lauter){Change:up}|(dunkler|kälter|leiser){Change:down}]
ZitatWobei ich da ggf. was kürzeres vorschlagen würde ($devname, $r_name oder $alias?).
Zitat
Ins Unreine - geht so etwas:Code Auswählen\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [dezibel{Unit:decibel}][grad{Unit:degree}][prozent{Unit:percent}] [(heller|wärmer|lauter){Change:up}|(dunkler|kälter|leiser){Change:down}]
Zitat von: drhirn am 09 März 2021, 17:27:14Unterstriche finde ich auch nicht so prickelnd, ich bevorzuge halt prinzipiell eher "kurz und knackig", von daher ist die spontane Tendenz eher zu $alias, aber letztlich ist mir das "juck wie jack". Falls das mit der "erweiterten maping-Analyse" kommt, wird man eben voraussichtlich diesen "Label" (ohne $) auch im List vom RHASSPY-Device über den möglichen Werten finden; spätestens dann ist auch für die User klarer, was gemeint ist (die werden eh' zu 95+% copy/paste machen...)
Ich bin da situationselastisch wie man bei uns in Österreich sagt ;) . Wenn ich's mir aussuchen kann, hätte ich gerne etwas Sprechendes ohne Unterstriche.
ZitatKlar, Unsinn kann man damit treiben, wobei die Frage im Raum steht, ob dann mehrfach die "Unit" im JSON auftaucht. ..?
Ähm, ja. Könnte gehen. Hab's jetzt aber nicht ausprobiert. Solange man nicht "Stelle Device auf 100 Dezibel Grad Prozent" sagt ;)
ZitatStelle fest, du kennst dich mit Rhasspy schon gut aus :DEin gewisses Gesamtbild schwebt schon vor meinen Augen, auch wenn ich bisher noch keinen Docker am Laufen habe... Es wird also so langsam.
Zitat von: Beta-User am 09 März 2021, 17:51:35Prinzipiell wäre eben die Frage, wie oft man sowas editieren muss und inwieweit es copy/paste von vorhandenen Vorlagen ist.
ZitatWas ganz anderes: Gibt es eigentlich die Option, eine "SPELL"-Anweisung zurückzugeben.
Anwendungfall: wir können ein Mapping nicht auflösen und wollen dem User mitteilen, welches das übergebene "keyword" war.
Zitat von: JensS am 09 März 2021, 19:07:18Ich hoffe, die Ursache gefunden zu haben, aktualisierter Code anbei.
@Beta-User
Meine Tests musste ich wieder einstellen, da meine CustomIntents mit Übergabe von Werten (z.B. SetAllOff) nur Fehler gebracht haben.
Zitat von: drhirn am 09 März 2021, 18:32:44Nachdem ich auch die "Sätze" für diese SetAllOn-Geschichte mal etwas näher angesehen habe, scheint es mir so zu sein, dass man auch das "Problem" aus
Die "Sätze" in Rhasspy? Muss man 1x erstellen. Sofern sie passen, braucht man das dann nie wieder.
ZitatÄhm, ja. Könnte gehen. Hab's jetzt aber nicht ausprobiert. Solange man nicht "Stelle Device auf 100 Dezibel Grad Prozent" sagtwohl durch passende Syntax gut lösen kann. Neige daher noch mehr dazu, das auf der "sentences.ini"-Ebene zu lösen und das Modul gleich passend beliefern zu lassen...
ZitatKlar. Meine eigentliche Frage war: wie bringen wir die Sprachausgabe dazu, etwas zu buchstabieren? Leerzeichen zwischen die einzelnen Buchstaben packen?
Verstehe ich nicht. Wir können in die reponse ja packen, was wir wollen.
ZitatKlar. Meine eigentliche Frage war: wie bringen wir die Sprachausgabe dazu, etwas zu buchstabieren? Leerzeichen zwischen die einzelnen Buchstaben packen?
SetOnOff:cmdOn=on,cmdOff=off,response=Okidoki
Can't use string ("set lampe2 off") as an ARRAY ref while "strict refs" in use at ./FHEM/10_RHASSPY.pm line 2290.
my $to_analyze = join q{ }, @{$arr};
SetOnOff:cmdOn=on,cmdOff=off,response=state
SetOnOff:cmdOn=on,cmdOff=off,response={"wird erledigt"}
sub RHASSPY_getValue { #($$$;$$)
my $hash = shift // return;
my $device = shift // return;
my $getString = shift // return;
my $val = shift;
my $siteId = shift;
# Perl Command oder in Anführungszeichen? -> Umleiten zu RHASSPY_runCmd
if ($getString =~ m{\A\s*\{.*\}\s*\z}x || $getString =~ m/^\s*".*"\s*$/) {
return RHASSPY_runCmd($hash, $device, $getString, $val, $siteId);
}
# Soll Reading von einem anderen Device gelesen werden?
if ($getString =~ m{:}x) {
my @replace = split m{:}x, $getString;
$device = $replace[0];
$getString = $replace[1] // $getString;
return ReadingsVal($device, $getString, 0);
}
# If it's only a string without quotes, return string for TTS
else {
return $getString;
}
}
sub RHASSPY_getValue { #($$$;$$)
my $hash = shift // return;
my $device = shift // return;
my $getString = shift // return;
my $val = shift;
my $siteId = shift;
# Perl Command oder in Anführungszeichen? -> Umleiten zu RHASSPY_runCmd
if ($getString =~ m{\A\s*\{.*\}\s*\z}x || $getString =~ m/^\s*".*"\s*$/) {
return RHASSPY_runCmd($hash, $device, $getString, $val, $siteId);
}
# Soll Reading von einem anderen Device gelesen werden?
if ($getString =~ m{:}x) {
my @replace = split m{:}x, $getString;
$device = $replace[0];
$getString = $replace[1] // $getString;
return ReadingsVal($device, $getString, 0);
}
# If it's only a string without quotes, return string for TTS
return ReadingsVal($device, $getString, $getString);
}
SetOnOff:cmdOn=on,cmdOff=off,response=state
response=[lampe1:state]
Zitat von: drhirn am 10 März 2021, 15:01:22Siehe meinen Nachtrag...
DeinCode AuswählenSetOnOff:cmdOn=on,cmdOff=off,response=state
wird halt nicht mehr funktionieren. Also schon, aber es wird nicht das Reading gesprochen.
ZitatNa ja, die eckigen Klammern sollte man dann nach "if ($getString =~ m{:}x) {" und vor dem split entfernen, falls die da sind. Diese "set magic"-Syntax ist aber bisher nicht als funktionierend dokumentiert...
Was mich daran erinnert, dassCode Auswählen
response=[lampe1:state]
leider auch nicht funktioniert. Weiß aber noch nicht, warum nicht.
my $forcePercent = (defined $mapping->{map} && lc($mapping->{map}) eq 'percent') ? 1 : 0;
\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [(prozent|grad|dezibel){Unit}] [(heller|dunkler|wärmer|kälter){Change}]
\[mach] $de.fhem.Device{Device} lauter{Change:upward}
\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [(prozent{Unit:percent}|grad{Unit:degree}|dezibel{Unit:decibel})] [((heller|wärmer){Change:up}|(dunkler|kälter){Change:down})]
\[mach] $de.fhem.Device{Device} lauter{Change:up}
Msg: hermes/intent/de.fhem_SetNumeric => {"input": "stell radio um 5 decibel up", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "radio"}, "slotName": "Device", "rawValue": "radio", "confidence": 1.0, "range": {"start": 6, "end": 11, "rawStart": 6, "rawEnd": 11}}, {"entity": "rhasspy/number", "value": {"kind": "Number", "value": 5}, "slotName": "Value", "rawValue": "fünf", "confidence": 1.0, "range": {"start": 15, "end": 16, "rawStart": 15, "rawEnd": 19}}, {"entity": "Unit", "value": {"kind": "Unknown", "value": "decibel"}, "slotName": "Unit", "rawValue": "dezibel", "confidence": 1.0, "range": {"start": 17, "end": 24, "rawStart": 20, "rawEnd": 27}}, {"entity": "Change", "value": {"kind": "Unknown", "value": "up"}, "slotName": "Change", "rawValue": "lauter", "confidence": 1.0, "range": {"start": 25, "end": 27, "rawStart": 28, "rawEnd": 34}}], "sessionId": "wohnzimmer-snowboy-ca7b4bf6-5649-492a-ac8a-7bfb85b597c3", "customData": null, "asrTokens": [[{"value": "stell", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "radio", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 11, "time": null}, {"value": "um", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 14, "time": null}, {"value": "5", "confidence": 1.0, "rangeStart": 15, "rangeEnd": 16, "time": null}, {"value": "decibel", "confidence": 1.0, "rangeStart": 17, "rangeEnd": 24, "time": null}, {"value": "up", "confidence": 1.0, "rangeStart": 25, "rangeEnd": 27, "time": null}]], "asrConfidence": null, "rawInput": "stell radio um fünf dezibel lauter", "wakewordId": "snowboy", "lang": null}
defmod lampe2 dummy
attr lampe2 readingList pct temperature volume
attr lampe2 rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off\
GetOnOff:currentVal=state,valueOff=off\
GetNumeric:currentVal=temperature,type=Temperatur\
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next\
SetNumeric:currentVal=pct,minVal=0,maxVal=255,cmd=pct,step=1,type=Helligkeit\
SetNumeric:currentVal=temperature,minVal=0,maxVal=255,cmd=temperature,step=1,type=Temperatur\
SetNumeric:currentVal=volume,minVal=-40,maxVal=20,cmd=volume,step=0.5,type=Lautstärke
attr lampe2 rhasspyName lampe,radio,licht
attr lampe2 rhasspyRoom wohnzimmer,schlafzimmer
attr lampe2 room Rhasspy
attr lampe2 setList pct temperature toggle on off play stop pause next previous volume
RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_SetNumeric => {"input": "
Parsed value: up for key: Change
Parsed value: 1 for key: probability
Parsed value: wohnzimmer-snowboy-ca7b4bf6-5649-492a-ac8a-7bfb85b597c3 for key: sessionId
Parsed value: 5 for key: Value
Parsed value: SetNumeric for key: intent
Parsed value: stell radio um 5 decibel up for key: input
Parsed value: decibel for key: Unit
Parsed value: radio for key: Device
Parsed value: stell radio um fünf dezibel lauter for key: rawInput
Parsed value: wohnzimmer for key: siteId
handleIntentSetNumeric called
Device selected: lampe2
rhasspyMapping selected: currentVal=pct,minVal=0,maxVal=255,cmd=pct,step=1,type=Helligkeit
runCmd called with command: pct
lampe2 pct 171 is a normal command
RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/dialogueManager/sessionEnded => {"termin
muss auf lauter/leiser begrenzt werden? Was ist mit Kleinschreibung? (Letzteres muss/kann ggf. vorher erledigt werden?
\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [(prozent{Unit:percent}|grad{Unit:degree}|dezibel{Unit:decibel}{Type:volume})] [(heller{Change:up}{Type:brightness}|dunkler{Change:down}{Type:brightness}|wärmer{Change:up}{Type:temperature}|kälter{Change:down}{Type:temperature}|lauter{Change:up}{Type:volume}|leiser{Change:down}{Type:volume}
)]
\[mach] $de.fhem.Device{Device} lauter{Change:up}{Type:volume}
\[stell|stelle|mach|mache|schalt|schalte] $de.fhem.Device{Device} [$de.fhem.Device{Room}] [auf|um] [(0..100){Value}] [(prozent{Unit:percent}|grad{Unit:degree}|dezibel{Unit:decibel})] [(heller{changeType:brighter}|dunkler{changeType:darker}|wärmer{changeType:warmer}|kälter{changeType:cooler}|lauter{{changeType:louder}|leiser{changeType:lower})]
\[mach] $de.fhem.Device{Device} lauter{Change:up}{Type:volume}
$de.fhem.Device{Device} [0..10]{Value} [dezibel]{Unit:decibel}(lauter|rauf){Change:volUp}
$de.fhem.Device{Device} [0..10]{Value} [grad]{Unit:decibel}(leiser|runter){Change:volDown}
$de.fhem.Device{Device} [0..10]{Value} [grad]{Unit:degree} (kälter|runter){Change:tempDown}
...
Msg: hermes/intent/de.fhem_SetNumeric => {"input": "Musik bad 10 decibel volUp", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "Musik"}, "slotName": "Device", "rawValue": "musik", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "bad"}, "slotName": "Room", "rawValue": "bad", "confidence": 1.0, "range": {"start": 6, "end": 9, "rawStart": 6, "rawEnd": 9}}, {"entity": "rhasspy/number", "value": {"kind": "Number", "value": 10}, "slotName": "Value", "rawValue": "zehn", "confidence": 1.0, "range": {"start": 10, "end": 12, "rawStart": 10, "rawEnd": 14}}, {"entity": "Unit", "value": {"kind": "Unknown", "value": "decibel"}, "slotName": "Unit", "rawValue": "dezibel", "confidence": 1.0, "range": {"start": 13, "end": 20, "rawStart": 15, "rawEnd": 22}}, {"entity": "Change", "value": {"kind": "Unknown", "value": "volUp"}, "slotName": "Change", "rawValue": "lauter", "confidence": 1.0, "range": {"start": 21, "end": 26, "rawStart": 23, "rawEnd": 29}}], "sessionId": "wohnzimmer-snowboy-26e76002-22ab-47dd-9f55-ca64e5a49019", "customData": null, "asrTokens": [[{"value": "Musik", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "bad", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 9, "time": null}, {"value": "10", "confidence": 1.0, "rangeStart": 10, "rangeEnd": 12, "time": null}, {"value": "decibel", "confidence": 1.0, "rangeStart": 13, "rangeEnd": 20, "time": null}, {"value": "volUp", "confidence": 1.0, "rangeStart": 21, "rangeEnd": 26, "time": null}]], "asrConfidence": null, "rawInput": "musik bad zehn dezibel lauter", "wakewordId": "snowboy", "lang": null}
Msg: hermes/intent/de.fhem_SetNumeric => {"input": "Musik bad decibel volUp", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "Musik"}, "slotName": "Device", "rawValue": "musik", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "bad"}, "slotName": "Room", "rawValue": "bad", "confidence": 1.0, "range": {"start": 6, "end": 9, "rawStart": 6, "rawEnd": 9}}, {"entity": "Value", "value": {"kind": "Unknown", "value": ""}, "slotName": "Value", "rawValue": "", "confidence": 1.0, "range": {"start": 10, "end": 9, "rawStart": 10, "rawEnd": 9}}, {"entity": "Unit", "value": {"kind": "Unknown", "value": "decibel"}, "slotName": "Unit", "rawValue": "", "confidence": 1.0, "range": {"start": 10, "end": 17, "rawStart": 10, "rawEnd": 9}}, {"entity": "Change", "value": {"kind": "Unknown", "value": "volUp"}, "slotName": "Change", "rawValue": "lauter", "confidence": 1.0, "range": {"start": 18, "end": 23, "rawStart": 10, "rawEnd": 16}}], "sessionId": "wohnzimmer-snowboy-13933d03-8d48-4d58-95a5-d6fb588516a2", "customData": null, "asrTokens": [[{"value": "Musik", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "bad", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 9, "time": null}, {"value": "decibel", "confidence": 1.0, "rangeStart": 10, "rangeEnd": 17, "time": null}, {"value": "volUp", "confidence": 1.0, "rangeStart": 18, "rangeEnd": 23, "time": null}]], "asrConfidence": null, "rawInput": "musik bad lauter", "wakewordId": "snowboy", "lang": null}
set Rhasspy play siteId="wohnzimmer" path="/opt/fhem/test.wav"
PERL WARNING: Argument "" isn't numeric in multiplication (*) at ./FHEM/10_RHASSPY.pm line 1947.
Zitat von: Beta-User am 11 März 2021, 10:36:25
"decibel" ist bisher auch keine Kategorie, die das Modul kennen würde. Kann also auch daran liegen.
Zitat von: drhirn am 11 März 2021, 10:59:41Danke für die Rückmeldung!
Nicht viel erfreulicherweise. Und ich muss sagen, das, was tut, tut sehr zuverlässig. Echt gute Arbeit von dir!
ZitatIn den Mappings wollen wir doch gar keine deutschen Begriffe?Jein. Wollen nicht, aber da die im Moment da sind, ist jetzt eben dieser Kompabilitäts-Layer eingezogen, und der fehlte an der Stelle noch.
ZitatIch hab derzeit noch das:Sollte jetzt auch gefixt sein.
- playWav liefert noch den FehlerCode Auswählenset Rhasspy play siteId="wohnzimmer" path="/opt/fhem/test.wav"
Zitat- getValue muss noch gut getestet werden. Funktioniert v.a. nicht mit [Device:Reading] AusdrückenVersuch's mal mit dieser Änderung in RHASSPY_getValue():
# Soll Reading von einem anderen Device gelesen werden?
if ($getString =~ m{:}x) {
$getString =~ s{\[([^]]+)]}{$1}x; #remove brackets
my @replace = split m{:}x, $getString;
$device = $replace[0];
$getString = $replace[1] // $getString;
return ReadingsVal($device, $getString, 0);
}
Zitat von: drhirn am 11 März 2021, 11:13:46Puh, du kannst Fragen stellen... Im Moment vermutlich sinnvoll für percent?
Brauchen wir das {Unit} überhaupt noch? Eigentlich nicht, oder?
Zitat von: drhirn am 11 März 2021, 11:09:30Habe ein Pflaster geklebt; die eigentliche Ursache ist aber woanders, aber dahin kommen wir ggf. später erst nochmal...Code AuswählenPERL WARNING: Argument "" isn't numeric in multiplication (*) at ./FHEM/10_RHASSPY.pm line 1947.
Das passiert in SetNumeric ständig bei allen Berechnungen. Ich weiß aber noch nicht, warum. Irgendwo bekommen wir eine falsche / keine Zahl zurück.
Zitat von: drhirn am 11 März 2021, 11:28:14Die "verständlichen Schlüsselworte" sind in $internal_mappings->{Change}, also "lightUp" bis "setDown".
Und kannst du mir bitte schreiben, wie ein korrektes Mapping jetzt aussehen muss?
SetNumeric:currentVal=pct,minVal=0,maxVal=255,cmd=pct,step=1,type=brightness\
SetNumeric:currentVal=temperature,minVal=0,maxVal=255,cmd=temperature,step=1,type=temperature\
SetNumeric:currentVal=volume,minVal=-40,maxVal=20,cmd=volume,step=0.5,type=volume
Das Mapping scheint man nur zu benötigen, wenn es mehrere SetNummeric gibt, oder?Zitat von: Beta-User am 11 März 2021, 12:06:42
Jein. Wollen nicht, aber da die im Moment da sind, ist jetzt eben dieser Kompabilitäts-Layer eingezogen, und der fehlte an der Stelle noch.
Mittelfristig sollte man tatsächlich von den deutschen Begriffen weg, aber dann am besten auch gleich so, dass wir eben ein pct- oder brightness-Reading ohne Angabe eines Mappings erkennen können.
ZitatPuh, du kannst Fragen stellen... Im Moment vermutlich sinnvoll für percent?
ZitatFyi: Habe mal das rhasspy-deb auf einem meiner Server installiert (x86), und die App hat auch Kontakt aufgenommen. Viel mehr ist aber noch nicht passiert...
Zitat von: drhirn am 11 März 2021, 13:24:48Bin noch nicht sicher, ob wir es nicht so hinbekommen, dass auch weiter die "alten" Vorgehensweisen und Werte erlaubt bleiben (und nur nicht mehr "beworben" werden).
Die User müssen dann eh noch mehr umbauen. Ich wäre daher fast dafür, dass wir einen "harten Schnitt" machen.
ZitatWenn im Mapping ein map=percent steht, soll in Prozent gerechnet werden. Sonst eh nicht.Das stimmt jedenfalls im Moment nicht, und ich meine auch, an der Logik an sich nichts gedreht zu haben. Wenn man Unit=>percent (bzw. bisher: "Prozent" ) übergeben hat, wird auch in Prozent gerechnet, und das finde ich - jedenfalls bis dato -auch ok so. Das gilt umso mehr, da man ggf. später auf den "Luxus" eines expliziten Mappings verzichten können soll ;) .
ZitatCooool :)Mal sehen, wie "cool" das ist; werde jetzt erst mal verstehen müssen, wie der Dienst funktioniert und dann auch, was mir ggf. noch an scripten fehlt; der Debian-Way ist dann doch etwas anders als Docker, und für eine eventuell Sprachausgabe muss ich mir auch was ausdenken, falls es nicht über das Handy zu machen wäre... Alles noch "black box".
Zitat von: Beta-User am 11 März 2021, 13:45:06
Das stimmt jedenfalls im Moment nicht, und ich meine auch, an der Logik an sich nichts gedreht zu haben. Wenn man Unit=>percent (bzw. bisher: "Prozent" ) übergeben hat, wird auch in Prozent gerechnet, und das finde ich - jedenfalls bis dato -auch ok so. Das gilt umso mehr, da man ggf. später auf den "Luxus" eines expliziten Mappings verzichten können soll ;) .
Zitat
Erläuterung zu map=percent:
Ist die Option gesetzt, werden alle numerischen Stellwerte als Prozentangaben zwischen minVal und maxVal verstanden.
Bei einer Lampe mit minVal=0 und maxVal=255 und map=percent verhält sich also Stelle die Lampe auf 50
genauso wie Stelle die Lampe auf 50 Prozent.
Dies mag bei einer Lampe mehr Sinn ergeben als Werte von 0...255 anzusagen.
Beim Sollwert eines Thermostats hingegen wird man die Option eher nicht nutzen,
da dort die Angaben normal in °C erfolgen und nicht prozentual zum möglichen Sollwertbereich.
Zitat
Mal sehen, wie "cool" das ist; werde jetzt erst mal verstehen müssen, wie der Dienst funktioniert und dann auch, was mir ggf. noch an scripten fehlt; der Debian-Way ist dann doch etwas anders als Docker, und für eine eventuell Sprachausgabe muss ich mir auch was ausdenken, falls es nicht über das Handy zu machen wäre... Alles noch "black box".
Msg: hermes/intent/de.fhem_SetNumeric => {"input": "mach lampe lightDown", "intent": {"intentName": "de.fhem:SetNumeric", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "de.fhem.Device", "value": {"kind": "Unknown", "value": "lampe"}, "slotName": "Device", "rawValue": "lampe", "confidence": 1.0, "range": {"start": 5, "end": 10, "rawStart": 5, "rawEnd": 10}}, {"entity": "Value", "value": {"kind": "Unknown", "value": ""}, "slotName": "Value", "rawValue": "", "confidence": 1.0, "range": {"start": 11, "end": 10, "rawStart": 11, "rawEnd": 10}}, {"entity": "Change", "value": {"kind": "Unknown", "value": "lightDown"}, "slotName": "Change", "rawValue": "dunkler", "confidence": 1.0, "range": {"start": 11, "end": 20, "rawStart": 11, "rawEnd": 18}}], "sessionId": "wohnzimmer-snowboy-67f0563c-282d-4035-b486-7cc373587b55", "customData": null, "asrTokens": [[{"value": "mach", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 4, "time": null}, {"value": "lampe", "confidence": 1.0, "rangeStart": 5, "rangeEnd": 10, "time": null}, {"value": "lightDown", "confidence": 1.0, "rangeStart": 11, "rangeEnd": 20, "time": null}]], "asrConfidence": null, "rawInput": "mach lampe dunkler", "wakewordId": "snowboy", "lang": null}
PERL WARNING: Argument "" isn't numeric in subtraction (-) at ./FHEM/10_RHASSPY.pm line 1971
# Stellwert um Wert x ändern ("Mache Lampe um 20 heller" oder "Mache Lampe heller")
#elsif ((!defined $unit || $unit ne 'Prozent') && defined $change && !$forcePercent) {
elsif ( ( !defined $unit || !$ispct ) && defined $change && !$forcePercent) {
$newVal = ($up) ? $oldVal + $diff : $oldVal - $diff;
}
SetNumeric:currentVal=pct,minVal=0,maxVal=100,cmd=pct,step=1,type=brightness
Zitat von: rudolfkoenig am 11 März 2021, 12:37:20Wir machen grade ziemlich viel "noise"...
Im Development Bereich des Forums [...] das Ziel ist aber Signal/Noise Ratio hoch zu halten, damit man das Abonnieren fuer Maintainer zu Pflicht machen kann.