Raspberry Pi - Monitor aus FHEM heraus schalten!

Begonnen von Tom111, 31 August 2015, 17:36:11

Vorheriges Thema - Nächstes Thema

Tom111

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 #1
Der Monitor ist AUS
FHEM wird neu gestartet über shutdown restart
Es 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 #2
Der 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 on

Szenario #3
Der Monitor wird über dem dummy (FHEM) wieder ausgeschaltet (Status off).
FHEM wird neu gestartet über shutdown restart
Die 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
FHEM 5.9 auf Raspberry Pi - 3B+ - Stretch-5.10.88+ | CUL868 CC1101 - USB - Lite module - V3 FW 1.67
Fritz!Box 7490 OS 07.29 / Fritz!Dect200 / Fritz!Powerline 546E
FS20ST-4/ FS20 DI-5/ FS20LS/ FS20 PIRI-2-KU/ FS20 TFK/ FS20S4A/FS20 SU-3/FS20 S20-3
HMS100TF/FHT80TF-2/ASH2200/S300TH/MiLight-Bridge V

Ascoban

Danke

Das ergibt ja wieder ganz neue Möglichkeiten z.b. den Monitor anschalten wenn bestimmte Ereignisse eintreten.

DazDavid

#2
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?
FHEM (up2date) on Raspberry Pi 3B | nanoCUL 868 MHz | Raspbee Zigbee Gateway | Philips Hue | Osram Lightify | MAX Thermostate

Tom111

#3
Hallo DazDavid,

Schreib mal bitte welche Debian-und Kernelversion bei dir läuft.
Wenn dein System schon etwas älter ist, könnte das noch der folgende Bug sein:
http://redmine.graphics-muse.org/issues/300

Führe in der SSH Kommandozeile mal folgenden Code aus:
sudo /opt/vc/bin/tvservice -s
Poste das Ergebnis!
FHEM 5.9 auf Raspberry Pi - 3B+ - Stretch-5.10.88+ | CUL868 CC1101 - USB - Lite module - V3 FW 1.67
Fritz!Box 7490 OS 07.29 / Fritz!Dect200 / Fritz!Powerline 546E
FS20ST-4/ FS20 DI-5/ FS20LS/ FS20 PIRI-2-KU/ FS20 TFK/ FS20S4A/FS20 SU-3/FS20 S20-3
HMS100TF/FHT80TF-2/ASH2200/S300TH/MiLight-Bridge V

DazDavid

#4
Hallo Tom,

an der alten Firmware kann es eigentlich nicht liegen. Ich habe den Raspi er neu aufgesetzt mit dem letzten Raspbian Image (Raspbian 8 mit Pixel und Kernel 4.4.21-v7+).

Ausgabe von sudo /opt/vc/bin/tvservice -s:
state 0x120006 [DVI DMT (81) RGB full 16:9], 1366x768 @ 60.00Hz, progressive

Wie gesagt über Kommandozeile kann ich auch als als user FHEM (sudo su - fhem) den Bildschirm problemlos ein- und ausschalten. Auch wenn ich die Zeile aus dem FHEM Notify direkt über SSH als Perl Code ausführe klappt es, nur aus FHEM selbst leider nicht.
FHEM (up2date) on Raspberry Pi 3B | nanoCUL 868 MHz | Raspbee Zigbee Gateway | Philips Hue | Osram Lightify | MAX Thermostate

DazDavid

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.
FHEM (up2date) on Raspberry Pi 3B | nanoCUL 868 MHz | Raspbee Zigbee Gateway | Philips Hue | Osram Lightify | MAX Thermostate

Tom111

#6
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
FHEM 5.9 auf Raspberry Pi - 3B+ - Stretch-5.10.88+ | CUL868 CC1101 - USB - Lite module - V3 FW 1.67
Fritz!Box 7490 OS 07.29 / Fritz!Dect200 / Fritz!Powerline 546E
FS20ST-4/ FS20 DI-5/ FS20LS/ FS20 PIRI-2-KU/ FS20 TFK/ FS20S4A/FS20 SU-3/FS20 S20-3
HMS100TF/FHT80TF-2/ASH2200/S300TH/MiLight-Bridge V

DazDavid

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.
FHEM (up2date) on Raspberry Pi 3B | nanoCUL 868 MHz | Raspbee Zigbee Gateway | Philips Hue | Osram Lightify | MAX Thermostate

Tom111

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.
FHEM 5.9 auf Raspberry Pi - 3B+ - Stretch-5.10.88+ | CUL868 CC1101 - USB - Lite module - V3 FW 1.67
Fritz!Box 7490 OS 07.29 / Fritz!Dect200 / Fritz!Powerline 546E
FS20ST-4/ FS20 DI-5/ FS20LS/ FS20 PIRI-2-KU/ FS20 TFK/ FS20S4A/FS20 SU-3/FS20 S20-3
HMS100TF/FHT80TF-2/ASH2200/S300TH/MiLight-Bridge V

DazDavid

FHEM (up2date) on Raspberry Pi 3B | nanoCUL 868 MHz | Raspbee Zigbee Gateway | Philips Hue | Osram Lightify | MAX Thermostate

Kuzl

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.

TheOe

Wichtig wäre noch den User fhem der Gruppe video zuzuordnen

sudo usermod -aG video fhem
2x Raspberry Pi 1B(+) | MAX | hue | Kodi