FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: DocCyber am 18 März 2020, 10:34:55

Titel: [GELÖST!] Wie Hash in Reading speichern?
Beitrag von: DocCyber am 18 März 2020, 10:34:55
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?


Titel: Antw:Wie Hash in Reading speichern?
Beitrag von: CoolTux am 18 März 2020, 10:51:58
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.
Titel: Antw:Wie Hash in Reading speichern?
Beitrag von: DocCyber am 18 März 2020, 11:03:06
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?
Titel: Antw:Wie Hash in Reading speichern?
Beitrag von: CoolTux am 18 März 2020, 11:14:07
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'}
Titel: Antw:Wie Hash in Reading speichern?
Beitrag von: Beta-User am 18 März 2020, 11:18:08
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...
Titel: Antw:Wie Hash in Reading speichern?
Beitrag 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.

Titel: Antw:Wie Hash in Reading speichern?
Beitrag von: DocCyber am 18 März 2020, 11:37:04
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.
Titel: Antw:Wie Hash in Reading speichern?
Beitrag von: DocCyber am 18 März 2020, 11:40:02
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!
Titel: Antw:Wie Hash in Reading speichern?
Beitrag 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.
Titel: Antw:Wie Hash in Reading speichern?
Beitrag von: DocCyber am 18 März 2020, 12:15:37
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!
Titel: Antw:[GELÖST!] Wie Hash in Reading speichern?
Beitrag von: KernSani am 18 März 2020, 15:48:38
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