LG webOS-TV mit Alexa steuern: Alexa – Schalte Sender ZDF ein…

Als ich mir vor kurzer Zeit einen neuen Fernseher gekauft habe, habe ich beschlossen, diesmal darauf zu achten, dass dieser auch Smart-Home-kompatibel ist in Bezug auf mein openhab2-System. Daher habe ich mich von vornherein auf Samsung oder LG festgelegt, da diese in der Theorie zu openhab2 entsprechende Bindings haben. Gerade die webos-Schnittstelle von LG fand ich spannen. So ist es dann letztlich ein Fernsehgerät von LG mit webOS geworden, konkret ein LG 55 UK 7750 LLA.

Was ich zuvor ja bereits umgesetzt hatte (allerdingsmit einer Strommessdose) ist das Schalten bestimmter Licht-Szenen (tageszeit und sonnenstandsabhängig). Das ging dann mit dem webos-Binding von openhab viel leichter. „Einschalten über WLAN“ stand in der Beschreibung. Das klingt gut, Wake-on-LAN also – dann sollte es ja ein Leichtes sein, küntig den Fernseh via Alexa per Sprache ein und auszuschalten. Das hat leider nicht gleich geklappt, denn die Beschreibung von LG war schlicht falsch. Eine Anfrage an den Support wurde damit beantwortet, dass das Feature ausgeschalten sei, den es gäbe noch Probleme. Irgendwann käme es nach. Bis dahin war es nur möglich, eine bestimmte Minutenanzahl nach Ausschalten des TV diesen per Wake on LAN einzuschalten, denn danach ging scheinbar die Netzwerkschnittstelle auf Standby. Nun wurde hier aber nachgearbeitet und der Fernseh teile mir vor ein paar Tagen mit, er könne das mit einem aktuellen Update nun tun. Soweit sogut, es kann losgehen! Alexa mit openhab-Skill läuft bei mir bereits bezüglich diverser Lampen, dann machen wir Alexa einmal fernsehtauglich.

Was der Fernseher können soll

  • Einschalten via Sprache
  • Ausschalten via Sprache
  • Senderwechsel zu bestimmten Sender
  • Stummschalten
  • Start des Amazon Prime Video-Dienstes

Die Theorie…

LG liefert ein Alexa Skill aus, aber um es einfach zusagen: Das Ding taugt nichts. Auch wenn man dann später noch die App installiert – zum Laufen habe ich es nicht bekommen, damit den TV zu steuern. Ich habe gelesen, dass das Ding wohl experimentell sein soll und für den deutschen Markt noch nicht alles könne, ein Umstellen auf ein anderes Land abhilfe schaffen würde – aber das ist mir zu bunt. Dann lieber eine eigene Lösung.

Den TV selbst habe ich via webos binding angebunden. Darauf möchte ich nicht genauer eingehen, das ist sozusagen vorausgesetzt…

Einschalten, Ausschalten, Stummschalten

Um den Fernseher einschalten zu können nutze ich das wake on lan binding von openhab2.

Um den Fernseher auszuschalten und auf Stumm zu schalten, nutze ich das webos binding – es bietet entsprechende Methoden. Beim Stummschalten ist der LG-TV aber buggy, denn zusammen mit meinem Pioneer-Receiver klappt selbst auf de Fernbedienung das Stummschalten nicht – der TV zeigt zwar stumm an, aber die Lautsprecher hören nicht darauf. Da habe ich festgestellt, dass ein mehrfaches Senden des Stumm-Kommandos den TV auch wirklich stumm schaltet – daher im Code nicht wundern, dass ich das mehrfach zum TV sende.

Um die Aktionen auszulösen, habe ich virutelle Switches als Items definiert, die als „Switchable“ über die Cloud für Alexa als schaltbares Gerät dann im Alexa Smart Home Skill-Bereich hinzugefügt werden können und genutzt werden können.

