hash als Wert eines userattr möglich?

Begonnen von Manul, 07 Juli 2017, 16:41:31

Vorheriges Thema - Nächstes Thema

Manul

Kann ich einem userattr einen hash zuweisen, den ich dann in Perl-Funktionen auswerten kann?

CoolTux

Kannst Du nicht den Hash in der Funktion ermitteln? Brauchst ja nur den Devicenamen.
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

Manul

Wie ermitteln? Ich möchte eine konfigurierbare Zuordnung key->value als Attribut des device speichern. Sowas heißt in Perl doch hash, oder?

CoolTux

Sorry Missverständnis meinerseits. Dachte Du meintest ein FHEM Device Hash
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: Manul am 07 Juli 2017, 16:41:31
Kann ich einem userattr einen hash zuweisen, den ich dann in Perl-Funktionen auswerten kann?

Klar kannst Du das. Aber Sinn macht es nicht unbedingt, dafür gibt es normalerweise andere Mechanismen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Manul

Kein Problem. Ich bin mit der FHEM-Terminologie noch nicht so 100%ig vertraut, sonst hätte ich das deutlicher formuliert. Ob und wie's geht, weißt Du nicht zufällig?

Zitat von: betateilchen am 07 Juli 2017, 17:15:42
Klar kannst Du das. Aber Sinn macht es nicht unbedingt, dafür gibt es normalerweise andere Mechanismen.

Ich lerne ausgesprochen gerne dazu: Welche denn?

CoolTux

Kannst Du noch mal erklären wa sgenau Du vor hast? Was ist das Ziel/soll das Endergebnis sein?
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

Prof. Dr. Peter Henning

ZitatIch lerne ausgesprochen gerne dazu: Welche denn?
Klar doch. Die Nachricht ist: Perl lernen, und mit ordentlichen Routinen arbeiten.

https://wiki.selfhtml.org/wiki/Perl

LG

pah

Manul

Zitat von: CoolTux am 07 Juli 2017, 21:51:36
Kannst Du noch mal erklären wa sgenau Du vor hast? Was ist das Ziel/soll das Endergebnis sein?

Gerne: Ich habe einen Saugroboter (Xiaomi), dessen Saugstärke sich verstellen lässt. In der App des Herstellers geht das in (4) Stufen (Quiet, Balanced, Turbo, MAX). Intern speichert der Roboter aber Zahlenwerte von 1-100. Im zugehörigen FHEM-Modul stellt man direkt diese Zahlenwerte ein. Ich hätte aber auch für FHEM gerne Stufen. Für den Anfang würde ich mich da an denen der App orientieren, möchte das später aber auch ändern können. Daher würde ich als userattr gerne die Zuordnung <Name der Stufe>:<Numerischer Wert> speichern.

Ich habe für mich jetzt folgende Lösung gefunden: Ich setze das userattr auf einen String von Komma- oder Space-separierten Paaren <Name>:<Wert> und splitte das dann direkt in einen hash:


my %hash = split(/[ ,:]/,$attr);

CoolTux

Genau sowas habe ich gestern erst umgesetzt. Nur halt als Attribut in einem Modul. Aber das Prinzip ist ja das selbe. Wenn Du es noch gebrauchen kannst kann ich den Code hier posten.
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

Manul

Danke, gerne. Ich bin zwar schon ein Stückchen weiter aber noch nicht am Ziel. Lernen kann ich aus dem Code bestimmt so oder so.

betateilchen

#11
fhem.pl hat seit einiger Zeit eine Funktion "toJSON()" der man einfach beliebige Daten vorwerfen kann (scalar, array, hash) und man bekommt json zurück. Wenn ich solche Daten in einem Internal, Reading oder Attribut speichern müsste, würde ich immer json speichern, damit man auch auf der Detailseite die Daten in von Menschen interpretierbaren Werten sieht.

Edit: (Funktionsname korrigiert)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

Im Attribut Test steht sowas wie

quit=25,balance=50,turbo=75,max=100


my @valuestring = split( ',', AttrVal($name,'test','') );

my %buffer;
   
    foreach( @valuestring ) {
   
        my @values = split( '=' , $_ );
        $buffer{$values[0]} = $values[1];
    }


Auslesen kann man das ganze dann mit $buffer{'max'} und rauskommen tut 100.
Ist es das was Du suchst?
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

Manul

Zitat von: betateilchen am 08 Juli 2017, 13:50:23
fhem.pl hat seit einiger Zeit eine Funktion "toJson()" der man einfach beliebige Daten vorwerfen kann (scalar, array, hash) und man bekommt json zurück. Wenn ich solche Daten in einem Internal, Reading oder Attribut speichern müsste, würde ich immer json speichern, damit man auch auf der Detailseite die Daten in von Menschen interpretierbaren Werten sieht.

Danke für die Information und den Vorschlag. Für meinen spezifischen eher überschaubaren Fall gefällt mir meine Variante mit dem String "key1:value1 key2:value2" besser, das finde ich für Menschen noch lesbarer als JSON. Bei komplexeren Strukturen ist letzteres sicher die bessere Wahl.

Manul

Zitat von: CoolTux am 08 Juli 2017, 13:57:20
Ist es das was Du suchst?

Ziemlich genau, ja. Führt zum ähnlichen Ergebnis wie meine obige Variante


my %buffer = split( /[,=]/, AttrVal($name,'test','') );


fängt aber Fehler im String besser ab. Da ich das für mich selber mache, bleibe ich bei der kurzen Version.