[GELÖST!] Wie Hash in Reading speichern?

Begonnen von DocCyber, 18 März 2020, 10:34:55

Vorheriges Thema - Nächstes Thema

DocCyber

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?


Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

CoolTux

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.
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

DocCyber

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?
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

CoolTux

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'}
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

Beta-User

Ungetestet: sowas müßte eigentlich über 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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

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.

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

DocCyber

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.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

DocCyber

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!
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

CoolTux

Etwas ähnliches wie die Idee von Udo wäre auch noch aus dem Hash ein JSON String zu machen und umgekehrt.
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

DocCyber

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!
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

KernSani

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
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...