Modulentwicklung für Rhasspy Sprachassistent

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

Vorheriges Thema - Nächstes Thema

drhirn

Dieser Thread ist die Fortsetzung von https://forum.fhem.de/index.php/topic,118926.msg1133694.html#msg1133694

Hier geht es nur über die Entwicklung des Moduls. Ist somit für Endnutzer eher nicht so relevant.

Wer in das Thema RHASSPY einsteigen möchte, findet im Wiki die wichtigsten Informationen.

- https://wiki.fhem.de/wiki/RHASSPY/Schnellstart: Eine Schnellstart-Anleitung, die gleich zu den ersten Erfolgen führt
- https://wiki.fhem.de/wiki/RHASSPY/Vertiefung: Vertiefende Informationen nach dem Schnellstart
- https://wiki.fhem.de/wiki/RHASSPY: Die RHASSPY-Hauptseite mit den meisten Konfigurations-Optionen und allen Intents

Fragen zu RHASSPY werden gerne hier im Forum unter "Frontends/Sprachsteuerung" beanwortet. Bitte dem jeweiligen Themen-Titel ein "[RHASSPY]" voranstellen, damit man den Zusammenhang besser erkennt.

drhirn

Zitat von: Beta-User am 11 März 2021, 15:42:13
Glaube, die Ursache gefunden zu haben:
Da wurden teils Hashes mit leerem Inhalt erzeugt, '' ist halt nicht undef...

Jetzt hat das Hand und Fuß :)

Aber, damit's nicht langweilig wird:
"radio um 10 prozent lauter"

Msg: hermes/intent/de.fhem_SetNumeric => {"input": "radio 10 percent volUp", "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": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}, {"entity": "rhasspy/number", "value": {"kind": "Number", "value": 10}, "slotName": "Value", "rawValue": "zehn", "confidence": 1.0, "range": {"start": 6, "end": 8, "rawStart": 6, "rawEnd": 10}}, {"entity": "Unit", "value": {"kind": "Unknown", "value": "percent"}, "slotName": "Unit", "rawValue": "prozent", "confidence": 1.0, "range": {"start": 9, "end": 16, "rawStart": 11, "rawEnd": 18}}, {"entity": "Change", "value": {"kind": "Unknown", "value": "volUp"}, "slotName": "Change", "rawValue": "lauter", "confidence": 1.0, "range": {"start": 17, "end": 22, "rawStart": 19, "rawEnd": 25}}], "sessionId": "wohnzimmer-snowboy-8080609b-e57b-44f5-935b-5a29bfcb8e67", "customData": null, "asrTokens": [[{"value": "radio", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "10", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 8, "time": null}, {"value": "percent", "confidence": 1.0, "rangeStart": 9, "rangeEnd": 16, "time": null}, {"value": "volUp", "confidence": 1.0, "rangeStart": 17, "rangeEnd": 22, "time": null}]], "asrConfidence": null, "rawInput": "radio zehn prozent lauter", "wakewordId": "snowboy", "lang": null}

Mapping macht hier den Unterschied:
SetNumeric:currentVal=volume,minVal=-60,maxVal=40,cmd=volume,step=0.5,type=volume

Man würde davon ausgehen, dass bei einem Ausgangswert von 0 als Ergebnis 10 kommt. Wird aber -50. Liegt das am negativen minVal?



Beta-User

Irgendwo stand, dass Rhasspy nicht mit negativen Zahlen könnte, und so gibt es an diversen Stellen Vorkehrungen, um insbesondere percent unbedingt zwischen 0 und 100 zu halten.

Insbesondere:
                    $newVal =   0 if ($newVal <   0);
                    $newVal = 100 if ($newVal > 100);

und - zwar so beabsichtigt, aber vermutlich unwirksam - auch hier:
                #my $minVal  = (defined($mapping->{minVal})) ? $mapping->{minVal} : 0; # Rhasspy kann keine negativen Nummern bisher, daher erzwungener minVal
                my $minVal  = $mapping->{minVal} // 0; # Rhasspy kann keine negativen Nummern bisher, daher erzwungener minVal


Würde behaupten, dass es reichen würde, die oberen beiden Zeilen auszukommentieren, habe aber die Furcht, dass das Nebenwirkungen hat...

Ähm, nicht umsonst meint perlcritic:
Subroutine "RHASSPY_handleIntentSetNumeric" with high complexity score (59) at line 1918, column 1. Consider refactoring.
(Ist aber nicht so einfach, das ist schon klar...)
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

Rhasspy muss es eh nicht können. Das kann nicht mal 0 hab ich gerade gemerkt. Kann uns aber egal sein, ich sage Rhasspy ja nicht, es soll um -10% höher stellen.

