HowTo: Callmonitor stellt TV-Lautstärke ein

dOnMoP

Neuer User
Mitglied seit
22 Nov 2007
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Hallo Leute,

ich habe mal aus meinen Erfahrungen ein kleines HowTo erstellt.
Falls etwas nicht funktioniert, oder wenn ihr das ganze mit anderen Geräten zum laufen bekommen habt, kann ich das gerne mit aufnehmen.

Was macht das ganze:
bei eingehendem oder ausgehendem Festnetzanruf wird bei einem Netzwerkfähigem Samsung TV die Lautstärke heruntergestellt. Nach dem Ende des Telefonates wird die Lautstärke wieder auf die Ausgangslautstärke gesetzt.

Das Gerät:
Ich habe als TV einen Samsung UE40B7090 - der ist per WLAN im Netzwerk.
Müsste auch bei anderen Samsung Geräten funktionieren und wahrscheinlich auch bei TVs anderer Hersteller, die DLNA unterstützen (evtl sind dann im script Änderungen nötig).

Voraussetzungen:
- gefreetzte Fritz.Box Fon mit den Paketen:
  • CallMonitor
  • curl

Einrichtung:

1. folgende Datei anlegen:
/var/tmp/flash/callmonitor/actions.local.d/7090vol.sh

- Datei ggf. mit "chmod 664 7090vol.sh" ausführbar machen
- die eingetragen IP mit der eures Gerätes austauschen

Code:
#
# read Samsung UE40B7090 volume and set it back
#

TVGetVol() {

tvolf=`curl "http://[B][U]192.168.178.22[/U][/B]:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:GetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><Channel>Master</Channel></ns0:GetVolume></s:Body></s:Envelope>"`
tvols=`echo ${tvolf#*CurrentVolume>}`
tvvolume=`echo ${tvols%</CurrentVolume*}`

echo "$tvvolume">/tmp/flash/callmonitor/actions.local.d/tvvolume

curl "http://[B][U]192.168.178.22[/U][/B]:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:SetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><DesiredVolume>2</DesiredVolume><Channel>Master</Channel></ns0:SetVolume></s:Body></s:Envelope>"

}

TVSetVol() {

tvvolume=`cat /tmp/flash/callmonitor/actions.local.d/tvvolume`

if $tvvolume 
then
setvol=8               #set standard volume 8 
else
setvol=$tvvolume       #if tvvolume is set, use it
fi
    
curl "http://[B][U]192.168.178.22[/U][/B]:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:SetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><DesiredVolume>$setvol</DesiredVolume><Channel>Master</Channel></ns0:SetVolume></s:Body></s:Envelope>"

}

2. im CallMonitor folgende Listeners einstellen:

Code:
in:connect ^ ^ TVGetVol
out:request ^ ^ TVGetVol
out:cancel ^ ^ TVSetVol
*:disconnect ^ ^ TVSetVol


Alternativen:
falls meine Anleitung nicht funktioniert, hier eine Alternative:

hier für einen Samsung 630 - Aufruf von USB Speicher aus (thx to waldoo)


 
Zuletzt bearbeitet:
vorweg: ich habe keine shell erfahrungen..ich könnte mir das ganze aus programmiertechnischer sicht aber so vorstellen:

du definierst die variable in der funktion TVGetVol, wenn es so abläuft wie in "normalen" programmiersprachen ist die variable nur innerhalb dieser funktion gültig... das heißt, sie wird nach beenden der funktion gelöscht...
wenn du in der funktion TVSetVol() darauf zugreifst, wird eine neue , leere variable in dieser funktion erstellt..der guültigkeitsbereich der variablen ist beschränkt..

eine lösung wäre eine globale, für alle funktionen gültige, variable zu definieren (ich weiß wie gesagt nicht ob das in shell geht) oder die variable in einer datei zu schreiben und dann wieder zu laden...

wenn ich hier falsch denke bitte korrigiert mich :)
 
