Attributname beim setzen des Attribut neu benennen

Begonnen von CoolTux, 03 Januar 2023, 11:11:27

Vorheriges Thema - Nächstes Thema

CoolTux

Hallo,

Der unten stehende Code stammt nicht aus meiner Tastatus  ;D

Der code steht in der AttrFn eines Modules. Durch das zuweisen von $_[2] und $_[3] wird sowohl der Attributname als auch der Attributwert gesetzt. Gerade durch $_[2] erfolgt ein komplett neuer Attributname der nicht in der vorher definierten Attributliste steht. Und das eigentlich ausgewählte Attribut wird nicht gesetzt. Das ist sogar genau so gewollt. Jetzt habe ich mich gefragt wie man das auch anders machen kann da ja $_ laut perl critic nicht erwünscht ist. Hat da jemand eine Idee?


sub Attr {
my ($cmd,$name,$attr_name,$attr_value) = @_;

Log3($name, 4, "Attr - $cmd - $name - $attr_name - $attr_value");

if($cmd eq "set") {
if ($attr_name eq "matrixQuestion_") {
my @erg = split(/ /, $attr_value, 2);
return qq("attr $name $attr_name" ).I18N('require2') if (!$erg[1] || $erg[0] !~ /[0-9]/);
$_[2] = "matrixQuestion_$erg[0]";
$_[3] = $erg[1];
}
if ($attr_name eq "matrixAnswer_") {
my @erg = split(/ /, $attr_value, 2);
return qq(wrong arguments $attr_name") if (!$erg[1] || $erg[0] !~ /[0-9]+/);
$_[2] = "matrixAnswer_$erg[0]";
$_[3] = $erg[1];
}
}

return ;
}



Im Grunde geht es also darum ein anderes Attribut zu setzen als das welches der User ausgewählt hat. Und welches noch nicht einmal in der Attr Liste steht.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Thorsten Pferdekaemper

Hi,
das ist ja schon ein "bisschen" ferkelig...
Ich mache etwas ähnliches so:

$main::attr{$hash->{NAME}}{$attr} = $value;
main::addStructChange("attr", $hash->{NAME}, "$hash->{NAME} $attr $value");

Ich setze damit aber auch nur zusätzliche Attribute.
Gruß,
   Thorsten
FUIP

rudolfkoenig

ZitatIm Grunde geht es also darum ein anderes Attribut zu setzen als das welches der User ausgewählt hat.
Ist nicht im Sinne des Erfinders.
Wann ist sowas notwendig?

CoolTux

Zitat von: rudolfkoenig am 03 Januar 2023, 11:46:09
Ist nicht im Sinne des Erfinders.
Wann ist sowas notwendig?

Ja wem sagst Du das.
Es geht darum ein Attribut zu nehmen "matrixQuestion_", wobei das nur ein Dummy zur Hilfe ist. Dieses Attribut befüllt man mit

attr DEVICE matrixQuestion_ 0 Frage:Antwort

Nun soll matrixQuestion_ nicht gesetzt werden, sondern ein neues Attribut soll entstehen Namens DEVICE matrixQuestion_0 mit Wert Frage:Antwort

Damit sollen bis zu 9 Fragen und Antworten zusammen gestellt werden als Attribut. Die Idee an sich ist gut, nur die Umsetzung Zweifelhaft. Aber wie kann man es besser machen außer das man matrixQuestion_0 bis matrixQuestion_9 hart setzt?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

betateilchen

Zitat von: CoolTux am 03 Januar 2023, 11:53:37
Aber wie kann man es besser machen außer das man

Warum müssen das Attribute sein?

Anstatt die Frage:Antwort Paare als Attribut zu setzen: als key/value analog zu irgendwelchen secrets speichern?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatAber wie kann man es besser machen außer das man matrixQuestion_0 bis matrixQuestion_9 hart setzt?
Indem man in attrList matrixQuestion_[0-9] setzt.

Waere es nicht besser nur ein Attribut mit NewLine als Trenner und ein Text-Editor als Eigabefeld zu verwenden?

CoolTux

Zitat von: betateilchen am 03 Januar 2023, 12:06:14
Warum müssen das Attribute sein?

Anstatt die Frage:Antwort Paare als Attribut zu setzen: als key/value analog zu irgendwelchen secrets speichern?

Naja im Enddefekt setzt der User die Fragen und Antworten ja nur einmal für das Device. Sind also statisch. Wären also bei den Attributen schon gut aufgehoben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Zitat von: rudolfkoenig am 03 Januar 2023, 12:08:15
Indem man in attrList matrixQuestion_[0-9] setzt.

Waere es nicht besser nur ein Attribut mit NewLine als Trenner und ein Text-Editor als Eigabefeld zu verwenden?

Das wäre eine annehmbare Alternative denke ich. Lässt sich auch gut parsen. Ich muss mal schauen.




Danke schon mal an alle für die Antworten.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

Zitat von: CoolTux am 03 Januar 2023, 12:14:24
Das wäre eine annehmbare Alternative denke ich. Lässt sich auch gut parsen. Ich muss mal schauen.
Für wildcard muss man halt ggf. für die commandref etwas tricksen (falls nicht das "Einheitsattribut" kommt).

Bzgl. "parsen": evtl. gleich "parseParams" verwenden? (Es gibt in RHASSPY einige solcher multiline-Attribute, bei denen dann ggf. auch die Antwort gleich noch "set magic"-like nachbehandelt wird).
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

betateilchen

Zitat von: CoolTux am 03 Januar 2023, 12:12:26
Naja im Enddefekt setzt der User die Fragen und Antworten ja nur einmal für das Device. Sind also statisch. Wären also bei den Attributen schon gut aufgehoben.

Naja, genausogut könnte man das aber über ein set <device> matrixQuestion <n frage:antwort> lösen - gerade weil die Werte statisch sind und problemlos im keystore landen können.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!