Perl - Modul 10_RHASSPY.pm "professionalisieren"

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

Vorheriges Thema - Nächstes Thema

Beta-User

...ganz so einfach ist es leider nicht...

Man muss schon die message auspacken, um überhaupt den intend zu bekommen, und das ist im Moment dann in onmessage. Aber es wäre m.E. sowieso eine Frage, warum man nicht diesen Teil nach Parse rübernimmt.
Werde mir das mal vornehmen, der Ablauf v.a. bei den shortcuts kommt mir irgendwie ineffektiv und schlecht nachvollziehbar vor: da wird bei jeder message erst das shortcut-Attribut immer wieder auseinandergenommen & analysiert & sortiert (und das dann ggf. später nochmal?). Sollte eigentlich nicht soooo schwer sein, das in einen Hash-lookup umzubasteln, wenn man es anders strukturiert. Mal sehen...
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

Aus Rhasspy-Sicht ist das ein Intent.

{"input": "ton an", "intent": {"intentName": "de.fhem:Shortcuts",...

So wie ich das sehe, kein Grund mehr, das in onmessage getrennt von den anderen Intents zu behandeln. Snips hat das damals anders gemacht, deswegen das extra elsif.
Das wollte ich damit sagen.

A propos Hash-Lookup (bzw. Hash-Dispatch): Hättest du da ein Beispiel für mich, das so einfach ist, dass ich das auch verstehe? Also wie eine if-elsif-Abfrage entsprechend umgebaut werden kann. Ich finde bei Recherchen nur Beispiele, die ich nicht kapiere ;).

Beta-User

An dem Hash-lookup bastle ich grade rum, mein "Steinbruch" dazu ist in Twilight zu finden (extWeather).
Ein (hoffentlich) halbwegs einfaches Beispiel wäre der go_eCharger (m2-attrTemplate):
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}}
Das "car"-Reading ist nummerisch, das macht da dann einen passenden lesbaren Text in das userReading...

Und andersrum fragt man einfach ab, ob der Hash defined ist (da muss man nur aufpassen, dass man nicht versehentlich den "davorstehenden" Hash generiert, obwohl er bis dahin nicht da war...). Wenn ja, rechnet man einfach mit dem Wert weiter, fertig.

Was die Funktionsreferenzen via Hash angeht, hatte ich den mAn. einfachsten Fall mit MySensors bereits an passender Stelle im Code genannt, es gibt dazu auch in der Perl-Ecke eine Diskussion, wie das entstanden ist. Da ist auch zu finden, dass das da etwas "komisch" aussieht, weil der lookup-Wert einer Konstante  zu entnehmen ist; eigentlich sollte das hier einfacher zu notieren sein, weil den Käse mit Konstanten fangen wir hier bitte gar nicht erst an ;) ...

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...
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 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...

Gefällt mir auch nicht. Habe ich auch immer so gemacht, wie du. Aber - wenn ich mich recht erinnere - hat perlcritic das mal angemeckert. Oder ich hab das aus einem Tutorial. Irgendwo her auf jeden Fall.

Hmm, perlcritic war's wohl nicht, gerade ausprobiert. Dann mach ich das wieder anders.

Beta-User

#109
So, ein wenig kann man erkennen, in welche Richtung es gehen könnte...

Hab's mal mit diesen Attributinhalten versucht, aber noch nicht vollständig durchgetestet
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

Die Änderungen bzgl. der Auswertung des Attributs kann man an einfachsten in einem list sehen.

Viel Spaß beim Testen!
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 hab das - wie hier zu sehen - mal aus onmessage rausgenommen. Und mir dann überlegt, wie ich das Kommando auseinandernehmen könnte. Was eigentlich leicht wäre. Ist nicht fertig, wird also unter Umständen Fehler werfen.

Beta-User

Ja, irgendwann ist mir auch aufgegangen, was du gemeint hattest mit dem, dass es eigentlich dasselbe ist...

Du solltest mal meine letzte Version downloaden und ein diff machen  ;) .
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

#112
Anbei eine Fassung, die mal die letzten Stände soweit konsolidieren dürfte, also das aus deinem github, meine Version von gestern und was mir sonst noch so auf- und eingefallen ist...

Was kann das?
- "alte Attribut-Werte" in "shortcuts" und die neuen parsen und (hoffentlich) zutreffend auswerten (slots: s.u.);
- Attribute "disable" und "disableForIntervals";
- "onmessage" darf m.E. bleiben, das in Parse() reinzubasteln, würde die Struktur m.E. nur verkomplizieren, nicht vereinfachen...
- die einzelnen Funktionausfrufe sind aus der "elsif-Hölle" entkommen und (weitestgehend) zu Hash-Referenzen umgebaut;
- Shortcuts werden ebenfalls durch Referenzierungen auf den aus dem Attribut gebauten Hash ausgewertet und ausgeführt. Damit sollte eigentlich dann RHASSPY_allRhasspyShortcuts() entfallen können. Unklar ist mir, ob das umgebaute RHASSPY_updateSlots() jetzt noch tut...
Vermutlich kann jetzt "Shortcuts" dasselbe wie "custom intent" (?)...
- Es gibt eine "array-Kürzen- und -Sortieren"-Funktion;

