Modulentwicklung für Rhasspy Sprachassistent

Begonnen von drhirn, 11 März 2021, 15:59:50

Vorheriges Thema - Nächstes Thema

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

laberlaib

#181
Zitat von: Beta-User am 01 April 2021, 19:43:21
Edit: vermutlich muss da beim Kopieren in lng dereferenziert werden: =%{$...}
Ich glaube sogar zu verstehen, was Du sagst.
ich probier da mal was Morgen oder später noch...

Edit: ich glaub, ich gebs auf. Ich hab die Zuweisung versucht zu kopieren und dann zu referenzieren. Aber es hat nicht geklappt:
Also aus Zeile 398
    $hash->{helper}{lng} = _combineHashes( $lngvars, $decoded);
hab ich all das hier mal erfolglos probiert:

$hash->{helper}{lng} = %{_combineHashes( $lngvars, $decoded)};
Resultat im List bei lng: 3.
Ok, helperlng soll ja nur die Referenz bekommen:
$hash->{helper}{lng} = \%{_combineHashes( $lngvars, $decoded)};
falsche Sprache
Ok, mal einzeln versuchen:
my $test = _combineHashes( $lngvars, $decoded);
my %hash_copy =  %{$test};
    $hash->{helper}{lng} = \%hash_copy;

falsche Sprache.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

drhirn

Ad Dialogue:
Zitat von: Beta-User am 01 April 2021, 19:01:08
mit dem "confirm"-Beispiel aus der cref (hoffe, das eingepflegt zu haben) sollte es gehen.
ich werde nach einer Bestätigung gefragt. Aber wie muss dann meine Sprachantwort sein, damit das auch gemacht wird?

Beta-User

#183
Puh, das mit der dereferenzierung war ein dickeres Brett, das Problem war _combineHashes()...

Sollte jetzt klappen, vermutlich kann man manches noch schöner machen....

Zitat von: drhirn am 02 April 2021, 09:56:08
Ad Dialogue:ich werde nach einer Bestätigung gefragt. Aber wie muss dann meine Sprachantwort sein, damit das auch gemacht wird?
Sorry, falls ich das bisher nicht gepostet hatte:
[de.fhem:ConfirmAction]
(ja mach | tu es | ist ok ){Mode:OK}
(lass es | nein | abbrechen | abbruch ){Mode}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

laberlaib

#184
Zitat von: Beta-User am 02 April 2021, 15:05:12
Puh, das mit der dereferenzierung war ein dickeres Brett, das Problem war _combineHashes()...
...und ich mit meinem Korkenzieher als improvisierte Bohrmaschine...

Klappt, super, Danke!

Ich versuch das mal durch vergleichen nachzuvollziehen, ich find das nämlich richtig spannend, da es über mein VBA-basiertes Programmieren deutlich hinausgeht.

--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

Beta-User

Zitat von: laberlaib am 02 April 2021, 15:23:16
Klappt, super, Danke!
Danke für die Rückmeldung!

Zitat
Ich versuch das mal durch vergleichen nachzuvollziehen, ich find das nämlich richtig spannend, da es über mein VBA-basiertes Programmieren deutlich hinausgeht.
Das mit diesen verdammten Hashes und Referenzen ist wirklich spannend, und die eigentlichen Änderungen (aaO) sind nicht wirklich revolutionär - es wird einfach nicht die übergebene Referenz "bearbeitet", sondern ein neuer Hash aufgebaut - "eigentlich" nichts besonderes...
(Der Rest oben ist zwar auch überarbeitet, aber vermutlich hätte der auch unverändert bleiben können.)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

#186
...kleine Ursache, große Wirkung...

