Modulentwicklung für Rhasspy Sprachassistent

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

Vorheriges Thema - Nächstes Thema

drhirn

Ist bei mir auch so:


2021.03.13 14:58:41.329 5: RHASSPY: [Rhasspy] Parse (IO: rhasspyMQTT2): Msg: hermes/intent/de.fhem_SetAllOff => {"input": "lösche alle light küche", "intent": {"intentName": "de.fhem:SetAllOff", "confidenceScore": 0.5}, "siteId": "default", "id": "efb67fe9-3469-409f-9c93-5050e8c37e2b", "slots": [{"entity": "Type", "value": {"kind": "Unknown", "value": "light"}, "slotName": "Type", "rawValue": "lichter", "confidence": 1.0, "range": {"start": 12, "end": 17, "rawStart": 12, "rawEnd": 19}}, {"entity": "de.fhem.Room", "value": {"kind": "Unknown", "value": "küche"}, "slotName": "Room", "rawValue": "küche", "confidence": 1.0, "range": {"start": 18, "end": 23, "rawStart": 20, "rawEnd": 25}}], "sessionId": "efb67fe9-3469-409f-9c93-5050e8c37e2b", "customData": null, "asrTokens": [[{"value": "lösche", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 6, "time": null}, {"value": "alle", "confidence": 1.0, "rangeStart": 7, "rangeEnd": 11, "time": null}, {"value": "light", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 17, "time": null}, {"value": "küche", "confidence": 1.0, "rangeStart": 18, "rangeEnd": 23, "time": null}]], "asrConfidence": null, "rawInput": "lösche alle lichter in der küche", "wakewordId": null, "lang": null}
2021.03.13 14:58:41.330 5: Parsed value: light for key: Type
2021.03.13 14:58:41.330 5: Parsed value: lösche alle light küche for key: input
2021.03.13 14:58:41.330 5: Parsed value: efb67fe9-3469-409f-9c93-5050e8c37e2b for key: sessionId
2021.03.13 14:58:41.330 5: Parsed value: default for key: siteId
2021.03.13 14:58:41.331 5: Parsed value: 0.5 for key: probability
2021.03.13 14:58:41.331 5: Parsed value: küche for key: Room
2021.03.13 14:58:41.331 5: Parsed value: lösche alle lichter in der küche for key: rawInput
2021.03.13 14:58:41.331 5: Parsed value: SetAllOff for key: intent
2021.03.13 14:58:41.332 5: handleCustomIntent called with SetAllOff key
2021.03.13 14:58:41.332 5: Calling sub:  SetAllOff( "wohnzimmer","light" )
2021.03.13 14:58:41.332 3: Raum: wohnzimmer - Typ: light

Beta-User

#31
Glaube das Problem gefunden zu haben: Die Parameternamen wurden nämlich im Hash ausgetauscht.

Die Version anbei scheint das Problem nicht mehr zu haben, man muss das Array kopieren, und dann erst die Parameter erstetzen, sonst stehen da einfach die letzten Werte drin...

Das mit dem internen Hash für die ganzen Mappings etc. geht auch voran, der nächste Schritt wäre jetzt, die Kommandos so umzubauen, dass sie auf diesen internen Hash zugreifen; ich bin auch noch nicht sicher, ob er vollständig ist.

Btw.: Es sollte über diesen Mechanismus dann auch leichter sein, sowas wie "mach alle Lichter im Wohnzimmer aus" direkt im Modul umzusetzen (fände ich sinnvoll).
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 13 März 2021, 17:13:00Glaube das Problem gefunden zu haben: Die Parameternamen wurden nämlich im Hash ausgetauscht.

Eine Lösung für welches Problem?

ZitatBtw.: Es sollte über diesen Mechanismus dann auch leichter sein, sowas wie "mach alle Lichter im Wohnzimmer aus" direkt im Modul umzusetzen (fände ich sinnvoll).

Bin immer noch der Meinung, es wäre einfach, dass via FHEM zu lösen (devspec, structure, etc.) und einfach SetOnOff zu nehmen.

Beta-User

Zitat von: drhirn am 14 März 2021, 10:04:59
Eine Lösung für welches Problem?
Das von JensS mit dem "falschen" Raum: Das Problem war, dass die Argumente im RHASSPY-Hash gespeichert waren (als "Namen") und dann bei der ersten Ausführung durch die ermittelten Werte getauscht wurden. Daher hat das beim 2. Mal (mit anderen Werten) nicht mehr funktioniert...
Jetzt wird mit einer Kopie aus dem Hash gearbeitet, damit scheint das Problem gelöst zu sein.

