[gelöst] - Lightscene setcmd und system() mit '' strings

Begonnen von popy, 15 Februar 2018, 19:59:37

Vorheriges Thema - Nächstes Thema

popy

Hallo.

Habe mehrere Lightscene's wo ich setcmd in Kombination mit system() verwende um Alexa zu steuern.
Das setcmd ist z.B.:

;set VR_Decke off ; set KUECHE_Szenen scene Aus ; set AR_Decke off ; set BAD_Decke off ; set WZ_Szenen scene Aus ; set SZ_Szene_Alle scene Aus ; set J_Szenen scene Aus ; set AZ_Decke off ; set WC_Lueftung off ; set WC_Decke off ; {system('/usr/sbin/alexa_remote_control.sh -d ALL -e pause > /dev/null 2>&1');;} ;

Anzeigen tut fhem es aber so wie im Anhang.
Irgendwie drüfte er das ' von dem Teil:

{system('/usr/sbin/alexa_remote_control.sh -d ALL -e pause > /dev/null 2>&1');;} ;

Mir ist das erst jetzt aufgefallen, nämlich wenn ich was ändern will dann fehlt da ja was.
PS.: es geht auch nicht mit doppeltem Anführungszeichen anstatt dem einzelnen und auch nicht mit ESCAPE vorher (\')

Kennt das Problem von euch jemand?
Gibts da Abhilfe, wie ich das system CMD korrekt schreibe ohne das setcmd durcheinander kommt.

Danke
pOpY



popy

Habe eine Lösung gefunden ;)

Die perl Funktion q() funktioniert. z.B.: q(ALL) wird zu 'ALL'
Damit geht dann die Verwendung auch in einem setcmd von Lightscene, da dann keine quotes mehr vorkommen.

Um es einfacher zu gestallten, habe ich mir nun in der "99_myUtils.pm" eine Funktion definiert:


#############################################
# Control Alexa
#############################################
sub AlexaCmd($;$)
{
    my $Alexa = shift;
    my $Cmd = shift;

    $Alexa = "" unless(defined($Alexa));
    $Cmd = "pause"  unless(defined($Cmd));

    # Log
    Log 1, "AlexaCmd: ".$Alexa." - Cmd: ".$Cmd;

    # run the cmd
    system('/usr/sbin/alexa_remote_control.sh -d '.$Alexa.' -e '.$Cmd.' > /dev/null 2>&1');
}


Und der funktionierende Aufrufcode aus dem setcmd der Lightscene lautet

set VR_Decke off ; set KUECHE_Szenen scene Aus ; set AR_Decke off ; set BAD_Decke off ; set WZ_Szenen scene Aus ; set SZ_Szene_Alle scene Aus ; set J_Szenen scene Aus ; set AZ_Decke off ; set WC_Lueftung off ; set WC_Decke off ; {AlexaCmd(q(ALL),q(pause));;} ;

Hoffe das hilft mal jemanden.
pOpY