Hallo,
möchte das mein Device ez_Dimmer je nach Dimmzustand heller wird. Habe mir dazu ein notify angelegt und im DEF Teil steht dies
ez_Dimmer { if (ReadingsVal("ez_Dimmer","state",off) > "20%") {fhem "set ez_Dimmer dim50%"} elseif (ReadingsVal("ez_Dimmer","state",off) > "50%") {fhem "set ez_Dimmer dim 80%"} elseif (ReadingsVal("ez_Dimmer","state",off) > "80%") {fhem "set ez_Dimmer dim100%"}}
mit "trigger heller_Esszimmer" bewegt sich nichts. Im log steht dann nichts. Ich vermute, dass einfach der aktuelle Dimmwert der in den Readings unter "state" nicht mit meiner if Andweisung so einfach ausgewertet werden kann, denn wenn der Dimmlevel auf z.B. 30% steht, dann zeigt "state" dim 30" und dies kann man ja nicht einfach mit "> 50%" abragen. Irgenwie ist mir das ja auch klar, aber wie mache ich es richtig?
Grüße, Heinzelrumpel
Hi,
ich denke zum Ersten dein Ausdruck stimmt nicht: (ReadingsVal("ez_Dimmer","state",off) ich denke so ist richtig: (ReadingsVal("ez_Dimmer","state","off")
Zum Zweiten denke ich der Vergleich wäre nicht richtig, 20% wäre eine Zeichenkette keine Zahl.
Ich zitiere mal die commandref:
ZitatVergleichende Abfragen werden, wie in Perl gewohnt, mit Operatoren ==, !=, <, <=, >, >= bei Zahlen und mit eq, ne, lt, le, gt, ge, =~, !~ bei Zeichenketten angegeben.
Aber steht im State wirklich 20% und nicht 20? Also bei meinen Homematic Dimmern steht da nur eine Zahl.
Zum Dritten Du sagst "trigger heller_Esszimmer" aber Dein notify triggert gar nicht auf "heller_Esszimmer" sondern auf "ez_Dimmer". So kannst Du das nicht testen!
Gruß Otto
Im state steht tatsächlich "dim 20" . Ich hab keine Ahnung, mit welchem Vergleichsoperator ich da arbeiten soll. Denke, ich muss ein customReading erstellen, dass das "dim" wegfiltert, oder?
Zitat von: heinzelrumpel am 06 März 2016, 00:38:58
Im state steht tatsächlich "dim 20" . Ich hab keine Ahnung, mit welchem Vergleichsoperator ich da arbeiten soll. Denke, ich muss ein customReading erstellen, dass das "dim" wegfiltert, oder?
du hast immer noch nicht gesagt, welchen dimmer du hast. bei homematic gäbe es sicher genügend readings, die du problemlos nutzen könntest.
Mach doch einfach mal ein list ez_Dimmer
und poste das Ergebnis.
Stimmt, habe ich vergessen
Internals:
DEF d629b337 6
IODev ZWDongle_0
LASTInputDev ZWDongle_0
MSGCNT 96
NAME ez_Dimmer
NR 46
STATE TRANSMIT_NO_ACK
TYPE ZWave
ZWDongle_0_MSGCNT 96
ZWDongle_0_RAWMSG 00130601025a
ZWDongle_0_TIME 2016-03-06 00:49:02
homeId d629b337
isWakeUp
lastMsgSent 1457221746.67809
nodeIdHex 06
Readings:
2016-02-22 21:48:22 CMD ZW_APPLICATION_UPDATE
2016-03-05 21:52:04 reportedState off
2016-03-06 00:49:02 state TRANSMIT_NO_ACK
2016-03-06 00:49:06 transmit OK
Attributes:
IODev ZWDongle_0
classes MANUFACTURER_SPECIFIC VERSION CONFIGURATION ASSOCIATION MULTI_CHANNEL_ASSOCIATION SWITCH_MULTILEVEL FIRMWARE_UPDATE_MD SWITCH_ALL POWERLEVEL MARK SWITCH_MULTILEVEL SCENE_ACTIVATION
room Esszimmer
webCmd dim
So langsam glaube ich aber, dass mein Vorhaben so nicht zu realisieren ist. ICh nutzte Tasker und Autovoice. Jetzt möchte ich, dass Tasker einen Befehl auf mein Sprachkommando absetzt, in dem Fall "Es ist im Esszimmer zu dunkel". Der abzusetzende Befehl in Fhem soll dann prüfen, wie der Dimmer gerade läuft, also welche Dimmstufe. Aber notify reagiert dann ja immer bei einer Änderung des Dimlevels, zB. wenn ich den Dimmer am Wandschalter betätige, oder?
Folgender Code läuft, wenn der Dimmer komplett auf 0 ist und ich "triggern heller_Esszimmer" absetze.
heller_Esszimmer { if (ReadingsVal("ez_Dimmer","state","off") < "20") {fhem "set ez_Dimmer dim 50"} elsif (ReadingsVal("ez_Dimmer","state","off" ) < "50") {fhem "set ez_Dimmer dim 80"} elsif (ReadingsVal("ez_Dimmer","state","off") < "80") {fhem "set ez_Dimmer dim 100"}}
ich kenne kein zwave, aber eventuell ist das reading reportedState besser geeignet.
Zitat von: frank am 06 März 2016, 12:25:11
ich kenne kein zwave, aber eventuell ist das reading reportedState besser geeignet.
Zeigt auch nur zB. "dim 30"
Habe es mal so probiert, nachdem ich im Wiki zum notify einige Beispiele gesehen habe
heller_Esszimmer (ez_Dimmer:STATE.*) { if ($EVTPART0 < "20") {fhem "set ez_Dimmer dim 50"} elsif ($EVTPART0 < "50") {fhem "set ez_Dimmer dim 80"} elsif ($EVTPART0) < "80") {fhem "set ez_Dimmer dim 100"}}
ein trigger löst nix aus, im Log steht dann folgendes
heller_Esszimmer return value: Unknown command (ez_Dimmer:STATE.*), try help.
Ich dachte eigentlich, dass sich die if-Abfrage dann auf das Ergebnis aus " (ez_Dimmer:STATE.*) holt. Da habe ich mich wohl getäuscht.
Also erstmal verwirrt mich das ziemlich:
Zitat2016-03-05 21:52:04 reportedState off
2016-03-06 00:49:02 state TRANSMIT_NO_ACK
2016-03-06 00:49:06 transmit OK
Aber egal, wenn Du der Meinung bist er zeigt "dim 50" in der Art an, dann gilt es die Spreu vom Weizen, sprich die Zahl vom Text zu trennen.
Mit einem RegExp "\d" nimmt man nur die Zahl. Ich weiß jetzt auf die Schnelle nicht wie man das bei Dir einbaut.
Eventuell so
(ReadingsVal("ez_Dimmer","state","off")\d
Die Idee mit dem EVTPART ist eventuell auch eine, aber wie sieht Dein Event denn aus? Du sagst trigger heller_Esszimmer!!! Da ist Dein Event heller_Esszimmer! Du stocherst irgendwie im ganz trüben Wasser! Du kannst den Event prima im Eventmonitor sehen, da wird Dir vielleicht klar was Du tust.
Ich weiß :-[ Finde fhem irgendwie echt kompliziert. Im eventmonitor hab ich bisher nix brauchbares entdecken können.
Zitat von: heinzelrumpel am 06 März 2016, 21:04:49
Ich weiß :-[ Finde fhem irgendwie echt kompliziert. Im eventmonitor hab ich bisher nix brauchbares entdecken können.
findest Du? Ich finde Du hast irgendwie komplizierte Ansätze :'(
Also klären wir mal die Sache mit Deinem notify und dem eventmonitor:
Dein notify heisst heller_Esszimmer? Du willst wissen was passiert und wie der event aussieht? Also mach bitte den eventmonitor auf, am Besten in einem zweiten Fenster. Dann tippst Du oben auf den Filter, dort schreibst du heller_Esszimmer rein. Damit steht dort
heller_Esszimmer.*
und Du drückst ok.
Anschließend gibst Du im anderen Fenster, trigger heller_Esszimmer ein - im eventmonitor siehst Du den event.
Alles klar?
Da ich davon ausgehe, dass Du nichts mit der Kommandozeile und dem Befehl trigger heller... machen willst: Was willst Du eigentlich machen? Einen Dimmer bedienen?
Wenn ich das im Eventmonitor eingegebe, bekomme ich unknown command. Das meine ich mit kompliziert ;) Kann schon sein,dass ich das verkompliziere,aber irgenwie sind die Zusammenhänge nicht in einer für micf verständliche Form erklärt. Stehe mit der IT eigentlich nicfht auf Kriegfuss, habe mit Debian auch schon viel gemacht, aber fhem killt mich gerade. Vielleicht liegts auch ein wenig an perl. Keine Ahnung. Ich versuche mal zu erklären, was ich eigentlich erreichen möchte. Ich brauche einen Befehl, der checkt,wie der dimlevel gerade ist und bei bestimmten Werten den level hochsetzt, also zb. falls derdimlevel bei <= 20 ist, soll der dimlevel auf 50 gesetzt werden. Der gleiche Befehl soll dann auch weitere level prüfen, also falls dimlevel <=50, dann auf 80 hoch, falls nicht <=20 usw. Dachte Elsif wäre dafür geeignet.Diesen Befel möchte ich dann über Tasker per fhem Plugin absetzen. Hoffe das war verständlich ausgedrückt ::)
Welche Version FHEM hast Du?
Die Zeile die Du oben in FHEM siehst ist immer die Kommandozeile, immer die Gleiche. Im Fenster eventmonitor kannst Du dort Befehle eingeben aber nicht das was ich meine!
Hast Du eigentlich mal den verlinkten Anfängerkurs von Uli (https://forum.fhem.de/index.php/topic,41693.0.html#new) angeschaut?
Die rot markierte Stelle im Bild ist klickbar, dort trägst Du das Filter ein!
(https://forum.fhem.de/index.php?action=dlattach;topic=50270.0;attach=48075)
Hier habe ich noch was gefunden, (https://forum.fhem.de/index.php/topic,14709.0.html) ich habe jetzt keine Lust das für Dich zu lesen ;)