HDMI-CEC mit LG TV / Notlösung per RS232

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • HDMI-CEC mit LG TV / Notlösung per RS232

    Hallo hdfreaks,

    nutzte bis vor kurzem meine Quad Plus mit dem openMIPS Image. Da Dieses aber seit geraumer Zeit nicht mehr unterstützt oder weiterentwickelt wird, habe ich mich entschieden auf openHDF umzusteigen. Nun sind meine ständigen Abstürze und Greenscreens endlich vergangenheit. Konnte mit Erfolg und Leichtigkeit meine Softcams und CI Module einrichten und habe wieder ein sauberes und funktionsfähiges System. Beim Einrichten bin ich jedoch über ein Problem gesolpert, welches ich schon verdrängt hatte.

    Egal welches Image ich auf meine Gigablue spielte, das HDMI-CEC mit meinem LG-TV hat nie richtig funktioniert. Also habe ich mich in openMIPS damit beholfen, dass ich mir die "Standby.py" angepasst habe und beim schalten immer ein Script aufrufe, welches per RS232 das passende Signal zu meinem TV sendet. So konnte ich trotz fehlendem CEC meinen TV mit ein- und ausschalten. Leider fehlt mir in oHDF jegliche Möglichkeit, diese Lösung nachzubilden, da ich keine Standby.py finde. Mir ist auch aufgefallen, dass die ganze Dateistruktur hier ein klein wenig anders ist. Daher bitte ich um Hilfe, um eine neue Lösung zu erarbeiten. Vielleicht kann mir auch jemand den passenden Tipp geben, wo ich die Codezeilen zum einfügen meines alten scriptes finde. Dies wäre für mich die beste Lösung, weil ich dann auch wieder meine Heimautomation mit Kinomodus automatisiert einpflegen kann und meine Scripte nicht alle überarbeiten müsste.

    Hoffe konnte mich verständlich ausdrücken und auf hilfreiche Antworten. Danke.

    Gruß
    Bin neu hier - komme nun öffter... :D
  • @Koivo
    Vielen Dank für den Link, der hat mir sehr geholfen. Mir ist nämlich aufgefallen, dass hier an der Standby.py schon rumgefummelt wurde. Keine Ahnung warum, aber vor paar Jahren, als dieses Problem bei mir das erste mal auftrat, habe ich in einem anderen Forum auch schon um Hilfe gebeten und man hat mir versichert, man würde das in den nächsten Build einfügen.

    Python-Quellcode: Standby.py

    1. class Standby2(Screen):
    2. def Power(self):
    3. print "[Standby] leave standby"
    4. SystemInfo["StandbyState"] = False
    5. if (getBrandOEM() in ('fulan', 'clap', 'dinobot') or getMachineBuild() in ('gbmv200', 'sf8008', 'sf8008m', 'ustym4kpro', 'beyonwizv2', 'viper4k')):
    6. try:
    7. open("/proc/stb/hdmi/output", "w").write("on")
    8. except:
    9. pass
    10. #set input to encoder
    11. self.avswitch.setInput("ENCODER")
    12. #restart last played service
    13. #unmute adc
    14. self.leaveMute()
    15. # set LCDminiTV
    16. if SystemInfo["Display"] and SystemInfo["LCDMiniTV"]:
    17. setLCDModeMinitTV(config.lcd.modeminitv.value)
    18. #kill me
    19. if os.path.exists("/usr/scripts/standby.sh") is True:
    20. os.system("chmod 755 /usr/scripts/standby.sh")
    21. os.system("/usr/scripts/standby.sh")
    22. else:
    23. print "/usr/scripts/standby.sh not found"
    24. self.close(True)
    Alles anzeigen



    Wie man hier sehen kann, wird der Pfad zu einer "/usr/scripts/standby.sh" geprüft und aufgerufen. Leider ohne Parameter und auch nur für "leave Standby". Ich benötige das aber für beide Zustände.

    @cricriat
    Um mal ein wenig Dunkelheit in meinen Durchblick zu bringen, hier mal die Scripts und der Versuch zu erklären, wie alles zusammenspielt. Warum Plural? Ganz einfach. Die Python-Codes musste ich mir kopieren, da ich kein Python beherrsche. Shell-Script ist meine Welt. Die restlichen Scripts und Erweiterungen sind historisch gewachsen. Also gleich vorweg, ich brauche keine Rüge, weil ich das so kompliziert gemacht habe, warum ich mich so doof anstelle oder was alles falsch ist. Es hat funktioniert, lief ein paar Jahre und ich bin gerne bereit, alles zu überarbeiten und besser zu machen.

    Als erstes war mein Anliegen, wegen nicht kompatiblen CEC den TV zu schalten, ohne python nutzen zu müssen. Stellte aber fest, dass COM bzw Serial oder gar USB anschlüsse per Shell nicht so einfach anzusteuern waren. Also habe ich mir ein Python-Script besorgt, welches dies einfach tun kann.

    Python-Quellcode: sebdserial.py

    1. import serial
    2. import sys
    3. print sys.argv[1]
    4. print sys.argv[2]
    5. ser = serial.Serial(sys.argv[1], 9600, 8, serial.PARITY_NONE, serial.STOPBITS_ONE, xonxoff=0, rtscts=0, timeout=1)
    6. Aktiv = False
    7. if(not(ser.isOpen())):
    8. Aktiv = True
    9. ser.open()
    10. ser.write(sys.argv[2]+'\r')
    11. if(Aktiv):
    12. ser.close()
    Alles anzeigen
    Diese rufe ich auf durch eine Shell, welche schon vorhanden war, um meinen TV per FHEM steuern zu können.

    Shell-Script: tvsteuern.sh

    1. #!/bin/sh
    2. TV() {
    3. python /usr/scripts/sendserial.py /dev/ttyS0 "ka 01 ${1}"
    4. }
    5. Leinwand() {
    6. ssh [email protected] 'perl /opt/fhem/fhem.pl 7072 "set Leinwand '$1'"'
    7. }
    8. Beamerlift() {
    9. ssh [email protected] 'perl /opt/fhem/fhem.pl 7072 "set Beamerlift '$1'"'
    10. }
    11. Beamer() {
    12. python /usr/scripts/sendserial.py /dev/ttyUSB0 "* 0 IR ${1}"
    13. }
    14. #Main-Code
    15. if [ "$1" == "on" ]
    16. then
    17. TV 01
    18. if [ -e /usr/scripts/kinomodus.cfg ]
    19. then
    20. Leinwand off
    21. Beamerlift off
    22. rm /usr/scripts/kinomodus.cfg
    23. fi
    24. fi
    25. if [ "$1" == "off" ]
    26. then
    27. if [ ! -e /usr/scripts/kinomodus.cfg ]
    28. then
    29. TV 00
    30. elif [ -e /usr/scripts/kinomodus.cfg ]
    31. then
    32. Beamer 002
    33. Leinwand off
    34. sleep 120
    35. Beamerlift off
    36. rm /usr/scripts/kinomodus.cfg
    37. fi
    38. fi
    39. if [ "$1" == "kinostart" ]
    40. then
    41. touch /usr/scripts/kinomodus.cfg
    42. TV 00
    43. Leinwand on
    44. Beamerlift on
    45. sleep 30
    46. Beamer 001
    47. fi
    48. if [ "$1" == "kinoende" ]
    49. then
    50. Beamer 002
    51. Leinwand off
    52. sleep 120
    53. Beamerlift off
    54. rm /usr/scripts/kinomodus.cfg
    55. TV 01
    56. fi
    Alles anzeigen

    Später wurde diese noch erweitert, um meinen Beamer und meine Leinwand automatisch zu steuern um per Sprachbefehl bzw. damals noch Plugin den Kinomodus zu starten bzw zu beenden. Außerdem habe ich eine File erstellt, dass bei Stromausfall und ausgefahrener Leinwand erkannt wird, dass diese noch hochgefahren werden muss.

    Dieses Script greift auch immer wieder auf die Serial zurück, da Beamer und TV durch diese gesteuert werden.

    Meine eigene Standby.py sieht so aus

    Python-Quellcode: Standby.py

    1. class Standby2(Screen):
    2. def Power(self):
    3. print "leave standby"
    4. if os.path.exists("/usr/scripts/tvsteuern.sh"):
    5. os.system("/usr/scripts/tvsteuern.sh on")
    6. #set input to encoder
    7. self.avswitch.setInput("ENCODER")
    8. #restart last played service
    9. #unmute adc
    10. self.leaveMute()
    11. # set LCDminiTV
    12. if SystemInfo["Display"] and SystemInfo["LCDMiniTV"]:
    13. setLCDModeMinitTV(config.lcd.modeminitv.getValue())
    14. #kill me
    15. self.close(True)
    16. def setMute(self):
    17. if (eDVBVolumecontrol.getInstance().isMuted()):
    18. self.wasMuted = 1
    19. print "mute already active"
    20. else:
    21. self.wasMuted = 0
    22. eDVBVolumecontrol.getInstance().volumeToggleMute()
    23. def leaveMute(self):
    24. if self.wasMuted == 0:
    25. eDVBVolumecontrol.getInstance().volumeToggleMute()
    26. def __init__(self, session, StandbyCounterIncrease=True):
    27. Screen.__init__(self, session)
    28. self.skinName = "Standby"
    29. self.avswitch = AVSwitch()
    30. print "enter standby"
    31. if os.path.exists("/usr/scripts/tvsteuern.sh"):
    32. os.system("/usr/scripts/tvsteuern.sh off")
    33. self["actions"] = ActionMap( [ "StandbyActions" ],
    34. {
    35. "power": self.Power,
    36. "discrete_on": self.Power
    37. }, -1)
    Alles anzeigen
    Und das hat bisher sehr gut funktioniert.

    Vielleicht hat ein Image-Entwickler ja eine Idee, wie man das Verbessern und fest einpflegen kann. Oder vielleicht lässt sich ein Menüpunkt erstellen, der das CEC mit RS232-Alternative aktivieren lässt, mit 2 Parameter. Erstmal aktiv/inaktiv und dann "Ausschaltcode" und "Einschaltcode" sowie Port (ttyUSB1 oder ttySER0) oder wie auch immer. Der Anfang in der Standby.py ist ja schon gemacht, keine Ahnung, ob hier der STatus abrufbar ist.

    So, hoffe alle Klarheiten beseitigt zu haben und vielleicht etwas weiter zu kommen.

    Werde mir aber schon mal die Standby.py manipulieren. Mal sehen, was sonst noch so kommt.

    Danke und Gruß
    Bin neu hier - komme nun öffter... :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von 0p3r4t0r_DE ()

  • Probier mal diese standby.py.

    Es wird eine /usr/scripts/enterstandby.sh ausgeführt, wenn man in standby geht und eine /usr/scripts/standby.sh, wenn man aus dem Standby kommt.

    Ich hab nur getestet ob die standby.py crasht und noch nicht die Funktion.
    Dateien
    • Standby.py

      (17,52 kB, 6 mal heruntergeladen, zuletzt: )
    Meine Bastelboxen: Mut@nt HD51 | GB Quad 4K | Mut@nt HD60 | OSMIO4K | HIS 4k Combo+

    ... Keinen Support per PN ... bitte stellt eure Fragen ins Forum!...

    ~ Benutzung OpenHDF Image ~ Benutzung der HDF-Toolbox ~ FAQ und Linksammlung ~ Build und Foren Server Spendenaktion ~
  • @0p3r4t0r_DE
    Danke für die Infos.
    Nach meinen Erfahrungen arbeitet HDMI-CEC alles andere als zuverlässig.

    Was Dich interessieren könnte, da es Deiner Neigung, Shellscripte zu schreiben entgegenkommt,
    ist folgendes:

    HDMI-CEC auf der command line
    Menü -> Einstellungen -> Video -> HDMI CEC Einstellungen -> Befehlszeilenfunktion aktivieren "Auf Ja setzen"
    Sicherheitshalber reboot.

    echo 00:standby > /tmp/hdmicec_cmd #(TV aus)
    echo 00:wakeup > /tmp/hdmicec_cmd #(TV ein)

    echo 00:powerstate > /tmp/hdmicec_cmd (Statusabfrage)
    Rückmeldung in /tmp/hdmicec_msg ist:
    Wenn 00:90:00 dann ist TV eingeschaltet und bei 00:90:01 ist TV abgeschaltet.
  • Erst mal vielen Dank an euch,

    konnte schon erste Erfolge sowie Rückschläge verzeichnen. Bevor ich nun ein neues SHELL-Script schreibe, wollte ich es erst mal durch eine Standby.py versuchen.
    Konnte auch teilweise wieder alles so rekonstruieren, dass es läuft wie auf dem alten System. Allerdings habe ich trotzdem Probleme und keine Ahnung, wie ich am besten ansetze um den Fehler zu finden.

    Habe meine beiden Files "tvsteuern.sh" und "sendserial.py" unter /usr/scripts/". Beide sind auf 755 gesetzt. Wenn ich über telnet (ach ja, bekomme aus Gründen die ich nicht kenne keine SSH Verbindung hin. Trotz Passwort und laut Menü ist SSH aktiv) verbinde, kann ich "./tvsteuern.sh on" bzw "./tvsteuern.sh off" aufrufen und mein TV geht aus und an. Also Scripte und RS232 funktionieren. Nur der Aufruf über die Standby.py geht irgendwie ins leere.

    Mal funktioniert das Ausschalten, aber das Einschalten gar nicht. Bei folgender .py

    Python-Quellcode: Standby.py

    1. class Standby2(Screen):
    2. def Power(self):
    3. print "[Standby] leave standby"
    4. SystemInfo["StandbyState"] = False
    5. if (getBrandOEM() in ('fulan', 'clap', 'dinobot') or getMachineBuild() in ('gbmv200', 'sf8008', 'sf8008m', 'ustym4kpro', 'beyonwizv2', 'viper4k')):
    6. try:
    7. open("/proc/stb/hdmi/output", "w").write("on")
    8. except:
    9. pass
    10. #set input to encoder
    11. self.avswitch.setInput("ENCODER")
    12. #restart last played service
    13. #unmute adc
    14. self.leaveMute()
    15. # set LCDminiTV
    16. if SystemInfo["Display"] and SystemInfo["LCDMiniTV"]:
    17. setLCDModeMinitTV(config.lcd.modeminitv.value)
    18. #kill me
    19. if os.path.exists("/usr/scripts/tvsteuern.sh") is True:
    20. os.system("/usr/scripts/tvsteuern.sh on")
    21. else:
    22. print "/usr/scripts/tvsteuern.sh not found"
    23. self.close(True)
    24. # normally handle only key's 'make' event
    25. def Power_make(self):
    26. if (config.usage.on_short_powerpress.value != "standby_noTVshutdown"):
    27. self.Power()
    28. # with the option "standby_noTVshutdown", use 'break' event / allow turning off the TV by a 'long' key press in standby
    29. # avoid waking from standby by ignoring the key's 'break' event after the 'long' and subsequent 'repeat' events.
    30. def Power_long(self):
    31. if (config.usage.on_short_powerpress.value == "standby_noTVshutdown"):
    32. self.TVoff()
    33. self.ignoreKeyBreakTimer.start(250, 1)
    34. def Power_repeat(self):
    35. if (config.usage.on_short_powerpress.value == "standby_noTVshutdown") and self.ignoreKeyBreakTimer.isActive():
    36. self.ignoreKeyBreakTimer.start(250, 1)
    37. def Power_break(self):
    38. if (config.usage.on_short_powerpress.value == "standby_noTVshutdown") and not self.ignoreKeyBreakTimer.isActive():
    39. self.Power()
    40. def TVoff(self):
    41. print "[Standby] TVoff"
    42. TVinStandby.skipHdmiCecNow(False)
    43. TVinStandby.setTVstate('standby')
    44. def setMute(self):
    45. if eDVBVolumecontrol.getInstance().isMuted():
    46. self.wasMuted = 1
    47. print "[Standby] mute already active"
    48. else:
    49. self.wasMuted = 0
    50. eDVBVolumecontrol.getInstance().volumeToggleMute()
    51. def leaveMute(self):
    52. if self.wasMuted == 0:
    53. eDVBVolumecontrol.getInstance().volumeToggleMute()
    54. def __init__(self, session):
    55. Screen.__init__(self, session)
    56. self.skinName = "Standby"
    57. self.avswitch = AVSwitch()
    58. print "[Standby] enter standby"
    59. SystemInfo["StandbyState"] = True
    60. if os.path.exists("/usr/scripts/tvsteuern.sh") is True:
    61. os.system("/usr/scripts/tvsteuern.sh off")
    62. else:
    63. print "/usr/scripts/tvsteuern.sh not found"
    64. self["actions"] = ActionMap(["StandbyActions"],
    65. {
    66. "power": self.Power,
    67. "power_make": self.Power_make,
    68. "power_break": self.Power_break,
    69. "power_long": self.Power_long,
    70. "power_repeat": self.Power_repeat,
    71. "discrete_on": self.Power
    72. }, -1)
    73. globalActionMap.setEnabled(False)
    74. self.ignoreKeyBreakTimer = eTimer()
    75. self.standbyStopServiceTimer = eTimer()
    76. self.standbyStopServiceTimer.callback.append(self.stopService)
    77. self.timeHandler = None
    78. #mute adc
    79. self.setMute()
    80. if SystemInfo["Display"] and SystemInfo["LCDMiniTV"]:
    81. # set LCDminiTV off
    82. setLCDModeMinitTV("0")
    Alles anzeigen

    Wie man hier sieht, habe ich die Codezeilen schon bearbeitet um den Fehler eingrenzen zu können. Kann aber auch nicht sagen, ob es einen Syntaxgehler gibt. Das müsste mal ein Python experte prüfen.

    Als ich die Zeilen noch weiter gekürzt habe, hat es funktioniert. Allerdings hatte ich dann das Problem, dass das abarbeiten der Standby.py knapp 10 bis 20 Sekunden gadauert hat. Da wurden keine Befehle mehr von der Box angenommen, nachdem man aus oder eingeschalten hat.

    Da hatte ich dann nur

    Python-Quellcode: Standby.py

    1. if os.path.exists("/usr/scripts/tvsteuern.sh"):
    2. os.system("/usr/scripts/tvsteuern.sh on")

    diese beiden Zeilen drin. Das einzige was mir auffällt, dass die Prüfung im IF verkürzt ist und es keinen ELSE gibt.

    Bin also gerade etwas Ratlos. Vielleicht kann mir jemand sagen, wo ich bei der Fehlersuche anfangen kann.

    Danke.

    PS: Habe die Standby.py von Koivo verwendet und dann als erstes einfach nur mal den Namen des Script geändert.
    Bin neu hier - komme nun öffter... :D
  • Guten Tag Jungs und Mädels,

    Nachtrag:
    Es funktioniert.

    Warum?
    Keine Ahnung.

    Habe heute Mittag etwas herumgespielt und verschiedenes versucht, wie oben beschrieben, aber es hat nicht wirklich geklappt. Meist nur sporadisch. Zuletzt war es so, dass ich die neue Standby.py kopiert habe, habe einen Reboot gemacht, dann hat es 1x beim Ausschalten funktioniert und dann nichts mehr. Jedes mal aufs neue, wenn ich die .py neu hoch geladen habe. Dann habe ich wegen kochen und Abendessen eine Pause gemacht. Ohne mir einen Kopf zu machen, habe ich die Box eingeschalten und zack. TV geht mit an. Schalte ich die Box wieder aus, TV geht auch aus. Schalte ich wieder ein.... und so weiter. Es scheint nun also zu funktionieren. Warum kann ich mir aber nicht erklären. Es wurde seit dem letzten gescheiterten Versuch tatsächlich nichts mehr geändert.

    Aber vielen Dank für die Hilfe.
    Bin neu hier - komme nun öffter... :D
  • Jetzt mit oder ohne Script?
    Ich habe mit meinen LGs aktuell keine Probleme mit HDMI CEC (ohne Script).
    _________________________________________________________________
    GB ue 4k mit ST3000LM024-2AN1 und Synology über Denon X1700H an LG OLED OLED65C17LB
    AX 4K HD51 mit Synology an OLED55C8LLA
    Anadol Multibox SE an Samsung c
    ET10000 an Pioneer PDP-436RXE
    Unicable mit IG-IDLU-UST110-CUO4O-32P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fern-seher ()

  • HDMI-CEC mit LG TV / Notlösung per RS232

    Mein LG ist aus dem Jahre 2009. Daher denke ich, dass LG wohl stark in der Software gearbeitet hat und moderne Geräte wahrscheinlicher eher funktionieren. Will aber meinen nicht raus schmeißen, nur weil er alt ist. Der läuft noch tadellos.
    Deshalb verwende ich derzeit die Scripte.

    Leider hatte ich vorhin wieder einen Ausfall. Da hat das Ausschalten nicht funktioniert. Obwohl es seit gestern Abend und heute morgen sehr gut funktioniert hat.
    Ich verzweifel langsam.

    Gesendet von meinem HTC U11 mit Tapatalk
    Bin neu hier - komme nun öffter... :D
  • HDMI-CEC mit LG TV / Notlösung per RS232

    So,
    Ich denke man kann das Thema als gelöst erachten.
    Habe noch sporadisch Fehler, Die ich aber auf den Bediener zurück führe. Werde es weiter beobachten, aber grundsätzlich läuft und funktioniert alles.
    Wenn ich wüsste, wie ich den Beitrag selbst als gelöst setzen kann, Würde ich es tun. Aber irgendwie klappt das nicht.

    Danke an alle Helfer und falls gewünscht, stelle ich gerne meine Scripte hier rein und passe diese dann auch der Allgemeinheit an. Einfach kurz Bescheid geben.

    MfG

    Gesendet von meinem HTC U11 mit Tapatalk
    Bin neu hier - komme nun öffter... :D

Unsere Partnerboards

^
Flag Counter