repeatcmd Reading Bedingungsprüfung

Begonnen von derbmann, 17 März 2021, 18:43:45

Vorheriges Thema - Nächstes Thema

derbmann

Hallo,

Und zwar möchte ich bei gedrückten Taster die Helligkeit langsam erhöhen und beim loslassen des Tasters soll logischerweise die aktuelle Helligkeit belassen werden.

Nach zig Stunden herum probieren habe ich nach wie vor keine Ahnung warum das so nicht funktioniert.:

define leddoif DOIF ([EnO_00001306:buttons] eq "pressed" and [$SELF:brig] < "255")\
(set ledtest ledbrig {([$SELF:brig])+17}, setreading $SELF brig {([$SELF:brig])+17})\
\
DOELSE (setreading $SELF brig 0)
attr LEDDOIF repeatcmd 1


Wenn brig zu beginn unter 255 steht wird brav nach oben gezählt, allerdings stoppt er nicht wenn der Wert über 255 ist sondern nur wenn der Taster nicht mehr "pressed" ist.
Wenn brig zu beginn über 255 steht passiert beim gedrückten Taster wie erwartet nichts.
Sprich es wird beim ersten Start schon das Reading richtig ausgelesen aber warum im weiteren Verlauf nicht?

lg derbmann

Damian

beim Vergleich: [$SELF:brig] < "255"

ist "26" größer als "255" wie im Telefonbuch :)

du willst aber nicht Buchstaben vergleichen, sondern Zahlen, daher:

[$SELF:brig] < 255
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

derbmann

Danke, ändert leider auch nichts, gleiches Verhalten :(
Hatte das denke ich sogar schon probiert...

Damian

Zitat von: derbmann am 17 März 2021, 20:00:20
Danke, ändert leider auch nichts, gleiches Verhalten :(
Hatte das denke ich sogar schon probiert...

Wenn er z. B. bei 250 ist, dann ist die Bedingung wahr und er addiert 17 dazu, was mit 267 den Grenzwert von 255 überschreitet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

derbmann

Eben da ist sollte die Bedingung ja falsch werden da größer 255 oder?
Allerdings starte ich den Versuch immer mit dem Wert 0...
Hab auch schon eq 0 probiert oder ne 255 da ich sowieso immer bei 0 anfange.
Immer das gleiche Ergebnis :/

derbmann

Nachdem ich absurde Dinge ausprobiert habe wie z.b. das Reading in ein anderes Device schreiben und und und, habe ich eine neue Erkenntnis.

define leddoif DOIF ([EnO_00001306:buttons] eq "pressed" and [$SELF:brig] eq 0)\
(set ledtest ledbrig {([$SELF:brig])+17}, setreading $SELF brig {([$SELF:brig])+17})\
\
DOELSE (setreading $SELF brig 0)\

attr leddoif repeatcmd 1


Bei dem Beispiel sollte nach meinem Verständnis cmd_1 nur einmal wahr sein und danach auf cmd_2 wechseln und dort bleiben, da repeatcmd nur für cmd_1 gilt.
Was aber wirklich passiert ist das er wie gehabt nach oben zählt bis unendlich, sprich auf cmd_1 bleibt.
Setzte ich aber das Reading händisch während der Endlosschleife auf z.b. 17 (setreading leddoif brig 17) wechselt er wie gewollt auf cmd_2 und bleibt dort.

Per

Ich würde mit wait und selftrigger arbeiten:
define leddoif DOIF ([EnO_00001306:buttons] eq "pressed" and [$SELF:brig] < 238)
(setreading $SELF brig {([$SELF:brig]) + 17},set ledtest ledbrig [$SELF:brig])
DOELSEIF  ([EnO_00001306:buttons] eq "pressed" and [$SELF:brig] < 255)
(setreading $SELF brig 255,set ledtest ledbrig 255)

attr leddoif selftrigger wait
attr leddoif wait 1:0
attr leddoif do always


Ob man [$SELF:brig] braucht oder gleich die LED abfragt, sei jetzt mal nicht hinterfragt.
Interessant wird es erst, wenn du wieder runterdimmen willst ;)