Kann ich einem userattr einen hash zuweisen, den ich dann in Perl-Funktionen auswerten kann?
Kannst Du nicht den Hash in der Funktion ermitteln? Brauchst ja nur den Devicenamen.
Wie ermitteln? Ich möchte eine konfigurierbare Zuordnung key->value als Attribut des device speichern. Sowas heißt in Perl doch hash, oder?
Sorry Missverständnis meinerseits. Dachte Du meintest ein FHEM Device Hash
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.
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?
Kannst Du noch mal erklären wa sgenau Du vor hast? Was ist das Ziel/soll das Endergebnis sein?
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
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);
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.
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.
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)
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?
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.
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.