ich arbeite gerade an einem grösseren TCL-Script für Yamaha AVR's. Um den einzuschalten, Quelle umschalten, Lautstärke regeln, etc. gibt es ja mehrere Postings hier. Ich will aber mehr:
- - Power-Status zyklisch prüfen (fertig)
- aktuelle Lautstärke abfragen (fertig)
- aktuelle Quelle abfragen (fertig)
- aktuellen Sender/Lied abfragen (NET_RADIO, SERVER & TUNER fertig)
- ...mal sehen, was mir noch einfällt
Voraussetzung: CUxD
Code: Alles auswählen
! Definitionen
var yam_ip="192.168.188.45"; ! IP-Adresse des AVR
var cuxd_dev="CUX2801001:9"; ! Adresse des benutzten CUxD-Devices
var yam_zone="Main_Zone"; ! Main_Zone, Zone_2, Zone_3, Zone_4
var yam_song_check=1; ! sollen die Meta-Infos abgefragt werden? (NET_RADIO, SERVER)
var yam_vol_check=1; ! soll die aktuelle Lautstärke geprüft werden?
var yam_var_power="Yamaha Power"; ! SysVar für den Power-Status
var yam_var_source="Yamaha Input"; ! SysVar für die Quelle
var yam_var_song="Yamaha PlayNow"; ! SysVar für die Meta-Infos
var yam_var_vol="Yamaha Volume"; ! SysVar für die Lautstärke
var Debug = 0; ! zum Testen ;-)
! Parameter
var yam_power= "<Power_Control><Power>GetParam</Power></Power_Control>";
var yam_source="<Input><Input_Sel>GetParam</Input_Sel></Input>";
var yam_net_radio="<NET_RADIO><Play_Info>GetParam</Play_Info></NET_RADIO>";
var yam_server="<SERVER><Play_Info>GetParam</Play_Info></SERVER>";
var yam_tuner="<Tuner><Play_Info>GetParam</Play_Info></Tuner>";
var yam_vol="<Volume><Lvl>GetParam</Lvl></Volume>";
! ########## Script-Start ##########
! # DON'T TOUCH #
! ########## Script-Start ##########
var url= "http://"#yam_ip#"/YamahaRemoteControl/ctrl";
var cURL="LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl";
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": Debug START");
}
! Power
dom.GetObject("CUxD."#cuxd_dev#".CMD_SETS").State(cURL#" -X POST -H 'Content-Type: text/xml; charset=UTF-8' -d '<YAMAHA_AV cmd=\"GET\"><"#yam_zone#">"#yam_power#"</"#yam_zone#"></YAMAHA_AV>' '"#url#"'");
dom.GetObject("CUxD."#cuxd_dev#".CMD_QUERY_RET").State(1);
string rueckgabe = dom.GetObject("CUxD."#cuxd_dev#".CMD_RETS").State();
integer standby_cp = rueckgabe.Find("Standby");
integer on_cp = rueckgabe.Find("On");
string svName = yam_var_power;
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtBinary);
svObj.ValueSubType(istBool);
svObj.ValueName0("Standby");
svObj.ValueName1("On");
svObj.DPInfo("Power-Status Yamaha AVR");
svObj.ValueUnit("");
dom.RTUpdate(false);
}
if ((standby_cp)!="-1") {
integer anfang_cp = rueckgabe.Find("Standby");
integer ende_cp = rueckgabe.Find(" /Power");
integer yam_power_cp = rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp);
svObj.State(false);
string svName = yam_var_song;
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
svObj.DPInfo("aktueller Song des Yamaha AVR");
svObj.ValueUnit("");
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
svObj.State("---");
}
if ((on_cp)!="-1") {
integer anfang_cp = rueckgabe.Find("On");
integer ende_cp = rueckgabe.Find(" /Power");
integer yam_power_cp = rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp);
svObj.State(true);
}
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": "#rueckgabe);
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#yam_power_cp);
WriteLine((system.Date("%H:%M:%S"))#": "#svObj.State().ToString());
}
if ((on_cp)!="-1") {
! SOURCE
dom.GetObject("CUxD."#cuxd_dev#".CMD_SETS").State(cURL#" -X POST -H 'Content-Type: text/xml; charset=UTF-8' -d '<YAMAHA_AV cmd=\"GET\"><"#yam_zone#">"#yam_source#"</"#yam_zone#"></YAMAHA_AV>' '"#url#"'");
dom.GetObject("CUxD."#cuxd_dev#".CMD_QUERY_RET").State(1);
string rueckgabe = dom.GetObject("CUxD."#cuxd_dev#".CMD_RETS").State();
integer anfang_cp = rueckgabe.Find("Input_Sel ")+10;
integer ende_cp = rueckgabe.Find(" /Input_Sel");
string yam_source_cp = rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp);
! dom.GetObject('Yamaha Input').State(yam_source_cp);
string svName = yam_var_source;
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
svObj.DPInfo("aktueller Input des Yamaha AVR");
svObj.ValueUnit("");
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
svObj.State(yam_source_cp);
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": "#rueckgabe);
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#yam_source_cp);
}
if (yam_song_check == 1) {
! NET_RADIO
if (yam_source_cp == "NET RADIO") {
dom.GetObject("CUxD."#cuxd_dev#".CMD_SETS").State(cURL#" -X POST -H 'Content-Type: text/xml; charset=UTF-8' -d '<YAMAHA_AV cmd=\"GET\">"#yam_net_radio#"</YAMAHA_AV>' '"#url#"'");
dom.GetObject("CUxD."#cuxd_dev#".CMD_QUERY_RET").State(1);
string rueckgabe = dom.GetObject("CUxD."#cuxd_dev#".CMD_RETS").State();
integer anfang_cp = rueckgabe.Find("Station ")+8;
integer ende_cp = rueckgabe.Find(" /Station");
string ausgabe_cp = rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp);
integer anfang_cp2 = rueckgabe.Find("Song ")+5;
integer ende_cp2 = rueckgabe.Find(" /Song");
string ausgabe_cp2 = rueckgabe.Substr(anfang_cp2,ende_cp2-anfang_cp2);
string yam_net_radio_cp = ausgabe_cp#": "#ausgabe_cp2;
string svName = yam_var_song;
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
svObj.DPInfo("aktueller Song des Yamaha AVR");
svObj.ValueUnit("");
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
svObj.State(yam_net_radio_cp);
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": "#rueckgabe);
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp2 );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp2 );
WriteLine((system.Date("%H:%M:%S"))#": "#yam_net_radio_cp);
}
}
! SERVER
if (yam_source_cp == "SERVER") {
dom.GetObject("CUxD."#cuxd_dev#".CMD_SETS").State(cURL#" -X POST -H 'Content-Type: text/xml; charset=UTF-8' -d '<YAMAHA_AV cmd=\"GET\">"#yam_server#"</YAMAHA_AV>' '"#url#"'");
dom.GetObject("CUxD."#cuxd_dev#".CMD_QUERY_RET").State(1);
string rueckgabe = dom.GetObject("CUxD."#cuxd_dev#".CMD_RETS").State();
integer anfang_cp = rueckgabe.Find("Artist ")+7;
integer ende_cp = rueckgabe.Find(" /Artist");
string ausgabe_cp = rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp);
integer anfang_cp2 = rueckgabe.Find("Song ")+5;
integer ende_cp2 = rueckgabe.Find(" /Song");
string ausgabe_cp2 = rueckgabe.Substr(anfang_cp2,ende_cp2-anfang_cp2);
string yam_server_cp = ausgabe_cp#" - "#ausgabe_cp2;
string svName = "Yamaha PlayNow";
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
svObj.DPInfo("aktueller Song des Yamaha AVR");
svObj.ValueUnit("");
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
svObj.State(yam_server_cp);
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": "#rueckgabe);
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp2 );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp2 );
WriteLine((system.Date("%H:%M:%S"))#": "#yam_server_cp);
}
}
! TUNER
if (yam_source_cp == "TUNER") {
dom.GetObject("CUxD."#cuxd_dev#".CMD_SETS").State(cURL#" -X POST -H 'Content-Type: text/xml; charset=UTF-8' -d '<YAMAHA_AV cmd=\"GET\">"#yam_tuner#"</YAMAHA_AV>' '"#url#"'");
dom.GetObject("CUxD."#cuxd_dev#".CMD_QUERY_RET").State(1);
string rueckgabe = dom.GetObject("CUxD."#cuxd_dev#".CMD_RETS").State();
integer anfang_cp = rueckgabe.Find("Program_Service ")+16;
integer ende_cp = rueckgabe.Find(" /Program_Service");
string ausgabe_cp = rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp);
integer anfang_cp2 = rueckgabe.Find("Radio_Text_A ")+13;
integer ende_cp2 = rueckgabe.Find(" /Radio_Text_A");
string ausgabe_cp2 = rueckgabe.Substr(anfang_cp2,ende_cp2-anfang_cp2);
integer anfang_cp3 = rueckgabe.Find("Radio_Text_A ")+13;
integer ende_cp3 = rueckgabe.Find(" /Radio_Text_A");
string ausgabe_cp3 = rueckgabe.Substr(anfang_cp2,ende_cp2-anfang_cp2);
string yam_net_radio_cp = ausgabe_cp#": "#ausgabe_cp2#" - "#ausgabe_cp3;
string svName = yam_var_song;
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
svObj.DPInfo("aktueller Song des Yamaha AVR");
svObj.ValueUnit("");
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
svObj.State(yam_net_radio_cp);
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": "#rueckgabe);
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp2 );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp2 );
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp3 );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp3 );
WriteLine((system.Date("%H:%M:%S"))#": "#yam_net_radio_cp);
}
}
if ((yam_source_cp != "NET RADIO") && (yam_source_cp != "SERVER") && (yam_source_cp != "TUNER")){
dom.GetObject('Yamaha PlayNow').State(yam_source_cp);
}
}
else {
dom.GetObject('Yamaha PlayNow').State(yam_source_cp);
}
if (yam_vol_check == 1) {
!Volume
dom.GetObject("CUxD."#cuxd_dev#".CMD_SETS").State(cURL#" -X POST -H 'Content-Type: text/xml; charset=UTF-8' -d '<YAMAHA_AV cmd=\"GET\"><"#yam_zone#">"#yam_vol#"</"#yam_zone#"></YAMAHA_AV>' '"#url#"'");
dom.GetObject("CUxD."#cuxd_dev#".CMD_QUERY_RET").State(1);
string rueckgabe = dom.GetObject("CUxD."#cuxd_dev#".CMD_RETS").State();
integer anfang_cp = rueckgabe.Find("Val ")+4;
integer ende_cp = rueckgabe.Find(" /Val");
string yam_vol_cp = (rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp).ToFloat())/10;
string svName = yam_var_vol;
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtFloat);
svObj.ValueSubType(istGeneric);
svObj.DPInfo("aktuelle Lautstärke des Yamaha AVR");
svObj.ValueUnit("dB");
svObj.ValueMin(-80);
svObj.ValueMax(0);
svObj.State(15);
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
svObj.State(yam_vol_cp);
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": "#rueckgabe);
WriteLine((system.Date("%H:%M:%S"))#": "#anfang_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#ende_cp );
WriteLine((system.Date("%H:%M:%S"))#": "#yam_vol_cp);
}
}
if (Debug == 1) {
WriteLine((system.Date("%H:%M:%S"))#": Debug ENDE");
}
}
Ihr könnt die Antworten zu den Funktionen ganz leicht herausbekommen. Hier mein "Test-Script":
Code: Alles auswählen
var url= "http://[AVR-IP]/YamahaRemoteControl/ctrl";
var cURL="LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl";
dom.GetObject("CUxD.[CUxD-Adresse].CMD_SETS").State(cURL#" -X POST -H 'Content-Type: text/xml; charset=UTF-8' -d '<YAMAHA_AV cmd=\"GET\">[gewünschte Funktion]</YAMAHA_AV>' '"#url#"'");
dom.GetObject("CUxD.[CUxD-Adresse].CMD_QUERY_RET").State(1);
string rueckgabe = dom.GetObject("CUxD.[CUxD-Adresse].CMD_RETS").State();
WriteLine(rueckgabe);
[gewünschte Funktion] einsetzen (Beisp.: <Main_Zone><Volume><Lvl>GetParam</Lvl></Volume></Main_Zone>)
[CUxD-Adresse] anpassen (Beisp.: CUX2801001:9)
Als Antwort würde in dem Beispiel kommen:
Code: Alles auswählen
YAMAHA_AV rsp="GET" RC="0" Main_Zone Volume Lvl Val -620 /Val Exp 1 /Exp Unit dB /Unit /Lvl /Volume /Main_Zone /YAMAHA_AV
Code: Alles auswählen
integer anfang_cp = rueckgabe.Find("Val ")+4;
integer ende_cp = rueckgabe.Find(" /Val");
integer ausgabe_cp = rueckgabe.Substr(anfang_cp,ende_cp-anfang_cp);
WriteLine(ausgabe_cp);
"Val" ist in dem Beispiel die Antort auf <Main_Zone><Volume><Lvl>GetParam</Lvl></Volume></Main_Zone>
Ergebnis von WriteLine(ausgabe_cp) in dem Beipiel:
Code: Alles auswählen
-620
WICHTIG: gebt dem AVR eine EIGENE CUxD-Adresse! Ich habe nicht umsonst die CUX2801001:9 genommen. 1-8 sind bei mir schon von anderen Geräten belegt (Pushbullet, Fritzbox, etc.). Beim Senden gäbe es keine Probleme, aber beim Empfangen der Antworten.
Du kannst ja auch nicht auf einem Telefon gleichzeitig mehrere Anrufe beantworten (klar kannst Du, aber die CCU kann weder Anklopfen noch Konferenzschaltung )