Das Modul sollt's können. AV-Receiver arbeiten z.B. oft mit negativen dB Werten.

Beta-User

#4
Da hast du wohl recht...

M.E. war da auch ein Logikfehlerchen verborgen, bin mal gespannt, ob du das zwischen diesen ganzen Änderungen findest...

(Und es wäre ggf. hilfreich, die de-cfg um die neuen Fehlerkategorien zu ergänzen...)
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

Habt ihr mal bitte ne aktuelle Sprachdatei.?
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.

Beta-User

versuch's mal mit dem hier (ist auf die Schnelle zusammengestupft, nur , damit das erst mal vollständig ist):

#$Id: rhasspy-de.cfg 2021-03-11-alpha- Beta-User $
# Diese Datei an einem Ort ablegen, den der user fhem lesen kann
# und dann diesen Ort im Attribut configFile hinterlegen. Beispiel:
# attr <rhasspy> configFile ./log/rhasspy-de.cfg
#
# "commaconversion", "units" und "mutated_vowels" sind optional, wenn nicht
# angegeben, werden die englischen Werte/Gepflogenheiten verwendet bzw. keine
# Ersetzungen vorgenommen.

{
  "commaconversion": "1",
  "mutated_vowels": {
    "Ä": "Ae",
    "Ö": "Oe",
    "Ü": "Ue",
    "ß": "ss",
    "ä": "ae",
    "ö": "oe",
    "ü": "ue"
  },
  "units": {
    "unitHours": "(stunde|stunden)",
    "unitMinutes": "(minute|minuten)"
  },
  "on": "an",
  "percent": "Prozent",
  "responses": {
    "DefaultConfirmation": "OK",
    "DefaultError": "Da ist leider etwas schief gegangen",
    "NoValidData": "Sorry but the received data is not sufficient to derive any action",
    "NoDeviceFound": "Sorry but I could not find a matching device",
    "NoMappingFound": "Sorry but I could not find a suitable mapping",
    "NoNewValDerived": "Sorry but I could not calculate a new value to set",
    "NoActiveMediaDevice": "Tut mir leid  es ist kein Wiedergabegerät aktiv",
    "duration_not_understood": "Tut mir leid ich habe die Dauer nicht verstanden",
    "timerEnd": "taimer im raum $room abgelaufen",
    "timerSet": "taimer im raum $room gesetzt auf $value $unit",
    "DefaultConfirmationTimeout": "Sorry too late to confirm",
    "DefaultCancelConfir": "Thanks aborted",
    "DefaultConfirReceived": "ok will do it",
    "timeRequest": "Es ist $hour Uhr $min",
    "weekdayRequest": "Heute ist $weekDay"
  },
  "Change": {
    "Types": {
      "volume": "Lautstärke",
      "brightness": "Helligkeit",
      "temperature": "Temperatur",
      "battery": "Batterie",
      "waterLevel": "Wasserstand",
      "airHumidity": "Luftfeuchtigkeit",
      "soilHumidity": "Bodenfeuchte",
      "targetValue": "Sollwert"
    },
    "regex": {
      "kälter": "temperature",
      "wärmer": "temperature",
      "dunkler": "brightness",
      "heller": "brightness",
      "lauter": "volume",
      "leiser": "volume",
      "upward": "(höher|heller|lauter|wärmer)",
      "setTarget": "(Helligkeit|Lautstärke|Sollwert)",
      "volume": "Lautstärke"
    },
    "regexToEn": {
      "Temperatur": "temperature",
      "Luftfeuchtigkeit": "airHumidity",
      "Batterie": "battery",
      "Wasserstand": "waterLevel",
      "Bodenfeuchte": "soilMoisture",
      "Helligkeit": "brightness",
      "Sollwert": "setTarget",
      "Lautstärke": "volume"
    },
    "responses": {
      "volume": "$device ist auf $value gestellt",
      "brightness": "$device ist auf $value gestellt",
      "temperature": {
        "0": "Die Temperatur von $location ist $value",
        "1": "Die Temperatur von $location beträgt $value Grad"
      },
      "battery": {
        "0": "Der Batteriestand von $location ist $value",
        "1": "Der Batteriestand von $location beträgt $value Prozent"
      },
      "waterLevel": "Der Wasserstand von $location beträgt $value Prozent",
      "airHumidity": "Die Luftfeuchtigkeit von $location beträgt $value Prozent",
      "soilMoisture": "Die Bodenfeuchte von $location beträgt $value Prozent",
      "knownType": "$mappingType von $location beträgt $value Prozent",
      "unknownType": "Der Wert von $location beträgt $value Prozent"
    }
  },
  "stateResponseType": {
    "aus": "onOff",
    "an": "onOff",
    "auf": "openClose",
    "zu": "openClose",
    "eingefahren": "inOut",
    "ausgefahren": "inOut",
    "läuft": "inOperation",
    "fertig": "inOperation"
  },
  "stateResponses": {
    "onOff": {
      "0": "$deviceName ist ausgeschaltet",
      "1": "$deviceName ist eingeschaltet"
    },
    "openClose": {
      "0": "$deviceName ist geöffnet",
      "1": "$deviceName ist geschlossen"
    },
    "inOut": {
      "0": "$deviceName ist ausgefahren",
      "1": "$deviceName ist eingefahren"
    },
    "inOperation": {
      "0": "$deviceName ist fertig",
      "1": "$deviceName läuft noch"
    }
  }
}
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