Habe den Logikfehler gefunden, der SetNumeric befallen hatte und bei der Gelegenheit noch ein paar Eintagsfliegen-Variablen bei der Sprachinitialisierung wieder entsorgt.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Hier noch zwei gefundene Ostereier und etwas Verpackungsmaterial:
Gelöste Probleme:
- Sprachnachricht nach Timer-Ende umfasste auch das Ändern des Readingwerts;
- Automatisch angelegte "media"-Mappings (aus gDT) waren eine Ebene zu hoch => crash...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Frohe Ostern und vielen Dank für die Revisionen. Nach Ostern geht's ans testen.
Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

JensS

#189
So, habe eben die rhasspy-de.cfg eingespielt, den rhasspyMQTT2 erzeugt 10_RHASSPY.pm modifiziert und nach FHEM-Neustart die Definition "devspec=room=Rhasspy defaultRoom=Wohnzimmer language=de encoding=utf-8'" angepasst. Schalten geht schon mal und der Rest kommt nach der Gartenarbeit ran. Lustig sind die englischen Fehlermeldungen. Pfad der Sprachdatei angepasst... 8)
Gruß Jens

p.s. Bevor ich viel lese, frage ich lieber jemanden, der sich mit auskennt.[de.fhem:GetNumeric]
(warm|kalt|heiß|Temperatur){Type:Temperatur} [ist es|von|vom|ist] ([(im|auf dem)]($de.fhem.Room){Room}|[das]($de.fhem.Device){Device})

Frage: "Wie warm ist es im Wohnzimmer?" - Antwort: "Tut mir leid, ich konnte kein passendes Gerät finden."attr Sensor2 rhasspyMapping GetNumeric:currentVal=temperature,type=Temperatur
attr Sensor2 rhasspyName Thermometer
attr Sensor2 rhasspyRoom Wohnzimmer
attr Sensor2 room Rhasspy,Sensoren,Wohnzimmer


rhasspyIntents funktionieren weitgehend!  :)
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Beta-User

GetNumeric hatte ich bisher nicht auf dem Schirm, habe eben mal (mit deinem Sentence) getestet: "im Wohnzimmer" => kein passendes Gerät; Anfrage auf spezielles Gerät (HK-Thermostat) =>  Antwort, aber "falsches" Reading (desired-temp statt measured-temp; beides ist aber in GetNumeric als "temperature" drin).
Habe dann in sentences "Temperatur" gegen "temperature" getauscht, jetzt kam was sinnvolles bei der Raumanfrage (allerdings mit "Punkt" statt "Komma", und ob man das auf zwei Stellen genau haben muss, ist ... na ja, so wird es eben geliefert...).

Auf die Anfrage bei den Heizkörpern kommt "zuverlässig" die desired-temp; das muss ich mir wohl mal ansehen...

Was bedeutet:
rhasspyIntents funktionieren weitgehend!

Vermutung: Das mit dem HASH als letztes Argument mußt du umbauen/in der Anfrage anpassen?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

...die Ursache für den Punkt habe ich gefunden:
Durch das strikte "nur was im Ausgangs-lng-Hash steht, darf ersetzt werden" gab es ein Problem mit dem Komma und den Umlauten.

Wenn man die speziell als Ergänzung zulässt, funktioniert auch das wieder:

