Hallo zusammen.
Ich würde gern ein Hash in einem Reading speichern und es auch wieder auslesen.
Leider bekomme ich es nicht hin.
Beispiel
my %sensors =
(
"sensor1" => {'location' = 'Garten', 'type' = 'ds'},
"sensor2" => {'location' = 'Eingang', 'type' = 'md'},
"sensor3" => {'location' = 'Auffahrt', 'type' = 'cam'}
)
Wie kann ich diesen Hash in dummy:sensors speichern?
fhem("setreading dummy sensors %sensors");
funktioniert nicht; in dummy:sensors steht anschließend nur der String %sensors
Wenn ich den gesamten Block ('sensor1' ... 'cam'}) über die Befehlszeile mit
setreading dummy sensors ('sensor1' ... 'cam'})
eingebe, steht der Block zwar anschließend in dummy:sensors, aber wird nicht eingelesen durch
my %sensors = ReadingsVal("dummy","sensors","");
Das hier funktioniert jedoch:
my %sensors();
$sensors{'sensor4'}={'location' = 'Wintergarten', 'type' = 'cam'}
fhem("setreading dummy sensor $sensors{'sensor4'}{'location'}");
In dummy:sensor steht anschließend Wintergarten
Offenbar mache ich oben etwas falsch. Kann mir jemand auf die Sprünge helfen?
Das wird so nicht funktionieren. Im Reading steht immer Text, egal was Du wie machst. Du kannst die Referenz auf den Hash abspeichern und hast dann den Hashwert drin zu stehen. Aber nur als Text. Also nur "HASH(0x55583b6c7af0)"
Das kannst Du aber nicht mehr aus einem Reading Herstellen. Du bekommst zwar "HASH(0x55583b6c7af0)" kannst aber auf den Ihnalt des Hashs nicht mehr referenzieren.
Danke für die Antwort.
Du schreibst "wird so nicht funktionieren"
Gibt es einen anderen, einfachen Weg?
Also ohne Schlüssel und Werte separat abzulegen?
Wenn Du es über einen neustart hinaus behalten willst, nicht. Ansonsten kannst Du es innerhalb des Geräte Hashs abspeichern. Am besten machst man sowas unter $hash->{helper}->
An den Hash eines Gerätes kommst mit $defs->{'GERÄTENAME'}
Ungetestet: sowas müßte eigentlich über parseParams (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#parseParams) zu machen sein, oder? Dann müßte halt der Reading-/Attributwert entsprechend vorgekaut werden, denn afaik gibt es keine Funktion (?), mit der man das "umkehren" könnte.
Da das aber vermutlich eh' statische Infos sind, die du händisch vorgibst (?), wäre es für die Eingabe egal, oder? (Das klingt mir auch etwas danach, als wäre das besser in einem Attribut/userattr unterzubringen).
Vielleicht erläuterst du noch etwas den usecase, so ist es etwas nebulös...
Man kann den hash serialisieren (z.B. mit dem perl Core-Modul Storable), dann kommt mit nfreeze() ein String raus, den man in einem reading speichern kann. Dazu gibt es natürlich auch die Umkehrfunktion thaw(), um aus dem String dann auch wieder den hash zu erzeugen.
Zitat von: betateilchen am 18 März 2020, 11:30:57
Man kann den hash serialisieren (z.B. mit dem perl Core-Modul Storable), dann kommt mit nfreeze() ein String raus, den man in einem reading speichern kann. Dazu gibt es natürlich auch die Umkehrfunktion thaw(), um aus dem String dann auch wieder den hash zu erzeugen.
Cool! :) Das probiere ich aus!
Vielen Dank.
Zitat von: Beta-User am 18 März 2020, 11:18:08
Vielleicht erläuterst du noch etwas den usecase, so ist es etwas nebulös...
Ich hatte eine umfassende Antwort geschrieben. Beim Abschicken ist sie leider verloren gegangen, warum auch immer...
Lag vielleicht daran, dass
beta-Teilchen zeitgleich eine Antwort geschrieben hatte, mit der ich vermutlich weiterkommen kann.
Danke euch allen!
Etwas ähnliches wie die Idee von Udo wäre auch noch aus dem Hash ein JSON String zu machen und umgekehrt.
Hab's ausprobiert - geht super! :)
use strict;
use warnings;
use Storable qw(freeze thaw);
my %sensors =
(
"sensor1" => {'location' => 'Garten', 'type' => 'ds'},
"sensor2" => {'location' => 'Eingang', 'type' => 'md'},
"sensor3" => {'location' => 'Auffahrt', 'type' => 'cam'}
);
# Ausgabe: Garten
print "$sensors{'sensor1'}{'location'}\n\n";
# einfrieren und wieder auftauen
my $sensorString = freeze(\%sensors);
%sensors = %{thaw($sensorString)};
# Ausgabe: Auffahrt
print "$sensors{'sensor3'}{'location'}\n";
Nochmals vielen Dank für die tolle Hilfe! Perfekt!
Zitat von: CoolTux am 18 März 2020, 11:50:56
Etwas ähnliches wie die Idee von Udo wäre auch noch aus dem Hash ein JSON String zu machen und umgekehrt.
So mache ich das z.B. Im DSBMobile Modul
Gesendet von iPhone mit Tapatalk