hallo,

genau so habe ich es mir vorgestellt - das versuche ich mit der variablen "tvvolume" aber die ist dann in TVSetVol() wieder leer (obwohl ich "export" benutzt habe)
 
hmm du hast recht... aber da bin ich raus!sry
 
Hi,

offensichtlich antworten Dir hier nur Nicht-Script-Profis :) ich zähl mich auch dazu...
Ich würde den Wert einfach mit echo >irgendeinfile $volume ins file schreiben und hinterher wieder lesen.

Gruß, Waldemar
 
ok das mit der datei schreiben könnte funktionieren.. habe ich mir auch schon überlegt.. aber irgendwie dachte ich das muss doch schöner gehen :D
es geht doch bestimmt auch anders, oder??

@Dieter: da steht aber nicht, wie man die variabeln "global" macht, oder habe ich etwas übersehen?
wenn ich die ausserhalb der funktion definiere komme ich auch nicht weiter.. anscheinend läuft das script einmal durch, die funktion wird gestartet und das script wird beendet.. somit wird da nix gespeichert

ich habe auch schon etwas über environment variablen gelesen.. aber das bekomme ich nicht hin (ich dachte der "export" befehl macht das)
 
Weiß nicht, ob Du das Problem inzwischen gelöst hast, aber IMHO hast Du keine andere Möglichkeit als den Wert in einer Datei zu sichern. Das Environment hilft Dir hier nicht weiter, da es immer nur für das aktuelle Programm (Script) gilt. Mittels "export" kannst Du lediglich Variablen an "Kind-Prozesse" weitergeben. Ich vermute sehr stark, dass beim Callmonitor jedoch zwei unterschiedliche Prozesse gestartet werden, einer beim Eintreffen des Anrufs, und einer beim Auflegen. Somit stehen diese beiden Events und die Scripte in keinerlei Verhältnis zu einander was das Environment angeht (abgesehen davon, dass beide möglicherweise das Environment vom callmonitor selbst erben, was Dir hier aber nix hilft).

Von daher empfehle ich, einfach eine Datei unter /tmp oder so anzulegen und die später wieder auszulesen.
 
ok danke...

das habe ich jetzt so umgesetzt und es funktioniert sogar :D

hier der code, falls den jemand braucht:
Code:
#
# read Samsung UE40B7090 volume and set it back
#

TVGetVol() {

tvolf=`curl "http://192.168.178.22:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:GetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><Channel>Master</Channel></ns0:GetVolume></s:Body></s:Envelope>"`
tvols=`echo ${tvolf#*CurrentVolume>}`
tvvolume=`echo ${tvols%</CurrentVolume*}`

echo "$tvvolume">/tmp/flash/callmonitor/actions.local.d/tvvolume

curl "http://192.168.178.22:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:SetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><DesiredVolume>2</DesiredVolume><Channel>Master</Channel></ns0:SetVolume></s:Body></s:Envelope>"

}

TVSetVol() {

tvvolume=`cat /tmp/flash/callmonitor/actions.local.d/tvvolume`

if $tvvolume 
then
setvol=8               #set standard volume 8 
else
setvol=$tvvolume       #if tvvolume is set, use it
fi
	
curl "http://192.168.178.22:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:SetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><DesiredVolume>$setvol</DesiredVolume><Channel>Master</Channel></ns0:SetVolume></s:Body></s:Envelope>"

}
 
Nachtrag:
man muss noch das schreibrecht für die datei tvvolume erteilen, damit es funktioniert:

Code:
/var/tmp/flash/callmonitor/actions.local.d # chmod 666 tvvolume

ohne diese aktion hat das ganze bei mir nur über Extras->Testanruf funktioniert, aber nicht bei einem echten Anruf
 
Hi dOnMoP,