ZitatBin immer noch der Meinung, es wäre einfach, dass via FHEM zu lösen (devspec, structure, etc.) und einfach SetOnOff zu nehmen.
Jein. Bezogen auf den einzelnen Anwendungfall mag das richtig sein, v.a., wenn man die Routinen schon hat bzw. die Strukturen eingerichtet sind.
Ggf. braucht es eben gar keine zusätzlichen Strukturen oder myUtils-Routinen. Wir könnten den "Pseudonamen" "all" (oder "everything" oä.)  zulassen, um dann einfach die Gruppe zu "schalten" (auch: auf 80% stellen, usw. usf.). Ich glaube, das wäre nicht sooo schwierig direkt im Modul umzusetzen, und weil der Code recht generisch sein dürfte, geht das im Ergebnis dann mit einiger Sicherheit auch mit praktisch allen passenden Kommandos. (Aber Rom und so).
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 wenn ich dich richtig verstehe, müssten wir dann mal alle Geräte finden, die angesprochen werden sollen. Danach rausfinden, ob sich die mit dem gewünschten Befehl schalten lassen. Und dann schalten. Anschließend das ganze wieder von vorne um festzustellen, ob auch alle richtig geschaltet wurden.

Ich glaub immer noch, dass z.B. eine structure sinnvoller wäre. Die kann ich dann - wie mal erwähnt - auch außerhalb von Rhasspy schalten.

Aber, wenn das Modul dann noch cooler wird, unterstütze ich das Vorhaben natürlich sofort :)

Beta-User

Genau.
Kannst ja mal testweise versuchen, ob der neue Befehl "reinit devicemap" bei dir eine schöne Struktur unter helper/devicemap in das list vom RHASSPY-Device erstellt, die dann Grundlage sein könnte.
(Ist alles noch nicht fertig, aber ggf. kannst du dann erahnen, in welche Richtung meine Überlegungen gehen).

Und klar, das mit den Rückmeldungen ist bei Gruppenanweisungen noch ein separates Thema, aber da fällt uns dann bei @Array>1 dann schon irgendwas ein...
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


$VAR1 = {
          'lampe2' => {
                        'intents' => {
                                       'SetNumeric' => {
                                                         'maxVal' => '40',
                                                         'cmd' => 'volume',
                                                         'step' => '0.5',
                                                         'type' => 'volume',
                                                         'minVal' => '-60',
                                                         'currentVal' => 'volume'
                                                       },
                                       'GetOnOff' => {
                                                       'valueOff' => 'off',
                                                       'currentVal' => 'state',
                                                       'type' => undef
                                                     },
                                       'MediaControls' => {
                                                            'cmdStop' => 'stop',
                                                            'cmdPlay' => 'play',
                                                            'cmdBack' => 'previous',
                                                            'cmdFwd' => 'next',
                                                            'cmdPause' => 'pause',
                                                            'type' => undef
                                                          },
                                       'GetNumeric' => {
                                                         'currentVal' => 'temperature',
                                                         'type' => 'temperature'
                                                       },
                                       'SetOnOff' => {
                                                       'cmdOff' => 'off',
                                                       'cmdOn' => 'on',
                                                       'type' => undef
                                                     }
                                     }
                      },
          'Channels' => {
                          'bad' => {
                                     'orf zwei' => 'lampe1',
                                     'orf eins' => 'lampe1',
                                     'orf drei' => 'lampe1'
                                   },
                          'küche' => {
                                        'orf drei' => 'lampe1',
                                        'orf eins' => 'lampe1',
                                        'orf zwei' => 'lampe1'
                                      }
                        },
          'rhasspyRooms' => {
                              'schlafzimmer' => {
                                                  'radio' => 'lampe2',
                                                  'lampe' => 'lampe2',
                                                  'licht' => 'lampe2'
                                                },
                              'bad' => {
                                         'radio' => 'lampe1',
                                         'Musik' => 'RXV777',
                                         'deckenlampe' => 'lampe1',
                                         'licht' => 'lampe1'
                                       },
                              'wohnzimmer' => {
                                                'radio' => 'lampe2',
                                                'licht' => 'lampe2',
                                                'lampe' => 'lampe2'
                                              },
                              'küche' => {
                                            'licht' => 'lampe1',
                                            'radio' => 'lampe1',
                                            'deckenlampe' => 'lampe1'
                                          }
                            },
          'Colors' => {
                        'küche' => {
                                      'grün' => 'lampe1',
                                      'blau' => 'lampe1',
                                      'gelb' => 'lampe1',
                                      'rot' => 'lampe1'
                                    },
                        'bad' => {
                                   'grün' => 'lampe1',
                                   'blau' => 'lampe1',
                                   'gelb' => 'lampe1',
                                   'rot' => 'lampe1'
                                 }
                      },
          'RXV777' => {
                        'intents' => {
                                       'SetOnOff' => {
                                                       'cmdOn' => 'on',
                                                       'type' => undef,
                                                       'cmdOff' => 'off'
                                                     },
                                       'MediaControls' => {
                                                            'cmdPause' => 'pause',
                                                            'type' => undef,
                                                            'cmdStop' => 'stop',
                                                            'cmdBack' => 'previous',
                                                            'cmdPlay' => 'play',
                                                            'cmdFwd' => 'next'
                                                          },
                                       'GetOnOff' => {
                                                       'valueOff' => 'off',
                                                       'currentVal' => 'state',
                                                       'type' => undef
                                                     },
                                       'SetNumeric' => {
                                                         'currentVal' => 'volume',
                                                         'minVal' => '0',
                                                         'cmd' => 'volume',
                                                         'maxVal' => '100',
                                                         'type' => 'volume',
                                                         'step' => '10'
                                                       }
                                     }
                      },
          'lampe1' => {
                        'Colors' => {
                                      'rot' => 'rgb FF0000',
                                      'gelb' => 'rgb 00F000',
                                      'blau' => 'rgb 0000FF',
                                      'grün' => 'rgb 00FF00'
                                    },
                        'Channels' => {
                                        'orf zwei' => 'set lampe1 off',
                                        'orf eins' => 'set lampe1 on',
                                        'orf drei' => 'set lampe1 on'
                                      },
                        'intents' => {
                                       'GetNumeric' => {
                                                         'type' => 'brightness',
                                                         'currentVal' => 'brightness'
                                                       },
                                       'SetOnOff' => {
                                                       'cmdOff' => 'off',
                                                       'cmdOn' => 'on',
                                                       'type' => undef,
                                                       'response' => 'Okidoki'
                                                     },
                                       'SetNumeric' => {
                                                         'cmd' => 'brightness',
                                                         'maxVal' => '255',
                                                         'minVal' => '0',
                                                         'currentVal' => 'brightness',
                                                         'map' => 'percent',
                                                         'step' => '1',
                                                         'type' => 'brightness'
                                                       },
                                       'Status' => {
                                                     'response' => 'Die Temperatur in der Küche beträgt',
                                                     'type' => undef
                                                   },
                                       'GetOnOff' => {
                                                       'type' => undef,
                                                       'valueOff' => 'off',
                                                       'currentVal' => 'state'
                                                     },
                                       'MediaControls' => {
                                                            'cmdFwd' => 'next',
                                                            'cmdStop' => 'stop',
                                                            'cmdBack' => 'previous',
                                                            'cmdPlay' => 'play',
                                                            'type' => undef,
                                                            'cmdPause' => 'pause'
                                                          }
                                     }
                      }
        };