sub _combineHashes {
    my ($hash1, $hash2, $parent) = @_;
    my $hash3 = {};
   
    for my $key (keys %{$hash1}) {
        $hash3->{$key} = $hash1->{$key};
        if (!exists $hash2->{$key}) {
            next;
        }
        if ( ref $hash3->{$key} eq 'HASH' and ref $hash2->{$key} eq 'HASH' ) {
            $hash3->{$key} = _combineHashes($hash3->{$key}, $hash2->{$key}, $key);
        } elsif ( !ref $hash3->{$key} && !ref $hash2->{$key} ) {
            $hash3->{$key} = $hash2->{$key};
        }
    }
    for (qw(commaconversion mutated_vowels)) {
        $hash3->{$_} = $hash2->{$_} if defined $hash2->{$_};
    }
    return $hash3;
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Das mit den matches_in_room, matches_outside_room sollten wir uns nochmal ansehen:

Wenn ich die Temperaturabfrage im Esszimmer mache, bekomme ich - mangels passendem Gerät im Esszimmer - die Temperatur des Sensors im Wohnzimmer (als Temperatur im Esszimmer) angesagt.

Meine aktuelle Vorstellung dazu:
- gibt es keinen passenden Match im Raum, sollte geschaut werden, ob es mehrere Sensoren gibt. Wenn ja, müßten die Räume als Auswahl angeboten werden (bzw. die Sensoren aus dem einen Raum, falls die alle im selben Raum sind).
- gibt es mehrere Sensoren => Auswahl fragen
- die letztendliche Ausgabe sollte dann sowohl den Namen des Sensors wie auch den Raum beinhalten. Das bringt aber zwei neue Probleme mit sich: jeweils "welchen" Namen bzw. Raum, wenn es mehrere gibt? Neige dazu, das zugunsten des jeweils ersten angegebenen zu entscheiden, habe aber noch keine Ahnung, ob sich das so in Code gießen läßt.
Und: vorab muss  das "Dialogische" funktionieren und mehr oder weniger frei konfigurierbar sein (klingt nicht lustig)...

Ansonsten bin ich noch etwas am Rumspielen, wie sich Dinge vereindeutigen lassen, manche "Treffer" wirken weiter etwas zufällig. Auch dazu meine Gedanken:
- Tendenziell wissen wir, welche Kombinationen Sinn machen ("volume" ist eher "media" und passt nicht richtig auf "blind").
- Da für klarere Verhältnisse zu sorgen, würde aber bedingen, dass
-- mindestens Rhasspy zum einen genauere Kenntnisse über "Typen" hat, also mehr slots definiert werden (also Rhasspy z.B. einen slot mit allen "blind"-Gerätenamen hat), und
-- eventuell dazu noch die Rückmeldungen dann auch wieder von RHASSPY nicht nur pauschal mit "up" oder eben nicht "up"( = down) ausgewertet werden, sondern auch wieder etwas differenzierter.
Muss mal testen, was da ggf. wie Sinn machen würde, oder hat jemand eine spontane Eingebung oder ein ausgefeiltes Konzept?

Aber evtl. hat auch jemand noch andere Tipps, wie man eindeutige Ergebnisse bekommen kann; habe jedenfalls das Gefühl, dass da noch "Luft" ist, und eigentlich wollte ich es vermeiden, die ganzen "alten" Threads zum Thema zu durchforsten, was sich da noch alles an (verworfenen) Ansätzen findet...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

Also früher wurde bei der Frage nach "wie ist die temperatur in der küche" in diesem Raum nach einem Gerät mit dem GetNumeric-Mapping-Typ "Temperatur" gesucht. Gab's keines, wurde der Fehlerton ausgegeben. Das hat mir persönlich eigentlich gereicht. Bzw. könnten wir auch einfach "kein passendes gerät gefunden" ausgeben lassen.

Ich tendiere eher dazu, in FHEM eine richtige Logik abzubilden anstatt das Modul nach irgendwelchen Geräten suchen zu lassen. Aber mit der Meinung bin ich wohl schon etwas zu spät dran ;D
Es macht z.B. in der Praxis eigentlich keinen Sinn, mehrere Temperatur-Sensoren in einem Raum zu haben. Also, kann man schon haben, hab ich auch. Aber interessieren tut mich eigentlich nur einer (bzw. ein Mittelwert aus allen, was wieder nur ein Device wäre).
Gibt's in einem Raum keinen Sensor, wird das wohl seinen Grund haben.

drhirn

Ich habe gerade Rhasspy in mein produktives FHEM übernommen. Und bin wieder über die selben zwei Punkte gestolpert, über die ich immer stolpere. rhasspyMaster und configFile vergessen ;D.

Gibt's irgendwie eine Möglichkeit, dass wir das so einrichten, dass das ein User nicht vergessen kann? Eventuell als verpflichtende Option ins define?