NEWS
Test Adapter cec2
-
Aktuelle Test Version 0.0.8 Veröffentlichungsdatum 14.02.2021 Github Link https://github.com/iobroker-community-adapters/ioBroker.cec2 Ich habe einen Adapter für HDMI-CEC geschrieben. Es gab bereits einen, der wurde aber nicht mehr gepflegt und hatte aus meiner Sicht einige Probleme (mehr dazu).
Der HDMI-CEC Adapter ist getestet auf eine Raspberry PI, der per HDMI an einem TV oder Switch oder AV-Reciever hängt (also irgenwie im "HDMI-Netz"). Es sollte auch mit anderen Rechnern gehen. Wichtig ist, dass der cec-client vorhanden ist, unter Raspian "cec-utils" installieren mit:
sudo apt-get install cec-utils
Danach muss vermutlich noch dem user "iobroker" das Recht eingeräumt werden auf die CEC-Schnittstelle zuzugreifen, das geht in Raspian so (User iobroker ist danach Mitglied in der Gruppe "video"):
sudo usermod -a -G video iobroker
Der Adapter pollt beim Start alle HDMI Geräte und legt entsprechend Geräte im ioBroker an. Ich habe für die Geräte ID den Namen des Geräts genommen. Der sollte sich nicht verändern und ist für Menschen doch ganz gut lesbar. Wenn während dem Betrieb weitere Geräte hinzukommen, werden die ebenfalls hinzugefügt und ggf. befragt.
(wer sich fragt, was das ganze mit den Adressen soll, liest kurz im Spoiler eine kurze Einführung in CEC Adressen ;-)):
Es gibt für jedes Gerät die folgenden States:
- info.active = das Gerät wurde gesehen, seitdem der Adapter gestartet ist und ist vermutlich unter der logischen Adresse noch erreichbar
- info.cecVersion = meist 1.4, wäre interessant ob ihr hier was anderes beobachtet
- info.lastSeen = letzte Nachricht von dem Gerät
- info.logicalAddress = logische Adresse (falls bekannt und aktiv) als Nummer
- info.logicalAddressHex = logische Adresse (falls bekannt und aktiv) als Hex-Zahl (wird in dieser Form für eigene Befehle benötigt, also 0-F).
- info.Name = der Name, den das Gerät sich selbst gibt
- info.physicalAddress = physische Adresse des Gerätshttp://info.name/
- info.Vendor = Hersteller des Geräts
- activeSource = ist dieses Geräte activeSource (= Eingang wird darauf umgestellt). Lässt sich setzen, dann wird das Gerät activeSource
- menuStatus = das Gerät reportet, dass es sich gerade mit einer Fernbedienung bedienen lassen würde (?), damit experimentiere ich noch (gerne Erfahrungen mitteilen, mit CEC kann man ja z.B. den FireTV mit der FB des TVs bedienen, soweit ich verstanden habe, hat es damit zu tun)
- state = Gerät ist an oder in standby bzw. kann darüber geschaltet werden
Dann gibt es noch das "Global" Device mit den folgenden States:
- active-source = hier kann die activeSource mit einer physischen Adresse gesetzt werden, so kann auch auf Geräte umgeschaltet werden, die selber kein CEC unterstützen (oder es deaktiviert ist). Außerdem wird hier die activeSource, die im Bus gesetzt wird auch reportet
- arc = Audio Return Channel ist (in)aktiv bzw. kann (de)aktiviert werden
- mute = AV-Receiver stumm schalten
- raw-command = Befehl direkt an cec-client senden. Da geht z.B. "scan" oder "standby all" oder auch mit tx davor beliebige CEC-Befehle...
- standbyAll = alle Geräte in Standby schicken (die es unterstützen)
- systemAudio = systemAudio ist (in)aktiv bzw. kann (de)aktiviert werden. Entscheidet ob das "Audiosystem" (= AV-Receiver) sich um Audio & Lautstärke kümmern soll, oder nicht und Geräte Lautstärkeanforderungen entsprechend dorthin schicken sollen
- volume = Status der Lautstärke, 0 = mute.
- volumeUp/Down = leiser/lauter machen
Dazu gibt es noch einen Unterordner "poll" für in dem für die meistens States noch ein Button ist. Wenn man den Button auslöst, wird auf dem CEC Bus ein Befehl zur Abfrage des entsprechenden States gesendet und der Wert, falls erhalten, entsprechend aktualisiert. Leider reagieren nicht alle Gerät zuverlässig auf diese Befehle.
Update 0.0.8:
Unter der Haube hat sich viel getan.Sichtbar neu ist der Support für die cec-Fernbedienung. Dafür gibt es bei jedem Gerät jetzt den state "createButtons" -> das erzeugt einen neuen Unterordner mit Button-States für alle möglichen Knöpfe (das sind einige) und einen State für das Delay (es wird immer ein Drücken und Loslassen gesendet, mit dem Delay lässt sich einstellen, wie viel Zeit zwischen drücken und loslassen verstreichen soll).
Es reagieren nicht alle Geräte auf Knöpfe und auch ganz sicher nicht auf alle. Viel Spaß beim testen.Auch neu ist Support für OSD Nachrichten. Mein TV will das irgendwie alles nicht -> daher kann ich das selber nicht testen...
Viel Spaß beim Testen und ich bin offen für weitere Anregungen.
Interessant fände ich auch, wenn jemand ein Gerät zum Aufnehmen hat oder ein "Tuner" Gerät. Oder ein Gerät, was plötzlich den state "deck" hat (da weiß ich noch gar nicht, wofür der da ist?).Ich überlege auch, ob man in den Geräten noch einen Unterordner für Fernbedienungsbefehle macht. Die kann man über CEC ja auch senden. Braucht man das?
-
@Garfonso wie sieht es mit dem Resourcenbedarf aus? Ich hätte noch einen Raspberry Pi Zero W in der Schublade, für den ich bisher keine Verwendung habe. Wenn das reichen sollte könnte ich den als Slave einrichten und an den "Receiver passthrough" Port meiner Xbox One hängen. Wahrscheinlich komme ich aber leider erst kommendes Wochenende dazu.
-
@Xyolyp
Könnte reichen... ich hatte das ganze auch eine lange Zeit auf einem PI 1 mit 512 MB RAM laufen (da ich beim entwickeln das ganze aber öfter neu starten musste, war mir das dann doch irgendwann zu doof und das ist jetzt ein PI 4. , daher kann ich es nicht garantieren, dass es noch läuft). -
@Garfonso einen Raspi 1B+ habe ich auch noch aber der letzte Installationsversuch ist kläglich gescheitert. Wie hast du auf dem 1er ioBroker installiert? Gerne per Chat falls es dir hier zu Off Topic ist.
-
@Garfonso ich bin doch schon dazu gekommen meinen Raspberry Pi 1B+ als Slave einzurichten und den CEC2 Adapter zu installieren. Angeschlossen ist der Raspberry am "Satellitenreceiverinput" von meiner XBox One. Leider bleibt der Adapter gelb mit dem folgenden Fehler im Log:
(1479) Can not access HDMI. Please read requirements part of readme. Error: Error: EACCES: permission denied, access '/dev/vchiq'
EDIT: Ich konnte das Problem lösen indem ich auf dem Slavesudo usermod -a -G video iobroker
ausgeführt habe.Aktuell habe ich im Log die folgenden Meldungen:
-
Aktuell wird der Chromecast und der Fernseher erkannt. Die XBox One, die aktuell der aktive Eingang ist sowie der Sat-Receiver (ziemlich alt, möglicherweise kann er kein CEC) werden nicht erkannt bzw. es werden keine Objekte angelegt.
Die angelegten Buttons funktionieren nicht. Weder Mute, noch Volume Up/Down unter Global, noch irgenein anderer:
Kann ich dir irgendwelche Informationen/Logs/Dumps/… bereitstellen, damit du die Probleme untersuchen kannst? -
@Xyolyp said in Test Adapter cec2:
EDIT: Ich konnte das Problem lösen indem ich auf dem Slave sudo usermod -a -G video iobroker ausgeführt habe.
Achja, das wollte ich hier ja noch ergänzen...
Da muss ich mal gucken, ob ich das irgendwie automatisieren kann bei der Installation (wenn überhaupt).@Xyolyp said in Test Adapter cec2:
Die angelegten Buttons funktionieren nicht. Weder Mute, noch Volume Up/Down unter Global, noch irgenein anderer:
Also nur buttons? Oder auch die anderen States? (also z.B. an/aus).
Das ist ja merkwürdig...
Könntest du neu von github installieren und es nochmal versuchen und mir ggf. nochmal das Log zeigen? Vielleicht auch mal ein Log vom Startvorgang. -
@Garfonso sagte in Test Adapter cec2:
Also nur buttons? Oder auch die anderen States? (also z.B. an/aus).
Es wirkt auf mich so als würde abgesehen vom Scan nichts so funktionieren wie es eigentlich sollte. Ich weiß nicht ob das Ursprungsproblem nicht vielleicht mein Aufbau ist, da ich den Raspi nicht direkt an einen Input vom Fernseher, sondern durch die Xbox am Fernseher angeschlossen habe. Leider habe ich keine Möglichkeit den Raspberry direkt am Fernseher anzuschließen.
-
@Xyolyp
Also an dem Port kann es eigentlich nicht liegen. Wenn CEC durchkommt, dann kommt es durch. Ich vermute, außer deinem TV "spricht" bei dir einfach keiner richtig CEC. Beim Chromecast kann ich mir gut vorstellen, dass der Support für CEC eher rudimentär ist und eher in die Richtung geht, dass der dafür sorgen kann, dass der TV auf ihn umschaltet und ggf. noch Ton gesteuert werden kann. Zumindest bei den FireTV sticks ist das so...
Die XBox scheint kein CEC zu unterstützen, hab ich mal gegoogelt, da lässt sich also nichts machen. Beim Sat-Receiver könntest du mal in den Menüs gucken, ob es da was gibt oder selber googeln (leider haben die Hersteller immer eigene Namen und verweisen selten selber auf CEC).Kannst du denn mit active-source den HDMI Eingang vom TV umstellen? (Es müsste gehen 1 oder 1.0.0.0 für Port 1 usw., X = X.0.0.0 ist eine Vereinfachung, die ich für den Fall am TV umzuschalten eingebaut hab). Oder TV an/aus?
Gehen mit der Version die Buttons? Ansonsten würde mir ein log davon auch weiterhelfen. Der Fehler ist jedenfalls ein Bug im Code, selbst wenn da vorher was "falsches" von außen kommt, muss der Code damit ja klar kommen.
Achja, die Fehler beim starten nicht überinterpretieren. Die hab ich jetzt auch rausgenommen. Das heißt nur, dass da halt keine geantwortet hat. Also die Timeouts sind immer unproblematisch.
-
Hallo Garfonso,
ich hab den Adapter installiert und scheint so weit alles gut zu funktionieren. Ich habe den Raspi an meinen Onkyo angeschlossen und kann damit den Samsung TV ein- und ausschalten, muten, usw.
Wie kann ich z.B. Fernbedienungsbefehle an den TV senden?Grüße
-
Hi,
das freut mich zu hören.
Fernbedienungsbefehle hab ich bisher noch nicht umgesetzt. Besteht da Bedarf? Dann guck ich mal. Meine erste Idee wäre in einem eigenen Unterordner am Device für die Befehle die CEC so unterstützt jeweils Knöpfe zu machen. Oder wäre ein sendTo für Skripte besser? (Hab ich Adapterseitig noch nie gemacht, müsste ich mir angucken). Es gibt glaube ich leider keinen einfachen Weg rauszufinden, welche Befehle ein Gerät unterstützt oder nicht.Es wird in CEC ein Button_Press und ein Button_Release gesendet. Da müsste ich überlegen, wie man das am besten umsetzt, wie lange ein Knopf gedrückt sein sollte... oder soll ich einen Knopf für release machen? grübel
Wenn du das nutzen willst, vielleicht hast du ja Ideen dazu.
Viele Grüße,
Garfonso -
Hi zusammen, ich frag das Mal hier, bitte Bescheid sagen, wenn ich das woanders machen soll.
Ich hab einen recht eigenwilligen AV Receiver (Samsung HW C700).
Der ist per CEC mit meinem Panasonic Fernseher verbunden und wenn der Receiver an ist, lässt sich die Lautstärke über die Fernbedienung des Receivers steuern und der Receiver geht mit dem TV zusammen aus. Leider aber nicht mit ihm zusammen an. Zumindest meistens nicht.
Ich habe einen workaround getestet über den Panasonic TV Adapter, indem ich nach dem erkennen des Einschaltens auf den HDMI Eingang des TV schalte, am dem der Receiver hängt. Das funktioniert in 90 Prozent der Fälle, außer meine Frau ist alleine Zuhause. Dann schaltet der Receiver doch manchmal mit dem TV ein, dann schaltet der Receiver manchmal auf einen anderen Eingangskanal, manchmal auf Mute, sodass er sich aber auch nicht mit der TV Fernbedienung wieder laut stellen lässt.Länge Rede kurzer Sinn, ich würde gerne bei erkennen des Einschaltens meines Fernsehers dem AV Receiver per CEC sagen, er solle angehen, auf den TV als Quelle stellen und die Lautstärke auf einen bestimmten Wert stellen. Kann ich das hiermit? Dann würde ich ihn die Tage auch installieren und ausgiebig testen.
Level 2 wäre dann noch:
Ich habe den iobroker zwar auf einem RPi4 aber würde den ungern am TV unterbringen. Da hab ich schon einen RetroPi. Könnte man den Adapter so einstellen/umbauen das ganze auf einem anderen RPi zu machen (SSH?) Kenne den cec-client noch nicht.Ich hab mittlerweile auch ein bisschen Erfahrung gesammelt in der Adapterentwicklung und könnte ggf auch unterstützen.
Gruß, Boris
-
@boriswerner Das mit den 90% kenne ich bei meinem Onkyo und Samsung TV auch...
Du kannst mit diesem Adapter den Zustand jedes am HDMI-CEC-Bus angeschlossenen Gerätes auslesen und entsprechend als Datenpunkt verwenden, Laustärke regeln, etc.Zum Level 2: IOBroker unterstützt das Master-Slave Prinzip. Ich hab auch einen RPI4 als Master und einen RPI3 mit HDMI-Kabel am Onkyo Receiver hängen, um genau das zu machen. Die Administration erfolgt ausschließlich in der Web-Oberfläche am Master.
Gruß
-
@SuperElmi cool. Danke für die Info.
Ich hab gestern direkt mit dem cec-client getestet und bin verzweifelt... Das Verhalten der Geräte hinterlässt bei mir nur Fragezeichen.
Ich werde dann aber Mal schauen, wie ich auf dem RetroPi am TV einem Slave installiert bekomme oder bringe den master einfach Mal runter zum Test. -
Hab jetzt mal den RPi4 direkt angeschlossen. Er hat alles erkannt (AVR, FireTV-Stick, TV; die XBox wird auch bei mir nicht angezeigt, steht aber ja schon oben, dass die kein CEC kann), zeigt allerdings beim Einschalten von TV oder AVR:
cec2.0 2020-03-27 14:17:02.079 error (1341) No device for name TV created. cec2.0 2020-03-27 14:10:52.436 error (1341) No device for name AV_Receiver created.
Ich weiß, nicht ob das etwas ausmacht.
Ich konnte auch über den raw_command den AVR einschalten, allerdings hat er seine Source dann auf den Kanal des RPi gestellt. Das soll dann eigentlich der TV werden (der ist über den HDMI-Out am HDMI2 (mit ARC) an den TV angeschlossen). Da muss ich noch testen.@Xyolyp die Buttons für Mute und Volume funktionieren übrigens per Definition des CEC Protokolls wohl nur wenn ein AVR im System ist (die gehen immer an Device 5, daher der Timeout, der bei dir "from 5" angezeigt wird).
Ich berichte weiter, muss nur weiter schauen, wie/ob das mit der active source funktioniert. Wollte nur schonmal einen Zwischenstand dalassen.
-
Hi,
also, was du vorhast sollte so gehen. Ich habe hier auch Probleme mit meinem AVR, die ich mit dem Adapter gelöst habe.
Zur Fehlermeldung:
Du hast aber devices (also "Ordner") für die Geräte im ioBroker unter Objekte? Darin sollte auch ein "state" Objekt sein, mit dem du an/aus schalten kannst. Und mit dem Objekt "activeSource" kannst du die Eingänge auf das Gerät umstellen (als "Boolean" im Gerät selber oder in Global, dann als physikalische Adresse).Zum Ton:
Bei mir ist das Problem, dass mein AVR zwar mit dem TV angeht, aber kein Ton liefert, weil er meint Audio würde über HDMI gerade nicht gebraucht... keine Ahnung, was da genau schiefläuft oder ob es auch mit dem FireTV zusammenhängt oder was (lustigerweise macht er auch keinen Ton, wenn er selber Audio streamt)... da hilft dann in Global "systemAudio" anschalten. Mein AVR schickt den status dazu allerdings nicht aktiv rum (keine Ahnung, ob das andere anders machen), daher gibt es für alle States noch im Unterordner "poll" einen Switch, mit dem man den Status aktiv abfragen lassen kann (der Adapter schickt dann einen Request in CEC und es sollte dann eine Antwort kommen -> der State aktualisiert sich dann in ioBroker, wenn es geklappt hat).Also hab ich hier ein Skript, was, wenn der TV angeht (also TV.state -> true) den systemAudio Status pollt nach kurzer Zeit ( -> Global.poll.systemAudio = true) und falls der auf "false" bleibt (was er nicht immer tut), den dann auf true setzt.
Zu SSH noch kurz:
Man könnte vermutlich den fork verändern und noch SSH drum herum legen... aber dabei handelt man sich natürlich noch Probleme ein, wenn was mit dem Netzwerk passiert, auf die der Adapter nicht vorbereitet ist... daher ist die Lösung mit ioBroker Slave vorzuziehen. Für schwache Geräte müsste der cec2 Adapter auch im compact Mode laufen können.Vielen Dank fürs testen.
VIele Grüße,
Garfonso -
@Garfonso sagte in Test Adapter cec2:
Ich habe probleme den zweiten Befehl:
sudo usermod -a -G video iobroker
abzusetzen. Ich bekomme die Meldung: user 'iobroker' does not exist
Habe versucht den user mitsudo su
unduseradd -m iobroker
diesen zu kreieren, ging aber nicht. Nach dem Enter, bekam ich nur die Auflistung der Befehle.
Hat hier jemand eine Lösung?EDIT: Hab jetzt erst verstanden, dass auf dem Pi am HDMI Netz ein Iobroker Slave installiert werden muss.
-
@Garfonso
Ein "wenig" OT:
ich habe bisher CEC deaktiviert, weil ich alles über Harmony steuere.
Seit diesem Jahr habe ich Disney+, das ich jedoch nicht (wie Netflix) über den BluRay Player streamen kann, sondern nur über den TV.
Damit dann ARC funktioniert, musste ich CEC aktivieren.
seitdem schaltet mir der TV, nachdem über die Harmony die Dreambox, der AV-Receiver und der TV angeschaltet wurde, sofort wieder die Dreambox ausWürde der Adapter etwas dagegen machen können?
-
@homoran
Ja. Der würde die Physische Adresse der Dreambox als "Active Source" ankündigen. Das sollte, bei richtiger Einstellung von TV / AV Receiver dazu führen, dass diese an gehen und die Eingänge entsprechend umstellen.
Das Problem, daher verlangt Logitech ja auch die Deaktivierung von CEC, ist, dass die Befehle der Harmony das dann alles durcheinander bringen. Daher solltest du das erstmal ohne Harmony ausprobieren. Also z.B. mal den Adapter nutzen und da active Source auf die Dreambox stellen (kannst du eine Zahl eingeben, das ist dann die Nummer des Anschluss am TV oder die volle Adresse, also z.B. 1.2.0.0, wenn z.B. AV Receiver an Anschluss 1 am TV und Dreambox an Anschluss 2 am AV Receiver usw.).rant on
Ich hab bei mir die Harmony rausgeschmissen und bin froh nicht jeden kleinen Scheiß mit der scheiß App konfigurieren zu müssen. Mit CEC geht das bei mir gerade alles sehr gut und viel besser als mit der Harmony jemals. Aber ich bin mit der auch nie grün geworden, für das gefummel hatte ich einfach nie die Geduld (und durch das schlechte Desing der App dauert dann ja alles auch nochmal extra ewig).
rant off -
Update 0.0.8:
Unter der Haube hat sich viel getan.Sichtbar neu ist der Support für die cec-Fernbedienung. Dafür gibt es bei jedem Gerät jetzt den state "createButtons" -> das erzeugt einen neuen Unterordner mit Button-States für alle möglichen Knöpfe (das sind einige) und einen State für das Delay (es wird immer ein Drücken und Loslassen gesendet, mit dem Delay lässt sich einstellen, wie viel Zeit zwischen drücken und loslassen verstreichen soll).
Es reagieren nicht alle Geräte auf Knöpfe und auch ganz sicher nicht auf alle. Viel Spaß beim testen.Auch neu ist Support für OSD Nachrichten. Mein TV will das irgendwie alles nicht -> daher kann ich das selber nicht testen...