FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Manul am 07 Juli 2017, 16:41:31

Titel: hash als Wert eines userattr möglich?
Beitrag von: Manul am 07 Juli 2017, 16:41:31
Kann ich einem userattr einen hash zuweisen, den ich dann in Perl-Funktionen auswerten kann?
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: CoolTux am 07 Juli 2017, 16:54:54
Kannst Du nicht den Hash in der Funktion ermitteln? Brauchst ja nur den Devicenamen.
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: Manul am 07 Juli 2017, 17:07:38
Wie ermitteln? Ich möchte eine konfigurierbare Zuordnung key->value als Attribut des device speichern. Sowas heißt in Perl doch hash, oder?
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: CoolTux am 07 Juli 2017, 17:11:07
Sorry Missverständnis meinerseits. Dachte Du meintest ein FHEM Device Hash
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: betateilchen am 07 Juli 2017, 17:15:42
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.
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: Manul am 07 Juli 2017, 17:17:18
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?
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag 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?
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: Prof. Dr. Peter Henning am 08 Juli 2017, 06:35:44
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
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: Manul am 08 Juli 2017, 11:46:33
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 (https://forum.fhem.de/index.php/topic,73052.0.html) 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);
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: CoolTux am 08 Juli 2017, 11:55:00
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.
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: Manul am 08 Juli 2017, 13:26:12
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.
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag 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.

Edit: (Funktionsname korrigiert)
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: CoolTux am 08 Juli 2017, 13:57:20
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?
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: Manul am 08 Juli 2017, 13:59:26
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.
Titel: Antw:hash als Wert eines userattr möglich?
Beitrag von: Manul am 08 Juli 2017, 14:02:43
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.