Perl - Modul 10_RHASSPY.pm "professionalisieren"

Begonnen von drhirn, 18 Februar 2021, 17:02:31

Vorheriges Thema - Nächstes Thema

Wzut

Kurzform
my $attribute = shift // return;

Langform
my $attribute = shift;
return if (!defined($attribute));

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

drhirn

Ahhhh, danke!

Gar nicht so leicht, nach "//" zu suchen.

Beta-User

Habe im Code auch ein paar Anmerkungen verteilt. Eine davon:
# 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...)

Man kann da auch mehrere Funktionen dahinter schreiben oder die die defined-or-Abfragen verketten (letzteres werden wir evtl. noch brauchen...)

Zwei Funktionen bei !defined:
    my $device = shift // carp q[No target device provided!] && return;
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

Ich dachte, das war als Hinweis gedacht, dass du mein if (defined... rausgelöscht hast  :-[

drhirn

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:
# Attribute setzen / löschen
sub RHASSPY_Attr {
    my $command = shift;
    my $name = shift;
    my $attribute = shift // return;
    my $value = shift;



Ich musste das Device zuerst löschen und neu anlegen, damit er die Änderungen im Attribut übernommen hat. Jetzt kann ich im laufenden Betrieb ändern.

Beta-User

#80
Zitat von: drhirn am 23 Februar 2021, 08:33:35
Ich dachte, das war als Hinweis gedacht, dass du mein if (defined... rausgelöscht hast
...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 ::) .)

Anbei jetzt eine Version, die bei Dispatch was zurückliefert. Ganz 100% glücklich bin ich noch nicht, weil das bisher "nur" der Name der verarbeiteten RHASSPY-Instanz ist (hoffentlich, mit zweien habe ich nicht getestet...), und es eigentlich effizienter sein dürfte, auch gleich die veranlassten Änderungen an "untergeordneten" Devices mit abzufrühstücken. Dazu müßte man die aber irgendwie durch den Code rückwärts verfolgen (intent?).

Wenn das mit dem longpoll dann wieder funktioniert (Test bei mir sah auf den ersten Blick gut aus), könnten wir das mit dem Sprachhash dann mal angehen...
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

Das Ergebnis ist durchwachsen. Ich habe zwei Browser-Fenster offen. Eines mit dem Rhasspy-Device, eines mit dem Raum RHASSPY (in dem die zu schaltenden Devices - Deckenlampe + Radio - sind).
Die Readings des Rhasspy-Devices werden jetzt wieder aktualisiert.
Der Status von Deckenlampe und Radio bleibt aber der selbe. Ändert sich nur, wenn ich die Seite aktualisiere.

Habe mit forceNEXT 0 und 1 getestet

Hier das Log:

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


Ich gehe jetzt mal davon aus, dass es immer nur EINE verarbeitende Instanz gibt. Mehr macht keinen Sinn. Und wenn doch, wären das wahrscheinlich zwei unterschiedliche MQTT2_CLIENTs.

Beta-User

#82
OK, dann ist das "richtig", was in der Anmerkung steht:
#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.

Bedeutet, wir müssen diese Gerätenamen irgendwie "durchschleusen"...
Anbei der Versuch, das exemplarisch für onOff-Devices zu implementieren. Damit sollte "lampe1" "rot leuchten" ;D .

Edit: "forceNEXT" hat nur was mit anderen Modulen zu tun, nicht irritieren lassen...
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

Leider keine guten Nachrichten. Hat nichts geändert.
Mal abgesehen davon, dass SetOnOff den Zustand schaltet, nicht GetOnOff.

Aber ich verstehe gerade nicht ganz, was du vor hast. Wie da was heißt, ist ja eigentlich nicht relevant. Oder? Das Modul hat schon bisher den rhasspyName dem richtigen Device-Name zugeordnet. Und das FHEM-Device wird ja auch geschalten.

Beta-User

#84
...wer lesen kann ist im Vorteil, das "Get" ist mir im Eifer grade raus...

War eh' an dem "%umlauts" dran, dann kannst du das auch gleich mit testen, selbst wenn es nichts hilft, das $device zurückzuliefern (falls du es auch bei set eingebaut hattest).

Der Punkt mit der Rückgabe ist (nach meinem möglicherweise noch unvollständigen Verständnis) der: Der "matching-Mechanismus" ist bei MQTT_DEVICE und bei MQTT2_DEVICE ein grundlegend anderer. MQTT_DEVICE (und Derivate wie RHASSPY, MQTT_BRIDGE oder MYSENSORS_DEVICE (das senselben matching-Mechanismus nutzt), arbeiten an Dispatch vorbei, was mAn. OK ist, solange sowieso nur einzelne Readings an einzelnen Devices ein update bekommen).
Wärend man "in Dispatch" ist, scheint die Eventverarbeitung angehalten zu sein und das Modul, das per Dispatch aufgerufen wurde, muss eine (vollständige...) Liste aller Devices zurückliefern, die es upgedatet hat sowie die Info, ob ggf. versucht werden soll, die Info noch an weitere Client-Module weiterzugeben (hier also MGB oder MQTT2_DEVICE), damit die das auch noch auswerten 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

drhirn

Ich glaub, das %umlauts brauchen wir gar nicht mehr. Hab das eh durch "makeReadingName" ersetzt. Nur noch nicht genügend getestet.

drhirn

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

Zeile 55:
my %languagevars = (

Zeile 930:
my %mutated_vowels = \%languagevars{$language}->{mutated_vowels};

Beta-User

#87
Zitat von: drhirn am 23 Februar 2021, 15:30:29
Ich glaub, das %umlauts brauchen wir gar nicht mehr. Hab das eh durch "makeReadingName" ersetzt. Nur noch nicht genügend getestet.
Na 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.

Stellt sich nur die Frage, wie das auf Französisch klappen soll ::) . Dazu steht in "makeReadingName" noch nichts...

Kannst du mir eine passende topic-message-Kombi (sowie ggf. ein passendes RAW-Device zum Schalten) zum Testen zukommen lassen, ich würde das gerne zum Laufen bringen ;) . Mit meinem Test-Publish kam da nicht viel rum außer ein paar "uninitialized"-Warnungen mit anderer Ursache, fix anbei...

Zeile 55 läuft hier (auch vorher) anstandslos durch (Perl 5.32.1), da habe ich im Moment noch keine Idee; 5.28 teste ich bei Gelegenheit.
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

Du kannst (fast) alles von mir haben. Ich schulde dir ja inzwischen schon mindestens einen halben LKW voll Bier. ;)

FHEM hat kaum englischsprachige User. Sollte da irgendwann ein Franzose auftauchen, können wir uns darum immer noch Gedanken machen ;).

Ein RAW-Device:

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


Was du mit topic-message-Kombi meinst, ist mir nicht ganz klar. Sowas?
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}

drhirn

Perl-technisch bist du weit vor mir. Die Docker-Version hat 5.028001. Könnte ein Grund sein.