Was nicht so richtig will, ist das RHASSPY_EvalSpecialsDefaults(), da habe ich mich noch in der Hash-(de-)-Referenzierungshölle verheddert und muss wohl auch noch das eine oder andere Nachlesen....

Falls Fragen sind: her damit ;) .
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

#113
Noch ein update. Könnte das "siteId"-Problem von https://forum.fhem.de/index.php/topic,113180.msg1135606.html#msg1135606 lösen, sonst ist nicht wirklich viel passiert:
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 bist mir zu schnell. Ich hab mir doch gerade erst vor ein paar Minuten deine Änderungen von heute morgen angesehen :D

Timer hat bei mir immer funktioniert. Weiß noch nicht, was Thargor für ein Problem hat.

Außerdem bin ich jetzt verwirrt. Kann am Mittagessen liegen. Aber kannst du mir bitte folgendes in einen Satz übersetzen: $room = $room // $siteId;

Ich brauche im Timer sowohl $value, als auch $time. Nachdem ich ja das eine in Sekunden umrechne, will ich nicht, dass als Antwort "Timer gesetzt auf 3600 Sekunden" zurück kommt, wenn ich ihn auf eine Stunde stelle ;).

Beta-User

#115
Vermutlich ist das Problem bei dir nicht vorhanden, weil $siteId und $room bei dir identisch sind; bei ihm nicht. Ich vermute, dass die Variable $room einmal an der falschen Stelle reingerutscht war:
$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.

Das mit $value/$time ist einleuchtend, hoffe es wieder repariert zu haben...
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

Letzte Zeile bei SetTimer
return [$name];

Die eckigen Klammern sind keine Absicht, oder?

Beta-User

#117
Die eckigen Klammern sind der Versuch Perl zu signalisieren, dass es das als Array zurückgeben soll.
Was ähnliches verbirgt sich auch hinter (#1411 in der Anlage):
$device = split m{,}x, $shortcut->{NAME};
Da geht es auch darum, dass ggf. ein Array zurückgegeben wird, selbst, wenn nur ein Device angegeben war.

Nach der Beschäftigung mit https://perldoc.perl.org/perlreftut habe ich es dann auch noch hinbekommen, das RHASSPY_EvalSpecialsDefaults() zumindest halbwegs funktional zu bekommen (indem eine Hash-Referenz übergeben wird statt des Hashes, alles klar...?). Was ich mir noch unsicher bin: Überschreiben die übermittelten Hash-Elemente immer die in der Funktion vorhandenen? Sollte eigentlich so sein, aber ob das hinhaut, wird man vermutlich nur mit etwas Testen in Erfahrung bringen können.

Jetzt wäre dann eigentlich (neben Code-Cleanup und Testen) dann das Dynamisieren der Sprache dran...

Oder erst mal die Präfix-Attribut-Namen?
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

Soweit mal gar nichts klar ehrlich gesagt. Das war in der Woche mehr Perl, als mein Hirn verkraftet hat ;).

Aber, bezüglich eckige Klammer hab ich gefragt weil: ERROR: >ARRAY(0x55b208b39008)< returned by the RHASSPY ParseFn is invalid, notify the module maintainer

Ansonsten muss ich jetzt mal alles testen. Mir sind da schon ein paar Ungereimtheiten aufgefallen, die es zu lösen gilt.

Beta-User

#119
Ja, war einiges an Perl ;D ...

$device muss als scalar zurückgegeben werden ( ::) ), das war wohl nix mit dem Array an dieser Stelle...

Anbei zu guter Letzt noch ein update, das das behebt und generell fhem.pl-Fehlermeldungen vermeidet, wenn irgendwo "Unsinn" konfiguriert ist bzw. als $device zurückgegeben wird (bei den get-Funktionen kann man das wohl lassen, oder?).

Ich hoffe, dass es nicht allzuviele Ungereimtheiten sind, manches wird erst sichtbar, wenn man Testet und ins Log schreibt. Das machen die letzten Fassungen etwas sehr exzessiv bei verbose 4/5, hab's jetzt wieder (an "meinen" Stellen) etwas reduziert und - grade was das %specials-Thema angeht - an hoffentlich auch für andere Funktionen hilfreicher Stelle plaziert...
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