Beim Einschalten via Sprache (manchmal dauert es etwas, bis der TV tatsächlich schaltet) sowie später beim Senderwechsel gebe ich manche Hinweismeldungen via Alexa Text To Speech aus – hier kann ich aber in diesem Artikel nicht genauer eingehen. Wer das nutzen will, der braucht das Alexa Echo Control Binding.

Senderwahl via Alexa

Kniffliger war das Thema Senderwahl. Am liebsten wäre mir gewesen, die Sender als Selection-Item in der Sitemap zu hintelegen und mit Alexa-Sprachsteuerung einfach darauf zugreifen zu können. Das geht leide nicht (oder ich weiß es einfach nicht, wie es geht), daher habe ich mir überlegt, wie man das trotzdem hinbekommen kann.

Idealerweise würde ich Alexa nur sagen wollen „Alexa, schalte auf ZDF“ o.ä. – aber das konnte ich so nicht umsetzen. Aber mir kam die Idee, einfach einen (virtuellen) Switch in openhab anzulegen, je Sender, und diese so zu benennen, dass es auch vernünftig zu steuern ist. „Alexa, schalte Sender ZDF ein“ ist aus meiner Sicht intuitiv genug.

Daher habe ich die wichtigsten Sender als virtuelle Switches definiert. Jeder Sender hat im TV eine bestimmte Nummer. ZDF ist z.B. bei mir Sendernummer 2. Alexa soll auf das Kommando „Alexa, schalte Sender ZDF ein“ hören, also muss das Item hier „Sender ZDF“ lauten. Nun könnte ich natürlich je Sender eine Rule machen, hier eine, die dan z.B. den Sender Nr 2 startet. Aber das wäre schon sehr aufwändig. Daher habe ich die Items so benannt, dass die Nummern der Sender in der Item-Benennung Platz finden, und diese Nummer extrahiert wird – generisch – und dann der entsprechende Befehl ausgeführt wird. Die Sender sind alle in einer Gruppe „tvsender“ und ändert sich ein Mitglied davon, wird geschaut, welche Sendernummer es ist, anhand des Items und der im Namen enthaltenen Sendernummer und der Sender wird gestartet.

Amazon Prime Video über Sprache starten

Auch Amazon Prime Video nutze ich von Zeit zu Zeit. Um auch dieses als Sender nutzen zu können hat dieses anstatt der Sendernummer im Item (wie oben beschrieben) einfach einen bestimmten Code, der abgeprüft wird. Wichtig ist, wenn nun Live-TV und Prime Video parallel schaltbar sein soll, auch die „App“ im TV zu wechseln, daher ist das entsprechend im Code hinterlegt.

Weitere Extras…

Wenn der Fernseh startet, dann habe ich noch eingebaut, dass mein Echo, sofern er gerade Musik abspielt, auf Pause gestellt wird.

Die Praxis…

Tatsächlich scheint das ganze recht zuverlässig zu funktionieren. Was Alexa und mein Fernseh nun können:

  • Alexa, schalte Fernseher ein
  • Alexa, schalte Sender XYZ ein
  • Alexa, schalte Amazon Prime Video ein
  • Alexa, schalte Fernseher Lautsprecher aus
  • Alexa, schalte Fernseher Lautsprecher ein
  • Alexa, schalte Fernseher aus

Damit bin ich erst einmal sehr zufrieden.

Die Umsetzung

Die Umsetzung erfolgt anhand folgender Dateien – bitte beachten, dass ihr die Teile, die meine Alexa steuern, ausklammern müsst (also Text to Speech und die Stummschaltung selsbt). Aber die Files dienen sicher ganz gut als Beispiel für eigene Basteleien.

Items-File

Anbei erst der Teil der webos-binding-Anbindung, anschließend dann die virtuellen Kanäle.

