Hauptmenü

DOIF und Sonos Sleeptimer

Begonnen von Spartacus, 05 März 2015, 17:05:23

Vorheriges Thema - Nächstes Thema

Spartacus

Hallo,
ich benötige einmal einen kleinen Denkanstoß (das DOELSE bitte ignorieren):
Getriggert wird auf einen ganz bestimmten Alarm mit der ID 809. Es wird dann zeitverzögert eine Routine definiert, die die Laustärke anpasst, ein Gruppenmitglied hinzufügt und den Sleeptimer für die Gruppe setzt.
Nun möchte ich im DOELSEIF-Zweig die Gruppe wieder trennen, wenn der Sleeptimer abgelaufen ist.

Mein Problem ist, dass ich zwar auf "SleepTimer = 'off'" triggern kann, aber dieses Event wird dann immer ausgeführt, bei jedem Sleeptimer. Ich muss mir irgendwie die SleepTimer-ID im DOIF-Zweig merken. Diese lese ich mit dem Perl-Code aus. Allerdings ist "$st" im DOELSEIF-Zweig nicht mehr gültig. Alternativ könnte ich mir die AlarmID merken, aber diese wird mit Ablauf des Sleeptimers aus den Readings gelöscht und ist dann futsch. Irgendwie muss ich möglichst elegant, die Information des laufenden Alarms bzw. Sleeptimers in den DOELSIF-Zweig verknüpfen, damit die Gruppe nur bei diesem einen Alarm/Sleeptimer wieder aufgelöst wird.
Hat jemand eine Idee, wie man das geschickt lösen kann?

Hinweis:
SleepTimer= off beendet den RunningAlarm und damit auch die AlarmRunningID

([OG.br.SON.ZP_S3:AlarmRunningID] eq "809")
(define at.01.OG.br.SON.ZP_S3 at +00:02:00
set OG.br.SON.ZP_S3 Volume 5 1;;
set KG.sk.SON.ZP_S3 Volume 0;;
set OG.br.SON.ZP_S3 AddMember KG.sk.SON.ZP_S3;;
set KG.sk.SON.ZP_S3 Volume 1 1;;
set OG.br.SON.ZP_S3 SleepTimer 00:01:00;;
{my $st=ReadingsVal("OG.br.SON.ZP_S3","SleepTimerVersion","")})
DOELSEIF
([OG.br.SON.ZP_S3:SleepTimer] eq "off")
(set OG.br.SON.ZP_S3 RemoveMember KG.sk.SON.ZP_S3, set ID {($st)})
DOELSE (set lampe off)


Danke und Gruß,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

flurin

#1
Für solche Fälle verwende ich folgende Perl-Funktionen:

{ # my vars

my %var_hash = ();

# how to use: {set_var("my_var","some value")}
sub set_var($$)
{
  my ($var, $value) = @_;
  $var_hash{$var} = $value;
}

# how to use: {get_var("my_var")}
sub get_var($)
{
  my ($var) = @_;
  my $ret = "undef";
  if (exists($var_hash{$var})) {
    $ret = $var_hash{$var};
  }
  return $ret;
}

# how to use: {dump_var()}
sub dump_var()
{
  my $ret = "empty";
  if (%var_hash) {
    $ret = Dumper(%var_hash);
  }
  return $ret;
}

} # end my vars


Den Code in 99_myUtils.pm kopieren:

Anwendung:

Variable speichern:

{set_var("my_var","some value")}


Variable lesen:

{get_var("my_var")}

mit:

{dump_var()}

können die gespeicherten Variablen angezeigt werden.
Bemerkung: die Variablen werden mit shutdown oder reload 99_my_Utils.pm gelöscht.

Edit:

use Data::Dumper;

muss auch deklariert werden.

Gruss
flurin

Damian

Zitat von: Spartacus am 05 März 2015, 17:05:23
Hallo,
ich benötige einmal einen kleinen Denkanstoß (das DOELSE bitte ignorieren):
Getriggert wird auf einen ganz bestimmten Alarm mit der ID 809. Es wird dann zeitverzögert eine Routine definiert, die die Laustärke anpasst, ein Gruppenmitglied hinzufügt und den Sleeptimer für die Gruppe setzt.
Nun möchte ich im DOELSEIF-Zweig die Gruppe wieder trennen, wenn der Sleeptimer abgelaufen ist.

Mein Problem ist, dass ich zwar auf "SleepTimer = 'off'" triggern kann, aber dieses Event wird dann immer ausgeführt, bei jedem Sleeptimer. Ich muss mir irgendwie die SleepTimer-ID im DOIF-Zweig merken. Diese lese ich mit dem Perl-Code aus. Allerdings ist "$st" im DOELSEIF-Zweig nicht mehr gültig. Alternativ könnte ich mir die AlarmID merken, aber diese wird mit Ablauf des Sleeptimers aus den Readings gelöscht und ist dann futsch. Irgendwie muss ich möglichst elegant, die Information des laufenden Alarms bzw. Sleeptimers in den DOELSIF-Zweig verknüpfen, damit die Gruppe nur bei diesem einen Alarm/Sleeptimer wieder aufgelöst wird.
Hat jemand eine Idee, wie man das geschickt lösen kann?

Hinweis:
SleepTimer= off beendet den RunningAlarm und damit auch die AlarmRunningID

([OG.br.SON.ZP_S3:AlarmRunningID] eq "809")
(define at.01.OG.br.SON.ZP_S3 at +00:02:00
set OG.br.SON.ZP_S3 Volume 5 1;;
set KG.sk.SON.ZP_S3 Volume 0;;
set OG.br.SON.ZP_S3 AddMember KG.sk.SON.ZP_S3;;
set KG.sk.SON.ZP_S3 Volume 1 1;;
set OG.br.SON.ZP_S3 SleepTimer 00:01:00;;
{my $st=ReadingsVal("OG.br.SON.ZP_S3","SleepTimerVersion","")})
DOELSEIF
([OG.br.SON.ZP_S3:SleepTimer] eq "off")
(set OG.br.SON.ZP_S3 RemoveMember KG.sk.SON.ZP_S3, set ID {($st)})
DOELSE (set lampe off)


Danke und Gruß,
Christian

1. Warum arbeitest du mit at statt mit wait?
2. Informationen kannst du immer geschickt mit setreading in deinem DOIF-Modul unterbringen, die du abfragen kannst. Auf diese solltest du jedoch im selben Modul nicht triggern.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

Hallo zusammen,
vielen Dank für Eure Antworten.

Das mit dem Reading im Device klingt interessant. Wenn ich es richtig überblicke, dann setze ich in dem Device beim Starten des Alarms (DOIF-Zweig) einfach ein Flag, verknüpfe es im DOELSEIF (ohne Trigger)mit dem SleepTimer "off" ("and") und setze es dort auch wieder zurück bzw. löschen.

Die Alternative mit der SUB in der myUtils muss ich mir noch einmal genauer ansehen, das habe ich noch nicht ganz verstanden...

Besten Dank,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R