Hauptmenü

$data hash erweitern

Begonnen von olwaldi, 30 Oktober 2025, 16:37:22

Vorheriges Thema - Nächstes Thema

olwaldi

Ich nutze schon seit Jahren fhem, um die Lautstärke meines Denon-AVR in 5dB-Schritten zu steueren - klappt prima. Jetzt würde ich gern die Anfangslautstärke je nach Input individuell automatisch einstellen. Das könnte ich mit einem längeren if - elsif Konstrukt erreichen. Aber es gibt ja das fhem hash $data. Dort würde ich gern die Lautstärkewerte als key/value Paare ablegen, wobei der key der Event-Name werden soll. Mir ist hier Verschiedenes unklar:
1. Wie kann man "elegant" diese key/value-Paare belegen?
sub ReloadVolumeStraight() {
  $data{volumeStraight}{"Denon:input:.Sat"} = -40;
  $data{volumeStraight}{"Denon:input:.Tuner"} = -35;
  $data{volumeStraight}{"zone2:input:.Cbl/Sat"} = -15;
usw
};
funktioniert zwar, ist aber m.E. nicht so elegant.

2. Der Name meiner sub deutet es schon an: Wie kann ich die Werte bei Änderungen neu laden? Einfach durch erneuten Aufruf nach Änderung der sub?

3. Ich hatte geglaubt, $data wäre persistent. Aber ein shutdown restart zeigt, daß dem nicht so ist. Kann ich z.B. "enfach" mein ReloadVolumeStraight in myUtils_Initialize($$) eintragen, wie der Name nahelegt? Oder wie sonst?

Und wenn ich schon soviele Fragen habe, dann frage ich auch gleich, ob mein geplantes notify passen könnte:
notify InitialVolume Denon:input:.*|zone2:input:.* {
  my $volume = $data{volumeStraight}{$NAME . ":" . $EVENT} // "-40";
  fhem("set " . $NAME . " volumeStraight " . $volume)
}
Ich hoffe, daß $NAME den Wert des fhem-Devices enthält (bei mir Denon oder zone2) und $EVENT der Gesamtstring des Events passend zu meinem key ist. Selber noch nicht getestet, da ich zuerst das ReloadVolumeStraight-Problem lösen sollte.


Danke schonmal vorab, Michael

DeeSPe

Ich habe etwas Ähnliches für meine Räume gemacht (99_myUtils.pm nach "# Enter you functions below _this_ line."):
my %myRooms =
(
  dz => 'Zimmer Dan',
  iz => 'Zimmer Isa',
  te => 'Terrasse',
  wz => 'Wohnzimmer',
  fl => 'Flur',
  bz => 'Badezimmer',
  ku => 'Küche',
  vr => 'Vorratasraum',
  ws => 'Werkstatt',
  db => 'Dachboden',
  ez => 'Esszimmer',
  ga => 'Garten'
);

$data{myRooms} = \%myRooms;

Aufruf dann per:
$data{myRooms}{dz}
Hoffe das hilft dir weiter.
Ich denke das kannst du für dich adaptieren.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

#2
Hier kurz mal zurechtgeklöppelt:
my %myDenon =
(
  'Denon:input: Tuner' => -35,
  'Denon:input: Sat' => -40,
  'zone2:input: Cbl/Sat' => -15
);

$data{volumeStraight} = \%myDenon;

Aufruf mit:
$data{volumeStraight}{'Denon:input: Tuner'}klappt bei mir.
Sollte dann auch mit:
$data{volumeStraight}{"$NAME:$EVENT"}funktionieren.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DS_Starter

Denkt bitte daran, dass $data von jedem genutzt werden kann und auch genutzt wird. Um Überschneidungen bzw. eventuelle Beeinflussungen zu vermeiden bzw. die Wahrscheinlichkeit dafür stark zu reduzieren plädiere ich dafür immer einen unikaten Namensraum zu benutzen wie z.B.
$data($name}{volumeStraight}{'Denon:input: Tuner'}
Also allgemein:
$data($name}{blabla}
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter