[gelöst] HDMI-Output an bei PIR-Bewegung

Begonnen von lukeman11, 20 Februar 2018, 18:51:10

Vorheriges Thema - Nächstes Thema

lukeman11

Hallo,
ich hoffe, ich habe das richtige Forum für mein Anliegen gefunden. "Codeschnipsel" schien mir nur für fertige Sachen zu sein.
Bin noch ziemlich neu, was Fhem und vor allem verschiedene Programmiersprachen angeht, sodass ich nicht überblicken kann, wie einfach etwas mit etwas Code umzusetzen ist.

Ich betreibe auf meinem Raspi Fhem und den MagicMirror2. Für den MM2 gibt es ein Modul namens MMM-PIR-Sensor, welches dafür sorgt, dass der HDMI-Output vom Raspi nach x-Zeit deaktiviert wird, sodass der Bildschirm in den Standby-Modus geht. Das funktioniert auch wie es soll.

Meine Frage ist nun, ob ich die Befehle, die dieses Modul erzeugt, auch von Fhem ausführen lassen kann.
Ich habe bereits den Bewegungsmelder gemäß dieser Anleitung in Fhem definieren können und damit auch eine Funksteckdose geschaltet.

Ich dachte, dass ich jetzt "ALARM" einfach durch Code zum aktivieren des HDMI-Outputs ersetzen könnte. Leider habe ich keine Ahnung wie dieser aussehen könnte. Im Internet habe ich dazu nichts gefunden.

Weiterführende Überlegungen meinerseits wären, dass man dann auch Zeiten vorgeben könnte, in denen das Display auf DauerAn ist, also auch ohne Bewegung oder dass der Monitor aus dem Standby geholt wird, wenn ein Anruf über die Fritzbox (die ich auch bereits erfolgreich definieren konnte) eingeht.

Nochmal zusammengefasst, geht es mir um den Codeschnipsel zum aktivieren bzw. deaktivieren des HDMI-Outputs am Raspi.

Vielleicht habe ich aber auch nur ein Brett vorm Kopf und sehe den Wald vor lauter Bäumen nicht. =(
Für eure Hilfe wäre ich unendlich dankbar.

MadMax-FHEM

#1
Ich hab ja jetzt nicht alles genau umrissen darum mal sehen was ich verstanden hab:

PIR eingerichtet in fhem Pin8!?

Im MMM-PIR den Pin angegeben oder auf 22 belassen?

Wenn auf 22 belassen (bewusst), dann eben bei Bewegung und anderer Dinge den GPIO22 des PI setzen/zurücksetzen (gibt ein Modul in fhem dafür https://wiki.fhem.de/wiki/Raspberry_Pi:_GPIOs_schalten)

Dadurch sollte ja dann doch das MMM-PIR Modul entsprechend den HDMI (oder was halt konfiguriert ist) schalten...

Aber vielleicht lieg ich auch völlig falsch oder hab's total falsch verstanden...

EDIT: bzgl. Pin und GPIO hab ich jetzt grad keinen Pinplan zur Hand (grad nur Handy)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

lukeman11

Zitat
PIR eingerichtet in fhem Pin8!?

Im MMM-PIR den Pin angegeben oder auf 22 belassen?

Nein, nein, die Anleitungen sind ja nur als Beispiel des Ablaufs. Natürlich habe ich sie z.B. bezüglich Pin-Belegung und Device-Namen auf mich zugeschnitten. In meinem Fall ist es GPIO_23.
Das MMM-PIR-Modul auf dem MM2 funktioniert einwandfrei und tut genau das was es soll. Ich möchte gerne das MMM-PIR Modul mit einer Lösung in Fhem ablösen, erkenne aber in den config-Dateien des Moduls keinen Code, den ich "einfach" in Fhem integrieren kann..


MadMax-FHEM

Ah, jetzt...

D.h. das MMM-PIR "deaktivieren" und stattdessen alles aus fhem heraus!?

Ich hab schon mal mit PI und HDMI "rumgespielt" vielleicht finde ich das wieder...

Stichwort: cec-client

Bzw. bin ich grad darüber gestolpert: https://forum.fhem.de/index.php?topic=65505.0

Kurz, da nur Handy...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

lukeman11

Okay,
vielen Dank. Ich werde es nach meinem Urlaub mal ausprobieren. Allerdings befürchte ich, dass, wenn es klappt, der Monitor komplett ausgeschaltet wird und dann zu lange braucht um anzugehen.

Weitere Tipps sind gern gesehen.

MadMax-FHEM

Da müsstest du halt mal sehen welche cec-Befehle es (für dein Display) gibt...

Viel Erfolg, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kuzl

ich mache das mit mit diesen Befehlen (aus dem Gedächtnis)
off: tvservice --off

on: tvservice --prefered
     fbset -depth 16
     fbset -depth 32
     xrefresh :0.0

Das ganze ist an einem HDMI-Monitor und schaltet diesen auf Standby und wieder an.
Wichtig: Die anzeige muss mit dem User sein, mit dem auch die Befehle durchgeführt werden.
Wenn also direk aus FHEM heraus die Befehle ausgeführt werden, muss der user fhem in der GUI angemeldet sein.
Ein TV wird dadurch z.b. nur "kein Signal" anzeigen. Über CEC-Signale kann man den aber z.b. komplett ein und ausschalten.

lukeman11

Vielen Dank auch aun Kunzl.

Ich habe es jetzt mit tvservice ausprobiert und das funktioniert ohne Probleme.

tvservice -o
schaltet den HDMI-Port aus,

tvservice -p
wieder an.

Ich kann das ganze auch über die FHEM-Befehlszeile mit z.B.
{system("tvservice -o")}
schalten.

Jetzt dachte ich mir, müsste ich ja meinen Bewegungsnotify irgendwie abändern können, aber ich habe die Syntax von dem Ding noch nicht so ganz begriffen.
define act_on_BewegungGPIO notify Bewegungsmelder { if ("$EVENT" ne "off") { fhem("set Steckdose_C on-for-timer 120;");}}

Also was bedeutet z.B. "ne" und wofür sind die ganzen Semikola da und was kann man da überhaupt alles eingeben. (Sorry für das Wirrwar, aber genauso sieht es in meinem Kopf gerade aus.)

Ich hätte jetzt gerne, dass bei Auslösen des Bewegungsmelders der Bildschirm angeht und nach 120sec wieder aus. Ich habe schon viel herumprobiert, auch mit sleep 120 usw, aber irgendwie funktioniert das alles nicht. Ich schätze ich verbocke dabei immer die Syntax des Notifys.

MadMax-FHEM

#8
Am einfachsten den Eventmonitor öffnen, bei Filter Bewegungsmelder.* (sofern der tatsächlich so heißt).
Warten bis der Event kommt, den markieren und dann create/modify...

Dann einfach den set-Befehl, also ohne fhem, Klammern etc.

Wenn das Gerät on-for-timer kann, dann kannst du dort auch die 120Sekunden angeben...

Kurz, da nur Handy...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

So, jetzt noch ein wenig zu Klammern und so weiter...

innerhalb eines Notify/DOIF etc. bist du in fhem, d.h. du kannst einfach fhem Befehle absetzen:

define nTest notify RegEx set Lampe on

auch mehrere hintereinander:

define nTest notify RegEx set Lampe1,Lampe2 on

oder

define nTest notify RegEx set Lampe1 on; set Lampe2 off

Siehe auch: https://wiki.fhem.de/wiki/Notify (oder commandref)

Klammern: die '{ }' wechselt zur Perl Ebene.
D.h. wenn du in Perl bist und einen fhem Befehl aufrufen willst, dann:

{fhem("set Lampe on")}
ist aber im Beispiel unnötig...
...weil das dasselbe wie:
set Lampe on
wenn du nicht aus einem bestimmten Grund nach Perl gewechselt hast.

https://wiki.fhem.de/wiki/Klammerebenen

Ich würde auch erst einmal testen was in $EVENT "steht" bevor ich es benutze...
...und es gibt auch noch $EVTPART0, $EVTPART1, ...

'eq' bzw. 'ne' und so weiter ist Perl Vergleich von Zeichenketten:

if($EVENT eq "on") prüft ob eben in der Variablen (Zeichenkette) "on" steht.
eq = equal
ne = not equal (ungleich)
usw.

Wenn es sich um Zahlen handelt, dann eben '<', '>', '='

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

lukeman11

Ah okay, das hat es etwas verständlicher gemacht.
Nach langem Probieren und scheitern und wieder Probieren usw. hab ich es realisieren können. Sieht jetzt folgendermaßen aus:


define Bewegungsmelder RPI_GPIO 23
attr Bewegungsmelder direction input
attr Bewegungsmelder interrupt both
attr Bewegungsmelder room MagicMirror

define HDMI_off notify Bewegungsmelder {if ("$EVENT" eq "off") { { system("tvservice -o")};; } }
attr HDMI_off room zz_Notifys

define HDMI_on notify Bewegungsmelder {if ("$EVENT" eq "on") { { system("tvservice -p")};; } }
attr HDMI_on room zz_Notifys


Die Zeit, die das Display nun an bleibt, regelt aktuell das Poti am Bewegungsmelder. Hätte ich lieber in FHEM geregelt, aber so geht es erstmal auch.

Falls man es eleganter lösen kann, z.B. Zeit in FHEM definieren oder auch mit nur einem Notify, nur raus damit. =)

rasti


vielleicht inzwischen ein wenig off-topic.... aber ich habe das mal (ohne FHEM) an einem Raspi mal realisiert, auf dem Chrome im Kiosk-Mode zur Visualisierung vom FHEM bzw. Tablet UI läuft.

https://forum.fhem.de/index.php/topic,82905.msg750538.html

Viele Grüße

Ralf

MadMax-FHEM

Gratuliere!

Es geht natürlich auch mit einem Notify:

define HDMI_off notify Bewegungsmelder {if ("$EVENT" eq "off") { { system("tvservice -o")};; } elsif ("$EVENT" eq "on") { { system("tvservice -p")};; } }

Denke auch, dass du die geschweiften Klammern direkt um system nicht brauchst und wahrscheinlich auch nicht die doppelten ;;
(mag mich aber täuschen, ich packe sowas immer in eine Sub in myUtils, finde ich übersichtlicher / und zunächst mache ich dort nur eine Logausgabe mit den übergebenen Dingen wie beispielsweise $EVENT, dann weiß ich "was ich habe" https://wiki.fhem.de/wiki/99_myUtils_anlegen)

Du könntest wahrscheinlich auch das RegEx des Notify "einschränken", aktuell wird dein Notify (eigentlich wahrschinlich beide) bei allem was der Bewegungsmelder "feuert" durchlaufen...

Einfach mal im Eventmonitor schauen.

Evtl. geht sowas wie:

define HDMI_off notify Bewegungsmelder:(on|off) {if ("$EVENT" eq "off") { { system("tvservice -o")};; } elsif ("$EVENT" eq "on") { { system("tvservice -p")};; } }

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

lukeman11

Zitat von: MadMax-FHEM am 11 März 2018, 17:57:36
Denke auch, dass du die geschweiften Klammern direkt um system nicht brauchst und wahrscheinlich auch nicht die doppelten ;;

Haste recht, hab ich geändert. Passt.

Zitat
(mag mich aber täuschen, ich packe sowas immer in eine Sub in myUtils, finde ich übersichtlicher / und zunächst mache ich dort nur eine Logausgabe mit den übergebenen Dingen wie beispielsweise $EVENT, dann weiß ich "was ich habe" https://wiki.fhem.de/wiki/99_myUtils_anlegen)

Da weiß ich noch nicht mit umzugehen. Ist wohl erstmal noch ein "versiegeltes Buch" für mich. :D

Vielen, vielen Dank Joachim für deine Hilfe.

Mit den Subs werde ich mich zu gegebener Zeit näher beschäftigen, das ist aber erstmal ein anderes Thema. =)

MadMax-FHEM

Hi,

na dann weiterhin viel Spaß!

Und den Thread dann noch auf gelöst stellen: umbenennen in beispielsweise [gelöst] HDMI-Output an bei PIR-Bewegung

Das mit den myUtils ist kein "muss" und bei den "einfachen" if-Abfragen auch nicht zwingend.

Ich mache es halt so, dann kann ich zwischen Konfiguration und (perl)Code unterscheiden.
Konfiguration (also beispielsweise das "nackte" Notify) kommt nat. in die fhem.cfg dort wird dann eine Sub (Funktion) in myUtils aufgerufen, in etwa so:

define nTest notify Test:irgendwas {myTuWasFunktion($EVENT)}

und dann die "TuWasFunktion":


sub myTuWasFunktion($)
{
  my($Event) = @_; # Parameter

  Log3(undef, 3, "myTuWasFunktion Parameter: $Event");

  if(Bedingung)
  {
    fhem("set Irgendwas on");
  }
}


Der Parameter $EVENT ist nur als Beispiel (es geht auch $NAME, §EVTPART0, $EVTPART1, ... und anderes)...
...durch die Logausgabe des Parameters sehe ich dann auch gleich was tatsächlich ankommt etc.

Dort "programmiere" ich dann in perl was ich so an Abfragen brauche.
Fhem-Aufrufe dann eben über fhem() und Abfragen von Readings etc. per ReadingsVal, ReadingsNum, etc.

Wenn ich dann an den Abfragen etc. etwas ändern will gehe ich "nur" in die myUtils und "schraube" am Programm die Konfiguration bleibt davon (meist) unberührt...
...und (ich finde) Code ist dann in einer myUtils auch übersichtlicher als das dann alles noch in die Definition des Notify zu stecken...

Aber immer eins nach dem anderen ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)