// Fernsehgerät
Group debugTV           "Fernseher Debugwerte"      <screen>    (debug)
// Orginäre Binding-Items
Switch TV_POWER         "TV Power"                  <screen>    (debugTV)                   { autoupdate="false", channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:power" }
Switch TV_MUTE          "TV Mute"                               (debugTV)                   { channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:mute"}
Dimmer TV_VOLUME        "Volume [%S]"                           (debugTV)                   { channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:volume" }
Number TV_VOLDUMMY      "VolumeUpDown"                          (debugTV)
Number TV_CHANNELNO     "Channel [%d]"                          (debugTV)                   { channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:channel" }
Number TV_CHANNELDUMMY  "ChannelUpDown"                         (debugTV)
String TV_CHANNEL       "Channel [%S]"                          (debugTV)                   { channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:channelName"}
String TV_TOAST                                                 (debugTV)                   { channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:toast"}
Switch TV_STOP          "Stop"                                  (debugTV)                   { autoupdate="false", channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:mediaStop" }
String TV_APP           "Application [%s]"                      (debugTV)                   { channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:appLauncher"}
Player TV_PLAYER                                                (debugTV)                   { channel="lgwebos:WebOSTV:xxxx-anonymisiert-xxxx:mediaPlayer"}

Switch TV               "Fernseher"                 <screen>    (gruppeEG, debugTV) ["Switchable"]
Switch TV_VIRT_LAUTSPRECHER  "Fernseher Lautsprecher"                (debugTV)           ["Switchable"]

// this assumes you also have the wake on lan binding configured and your TV's IP address is on this network - You would need to update your broadcast and mac address accordingly
Switch TV_WOL           "Wake-on-LAN TV (LAN)"                           (debugTV) { wol="192.168.188.255#xx:xx:xx:xx:xx:xx" }


// Virtuelle Schalter für Fernsehkanäle zur Alexa-Ansteuerung
Group debugTVSender (debugTV)
Group tvsender

// Senderliste TV:
Switch TV_VIRT_KANAL_001_ARD        "Sender ARD" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_002_ZDF        "Sender ZDF" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_003_RTL        "Sender RTL" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_004_SAT1       "Sender Sat 1" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_005_PRO7       "Sender Pro 7" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_006_VOX        "Sender Vox" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_007_KABEL1     "Sender Kabel 1" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_008_RTL2       "Sender RTL 2" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_009_SRTL       "Sender Super RTL" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_012_3SAT       "Sender 3 Sat" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_013_WELT       "Sender Welt" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_014_PHOENIX    "Sender Phönix" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_015_NTV        "Sender NTV" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_018_ARTE       "Sender Arte" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_022_N24        "Sender N24" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_101_NDR        "Sender NDR" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_105_WDR        "Sender WDR" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_117_BR         "Sender BR" (debugTVSender, tvsender) ["Switchable"]
Switch TV_VIRT_KANAL_126_TAGESSCHAU24 "Sender Tagesschau 24" (debugTVSender, tvsender) ["Switchable"]

// Amazon Prime Video
Switch TV_VIRT_KANAL_PRM_PRIMEVIDEO "Amazon Prime Video" (debugTVSender, tvsender) ["Switchable"]

Rules-File

var boolean log = true
var String logPrefix = 'Fernseher.rules - '
rule "Fernsehgerät anschalten via Wake on LAN"
when
	Item TV changed to ON
then 
	// nur Anschalten wenn es nicht bereits an ist.
	if (log) logInfo('rules', logPrefix + ' Status APP ist: "' + TV_APP.state.toString()  + '"')
	if ((TV_APP.state.toString() == '' || TV_APP.state == UNDEF)  || (TV_POWER.state == OFF && TV.state == ON)) {
		ALEXA_EG_WOHNEN_TTS.sendCommand('Das Fernsehgerät wird gestartet')
		if (log) logInfo('rules', logPrefix + 'Einschalten via SmartHome - WOL wird ausgeführt...')
		TV_WOL.sendCommand(ON)
		Thread::sleep(5000)
		TV_WOL.sendCommand(OFF) // WOL-Switch wieder auf "aus" rücksetzen.
	} else {
		logInfo('rules', logPrefix + 'TV-Gerät wohl schon an - wird nicht nochmal angschalten')
	}
end

rule "Fernsehgerät ausschalten über webos-bindung"
when 
	Item  TV changed to OFF
then
	if (TV_APP.state.toString() != '') {
		TV_POWER.sendCommand(OFF)
	}
end

rule "Fernseh aus? Dann Stummschaltung rausnehmen"
when Item TV changed to OFF 
then 
	if (TV_VIRT_LAUTSPRECHER.state != ON) {
		TV_VIRT_LAUTSPRECHER.sendCommand(ON)
	}
end

rule "Fernseher-Status synchron halten"
when 
	Item TV_APP changed
then
	if (log) logInfo('rules', logPrefix + 'Fernsehstatus hat sich geändert: ' + TV_APP.state.toString())
	if (
		(TV.state != OFF) && (
			(TV_APP.state.toString() == '') || (TV_APP.state.toString() == 'UNDEF')
		)
		) {
		TV.postUpdate(OFF)
	}
	if (
		(TV.state != ON) && (
			(TV_APP.state.toString() != '') && (TV_APP.state.toString() != 'UNDEF')
		) 
		) {
		TV.postUpdate(ON)
	}
end

rule "Lautsprecher-Mute-Schaltung mit inversem Mute-Kommando"
when Item TV_VIRT_LAUTSPRECHER changed
then 
	if (TV_VIRT_LAUTSPRECHER.state == ON)  // Mehrmals, wegen der buggy Receiver-Anbindung, ohne Receiver oder mit besserem vermutlich nicht nötig
		TV_MUTE.sendCommand(OFF)
		Thread::sleep(1000)
		TV_MUTE.sendCommand(OFF)
		Thread::sleep(1000)
		TV_MUTE.sendCommand(OFF)
	} else {
		TV_MUTE.sendCommand(ON)
		Thread::sleep(1000)
		TV_MUTE.sendCommand(ON)
		Thread::sleep(1000)
		TV_MUTE.sendCommand(ON)
	}
end

rule "TV Programm schalten"
when
	Member of tvsender changed to ON
then
	if (log) logInfo('rules', logPrefix + ' Regel zum TV-Sender-Ändern getriggert')
	if (TV.state != ON) {
		if (log) logInfo('rules', logPrefix + 'Fernsehgerät nicht an, Kanal kann nicht geschalten werden.')
		ALEXA_EG_WOHNEN_TTS.sendCommand('Das Fernsehgerät ist nicht an. Schalte es zuerst ein.')
	} else {
		tvsender.members.forEach[i|
			if (i.state == ON) {
				// Nun muss die dreistellige Zahl ab der 15. Stelle des Item-Namens extrahiert werden
				var extrakt = i.name.substring(14,17);
				// Prüfen, ob normaler TV-Kanal oder Prime Video
				if (extrakt == 'PRM') {
					// Prime starten
					TV_APP.sendCommand('amazon')
				}
				else {
					if (TV_APP != 'com.webos.app.livetv') {
						TV_APP.sendCommand('com.webos.app.livetv')
					}
					val kanalNummer = new java.math.BigDecimal(Integer::parseInt(extrakt, 10))
					if (log) logInfo('rules', 'Kanale zum Umschalten extrahiert: ' + kanalNummer.toString())
					// Sender umschalten
					TV_CHANNELNO.sendCommand(kanalNummer)
				}
			}
		]
	}
	tvsender.members.forEach[i|
		// Nun alle Items, die nicht OFF sind wieder auf OFF schalten - der Switch soll nicht den Zustand sondern nur die Bedienung ermöglichen
		if (i.state != OFF) i.sendCommand(OFF)
	]
end

Viel Spaß damit! Anregungen und Ergänzungen gern als Kommentar – individuellen Support kann ich aber leider nicht leisten…

2 Antworten auf „LG webOS-TV mit Alexa steuern: Alexa – Schalte Sender ZDF ein…“

  1. Hast du nicht das Problem, dass Alexa bei den Sendern wie z.B. RTL und RTL2 meckert? Bei mir beschwert sie sich das es mehrere Geräte mit dem Namen RTL gibt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.