Gute Überlegung!

Allerdings müssten wir das immer ausführen, wenn ein Device geändert wird. Wie auch updateSlots. Also dort gleich zusätzlich einbauen?

Beta-User

Jein.

Würde mal folgendes vorschlagen:
- Das ist erst mal optional!
- Wir könnten eine DEF-Option einbauen, damit es beim Start ausgeführt wird?
- Ist die Struktur vorhanden, wird sie dann (wenn es soweit fertig ist) dafür genutzt, die bisherigen Routinen zu "umgehen"
=> testen ist möglich

- dann erst mal sehen, ob man genericDeviceType "ausschlachten" kann, um die Struktur zu füllen.

Dazwischen oder danach dann das "Struktur-Thema"...?
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

Warum "Jein"? Wenn wir uns darauf verlassen, müssen Änderungen an einem Device ja gleich im helper abgebildet werden. Oder nicht?

Ich komm übrigens langsam auch zu der Ansicht, dass deine Idee mit dem genericDeviceType sehr gut ist.

Beta-User

Na ja, letztlich ist das meistens statisch, und ggf. muss halt der User einen "scan" einleiten, wenn er was ändert oder ergänzt. Wird woanders auch so gemacht (ASC, z.B.)...

Eine NotifyFn wollte ich eigentlich nicht einbauen.
Zitat von: drhirn am 14 März 2021, 10:59:45
Ich komm übrigens langsam auch zu der Ansicht, dass deine Idee mit dem genericDeviceType sehr gut ist.
:)
Dauert halt noch, bis wir dahin kommen...
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 14 März 2021, 11:02:32
Na ja, letztlich ist das meistens statisch, und ggf. muss halt der User einen "scan" einleiten, wenn er was ändert oder ergänzt. Wird woanders auch so gemacht (ASC, z.B.)...

Eh. Aber in unserem Fall müsste er bei einer Änderung zwei Sachen ausführen (updateSlots und reinit). Finde ich nicht so schön.

Beta-User

Mittelfristig sollte es ggf. dann "update" mit "slots" "devicemap" und "language" bzw. "all" geben?
Die Teile (anders) zu verketten, wäre kein Problem...
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

Wäre fast sinnvoll. Oder überhaupt nur "all" ;). Wir müssen nur sicher gehen, dass sowohl der hash, als auch Rhasspy was davon mitbekommen.

drhirn

Was hattest du bei "setUp"/"setDown" für ein Gerät im Kopf?

Beta-User

...dann vermutlich eher weiter "updateSlots" (mit integriertem reinit devicemap) und reinit language; letzteres ist schon irgendwie was anderes...

setUp war nicht für irgendein konkretes Gerät; im Code tauchte halt bisher irgendwas auf, das dann nach setTarget gewandert ist ("Sollwert"?), von daher ist es halt in der Form drin geblieben. Darf aber gerne auch anders heißen, war halt das, was mit eingefallen ist...
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