Zitat von: Beta-User am 11 März 2021, 18:12:00
M.E. war da auch ein Logikfehlerchen verborgen, bin mal gespannt, ob du das zwischen diesen ganzen Änderungen findest...

Hab ich nicht. Aber um ehrlich zu sein, ich hab auch nicht danach gesucht.

Zitat(Und es wäre ggf. hilfreich, die de-cfg um die neuen Fehlerkategorien zu ergänzen...)

Ist erledigt.

Überhaupt ist auf GitHub gerade ein aktueller Stand (ich hab da gestern am Timer gebastelt). Allerdings immer noch unter 0.4.3beta.

drhirn

So, in meinem vorwochenendlichen Überschwang und weil gerade in der Arbeit und beim Modul alles so funktioniert, wie's soll, hab ich in GitHub eine Version 0.4.3 erstellt. Das ist die aktuelle "stable".

Weiter geht's mit 0.4.4beta ;)

Beta-User

#9
Na ja, ich hätte da noch ein paar Kleinigkeiten und auch einige Vorarbeiten aus der beta...

Sollte (hoffentlich!) nichts brechen, aber damit wir in etwa auf demselben Stand sind...
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

An was bastelst du eigentlich gerade? Eine Dialog-Option?

Ich übernehm' das gleich.

Beta-User

An zwei Dingen:
a) Ausführen nur nach Bestätigung, das ist vermutlich das, was du mit "Dialog-Option" meinst?
b) Einsammeln der ganzen Mappings => Bilden von einem Hash, der die ganze Struktur der steuerbaren Devices so abbildet, dass man darüber die Auswertung @runtime machen kann... Da interessiert mich v.a. erst mal, wie der sinnigerweise strukturiert sein sollte.
Ist der für die "eigenen" Attribute mal erstellt und funktionsfähig, könnte man dann "fremde Attribute" ausschlachten.

ad a) fehlt eigentlich fast nur
aa) das Verzögern, wenn "c" gesetzt ist (im Shortcut-handling)
bb) ein "Bestätigungs"-Intent (da wäre Zuarbeit angesagt...)
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

Für bb brauche ich mehr Infos. Was genau stellst du dir das vor? Sowas:

Ich: Lösche wikipedia.org
Rhasspy: Bist du sicher?
Ich: Nein

Beta-User

Ja, genau so..

Oder etwas ausführlicher:

Anweisung via Rhasspy => Rückfrage =>
a) "Ja, mach" (oä) => Ausführung
b) "Neee, bloß nicht!" (oä.) => Abbrechen

oder eben
c) keine rechtzeitige Rückmeldung => Abbruch
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

#14
Deutsche Sprache - schwere Sprache.
Mein Rhasspy kann derzeit keine Umlaute:{"Room":"Wohnzimmer","Type":"light","input":"lösche alle light im Wohnzimmer","intent":"SetAllOff","probability":1,"rawInput":"lösche alle lichter im wohnzimmer","requestType":"voice","sessionId":"Wohnzimmer-alexa-f1c191c6-5621-4e09-88ad-10083d405b19","siteId":"Wohnzimmer"}
Darauf hin sagt Rhasspy, dass alle Lampen auf dem Dachboden ausgeschaltet sind.
Vom Rhasspy-Master wird der richtige Raum erkannt und übertragen.
Gruß Jens

p.s. Bei mir funktioniert:
    # JSON Decode und Fehlerüberprüfung
    my $decoded = eval { decode_json(encode('cp-1252',$json)) };

Wobei mir aber immer noch der Dachboden statt Wohnzimmer übergeben wird. Wieso verwendest Du eigentlich "eval"?

p.p.s. dito# Parse the response of the request to the HTTP-API
sub RHASSPY_ParseHttpResponse {
...
        my $siteIds = encode('cp-1252',$ref->{dialogue}{satellite_site_ids});
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.