Hauptmenü

Perl Parameterübergabe

Begonnen von kwbo, 06 Januar 2014, 00:23:17

Vorheriges Thema - Nächstes Thema

kwbo

ich versuche in fhem.cfg einen Parameter an eine Routine in 99_myUtils zu übergeben, komme aber damit nicht zurande. Wäre nett, wenn jemand mir auf die Sprünge helfen könnte.

Es geht dabei darum, mit den Fernbedienungstasten 1 und 2 zwei Mediaplayer zu schalten und mit den Tasten 3 und 4 den jeweils zuletzt selektierten lauter oder leiser zu regeln. Dazu würde ich gerne die jeweils selektierte Location in dem Dummy "Sonos_Zone" speichern und auch als Parameter übergeben. Irgendwie scheint aber in meiner Syntax der Wurm zu stecken.

Hier der Aufruf in fhem.cfg:
define Sonos_Zone dummy
#
define WZ_Sonos notify Fernb1T2 {fhem ("set Sonos_Zone Sonos_Wohnzimmer") ;; Sonos_FB1S2("Sonos_Wohnzimmer")}
define K_Sonos notify Fernb1T1 {fhem ("set Sonos_Zone Sonos_Kueche") ;; Sonos_FB1S2("Sonos_Kueche")}
#
define Sonos_LAUTER notify Fernb1T4 {Sonos_FB1S4(Value("Sonos_Zone"))}
define Sonos_LEISER notify Fernb1T3 {Sonos_FB1S3(Value("Sonos_Zone"))}


Hier die Routine in 99_myUtils:

######################################################
# Sonos Schalter 2/1
######################################################
#
sub
Sonos_FB1S2
{
my $Zone = shift @_;
my $SonosStatus = ReadingsVal("$Zone","transportState","?");
#
#Musik einschalten
if ( $SonosStatus eq "STOPPED" ) {
    { fhem ("set $Zone Speak 40 de Radio WDR5")};
    sleep(1);
    { fhem ("set $Zone Volume 30")};   
    { fhem ("set $Zone LoadRadio WDR5%20-%20Hören%20erleben.")};   
    { fhem ("set $Zone Play")};
#
#Musik ausschalten
if ( $SonosStatus eq "PLAYING" ) { fhem ("set $Zone Stop")};
#
######################################################
## Sonos Schalter 4
######################################################
sub
Sonos_FB1S4
{
my $Zone = shift @_;
my $SonosStatus = ReadingsVal("$Zone","transportState","?");

if ( $SonosStatus eq "STOPPED" ) {
my $Glashaustmp = ReadingsVal("FHT_Wintergarten","temperature","?");
$Glashaustmp = "Im Wintergarten ist es ". $Glashaustmp . " Grad";
sleep(1);
{ fhem ("set $Zone Speak 40 de $Glashaustmp")};
}
if ( $SonosStatus eq "PLAYING" ) {
  { fhem ("set $Zone VolumeU")};
}
}
# End Sonos_Schalter_4
#
######################################################
# Sonos Schalter 3
######################################################
sub
Sonos_FB1S3
{
my $Zone = shift @_;
my $SonosStatus = ReadingsVal("$Zone","transportState","?");

if ( $SonosStatus eq "STOPPED" ) {
my $Aussentmp = ReadingsVal("FHT_Wohnen","temperature","?");
$Aussentmp = "Im Wohnzimmer ist es ". $Aussentmp . " Grad";
sleep(1);
{ fhem ("set $Zone Speak 40 de $Aussentmp")};
}
if ( $SonosStatus eq "PLAYING" ) {
  { fhem ("set $Zone VolumeD")};
}
}
# End Sonos_Schalter_3
#
}

Danke und Grüße,
Werner

hexenmeister

ZitatIrgendwie scheint aber in meiner Syntax der Wurm zu stecken.

Jo, in Form von ungeraden Anzahl von Anführungszeichen  ;)

define WZ_Sonos notify Fernb1T2 {fhem ("set Sonos_Zone eq "Sonos_Wohnzimmer") ;; Sonos_FB1S2("Sonos_Wohnzimmer")}

Das auf den ersten Blick (zugegeben, habe nicht weiter gelesen...)

Grüße,

Alexander

kwbo

#2
Sorry, stimmt. Ist versehentlich beim hin und herprobieren/kopieren passiert.
Ist aber leider nicht das eigentliche Problem. Auch bin ich nicht sicher, ob set oder setstate zur Übertragung des Strings "Sonos_Wohnzimmer" auf den Dummy der geeignete Weg ist. Dieser String soll auch als Parameter an das Unterprogramm übergeben werden.
Danke und Gruß, Werner

kwbo

Sollte ich statt zu versuchen einen Parameter zu übergeben besser direkt im 99_myUtils den Status des Dummy Sonos_Zone abfragen?
my $Zone = ReadingsVal("Sonos_Zone","state","Sonos_Wohnzimmer");
Oder gibt es eine bessere Möglichkeit in dem Unterprogramm den aktuellen Status auszuwerten?

hexenmeister

Ob man besser die Werte als Parameter übergibt, oder deise in der Routine selbst liest, kann man nicht eindeutig sagen. I Deinem Fall (wenn Du schon mit Dummies arbeitet) würde ich bei der Übergabe belassen.

Für sub sollte folgende Definition funktionieren:

sub mySub ($)
{
my ($value) = @_;
...

}


und der Aufruf dazu lautet {mySub("value")}

kwbo

#5
Nur noch mal zur Sicherheit, ob ich das richtig verstanden habe.
Wäre das so richtig, oder muß in den Aufruf nicht der Status/Inhalt des Dummies,
weil das der zu übergebende String ist? Also z.B.  {Sonos_FB1S2("Value("DUMMY")")}

fhem.cfg:
define DUMMY dummy
#
define WZ_Sonos notify Fernb1T2 {fhem ("setstate DUMMY text") ;; Sonos_FB1S2("DUMMY")}


99_myUtils:
sub Sonos_FB1S2 ($)
{
my ($DUMMY) = @_;
{ fhem ("set $DUMMY Play")};
}

Danke und Gruß,
Werner