Hallo Leute,
mit reichlich Unterstützung von Rudi habe ich es nun geschafft meinen Monitor am HDMI-Anschluss über FHEM ein- und aus- zuschalten.
Das ganze ist besonders nützlich wenn man, so wie ich, nur ab und an, an den Raspberry Pi über Konsole arbeitet und ihn vergisst
auszuschalten. Das Ausschalten kann nun über FHEM erfolgen, entweder manuell oder automatisch über eine Logik.
Natürlich kann man an den meisten Monitoren auch eine Abschaltzeit angeben aber diese Vorgehensweise schaltet zumeist auch gleichzeitig
die Lautsprecher mit aus und dass wollte ich vermeiden. Da ich meinen Monitor über einen Klinkenstecker mit dem Raspberry Pi verbunden habe
bleiben diese auch in Betrieb wenn das HDMI Signal abgeschaltet wird.
Der Monitor lässt sich über einen
dummy gesteuert mit
notify ganz einfach ausführen.
Das Problem ist aber folgendes:
Wenn der Monitor so über FHEM ausgeschaltet und der Raspberry Pi neu gestartet wird, schaltet sich das HDMI-Signal automatisch wieder ein.
Da der
dummy in FHEM aber als
state immer noch auf
AUS steht und FHEM diesen Status gespeichert hat bleibt der Monitor (für FHEM)
aus.
D.h. der
dummy steht auf
AUS obwohl der Monitor ja
AN ist.
Ich habe nun eine Vorgehensweise entwickelt die dieses Problem umgeht
Ich denke der eine oder andere kann damit was anfangen.
Hier nun meine Lösung:
Zuerst wird ein Python-Script angelegt ich nenne es mal
FHEMMonitor.py im Ordner
/usr/local/bin/folgendes in die Datei
FHEMMonitor.py hineinschreiben:
#!/usr/bin/python
datei = open("/tmp/RPi_Monitor.status", "w")
datei.write("on\n")
datei.close()
(wenn das jemand über FTP mit z.B. notepad++ macht, nicht vergessen, speichern mit
UTF-8 ohne BOM und als
UNIX-Datei ablegen.)
Jetzt die Rechte anpassen und das Script ausführbar machen, am besten über Konsole bzw. Putty eingeben
sudo chown fhem:dialout /usr/local/bin/FHEMMonitor.py
sudo chmod 0755 /usr/local/bin/FHEMMonitor.py
Damit das Python-Skript beim Systemstart automatisch gestartet wird, muss dieses in der Datei /etc/rc.local eingetragen werden.
Folgende Zeile vor dem Befehl
exit, welcher sich in der letzten Zeile befindet, einfügen.
su - fhem --shell /bin/bash --command "/usr/local/bin/FHEMMonitor.py" &
ZitatINFO:
Die von dem Script so erzeugte Datei beim Starten des Systems legt eine Datei im Verzeichnis /tmp an mit dem einfachen Eintrag on.
Besitzer dieser Datei ist dann fhem und die Gruppe dialout mit den Rechten 0644.
ein einfacher Eintrag: /usr/local/bin/FHEMMonitor.py &
würde eine Datei mit dem Besitzer root und der Gruppe root erzeugen, diese könnte dann nicht mehr von fhem überschrieben werden,
das ist aber nachfolgend Voraussetzung!
Da fhem keine shell besitzt, muss "--shell /bin/bash" noch mit rein geschrieben werden!
Das war der erste Teil, jetzt die Einträge in
FHEM:
Änderung: 16.10.2016
Anscheinend gibt es Probleme mit Jessie-Systemen, daher habe ich den Code angepasst,
die Systembefehle stehen nun in einfachen Anführungszeichen; auch getestet mit Wheezy-4.4.23+
Folgenden Code einfach in die Datei
fhem.cfg eintragen:
define RPi_Monitor dummy
attr RPi_Monitor devStateIcon on:linux_on@green off:linux_off@red
attr RPi_Monitor group Linux
attr RPi_Monitor icon linux2
attr RPi_Monitor room RasPi,Wohnung
attr RPi_Monitor setList on off
# ===== Dummy schaltet Notifys =============================================
#
define TV_on_notify notify RPi_Monitor { if ( Value("RPi_Monitor") eq "on"){system ('/opt/vc/bin/tvservice -p 1> /dev/null;; fbset -depth 8;; fbset -depth 16')}}
attr TV_on_notify verbose 0
define TV_off_notify notify RPi_Monitor { if ( Value("RPi_Monitor") eq "off"){system ('/opt/vc/bin/tvservice -o 1> /dev/null')}}
attr TV_off_notify verbose 0
# ===== Dummy State-Datei im Ordner /tmp schreiben/lesen ===================
#
define n1 notify global:SHUTDOWN { my $v = Value("RPi_Monitor");; `echo $v > /tmp/RPi_Monitor.status` }
define n2 notify global:INITIALIZED { my $v = `cat /tmp/RPi_Monitor.status`;; if($v) { chomp($v);; fhem("setstate RPi_Monitor $v") } }
Natürlich kann jeder die gesetzten Icons ändern bzw. Raum und Gruppe oder die Namen des dummys und notifys!!
Erklärung:zuerst wird ein dummy angelegt mit dem ich ein und ausschalten kann.
Notify fragt den Dummy ab und übergibt Perl den Befehl zum Einschalten oder Ausschalten des Monitors.
Szenario #1Der Monitor ist AUS
FHEM wird neu gestartet über
shutdown restartEs wird eine Datei in den Ordner /tmp mit dem Namen
RPi_Monitor.status erzeugt und ein "
off" hineingeschrieben.
FHEM fährt wieder hoch, liest die Datei
RPi_Monitor.status ein und setzt den Status des Dummys wieder auf off!
Szenario #2Der Monitor ist AUS
Der Raspberry Pi wird neu gestartet über
sudo reboot Der Monitor wird automatisch wieder eingeschaltet.
Das Script
/usr/local/bin/FHEMMonitor.py wird ausgeführt und die Datei
RPi_Monitor.status mit dem Eintrag
on erzeugt.
FHEM startet nun, liest den Eintrag aus der Datei
RPi_Monitor.status und setzt den dummy nun auf
onSzenario #3Der Monitor wird über dem dummy (FHEM) wieder ausgeschaltet (Status off).
FHEM wird neu gestartet über
shutdown restartDie Datei in den Ordner
/tmp mit dem Namen
RPi_Monitor.status wird überschrieben mit "
off".
FHEM fährt wieder hoch, liest die Datei
RPi_Monitor.status ein und setzt den Status des Dummys wieder auf off!
Dieses Beispiel hier ist nur ein Anfang, natürlich kann das ganze auch automatisiert werde, aber dass ist jedem selber überlassen.
Vielleicht kann das ja jemand gebrauchen,
über Rückmeldungen bzw. Verbesserungsvorschläge oder Anregungen würde ich mich freuen.
Gruß
Tom
Ich hoffe jemand ließt diesen Thread noch und kann mir evtl helfen. Ich bin der Anleitung soweit gefolgt, jedoch wird das Kommando zum Ein- bzw. Ausschalten durch FHEM nicht korrekt ausgeführt. Der Versuch den Monitor einzuschalten wird im Log mit "[E] Failed to initialize VCHI (ret=-1)" quittiert, beim Abschalten passiert garnichts. Ich habe die Kommandos auch einmal direkt über SSH Command Line ausgefüht, was problemlos klappte.
Irgendwelche Hinweise wo ich suchen könnte? Unter welchem user mit welchen Rechten wird das Kommando ausgeführt?
Ich habe das Problem dank dieses Threads lösen können: https://forum.fhem.de/index.php?topic=17613.0
Das Geheimnis ist den System Befehl in FHEM in einfache Anführungszeichen und nicht doppelte zu setzen.
Danke trotzdem für die Hilfe.
Gut dass du die Lösung gefunden hast, ich hab mir auch schon den Kopf zerbrochen. Kann es sein dass es an Jessie liegt?
Eine andere Erklärung habe ich nicht. Bei mir funktioniert jedenfalls alles soweit.
Wenn ich dich richtig verstanden habe dann müsste der Code so lauten:
define TV_on_notify notify RPi_Monitor { if ( Value("RPi_Monitor") eq "on"){system ('/opt/vc/bin/tvservice -p 1> /dev/null;; fbset -depth 8;; fbset -depth 16')}}
attr TV_on_notify verbose 0
define TV_off_notify notify RPi_Monitor { if ( Value("RPi_Monitor") eq "off"){system ('/opt/vc/bin/tvservice -o 1> /dev/null')}}
attr TV_off_notify verbose 0
Hi Tom,
ja ich hätte es jetzt auch erst einmal auf Jessie geschoben.
Zitat von: Tom111 am 16 Oktober 2016, 02:08:09
Wenn ich dich richtig verstanden habe müsste dann der Code so lauten:
define TV_on_notify notify RPi_Monitor { if ( Value("RPi_Monitor") eq "on"){system ('/opt/vc/bin/tvservice -p 1> /dev/null;; fbset -depth 8;; fbset -depth 16')}}
attr TV_on_notify verbose 0
define TV_off_notify notify RPi_Monitor { if ( Value("RPi_Monitor") eq "off"){system ('/opt/vc/bin/tvservice -o 1> /dev/null')}}
attr TV_off_notify verbose 0
Genau, nur habe ich den Teil mit Fbset beim Einschalten weggelassen da ich keinen Unterschied feststellen konnte. Kannst du mir vll noch kurz erklären wozu der Teil ist?
Ansonsten läuft jetzt endlich alles auch in den von dir geschilderten verschiedenen Situationen.
Vielen Dank für die Hilfe und den Thread.
Zitat von: DazDavid am 16 Oktober 2016, 08:46:38
Genau, nur habe ich den Teil mit Fbset beim Einschalten weggelassen da ich keinen Unterschied feststellen konnte. Kannst du mir vll noch kurz erklären wozu der Teil ist?
fbset ist auch nicht zwingend notwendig, bei einigen Systemen bleibt der Monitor nach dem Einschalten des HDMI Signals aber schwarz (so auch bei mir), damit das verhindert wird muss
fbset zusätzlich angefügt werden. Wenn es bei dir ohne diesen Befehl funktioniert kannst du den auch weglassen, aber schaden tut es nicht
fbset zu setzen.
Das funktioniert aber nur solange, bis man ein X startet. Dann braucht man (zuminderst bei mir) noch ein xrefresh. Das geht allerdings nur wenn der angemeldete Benutzer fhem ist.