autom. Helligkeitsänderung eines Displays per Systembefehl

Begonnen von nitrosont, 23 August 2017, 10:37:14

Vorheriges Thema - Nächstes Thema

nitrosont

Hallo zusammen!

Folgende Problemstellung:
Ich verwende einen Raspberry Pi mit fhem, der über das offizielle Display (https://www.rasppishop.de/Raspberry-Pi-7-Touchscreen-Display) als UI dient. An diesem RPi befindet sich ebenfalls ein Helligkeitssensor (BH1750 über I2C angebunden), der bereits in fhem eingebunden ist und die Helligkeit in Lux anzeigt.

Nun kann man das Display und dessen Helligkeit mit einem Befehl auf Kommandozeile ändern [0-255]. Da das Display im Wohnzimmer im Sichtbereich ist, würde ich ungern bei Dämmerung/abends beim Fernsehen ein helles Display im Raum haben. Ebenfalls wäre es toll, wenn das Display tagsüber an einem Sommertag hell genug ist, um etwas darauf ablesen zu können.

Es liegt natürlich nahe, mit dem Helligkeitssensor und dessen Output die Displayhelligkeit automatisch zu regeln. Und genau das bereitet mir derzeit etwas Kopfzerbrechen.

Ich habe bereits über einen längeren Zeitraum die Helligkeitswerte des Sensor und die dazu passende Displayhelligkeit notiert. Diese Werte habe ich mal in Excel geworfen und eine Funktion bestimmt, die mir den gewünschten Displayhelligkeitswert abhängig vom Sensorwert angibt.

Nun ist meine Idee für die weitere Implementierung folgende:


  • Ein UserReading ,,BrightnessSetpoint" an dem Helligkeitswert in fhem hinzufügen. Dieses UserReading enthält den Sollwert der Displayhelligkeit. Dabei muss ich hier irgendwie eine if-elsif-else-Unterscheidung implementieren, denn ab einem bestimmten Helligkeitswert, kann das Display in seiner Helligkeit nicht mehr gesteigert werden. Ebenso, soll das Display bei Dunkelheit eine minimale Helligkeit aufweisen und nicht komplett dunkel zu sein. Darüber hinaus wäre es schön, wenn das Display bei Abwesenheit (Anwesenheitserkennung ist in fhem bereits implementiert) aus ist.
  • Dann mit einem Notify bei Änderungen des Helligkeitswertes des Sensors mit den UserReading ,,BrightnessSetpoint" einen entsprechenden Shell-Befehl absetzen um die Helligkeit des Displays zu ändern.

Da ich so etwas (für mich komplexes) noch nie implementiert habe, stellen sich mir diverse Fragen.


  • Der Raspberry mit (Display und Helligkeitssensor) ist nicht mein Haupt-fhem-System, sondern in dieses Hauptsystem (ebenfalls auf einem Raspberry) per fhem2fhem eingebunden. Da ich aber die Displayhelligkeit an dem Client-System ändern will und der Helligkeitssensor ebenfalls am Client-System hängt, denke ich, sollte die Konstellation mit zwei verknüpften fhem-Instanzen kein Problem darstellen, oder? Einzig die Tatsache, dass die Anwesenheitserkennung auf dem Hauptsystem läuft passt nicht ins Bild.
  • Ist mein Vorgehen generell sinnvoll? Oder mache ich einen Denkfehler? Sollte ich vielleicht z.B. den Systembefehl bereits in das UserReading integrieren und den ,,Umweg" über das Notify umgehen? Ginge das überhaupt?
  • Kann ich eine if-elsif-else-Unterscheidung generell im Perl-Teil des UserReading unterbringen?
  • Wäre es sinnvoller, statt eines Systembefehls ein Script aufzurufen, dem ,,BrightnessSetpoint" übergeben wird?
  • Der Systembefehl zur Helligkeitsänderung des Displays muss als root abgesetzt werden. Soweit ich es verstanden habe, besitzt fhem aber nur User-Rechte. Ich würde aber ungern fhem root-Rechte aus Systemebene zuweisen. Gibt es hier ,,best-practice"-Herangehensweisen?

Otto123

Hi,

ich fange mal von hinten an:
5. fhem braucht kein root, Du kannst über z.B. so etwas ziemlich granular die sudo Rechte zu weisen (Beispielscript!)
# ergänze eine Datei zum sudoers Script Verzeichnis /etc/sudoers.d/
File="011_fhem-nopasswd"
echo "fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt" >/etc/sudoers.d/$File
chmod 0440 /etc/sudoers.d/$File
 
4. Ich halte es grundlegend für sinnvoll scripte (oder 99_myUtils) zu machen und diese Routinen aus FHEM aufzurufen. Hängt von der Länge der Befehlszeile ab.
3. Im Perlteil des Userreadings kannst Du wahrscheinlich nahezu alles unterbringen. Es sollte nur so gestaltet sein das es dein System nicht lahmlegt  ;)
2. Eventuell wird das reading öfters aktualisiert als Du den Systembefehl ausführen willst. Gefühlt würde ich es trennen. Ich würde mich da ran tasten. Kannst es doch jederzeit ändern.
1. Du kannst über F2F ganz granular bestimmte Werte von einem System zum anderen schicken. Anwesenheit zum Client. Du darfst bloß nicht LOG:.* verwenden!!!

Gruß Otto

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz