ubuntuusers.de

Befehl ausführen, nur wenn Hdmi Kabel angeschlossen ist

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Sheldor

Avatar von Sheldor

Anmeldungsdatum:
2. Oktober 2009

Beiträge: Zähle...

Hallo

Ich habe ein Problem mit einem kleinen Script das ich mir geschrieben habe und google hat mir leider keine Antwort liefern können, deshalb frag ich mal hier nach ob mir jemand helfen kann.

Also ich hab mir ein kleines Script geschrieben, das eigentlich nur meine Monitorausgabe vom Notebook auf mein extern angeschlossenen Fehrnseher umschaltet, dabei die Soundausgabe auf Hdmi umstell und XBMC startet.

Das funktioniert soweit auch ganz gut, nur ab und zu vergesse ich bevor ich die Tastenkombination (die ich dem ganzen zugewiesen habe) drücke, das HDMI kabel anzuschließe. Da er dann aber leider auch schon XBMC startet, ist es nicht mehr so einfach das ganze wieder zurück zu schalten.

Jetzt wollte ich das Script so erweitern, dass er vorher überprüft ob das HDMI Kabel angeschlossen ist und fals das nicht der Fall ist kurz eine Warnung einblendet (über den Benachrichtigungsdienst von Ubuntu, den teil bekomm ich hin).

Das Problem is jetzt das ich nicht weiß wie ich dies Abfrage nach dem HDMI Kabel mache.

Wäre schön wenn mir da jemand weiter helfen könnte.

Vielen Dank im Voraus.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Du müsstest vielleicht doch mal etwas mehr Details verraten ...
(z.B. das Skript posten, damit wir überhaupt erstmal einen Einstieg haben 😉 )

Ansonsten hat mir die Suchmaschine meines Vertrauens spontan dies ausgeworfen: https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture#Using_udev_to_automatically_turn_HDMI_audio_on_or_off - vielleicht findest Du darin schon einen Ansatzpunkt ?

LG,

track

Sheldor

(Themenstarter)
Avatar von Sheldor

Anmeldungsdatum:
2. Oktober 2009

Beiträge: 101

Mein Script macht nicht wirklich viel, bis auf ein paar sachen starten, im Moment sieht es so aus:

1
2
3
4
5
6
7
#!/bin/bash
xrandr --output LVDS1 --off --output HDMI1 --auto    #Display auf HDMI umschalten
pactl set-card-profile 0 output:hdmi-stereo          #Audioausgabe auf HDMI umschalten
amixer set Master 100%                               #Lautstärke auf maximal stellen
boblightd&                                           #Ambilight starten
boblight-X11 -o saturation=1.5&                      #Amilight starten
xbmc                                                 #xbmc starten

Nun würde ich halt gerne das er bevor er das alles macht erst einmal überprüft ob ein Hdmi kabel angeschlossen, bzw. der Bildschirm auf den er umschalten will vorhanden ist.

Den Artikel hatte ich mir schon mal angeguckt, konnte aber nix brauchbares darin finden. Hab ihn mir gerade noch mal näher angeschaut und gefunden, dass ich mit:

1
read hdmi_status </sys/class/drm/card0-HDMI-A-1/status

den status des HDMI Kables auslesen kann, wenn ich hdmi_status dann ausgebe bekomme ich entweder "connected" oder "disconnectet". Das sieht soweit ja schon ganz gut aus, nur bekomme ich das ganze nicht in eine if abfrage, habe folgendes zum testen versucht:

1
2
3
4
5
6
7
8
#!/bin/bash
read hdmi_status </sys/class/drm/card0-HDMI-A-1/status
if [$hdmi_status = "disconnected" ]; then
echo "kabel ab"
else
echo "kabel dran"
fi
exit 0

Leider gibt er auch bei nicht angeschlossenem kabel "kabel dran" aus, d.h. so wie ich die if abrfage gemacht habe geht es anscheinend nicht. Was mache ich da falsch?

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1570

Wohnort: Terra incognita

Sheldor schrieb:

#!/bin/bash
read hdmi_status </sys/class/drm/card0-HDMI-A-1/status
if [$hdmi_status = "disconnected" ]; then
echo "kabel ab"
else
echo "kabel dran"
fi
exit 0

Ohne Leerzeichen zwischen "[" und "$"? Tippfehler hier, oder definitiv im Skript falsch...

Sheldor

(Themenstarter)
Avatar von Sheldor

Anmeldungsdatum:
2. Oktober 2009

Beiträge: 101

Ja habe es auch grade selbst bemerkt, dummer Fehler, jetzt geht es so wie es soll, vielen danke für deine Hilfe

Lg Sheldor

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Sheldor schrieb:

....
den status des HDMI Kables auslesen kann, wenn ich hdmi_status dann ausgebe bekomme ich entweder "connected" oder "disconnectet". Das sieht soweit ja schon ganz gut aus, nur bekomme ich das ganze nicht in eine if abfrage, habe folgendes zum testen versucht:

Was hältst Du von einer Variante mit grep :

1
2
3
4
5
6
7
#!/bin/bash

if grep -q "^connected$" /sys/class/drm/card0-HDMI-A-1/status ; then
        echo "kabel dran"
else
        echo "kabel ab"
fi

wo Du direkt den Rückgabewert auswertest, ganz ohne test ...?
(Es ist besser, ihn nach "connected" suchen zu lassen. Dann kann er nicht spinnen, falls es dieses Gerät gar nicht gibt !)

LG,

track

Sheldor

(Themenstarter)
Avatar von Sheldor

Anmeldungsdatum:
2. Oktober 2009

Beiträge: 101

Ja das sieht eleganter aus als meine Lösung, werd ich so anpassen in mein Skript. Dann funktioniert jetzt alles so wie ich es mir erhofft habe. Danke noch mal für die schnelle Hilfe.

Lg Sheldor

Acer54

Avatar von Acer54

Anmeldungsdatum:
6. Juli 2011

Beiträge: 700

Wohnort: Bayern

Hallo Sheldor,

auch wenn es etwas spät kommt, stelle ich dir einfach mal mein XBMC Skript zur Verfügung...

Funktionen:

Überprüfen ob alle benötigten Pakte installiert sind, ob HDMI Kabel angeschlossen ist, ob ext. Festplatte angeschlossen ist, ob eine andere Instanz von xbmc bereits läuft, stellt Display auf HDMI um, stellt Sound auf HDMI um, setzt Lautstärke auf 100%, startet xbmc ... dann alles Rückgängig und umounted die HDD...

Das ganze benötigt kein "Terminal" es läuft über einen Starter in der Dash (unity). Allerdings wird das Paket "yad" aus den Respos benötigt. Aber das würde dir das Skript dann schon sagen 😉

hier der code:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#! /bin/bash
##########################################################################################################
###########################################XBMC at HDTV###################################################
##########################################################################################################
exec 3> >(zenity --notification --listen)

########Abfrage#############################sind alle Abhängigkeiten installiert###################################################################
yadapp="$(dpkg -l | grep -c yad)"										#ist yad installiert ?

xbmcapp="$(dpkg -l | grep -c xbmc)"										#ist xbmc installiert ?

xrandrapp="$(dpkg -l | grep -c xrandr)"										#ist xrandr installiert ?

pactapp="$(dpkg -l | grep -c pact)"										#ist pact installiert ?


if [ $yadapp == 0 ] ; then											#Fehlermeldung falls, eines nicht inst. ist
	
	zenity --error --text "Das Paket 'yad' scheint nicht installiert zu sein \nInstallieren Sie das fehlened Paket und versuchen Sie es erneut..."
	exit
elif [ $xbmcapp == 0 ] ; then

	zenity --error --text "XBMC muss vorher installiert sein! \nInstallieren Sie das fehlened Paket und versuchen Sie es erneut..."
	exit
elif [ $xrandrapp == 0 ] ; then

	zenity --error --text "Das Paket 'xrandr' scheint nicht installiert zu sein \nInstallieren Sie das fehlened Paket und versuchen Sie es erneut..."
	exit
elif [ $pactapp == 0 ] ; then

	zenity --error --text "Das Paket 'pact' scheint nicht installiert zu sein \nInstallieren Sie das fehlened Paket und versuchen Sie es erneut..."
	exit
else




#Gates vordefinieren (schlechtester Fall)
HDMI=0														#kein HDMI Kabel angeschlossen
HDD=0														#keine HDD angeschlossen
BUSY=1														#eine andere Instanz von XMBC läuft 
#####Abfrage##############################Ist das HDMI Kabel angeschlossen ? #######################################################################	
if xrandr | grep -i "HDMI1 connected" ; then 									#falls das HDMI Kabel angeschlossen ist
	HDMI=1													#setze Gate "HDMI" auf 1
else
	HDMI=0													#falls nicht, lasse den Status auf 0

	while [ $HDMI == 0 ] 											#solange Gate=0, 
		 do yad --title="XBMC @ HDTV" --text="Das HDMI Kabel scheint nicht angeschlossen zu sein! \nBitte erst die HDMI Verbindung zwischen PC und TV herstellen..." --button="OK" --button="Abbrechen" --image=/home/matthias/.scripte/xbmc_HDMI/connect\ HDMI.jpg  	#Meldung mit aufforderung mit OK und Abbrechen
		ret=$?
		if [ $ret = 1 ] ; then 										#wenn Taste "Abbrechen gedrückt wurd, abbruch
					
			exit
		elif [ $ret = 0 ] ; then									#wenn Taste "OK" gedrückt wird erneute Abfrage
			if xrandr | grep -i "HDMI1 connected" ; then 						#wenn nun OK, wird Gate auf 1 gesetzt und 
				HDMI=1										#loop durchbrochen
			else
				HDMI=0										#falls immer noch nicht, erneuter loop
			fi	
		else
		echo "DEBUG !"											#das sollte niemals vorkommen
		fi		
				
		done 
fi


######Abfrage##################################ist die USB HDD angeschlossen ?########################################################################
if lsusb |grep -i "Western Digital" ; then									#wenn HDD angeschlossen
	HDD=1													#setze Gate auf 1
else														#wenn nicht
	HDD=0													#setze 0
	
	while [ $HDD == 0 ] 											#solange keine HDD angeschlossen
		 do yad --title="XBMC @ HDTV" --text="Die externe Festplatte scheint nicht angeschlossen zu sein! \nBitte erst die USB-Festplatte anschließen..." --button="OK" --button="Abbrechen" --image=/home/matthias/.scripte/xbmc_HDMI/connect\ USB.jpg  			#Meldung mit aufforderung mit OK und Abbrechen
		ret=$?
		if [ $ret = 1 ] ; then 										#wenn Taste "Abbrechen gedrückt wurd, abbruch
					
			exit
		elif [ $ret = 0 ] ; then									#wenn Taste "OK" gedrückt wird erneute Abfrage
			if lsusb |grep -i "Western Digital" ; then 						#wenn nun OK, wird Gate auf 1 gesetzt und
				HDD=1										#loop durchbrochen
			else
				HDD=0										#falls immer noch nicht, erneuter loop
			fi	
		else
		echo "DEBUG !"											#das sollte niemals vorkommen
		fi		
				
		done 
	
fi


######Abfrage#####################################läuft xbmc bereits ?################################################################################
if ps -ef|grep -v grep|grep -i xbmc.bin	; then									#wenn bereits ein xbmc prozess läuft
BUSY=0														#setze Gate auf 0
zenity --error --text "XBMC läuft bereits in eines anderen Instanz! Bitte vorher beenden!" 			#Errormeldung
exit														#exit
else														#falls kein xbmc prozess läuft
BUSY=1														#setze Gate auf 1

fi


######Feststellung#################################Alles in Ordnung! ##################################################################################
													
    					xrandr --output HDMI1 --mode 1280x720 --same-as LVDS1			#echo "Aktiviere HDMI Ausgang" 		

					
		    			pactl set-card-profile 0 output:hdmi-stereo				#echo "Aktiviere Audio Ausgang über HDMI"

					amixer set Master 100%							#setze Lautstärke auf 100%
					gconftool-2 -s /apps/gnome-power-manager/buttons/lid_battery --type=string blank	#unterdrücke suspend
								
				
					notify-send -t 5 XBMC "Sie können die Laptopklappe nun schließen"	#Meldung, 				
					read -t 5 Dummy								#warte bis jeder die Meldung gelesen hat
					#gconftool-2 -a /apps/gnome-power-manager/buttons			#hiermit könnte der suspend status abgefragt werden
    					xbmc									#los gehts !		

#########################################################################################################	#Script stoppt hier solange XBMC läuft
#########################################Nach schließen des XBMC#########################################
#########################################################################################################

					

							
					xrandr --output HDMI1 --off						#Grafikeinstellungen zurücksetzen

					 		
					pactl set-card-profile 0 output:analog-stereo				#Soundprofil auf int. Lautsprecher setzen.

					amixer set Master 85%							#machen wir mal wieder ein bisschen leiser...
					gconftool-2 -s /apps/gnome-power-manager/buttons/lid_battery --type=string suspend
					#gconftool-2 -a /apps/gnome-power-manager/buttons			#optionale kontrollfunktion
					sudo umount -l /media/Elements/						#Festplatte aushängen
					zenity --info --text "Das HDMI Kabel und die USB Festplatte kann getrennt werden" #Info Fenster
					notify-send -t 5 XBMC "Einstellungen wurden wieder hergestellt"		#infobox
				

fi
exit 0

#Um die Passworteingabe von "sudo umount -l /media/Elements/ zu umgehen, muss man den "mount" und "umount" Befehl in die "/etc/sudoers" File eintragen.
#Es ist stark empfohlen dies nicht mit irgendeinem Textmanager vorzunehmen sondern NUR mit visudo
#
#Terminal:	sudo visudo
#
#Anschließend werden am Ende der Datei folgende 2 Zeilen eingetragen:
#	
#	%matthias ALL=NOPASSWD: /bin/mount
#	%matthias ALL=NOPASSWD: /bin/umount
#
#Nach einer neuen Anmeldung an den Xserver sollte die Ausführung des Befehles "sudo umount -l /media/Elements/ ohne darauffolgende Passworteingabe 
#möglich sein.

Bestimmt alles andere als "sauber" geschrieben... funktioniert aber 😀

Evtl. kannst du, oder jemand der über diesen Thread stolpert etwas davon brauchen...

Sheldor

(Themenstarter)
Avatar von Sheldor

Anmeldungsdatum:
2. Oktober 2009

Beiträge: 101

Ah cool vielen Dank

Antworten |