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
			
			
			
				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
			
			
			
				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
			
			
			
				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} 
			
			
			
				Danke für eure Hinweise. Mußte allerdings noch etwas mit der Art der Klammern experimentieren:
sub ReloadVolumeStraight() {
  my %DenonVolume = (
    "input: Sat" => -40,
    "input: Tuner" => -35
  );
  my %Zone2Volume = (
    "input: Cbl/Sat" => -15
  );
  $data{Denon}{volumeStraight} = \%DenonVolume;
  $data{zone2}{volumeStraight} = \%Zone2Volume;
  return;
};
NB: Man sieht übrigens, daß ich mit Groß/Kleinschreibung nicht ganz konsequent bin:-(
Grüßle, Michael
			
			
			
				Was ich noch gar nicht verstanden habe: wenn Du doch die Werte ohnehin nach jedem Neustart neu in einen hash schreiben musst, warum muss es dann unbedingt $data sein? Du kannst doch den von Dir benutzten hash benennen, wie Du möchtest. Damit umgehst Du die oben genannten, möglicherweise auftretenden Probleme durch Überschneidungen.
			
			
			
				Da bin ich offen. Wie erreiche ich das denn in 99_myUtils.pm?
Ich könnte mir auch vorstellen, daß ich bei jeder Benutzung checke, ob initialisiert wurde. Wenn nicht, rufe ich LoadVolumeStraight. Aber ich würde das gerrn beim Starten von fhem einmalig tun.
Grüßle, Michael