FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kwbo am 06 Januar 2014, 00:23:17

Titel: Perl Parameterübergabe
Beitrag von: kwbo am 06 Januar 2014, 00:23:17
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
Titel: Antw:Perl Parameterübergabe
Beitrag von: hexenmeister am 06 Januar 2014, 00:30:41
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
Titel: Antw:Perl Parameterübergabe
Beitrag von: kwbo am 06 Januar 2014, 00:59:23
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
Titel: Antw:Perl Parameterübergabe
Beitrag von: kwbo am 06 Januar 2014, 11:38:30
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?
Titel: Antw:Perl Parameterübergabe
Beitrag von: hexenmeister am 06 Januar 2014, 21:09:40
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")}
Titel: Antw:Perl Parameterübergabe
Beitrag von: kwbo am 07 Januar 2014, 12:50:51
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