Fotowiderstand soll Displayhelligkeit steuern

Begonnen von kblc, 26 April 2017, 21:12:04

Vorheriges Thema - Nächstes Thema

kblc

Hallo,

es ist mir echt unangenehm, aber ich muss schon wieder eine Frage stellen.
Irgendwie stockt es bei mir, und ich komme nicht weiter in meinem Denken.

Ich habe ein Display über den Raspberry Pi angeschlossen, auf dem auch FHEM installiert ist.
Ich habe einen Fotowiderstand (Lichtsensor) der mir unter Readings einen Wert gibt. (siehe Bild)

Den Wert will ich nun hernehmen, um einen Befehl auszugeben:
Mein angeschlossenes Display soll nun heller oder dunkler werden. Meine Programmierung sieht so aus, aber es tut sich nichts. Den Codeteil:
{ system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" }
habe ich bereits durch Hilfe aus dem Forum zum laufen bekommen. Also der geht. Aber meine andere Programmierung nicht.
Der Bildschirm soll auf 100 gestellt werden, wenn der Fotowiderstand dunkler als den Wert 90 hat. Das soll jede Minute getestet werden.

Hier mein Anfang


define SchalterNotify90  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<90) { system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify100  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<100) { system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify120  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<120) { system "sudo sh -c 'echo 200 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify130  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<120) { system "sudo sh -c 'echo 220 >> /sys/class/backlight/rpi_backlight/brightness'" } }



Es geht nicht.

was mache ich falsch? Der Bildschirm ist schwarz, also auf 0 eingestellt. Er müsste mindestens an gehen.

Danke für jede Hilfe.
SPS, Arduino, Controllino, Sensortechnik, Elektronik

MKeY

#1
was steht denn im fhem log?
bei dem wert 96 triggerst du die notify 100,120,130 gleichzeitig!
ich würde alles in eins packen und dann min und max angeben

<90
>=90 <100
>=100 <110
>=110 <120
>=120
Wer Fehler findet, darf sie behalten!
RPi's, D1Mini
Homematic, Hue, Sonoff, Alexa, Xiaomi, ConBee
Prusa MK2.5, Prusa MK3S (MMU2S vorhanden, aber nervtötend)
Lowrider 2CNC

Thorsten Pferdekaemper

Zitat von: kblc am 26 April 2017, 21:12:04

define SchalterNotify90  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<90) { system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify100  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<100) { system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify120  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<120) { system "sudo sh -c 'echo 200 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify130  notify at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<120) { system "sudo sh -c 'echo 220 >> /sys/class/backlight/rpi_backlight/brightness'" } }
Hi,
Du matschst hier notify und at zusammen. Wahrscheinlich meinst Du einfach nur "at".
Also in etwa so:

define SchalterNotify90  at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<90) { system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify100  at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<100) { system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify120  at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<120) { system "sudo sh -c 'echo 200 >> /sys/class/backlight/rpi_backlight/brightness'" } }
define SchalterNotify130  at +*00:01:00 { if (ReadingsVal("Firmata_ANALOG15","reading",90)<120) { system "sudo sh -c 'echo 220 >> /sys/class/backlight/rpi_backlight/brightness'" } }

Das nächste ist dann was MKeY schon gesagt hat: wenn der Wert kleiner 90 ist, dann ist er ja auch < 120 etc. Also würden alle zuschlagen.
Fang vielleicht erst einmal mit zwei Werten an und dann sehen wir weiter. Also in etwa so:

define SchalterNotify90  at +*00:01:00 { my $bright = 220; if (ReadingsVal("Firmata_ANALOG15","reading",90)<100) { $bright = 100 }; system "sudo sh -c 'echo ".$bright." >> /sys/class/backlight/rpi_backlight/brightness'" } }

Je nachdem wo Du das eingibst must Du ggf. die ";" verdoppeln.
Gruß,
   Thorsten

FUIP

Wuppi68

ich würde das Thema überhaupt nicht Zustandsbasiert (via AT) angehen ...

wenn sich die Helligkeit ändert wird ja ein Event getriggert ...

also z.B.:

