Hallo zusammen,
bastel nun schon einige Zeit an meiner Funktion um die Helligkeit meines Tablets mit abfrage aus dem Twilight Modul über ein Notify zu steuern.
Aber so recht will es mir nicht gelingen und es funktioniert nur bis zur Helligkeit 120, darunter nicht.
Finde aber auch das Problem aufgrund meiner mangelnden Perl Kenntnisse nicht.
Evtl. hat da jemand einen Tipp für mich.
Hier mal der Inhalt meines Notify.
LichtWetterFaktor:light:.* {
my $hellwert = ReadingsVal("LichtWetterFaktor","light","");
if($hellwert >= 6){
fhem ("set TabletWohnzimmer screenBrightness 160");
}
elsif($hellwert <= 5){
fhem ("set TabletWohnzimmer screenBrightness 120");
}
elsif($hellwert <= 4){
fhem ("set TabletWohnzimmer screenBrightness 100");
}
elsif($hellwert <= 3){
fhem ("set TabletWohnzimmer screenBrightness 80");
}
elsif($hellwert <= 2){
fhem ("set TabletWohnzimmer screenBrightness 60");
}
elsif($hellwert <= 1){
fhem ("set TabletWohnzimmer screenBrightness 30");
}
elsif($hellwert <= 0){
fhem ("set TabletWohnzimmer screenBrightness 20");
}
}
Gruß
Ralf
Hallo Ralf,
naja ganz einfach:
es läuft "von oben" durch.
Also wenn 6 oder größer -> 160
Wenn 5 oder kleiner (und da gehört eben auch 4, 3, 2, 1, 0 dazu! ;) ) dann -> 120
EDIT: damit ist das erste elsif "zufrieden" und es "gibt/braucht" dann ja nicht mehr weiter "geschaut" zu werden ;)
D.h. die Abfragen umdrehen, also "von hinten" (kleine Werte) beginnen...
Dann noch ein paar Anmerkungen:
Du brauchst in einem/diesem notify nicht per ReadingsVal abfragen.
Der Wert kommt ja bereits als $EVENT oder $EVTPART1, $EVTPART2, ... "mit" bzw. steht als solcher im notify zur Verfügung.
EDIT: wenn du "sehen" willst was bzw. "wo" der passende Wert drin steht, dann kannst du das ja ausgeben lassen. Also als 1. Zeile im notify eine Logausgabe. Log3(undef, 1, "EVENT: $EVENT EVTPART1: $EVTPART1 EVTPART2: $EVTPART2");
Nicht "wundern", wenn Warnings im Log auftauchen, es kann durchaus sein, dass es keinen $EVTPART1 usw. gibt (kommt eben drauf an was auslöst und wie der entspr. Readingwert aussieht), das wird dann nat. "angemosert". Das mit der Logausgabe ist nur, um zu sehen was denn im notify in welcher Variablen zur Verfügung steht und kann ja dann wieder weg... ;)
Wenn du doch abfragen willst, empfiehlt sich bei numerischen Werten statt ReadingsVal eben ReadingsNum zu verwenden:
ReadingsNum("LichtWetterFaktor","light",0)
Gruß, Joachim
Ergänzend: mach doch für die Fälle <6 einfach "$EVTPART1*20+20" ;) .
Zitat von: Beta-User am 26 November 2020, 11:38:43
Ergänzend: mach doch für die Fälle <6 einfach "$EVTPART1*20+20" ;) .
Dann wird das hier aber zu 40 ;)
Zitat
elsif($hellwert <= 1){
fhem ("set TabletWohnzimmer screenBrightness 30");
ist aber vermutlich "verschmerzbar" ;)
Gruß, Joachim
Hallo zusammen,
habe nun mal mein notify geändert.
Logausgabe. Log3(undef, 1, "EVENT: $EVENT EVTPART1: $EVTPART1 EVTPART2: $EVTPART2");
LichtWetterFaktor:light:.* {
my $hellwert = ReadingsNum("LichtWetterFaktor","light",0);
elsif($hellwert <= 0){
fhem ("set TabletWohnzimmer screenBrightness 20");
}
elsif($hellwert <= 1){
fhem ("set TabletWohnzimmer screenBrightness 30");
}
elsif($hellwert <= 2){
fhem ("set TabletWohnzimmer screenBrightness 60");
}
elsif($hellwert <= 3){
fhem ("set TabletWohnzimmer screenBrightness 80");
}
elsif($hellwert <= 4){
fhem ("set TabletWohnzimmer screenBrightness 100");
}
elsif($hellwert <= 5){
fhem ("set TabletWohnzimmer screenBrightness 120");
}
if($hellwert >= 6){
fhem ("set TabletWohnzimmer screenBrightness 160");
}
}
@Beta-User
Das ist eine gute Idee, mach ich aber später da ich erst einmal verstehen muss wie das funktioniert und da hapert es bei mir leider noch.
Man kann ja das das notify auch manuell auslösen damit ich nicht warten muss bis der Helligkeitswert sinkt und ich auch was im log sehe.
Evtl. kann mit da auch noch jemand auf die Sprünge helfen wie hier die richtige Syntax ist?
Mit der FHEM Hilfe jedenfalls schaffe ich das nicht.
Gruß
Ralf
Rom wurde nicht an einem Tag erbaut. Was das Auslösen des notify angeht: "trigger" ist dein Freund ;) . (help trigger in die Kommandozeile werfen...)
trigger LichtWetterFaktor:light:2 z.B. geht nicht und trigger LichtWetterFaktor macht zumindest keine Fehlermeldung aber auch keinen Eintrag im log.
Auf was muss ich denn hier korrekt triggern ?
Gruß
Ralf
lass mal die Doppelpunkte weg... (da war doch auch nur "device on" in help, oder?)
Wäre das so korrekt ?
trigger LichtWetterFaktor light 2 (keine Fehlermeldung aber auch leider nichts im Log)
Sorry, bin leider ein Perl Dau
Ich hab mir deinen Umbau angesehen:
du kannst NICHT einfach mit elsif anfangen!
und/oder mit if aufhören!!
Das muss schon bleiben!
Nur die "Bedingungen" ändern...
EDIT: weil die "Abfrage" bleibt: wenn "irgendwas" dann, wenn nicht aber "was anderes" dann, wenn auch das nicht aber "ganz was anderes" dann... Du kannst nicht mit "wenn das nicht aber" beginnen ;) Weil es ja noch kein "das" gab... ;)
Gab es keinen Fehler!?
Gruß, Joachim
Eigentlich müsste das mit dem "trigger" passen, aber MadMax-FHEM hat völlig recht, dass der "Teilcode" völlig verbogen ist...
Das kann man dann im Event-Monitor sehen, und dann ggf. auch die durch das notify ausgelöste Reaktion, die hier mangels passendem "Suchmuster" wohl ausfällt.
(Aber mal ernsthaft: Welche Grundlagendokumente in FHEM hast du denn schon gelesen und wie lange ist das her? Die Frage ist übrigens ernst gemeint, auch wenn sie sarkastisch klingen mag!)
Hallo zusammen,
sorry für die späte Antwort.
Ja, das kommt wenn man den Code einfach kopiert und vergisst den If anzupassen.
Aber Fehlermeldung gab es auch keine (habe aber auch den globalen verbose auf 1 stehen ?).
Meine Kenntnisse mit der Syntax sind eher gering und die Grunddokumente habe ich vor langer Zeit mal gelesen.
Helfe mir halt so weit ich kann mit diesem Forum, denn mir fehlt einfach die Zeit das alles jedes mal aufzufrischen.
Aber auch mit der aktuellen Korrektur funktioniert es auch nicht.
Logausgabe. Log3(undef, 1, "EVENT: $EVENT EVTPART1: $EVTPART1 EVTPART2: $EVTPART2");
LichtWetterFaktor:light:.* {
my $hellwert = ReadingsNum("LichtWetterFaktor","light",0);
if($hellwert <= 0){
fhem ("set TabletWohnzimmer screenBrightness 20");
}
elsif($hellwert <= 1){
fhem ("set TabletWohnzimmer screenBrightness 30");
}
elsif($hellwert <= 2){
fhem ("set TabletWohnzimmer screenBrightness 60");
}
elsif($hellwert <= 3){
fhem ("set TabletWohnzimmer screenBrightness 80");
}
elsif($hellwert <= 4){
fhem ("set TabletWohnzimmer screenBrightness 100");
}
elsif($hellwert <= 5){
fhem ("set TabletWohnzimmer screenBrightness 120");
}
elsif($hellwert >= 6){
fhem ("set TabletWohnzimmer screenBrightness 160");
}
}
Mit dem auslösen des Triggers komme ich aber auch nicht weiter. (keine Meldung im Log)
trigger LichtWetterFaktor light 2
Im Event Monitor sehe ich hier nur
020-11-26 16:15:16 Twilight LichtWetterFaktor light 2
Wie ich den Event Monitor sonst noch bediene muss ich auch nochmal nachlesen. (um den Fragen nach meinen Kenntnissen dazu zuvorzukommen ;))
...dieser Code, WAS ist DAS? Ist das die DEF von einem notify...? Dann ist es klar, dass das nicht paßt, denn das Event "Logausgabe....*" wird ja auch nicht getriggert... ::)
Bitte commandref oder Wiki zu notify bemühen - falls das ein notify-Code war, wie im ersten Post noch...:
LichtWetterFaktor:light:.* { [...]
Zitat...dieser Code, WAS ist DAS? Ist das die DEF von einem notify...?
Ein klares Ja
ZitatDann ist es klar, dass das nicht paßt, denn das Event "Logausgabe....*" wird ja auch nicht getriggert... ::
verstehe ich nicht ::) da fehlt mir der Hintergrund.
Was muss ich denn machen damit es funktioniert ?
::) :o ::) Also....
(Ungetestet) für die DEF:
LichtWetterFaktor:light:.* {
Log3($SELF, 4, "$SELF - EVENT: $EVENT EVTPART1: $EVTPART1 ");
if( $EVTPART1 == 1 ){
return fhem( "set TabletWohnzimmer screenBrightness 30" );
}
if( $EVTPART1 == 6 ){
return fhem( "set TabletWohnzimmer screenBrightness 160" );
}
my $bri = ($EVTPART1+1)*20;
return fhem(" set TabletWohnzimmer screenBrightness $bri" );
}
Dann setzt du das notify auf verbose 4 (im code: $SELF in Log3)... Wenn alles funktioniert, machst du entweder die Zeile raus oder löschst das verbose (unterstellt, global steht es weiter auf 3) => keine Log-Einträge mehr ;) .
Die return-Anweisungen brechen dann direkt ab, so dass das ganze weitere else-"Gelumpe" (hier) auch weg kann...
$EVTPART2 etc. gibt es nicht => Fehler...
ZitatLog3($SELF, 4, "$SELF - EVENT: $EVENT EVTPART1: $EVTPART1 ");
Erzeugt für mich wieder ein neues unlösbares Problem.
Bad regexp: Unmatched ( in regex; marked by <-- HERE in m/^Log3( <-- HERE $SELF,$/ at ./FHEM/91_notify.pm line 56.
wäre das korrekt
Log3(my $SELF, 4, "$SELF - EVENT: $EVENT EVTPART1: $EVTPART1 ");
else-"Gelumpe" mag sein, aber das verstehe ich noch halbwegs und scheint ja auch nicht grundsätzlich falsch, was du da schreibst ist mir viel zu kompliziert und (noch) nicht verständlich.
Hast du das 1:1 übernommen, oder kreativ weiterentwickelt?Bitte ggf. list liefern....
Mit deiner kompletten Syntax gib es keine Fehlermeldung.
Aber ob es wirklich funktioniert kann ich sicher immer noch nicht sagen, denn ein "trigger LichtWetterFaktor light 5" z.B. löst den notify nicht aus.
Der Monitor sagt dazu:
2020-11-26 18:50:58 Twilight LichtWetterFaktor light 5
Im Log gibts keine Meldung dazu.
Anbei mal ein List AutoTabletHelligkeit
Internals:
DEF LichtWetterFaktor:light:.* {
Log3($SELF, 4, "$SELF - EVENT: $EVENT EVTPART1: $EVTPART1 ");
if( $EVTPART1 == 1 ){
return fhem( "set TabletWohnzimmer screenBrightness 30" );
}
if( $EVTPART1 == 6 ){
return fhem( "set TabletWohnzimmer screenBrightness 160" );
}
my $bri = ($EVTPART1+1)*20;
return fhem(" set TabletWohnzimmer screenBrightness $bri" );
}
FUUID 5c4a21ce-f33f-4a71-a857-f79f6d83e1c6d968
NAME AutoTabletHelligkeit
NOTIFYDEV LichtWetterFaktor
NR 900
NTFY_ORDER 50-AutoTabletHelligkeit
REGEXP LichtWetterFaktor:light:.*
STATE active
TRIGGERTIME 1606411847.00952
TYPE notify
READINGS:
2020-11-26 19:04:21 state active
Attributes:
icon day_night
room 10.2_Amad
verbose 4
Hm, ja, vermutlich braucht man doch den einen der Doppelpunkte im trigger...
trigger LichtWetterFaktor light: 5
Der trigger sollte halt immer so aussehen wie das Event im Event-Monitor, und da sind nur STATE-Events ohne "Reading:"-Angabe. Sorry, hatte ich vorhin auch nicht bedacht...
Zitattrigger LichtWetterFaktor light: 5
Ja, so gehts.
@MadMax-FHEM @Beta-User
Nochmals vielen Dank für die Hilfe und Geduld. :)
Wieder was gelernt.
Der beste Lehrmeister ist halt immer noch der Fehler. ;)
Danke für die Rückmeldung. Markierst du den Thread noch als [gelöst], bitte?
(Steht im untersten der angepinnten Beiträge, wie das geht).
Hallo nochmal,
würde gerne die Syntax mit dem Log Log3($SELF, 4, "$SELF - EVENT: $EVENT EVTPART1: $EVTPART1 ");
und den Variablen $EVTPART ($EVTPART1+1)*20;
noch nacharbeiten damit ich zukünftig besser verstehe wie das funktioniert, finde aber zur Zeit noch nicht die passende Hilfe.
Evtl. hat jemand einen link parat ?
Gerne :) ...
Links zum Nacharbeiten:
- ($SELF steht nirgends, funktioniert aber insbesondere in notify (und DOIF afaik))
- Log3 => https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Log3
- $EVTPARTx => https://fhem.de/commandref_modular_DE.html#notify
Wenn du das über diesen Link öffnest, kommen direkt dahinter die Perl Specials, damit kannst du das ggf. etwas vertiefen ;) . Ich habe diesen Perl-Teil schon x Mal durchgesehen, es kommt immer mal wieder ein Aha-Erlebnis ::) ...
Nochmals Danke ;)