FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: CoolTux am 03 Januar 2023, 11:11:27

Titel: Attributname beim setzen des Attribut neu benennen
Beitrag von: CoolTux am 03 Januar 2023, 11:11:27
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
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: Thorsten Pferdekaemper am 03 Januar 2023, 11:34:54
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
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: rudolfkoenig am 03 Januar 2023, 11:46:09
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?
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: CoolTux am 03 Januar 2023, 11:53:37
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?
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: betateilchen am 03 Januar 2023, 12:06:14
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?
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: rudolfkoenig am 03 Januar 2023, 12:08:15
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?
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: CoolTux am 03 Januar 2023, 12:12:26
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.
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: CoolTux am 03 Januar 2023, 12:14:24
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.
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: Beta-User am 03 Januar 2023, 12:20:41
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).
Titel: Antw:Attributname beim setzen des Attribut neu benennen
Beitrag von: betateilchen am 03 Januar 2023, 12:22:25
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.