define nty.displayBrightness notify Firmata_ANALOG15:reading {

my $help = ReadingsVal('Firmata_ANALOG15', 'reading',0);

if ($help >= 120)
{system "sudo sh -c 'echo 220 >> /sys/class/backlight/rpi_backlight/brightness'"}
elsif ($help >= 100)
{system "sudo sh -c 'echo 200 >> /sys/class/backlight/rpi_backlight/brightness'"}
elsif ($help >=  90)
{system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'"}
elsif ($help < 90)
{system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'"}
else { Log3 'nty.displayBrightness notify', 3, "Something went wrong: $EVENT"};
}

   
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

Thorsten Pferdekaemper

Zitat von: Wuppi68 am 27 April 2017, 11:44:38
ich würde das Thema überhaupt nicht Zustandsbasiert (via AT) angehen ...
wenn sich die Helligkeit ändert wird ja ein Event getriggert ...
Jetzt hat er (oder sie) ja beide Varianten.
Allerdings gebe ich beim notify zu bedenken, dass es hier darauf ankommt, wie oft das Event tatsächlich getriggert wird. Durch das Quantisierungsrauschen kann es bei einem A/D-Wandler andauernd zu Änderungen kommen. Da ist dann die Lösung mit dem at ggf. doch besser. ...wobei man da auch eine Hysterese einbauen sollte, da das Display ansonsten manchmal flackern wird.
Gruß,
   Thorsten 
FUIP

Wuppi68

Zitat von: Thorsten Pferdekaemper am 27 April 2017, 14:15:57
Jetzt hat er (oder sie) ja beide Varianten.
Allerdings gebe ich beim notify zu bedenken, dass es hier darauf ankommt, wie oft das Event tatsächlich getriggert wird. Durch das Quantisierungsrauschen kann es bei einem A/D-Wandler andauernd zu Änderungen kommen. Da ist dann die Lösung mit dem at ggf. doch besser. ...wobei man da auch eine Hysterese einbauen sollte, da das Display ansonsten manchmal flackern wird.
Gruß,
   Thorsten

Dein Einwand ist völlig korrekt :-)

Hier ist ja "nur" ein Proof of Concept

Die Hysterese ist wirklich notwendig? Ich habe ja feste Schaltstufen ... und gegen Flacken event-on-* Atrribute beim Reading
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

Thorsten Pferdekaemper

Zitat von: Wuppi68 am 27 April 2017, 14:26:11
Die Hysterese ist wirklich notwendig? Ich habe ja feste Schaltstufen
Das hilft nichts. Wenn z.B. der Eingang um den Wert 100 schwankt. Also mal 99, mal 100. Dann wird das Display ständig zwischen Helligkeit 150 und 200 wechseln. 

Zitat
... und gegen Flacken event-on-* Atrribute beim Reading
Das hilft, wenn man die Sache mit dem Threshold einbaut. Also in etwa event-on-change-reading reading:5. Das würde im Prinzip eine Hysterese bewirken.
Gruß,
   Thorsten
FUIP

kblc

Viele Dank für die vielen Informationen, die ich förmlich aufsauge und schon daraus viel lernen kann.

Das ist echt toll und nicht selbstverständlich.

Frage von meiner Seite:
es wäre doch eine Möglichkeit so zu programmieren, dass es nur alle 5 Minuten abgefragt wird sobald der Sprung des Wertes nicht größer ist as z.B. 30. Und nur bei einem Sprung der größer/gleich als 30 sofort geändert wird.

Würde das gehen? Und wie muss ich da anfangen?

Nochmal Vielen Dank.

Kai aus Oberfranken
SPS, Arduino, Controllino, Sensortechnik, Elektronik

Thorsten Pferdekaemper

Hi,
schau mal in der Commandref nach event-on-change-reading und event-min-interval. Das müsste das tun, was Du willst. Wobei wahrscheinlich event-on-change-reading mit threshold schon reichen dürfte.
Gruß,
   Thorsten
FUIP

Wuppi68

noch ein globaler Tipp für Dich:

versuche Dein Denken von Zustand basiert auf Ereignis Orientiert in Verbindung mit FHEM zu ändern

"Alle" Geräte/Devices geben bei einer Änderung "Alarm" und können dadurch Aktionen anstoßen ... dadurch ist es nicht notwendig regelmäßig zu schauen wie der Status ist (Pollen = zyklische Abfrage)

In Deinen Beispiel bekommt FHEM automatisch mit, wenn sich der Helligkeitswert ändert (Alarm) und Du reagierst auf den Alarm in diesem Notify. Dort werden dann die Bedingungen abgefragt ("Steht der Sack Reis in China noch?" )
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

kblc

Danke Thorsten, danke Wuppi68,

danke für die Hilfe. Ich bin nun am lesen und bin echt froh, dass es Menschen wie Euch gibt, die mir beim lernen und auch umdenken helfen.
Da ich aus dem SPS-Bereich komme und in AWL programmiere, fällt mir das umdenken nicht immer leicht.

Ich bin ehrlich dankbar.

Kai
SPS, Arduino, Controllino, Sensortechnik, Elektronik

kblc

So, nun bin ich in meinem Projekt schon mal einen großen Schritt weiter. Aber ich stoße schon wieder an meine Grenzen.

Nochmal zur Erinnerung:
Ich möchte die Helligkeit des Touch-Display steuern, das am Raspi (mit FHEM) angeschlossen ist. Wie bei einem Macintosh soll die Helligkeit des Displays zunehmen, wenn die Umgebungsbeleuchtung heller wird. Also: um so heller der Tag, um so heller das Display.

Nun habe ich angefangen und mit Viel Hilfe mir folgenden Code zusammengebastelt:

#################################################################################
#Die Helligkeit des Displays stellt sich in 10 Stufen durch mehrere Schritte automatisch nach der Sensorhelligkeit ein.
#1. Schritt ist es die Helligkeitsschalter zu definieren. Diese Helligkeitsschalter werden dann der Reihe nach angehen. Um so höher der Sensorwert, um so mehr Helligkeitsschalter gehen der Reihe nach an. Das wird durch die erste if-Programmierung durchgeführt
#2. Schritt ist es, die Helligkeit am Display durch eine weitere if Programmierung zu steuern. Hierbei wird in das Raspberry Pi System eingegriffen und dort ein Programm geändert, das für die Helligkeit des Displays zuständig ist.

#--------------------------------1. Schritt (Erstellen/definieren der 10 Helligkeitsschalter)
define Helligkeit01 dummy
attr Helligkeit01 webCmd on:off
define Helligkeit02 dummy
attr Helligkeit02 webCmd on:off
define Helligkeit03 dummy
attr Helligkeit03 webCmd on:off
define Helligkeit04 dummy
attr Helligkeit04 webCmd on:off
define Helligkeit05 dummy
attr Helligkeit05 webCmd on:off
define Helligkeit06 dummy
attr Helligkeit06 webCmd on:off
define Helligkeit07 dummy
attr Helligkeit07 webCmd on:off
define Helligkeit08 dummy
attr Helligkeit08 webCmd on:off
define Helligkeit09 dummy
attr Helligkeit09 webCmd on:off
define Helligkeit10 dummy
attr Helligkeit10 webCmd on:off

#--------------------------------1. Schritt (Erstellen/definieren der 10 Helligkeitsschalter)
define Slider1 dummy
attr Slider1 alias Heizung
attr Slider1 eventMap on:100% off:0%
attr Slider1 room Firmata
attr Slider1 setList state:slider,0,0.5,100
attr Slider1 sortby 01
attr Slider1 webCmd state
#attr Slider1 fp_Wohnzimmer 353,161,2,dy_SZ_Heizung_Slider,
#attr Slider1 group Heizungsregelung

#--------------------------------1. Schritt (if Bedingung)
#  if (ReadingsVal("Slider1", "reading", "") <= "35"    <-- Hier an dieser Stelle wird die Helligkeitsstufe definiert In diesem Fall ist der Wert 35. Im Programm habe ich mit 15 gearbeitet.
#  fhem("set Schalter01 on"                                    <-- Hier wird gesagt, dass der Schalter1 eingehen soll. Im Programm ist dann der Schalter anders benannt.

#------1. Stufe alles bis 25
define Stufe1_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "15"  && ReadingsVal("Helligkeit01", "state", "off") eq "off")  {\
    fhem("set Helligkeit01 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "15"  && ReadingsVal("Helligkeit01", "state", "on") eq "on")  {\
  fhem("set Helligkeit01  off");;\
}\
   }\
}
attr Stufe1_Notify addStateEvent 1

#------2. Stufe alles bis 50
define Stufe2_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "50"  && ReadingsVal("Helligkeit02", "state", "off") eq "off")  {\
    fhem("set Helligkeit02 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "50"  && ReadingsVal("Helligkeit02", "state", "on") eq "on")  {\
  fhem("set Helligkeit02  off");;\
}\
   }\
}
attr Stufe2_Notify addStateEvent 1

#------3. Stufe alles bis 75
define Stufe3_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "75"  && ReadingsVal("Helligkeit03", "state", "off") eq "off")  {\
    fhem("set Helligkeit03 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "75"  && ReadingsVal("Helligkeit03", "state", "on") eq "on")  {\
  fhem("set Helligkeit03  off");;\
}\
   }\
}
attr Stufe3_Notify addStateEvent 1

#------4. Stufe alles bis 100
define Stufe4_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "100"  && ReadingsVal("Helligkeit04", "state", "off") eq "off")  {\
    fhem("set Helligkeit04 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "100"  && ReadingsVal("Helligkeit04", "state", "on") eq "on")  {\
  fhem("set Helligkeit04  off");;\
}\
   }\
}
attr Stufe4_Notify addStateEvent 1

#------5. Stufe alles bis 125
define Stufe5_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "125"  && ReadingsVal("Helligkeit05", "state", "off") eq "off")  {\
    fhem("set Helligkeit05 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "125"  && ReadingsVal("Helligkeit05", "state", "on") eq "on")  {\
  fhem("set Helligkeit05  off");;\
}\
   }\
}
attr Stufe5_Notify addStateEvent 1

#------6. Stufe alles bis 150
define Stufe6_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "150"  && ReadingsVal("Helligkeit06", "state", "off") eq "off")  {\
    fhem("set Helligkeit06 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "150"  && ReadingsVal("Helligkeit06", "state", "on") eq "on")  {\
  fhem("set Helligkeit06  off");;\
}\
   }\
}
attr Stufe6_Notify addStateEvent 1

#------7. Stufe alles bis 175
define Stufe7_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "175"  && ReadingsVal("Helligkeit07", "state", "off") eq "off")  {\
    fhem("set Helligkeit07 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "175"  && ReadingsVal("Helligkeit07", "state", "on") eq "on")  {\
  fhem("set Helligkeit07  off");;\
}\
   }\
}
attr Stufe7_Notify addStateEvent 1

#------8. Stufe alles bis 200
define Stufe8_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "200"  && ReadingsVal("Helligkeit08", "state", "off") eq "off")  {\
    fhem("set Helligkeit08 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "200"  && ReadingsVal("Helligkeit08", "state", "on") eq "on")  {\
  fhem("set Helligkeit08  off");;\
}\
   }\
}
attr Stufe8_Notify addStateEvent 1

#------9. Stufe alles bis 225
define Stufe9_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "225"  && ReadingsVal("Helligkeit09", "state", "off") eq "off")  {\
    fhem("set Helligkeit09 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "225"  && ReadingsVal("Helligkeit09", "state", "on") eq "on")  {\
  fhem("set Helligkeit09  off");;\
}\
   }\
}
attr Stufe9_Notify addStateEvent 1

#------10. Stufe alles bis 250
define Stufe10_Notify notify Firmata_ANALOG15:reading:.* {\
  if (ReadingsVal("Firmata_ANALOG15", "reading", "") >= "255"  && ReadingsVal("Helligkeit10", "state", "off") eq "off")  {\
    fhem("set Helligkeit10 on");;\
  }\
  else {\
    if (ReadingsVal("Firmata_ANALOG15", "reading", "") < "255"  && ReadingsVal("Helligkeit10", "state", "on") eq "on")  {\
  fhem("set Helligkeit10  off");;\
}\
   }\
}
attr Stufe10_Notify addStateEvent 1


#--------------------------------2. Schritt (if-Bedingung, die Schaltet)

define Schalter01 dummy
attr Schalter01 webCmd on:off

#define Stufe1_2_Notify notify Helligkeit01:on && Helligkeit02:on set Schalter01 on

define Stufe1_2_Notify at +*00:00:10 {\
   if (ReadingsVal("Helligkeit01", "state", "off")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){\
    system "sudo sh -c 'echo 0 >> /sys/class/backlight/rpi_backlight/brightness'" };;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){\
     system "sudo sh -c 'echo 30 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){\
     system "sudo sh -c 'echo 60 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {\
    system "sudo sh -c 'echo 75 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {\
    system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {\
   system "sudo sh -c 'echo 125 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if { elsif (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "on")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off"))  {\
system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" }    }\




Es funktioniert alles soweit ganz gut bis auf folgenden Teil meines Codes:

#define Stufe1_2_Notify notify Helligkeit01:on && Helligkeit02:on set Schalter01 on

define Stufe1_2_Notify at +*00:00:10 {\
   if (ReadingsVal("Helligkeit01", "state", "off")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){\
    system "sudo sh -c 'echo 0 >> /sys/class/backlight/rpi_backlight/brightness'" };;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){\
     system "sudo sh -c 'echo 30 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){\
     system "sudo sh -c 'echo 60 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {\
    system "sudo sh -c 'echo 75 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {\
    system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {\
   system "sudo sh -c 'echo 125 >> /sys/class/backlight/rpi_backlight/brightness'" } ;;\
   }\
else {\
   if { elsif (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "on")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off"))  {\
system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" }    }\



Auch wenn ich statt
system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" }

z.B.
set testschalter1 on Testschalter1 ist freilich schon definiert und so.

Was mache ich falsch?

Die Logfile wirft folgendes aus:

2017.04.30 22:01:27 1: ERROR evaluating {
   if (ReadingsVal("Helligkeit01", "state", "off")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){
    system "sudo sh -c 'echo 0 >> /sys/class/backlight/rpi_backlight/brightness'" };
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){
     system "sudo sh -c 'echo 30 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){
     system "sudo sh -c 'echo 60 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {
    system "sudo sh -c 'echo 75 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {
    system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {
   system "sudo sh -c 'echo 125 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if { elsif (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "on")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off"))  {
system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" }    }
: syntax error at (eval 1341357) line 5, near "}
else"
Missing right curly or square bracket at (eval 1341357) line 28, at end of line

2017.04.30 22:01:27 3: Stufe1_2_Notify: syntax error at (eval 1341357) line 5, near "}
else"
Missing right curly or square bracket at (eval 1341357) line 28, at end of line

2017.04.30 22:01:37 1: ERROR evaluating {
   if (ReadingsVal("Helligkeit01", "state", "off")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){
    system "sudo sh -c 'echo 0 >> /sys/class/backlight/rpi_backlight/brightness'" };
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "off")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){
     system "sudo sh -c 'echo 30 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "off")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")){
     system "sudo sh -c 'echo 60 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "off")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {
    system "sudo sh -c 'echo 75 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "off")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {
    system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "off")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off")) {
   system "sudo sh -c 'echo 125 >> /sys/class/backlight/rpi_backlight/brightness'" } ;
   }
else {
   if { elsif (ReadingsVal("Helligkeit01", "state", "on")&&ReadingsVal("Helligkeit02", "state", "on")&&ReadingsVal("Helligkeit03", "state", "on")&&ReadingsVal("Helligkeit04", "state", "on")&&ReadingsVal("Helligkeit05", "state", "on")&&ReadingsVal("Helligkeit06", "state", "on")&&ReadingsVal("Helligkeit07", "state", "off")&&ReadingsVal("Helligkeit08", "state", "off")&&ReadingsVal("Helligkeit09", "state", "off")&&ReadingsVal("Helligkeit10", "state", "off"))  {
system "sudo sh -c 'echo 150 >> /sys/class/backlight/rpi_backlight/brightness'" }    }
: syntax error at (eval 1342368) line 5, near "}
else"
Missing right curly or square bracket at (eval 1342368) line 28, at end of line

2017.04.30 22:01:37 3: Stufe1_2_Notify: syntax error at (eval 1342368) line 5, near "}
else"
Missing right curly or square bracket at (eval 1342368) line 28, at end of line


Vielen Dank schon mal

Kai aus Oberfranken
SPS, Arduino, Controllino, Sensortechnik, Elektronik

Thorsten Pferdekaemper

Hi,
was um alles in der Welt treibst Du da? Ich werde mich jetzt nicht durch diese unmengen von Coding wühlen. Außerdem scheinst Du immer noch manuell an der fhem.cfg herumzumachen. Das solltest Du ganz schnell bleiben lassen.
Vielleicht nochmal von vorne: Du willst doch nur die Displayhelligkeit steuern oder? Wofür sind dann die ganzen dummys und slider etc. gut?

Was anscheinend schon funktioniert:

  • system "sudo sh -c 'echo 100 >> /sys/class/backlight/rpi_backlight/brightness'" setzt die Display-Helligkeit. Wertebereich scheint 0 bis 150 zu sein.
  • Es gibt ein Reading namens Firmata_ANALOG15:reading, das die Umgebungshelligkeit enthält.  Wertebereich scheint 0 bis 255 zu sein.

Was spricht jetzt dagegen, auf Firmata_ANALOG15:reading ein notify zu legen, dass aus Firmata_ANALOG15:reading die Displayhelligkeit berechnet und dann den Systembefehl aufruft? Dazu dann noch event-on-change-reading um ein Flackern zu vermeiden und fertig.
Also in etwa:

attr Firmata_ANALOG15 event-on-change-reading reading:10
define myBrightnessControl notify Firmata_ANALOG15:reading.* { my $bright = ReadingsVal("Firmata_ANALOG15","reading","100"); my $disp = int($bright * 150 / 255); system("sudo sh -c 'echo ".$disp." >> /sys/class/backlight/rpi_backlight/brightness'" }

Wie immer weiß ich nicht so genau, ob die Anzahl der ";" stimmt. Also das ganze am besten mit Hilfe des "DEF"-Editors machen.
...und bitte nicht das ganze in die fhem.cfg reinhämmern.

Die Funktion $bright -> $disp kann man natürlich noch verfeinern. Das könnte man dann aber z.B. in einer kleinen Routine in 99_myUtils.pm machen.

Gruß,
   Thorsten




FUIP

kblc

Hallo
ZitatHi,
was um alles in der Welt treibst Du da?
Ich versuche mir zu helfen. Aber wie bereits geschrieben, bin ich echt sehr dankbar für jede lehrreiche Unterstützung und nehme die Projekte auch nicht einfach so hin, sondern lerne auch sehr viel daraus.

ZitatAußerdem scheinst Du immer noch manuell an der fhem.cfg herumzumachen.
Keine Sorge. Die fhem.cfg ist sicher bei mir. Da schrieb ich allerhöchstens nur die include rein. Alles andere habe ich bis jetzt unter modules und hleperfiles geschrieben, und falls nötig wieder gelöscht. Aber ich werde mich jetzt an den DEF-Bereich gewöhnen.

ZitatWofür sind dann die ganzen dummys und slider etc. gut?

Ich glaube, das willst du nicht wissen.   ::)

Ganz kurz zur Verständnisinfo, falls es ich interessiert: Die Dummys gehen der Reihe nach an, also bei einer Helligkeit von 15 oder größer geht Dummy1 an, bei einer Helligkeit von 50 oder mehr, geht Dummy1 und Dummy2 an bei einer Helligkeit von 75 und mehr geht Dummy1 2 und 3 an und so weiter. Der nächste Schritt wäre gewesen, das mit der if-Bedingung auszuwerten und dementsprechend das Display zu steuern. Aber das ist nun ja hoffentlich dank Deinem Code hinfällig.
Der Slider war nur ein Wertgeber, damit ich nicht ständig den Fotowiderstand abdecken und beleuchten musste (reine Faulheit). So konnte ich den Wert vorgeben, und als es funktionierte habe ich dann die Dummys in den Code aufgenommen.


Soviel zur Vergangenheit, nun zur Zukunft:

attr Firmata_ANALOG15 event-on-change-reading reading:10
define myBrightnessControl notify Firmata_ANALOG15:reading.* { my $bright = ReadingsVal("Firmata_ANALOG15","reading","100"); my $disp = int($bright * 150 / 255); system("sudo sh -c 'echo ".$disp." >> /sys/class/backlight/rpi_backlight/brightness'" }


gibt bei mir die Logfile immer

Unknown command my, try help.
Unknown command system, try help.


wieder. Ich habe schon die ";" in ";;" umgewandelt. Das war schon mal gut.


Was kann ich noch tun?

Und ganz wichtig: Danke vielmals Thorsten, auch für die entgegengebrachte Geduld.

Kai
SPS, Arduino, Controllino, Sensortechnik, Elektronik

Thorsten Pferdekaemper

Hi,
mach mal vor der schließenden } noch eine ). ...außerdem dürfen im DEF-Editor keine doppelten ; erscheinen.
Gruß,
   Thorsten
FUIP