ich habe diesen Thread erst heute zufällig gefunden. Als Callmonitor-Entwickler kann ich dir zunächst einmal sagen, dass die Beschreibung von derheimi vollkommen richtig war. Es ist nicht möglich, von einer Aktion zur nächsten per (Umgebungs-)Variable Informationen weiterzugeben.

Ich würde dir aber raten, deine Datei mit der Lautstärke nicht unterhalb von /tmp/flash abzulegen. Dieser Ort ist nur für Dateien gedacht, die dauerhaft (über ein Ausschalten der Box hinaus) gespeichert werden sollen. Deine Datei wäre besser in /tmp oder /var/lib aufgehoben.

Gruß,

Andreas
 
so, da ich jetzt schon ein paar Anfragen hatte, habe ich das Thema/den 1. post mal umgeschrieben und ein kleines HowTo draus gemacht..

viel spass damit ;)
 
Hallo dOnMoP,

super, danke Dir für die Gute Arbeit.

Leider hat das bei mir nicht so richtig funktioniert und habe Deinen Ansatz dann ein wenig geändert.
Vielleicht braucht das ja jemand mal :)

1.)
curl mit freetz statisch gebaut und auf den USB stick gelegt.

2.)
callmonitor Einträge im Webinterface hinterlegt
Code:
in:request ^ ^ samsung 192.168.XXX.XXX
in:request ^ ^ /var/media/ftp/USB/addons/tv_laut/tvlaut.sh TVGetVol
in:connect ^ ^ /var/media/ftp/USB/addons/tv_laut/tvlaut.sh TVGetVol
in:cancel ^ ^ /var/media/ftp/USB/addons/tv_laut/tvlaut.sh TVSetVol
in:disconnect ^ ^ /var/media/ftp/USB/addons/tv_laut/tvlaut.sh TVSetVol

3.)
Dein script angepasst und in das gleiche Verzeichnis wie die ausführbare curl Datei
Code:
#
# read Samsung UE40B7090 volume and set it back
#
TVGetVol() {

tvolf=`/var/media/ftp/USB/addons/tv_laut/curl "http://192.168.XXX.XXX:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:GetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><Channel>Master</Channel></ns0:GetVolume></s:Body></s:Envelope>"`
tvols=`echo ${tvolf#*CurrentVolume>}`
tvvolume=`echo ${tvols%</CurrentVolume*}`
echo "$tvvolume" > /tmp/tvvolume

/var/media/ftp/USB/addons/tv_laut/curl "http://192.168.XXX.XXX:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:SetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><DesiredVolume>2</DesiredVolume><Channel>Master</Channel></ns0:SetVolume></s:Body></s:Envelope>"

}

TVSetVol() {

tvvolume=`cat /tmp/tvvolume`

if $tvvolume
then
setvol=8               #set standard volume 8
else
setvol=$tvvolume       #if tvvolume is set, use it
fi

/var/media/ftp/USB/addons/tv_laut/curl "http://192.168.XXX.XXX:52235/upnp/control/RenderingControl1" -H "Content-Type: text/xml; charset='utf-8'" -H "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><ns0:SetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'><InstanceID>0</InstanceID><DesiredVolume>$setvol</DesiredVolume><Channel>Master</Channel></ns0:SetVolume></s:Body></s:Envelope>"
rm -rf /tmp/tvvolume

}


case $1 in
TVSetVol)
TVSetVol
;;
TVGetVol)
TVGetVol
;;

esac

exit 0

p.s mein Samsung ist ein 630 er
 
ok danke für die ergänzung.. habe ich oben mit eingefügt als alternative..

leider weiß ich nicht, was an meinem Ansatz nicht hinhaut.. bzw. wo vielleicht ein Fehler im HowTo ist.. wer ihn findet bekommt einen Keks :D
 
Hi,

Kann mir vielleicht jemand das so übersetzten das sogar ich das verstehe?
Das mit curl sagt mich gar nichts. Ich haben Callmonitor auf der Box und bekomme noch nicht einmal die Arufdauer gebacken.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.