Hmm, OK, kann man so machen. Sei aber nur vorsichtig mit den CURL-Abfragen! Die funktionieren sehr zuverlässig, solange die abgefragte Seite
verfügbar ist. Ist sie das nicht verursachen die CURL abfragen (bei mir) ein ca. 2 Minuten langes "hängen" des Raspi 3, also meiner an und für sich schnellen CCU! In dieser Zeit geht gar nichts. Wenn du also schön regelmäßig deine ST10 checkst, ob sie im Standby ist oder nicht und deine Frau gerade den Stecker der ST10 gezogen hat um den Föhn dranzuhängen geht minuenlang nichts. Fragst du das Gerät alle 10 Minuten ab ergibt das schon Chaos. Und dann erklär mal deiner Frau dass die Kaffeemaschine nicht angeht weil der Stecker vom Badezimmerradio gezogen ist

So ist ein Hobby schnell beendet bevor es richtig angefangen hat
Daher mein Tip: Interne CURL Abfragen immer mit einem Ping auslösen und das geht so:
1. Neues CUxD-Gerät vom Typ System (28) mit Funktion: Ping/Alive anlegen
2. Einem Kanal davon unter Geräte --> Einstellungen die IP des ST10 geben und Pinginterval auf 1200 (Alle 20 Minuten oder wie es dir am besten passt)
3. Ein Program in der WebUI mit "
WENN Gerät CUX2803xxx:X UNREACH kleiner oder gleich 0 - bei
Aktuallisierung auslösen
DANN Skript:
Code: Alles auswählen
! ACHTUNG geaendertes Skript
! Dieses Skript schaltet Soundtouch EIN nicht AUS
string ST_Ip ="192.168.1.100";
!Überprüfung ob Soundtuch bereits in STANDBY ist
var url="http://" # ST_Ip #":8090/now_playing";
var cmd = "/usr/local/addons/cuxd/curl -s -k -L " # url ;
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
WriteLine("Ret>:" # v);
integer foo = v.Find("STANDBY"); ! World = 6
WriteLine("Find STANDBY at Position>: " # foo);
if (foo == -1)
{ WriteLine("Soundtouch>: ON");}
else
{
WriteLine("Soundtouch>: STANDBY");
!Press Power Button (down)
string ST_Method = "key";
string ST_Post='<key state="press" sender="Gabbo">POWER</key>';
string CurlCmd='/usr/local/addons/cuxd/curl --data "' # ST_Post # '" http://'# ST_Ip #':8090/' + ST_Method;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(CurlCmd);
!Press Power Button (release)
string ST_Method = "key";
string ST_Post='<key state="release" sender="Gabbo">POWER</key>';
string CurlCmd='/usr/local/addons/cuxd/curl --data "' # ST_Post # '" http://'# ST_Ip #':8090/' + ST_Method;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(CurlCmd)
}
Auf diese Weise wird der eigentliche CURL Abruf nur dann gestartet, wenn das Gerät auch definitiv erreichbar ist. Mit dem Intervall mit dem du pingst (1/15s bis 1/h) wird dann auch das Gerät wieder gestartet, sollte es aus sein. Wenn du das wiedereinschalten unter bestimmten Umständen (z.B. während Abwesenheit) unterbinden willst, kannst du mit z.B.
WENN abwesend
DANN Skript
Code: Alles auswählen
dom.GetObject("CUxD.CUX2803xxx:X.INHIBIT").State(true);
das Pingen unterbrechen, das Gerät direkt anschließend per
Code: Alles auswählen
string ST_Ip ="192.168.1.100";
!Überprüfung ob Soundtuch bereits in STANDBY ist
var url="http://" # ST_Ip #":8090/now_playing";
var cmd = "/usr/local/addons/cuxd/curl -s -k -L " # url ;
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
WriteLine("Ret>:" # v);
integer foo = v.Find("STANDBY"); ! World = 6
WriteLine("Find STANDBY at Position>: " # foo);
if (foo <> -1)
{ WriteLine("Soundtouch>: STANDBY");}
else
{
WriteLine("Soundtouch>: ON");
!Press Power Button (down)
string ST_Method = "key";
string ST_Post='<key state="press" sender="Gabbo">POWER</key>';
string CurlCmd='/usr/local/addons/cuxd/curl --data "' # ST_Post # '" http://'# ST_Ip #':8090/' + ST_Method;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(CurlCmd);
!Press Power Button (release)
string ST_Method = "key";
string ST_Post='<key state="release" sender="Gabbo">POWER</key>';
string CurlCmd='/usr/local/addons/cuxd/curl --data "' # ST_Post # '" http://'# ST_Ip #':8090/' + ST_Method;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(CurlCmd)
}
in den Standby versetzten (Schadet ja nicht wenns doch nur die 1.2Watt zieht während du eh nicht zu Hause bist...

) und es dann mit
WENN a
nwesend
DANN Skript
Code: Alles auswählen
dom.GetObject("CUxD.CUX2803xxx:X.INHIBIT").State(false);
wieder aufwecken. Nach dem Inhibit-->false wird sofort ein Ping geschickt und das Einschaltskript entsprechend wieder ausgelößt. Musst du mal probieren, aber eigentlich dudeln die STs beim einfachen Druck auf die Powertaste da los, wo sie vorher aufgehört haben.
Das ist, denke ich, eine saubere und stabile Lösung für dein Anliegen.
Gruß aus dem Pott
Björn