Moin,
ich habe mir jetzt einen HmIP-BRC2 gekauft und in Homematic an meiner CCU3 angelernt.
Dann habe ich ein Homematic Programm gemacht, dass auf die Buttons reagiert.
Nach dem Setzen von Attributes bekam ich auch Readings:
Internals:
DEF WZSchalter1
IODev hmccu
NAME WZSchalter1
NR 223
STATE Initialized
TYPE HMCCUDEV
ccuaddr 0019D8A99628A8
ccudevstate active
ccuif HmIP-RF
ccuname WZSchalter1
ccutype HmIP-BRC2
channels 3
firmware 1.8.8
statevals devstate
READINGS:
2019-01-15 21:03:51 1.PRESS_LONG 1
2019-01-15 21:03:04 1.PRESS_SHORT 1
2019-01-15 21:03:33 2.PRESS_LONG 1
2019-01-15 21:02:55 2.PRESS_SHORT 1
2019-01-15 21:03:51 hmstate Initialized
2019-01-15 20:49:06 state Initialized
hmccu:
devspec WZSchalter1
dp:
0.CONFIG_PENDING:
OVAL 0
VAL 0
0.DUTY_CYCLE:
OVAL false
VAL false
0.INSTALL_TEST:
OVAL true
VAL true
0.OPERATING_VOLTAGE:
OVAL 0.000000
VAL 0.000000
0.OPERATING_VOLTAGE_STATUS:
OVAL 0
VAL 0
0.RSSI_DEVICE:
OVAL -86
VAL -89
0.RSSI_PEER:
OVAL 0
VAL 0
0.UNREACH:
OVAL 0
VAL 0
0.UPDATE_PENDING:
OVAL false
VAL false
1.PRESS_LONG:
OSVAL 1
OVAL 1
SVAL 1
VAL 1
1.PRESS_SHORT:
OSVAL 1
OVAL 1
SVAL 1
VAL 1
2.PRESS_LONG:
OSVAL 1
OVAL 1
SVAL 1
VAL 1
2.PRESS_SHORT:
OSVAL 1
OVAL 1
SVAL 1
VAL 1
Attributes:
IODev hmccu
ccureadingfilter PRESS
event-on-change-reading .*
event-on-update-reading ^[1-9]\.PRESS.*
icon ios-off
room Wohnzimmer
Jetzt wollte ich ein Notify machen, dass auf Drücken reagiert.
Für die PRESS_SHORT war das gar kein Problem. Für die PRESS_LONG klappt es leider nicht so einfach.
Mein Problem ist, dass es jede Sekunde ein Event PRESS_LONG gibt, wenn ich den Schalter gedrückt halte. Wie kann ich nur auf das erste Event reagieren?
Ich habe hier im Forum oft von LONGRELEASE gelesen, aber das taucht bei mir im Event Monitor nicht auf, wenn ich loslasse. Und eigentlich wäre es auch schöner, dass ich direkt beim ersten PRESS_LONG eine Aktion starten kann und ich nicht auf das Loslassen warten muss.
Hat hier jemand eine Idee, wie ich das machen kann?
Viele Grüße
dwi
Offensichtlich gibt es keinen Datenpunkt für RELEASE. Kannst Du aber gerne nochmal per "get deviceinfo" prüfen.
Leider werden die PRESS_xxx Datenpunkte niemals 0. Sonst könnte man mit event-on-change-reading arbeiten.
Ich habe "get deviceinfo" geprüft:
CHN 0019D8A99628A8:0 WZSchalter1:0
DPT {b} HmIP-RF.0019D8A99628A8:0.CONFIG_PENDING = false [RE]
DPT {b} HmIP-RF.0019D8A99628A8:0.DUTY_CYCLE = false [RE]
DPT {b} HmIP-RF.0019D8A99628A8:0.INSTALL_TEST = true [RW]
DPT {f} HmIP-RF.0019D8A99628A8:0.OPERATING_VOLTAGE = 0.000000 [RE]
DPT {i} HmIP-RF.0019D8A99628A8:0.OPERATING_VOLTAGE_STATUS = 0 [RE]
DPT {n} HmIP-RF.0019D8A99628A8:0.RSSI_DEVICE = 165 [RE]
DPT {n} HmIP-RF.0019D8A99628A8:0.RSSI_PEER = 0 [RE]
DPT {b} HmIP-RF.0019D8A99628A8:0.UNREACH = false [RE]
DPT {b} HmIP-RF.0019D8A99628A8:0.UPDATE_PENDING = false [RE]
CHN 0019D8A99628A8:1 HmIP-BRC2 0019D8A99628A8:1
DPT {b} HmIP-RF.0019D8A99628A8:1.PRESS_LONG = false [E]
DPT {b} HmIP-RF.0019D8A99628A8:1.PRESS_SHORT = false [E]
CHN 0019D8A99628A8:2 HmIP-BRC2 0019D8A99628A8:2
DPT {b} HmIP-RF.0019D8A99628A8:2.PRESS_LONG = false [E]
DPT {b} HmIP-RF.0019D8A99628A8:2.PRESS_SHORT = false [E]
Leider wie erwartet kein RELEASE.
Ich habe mir jetzt ein wenig dreckig beholfen mittels eines Hilfsreading "laststate" und dem Setzen dieses beim Drücken und löschen des Wertes per "at" nach 5 Sekunden.
Drückt man also lange (bis zu 5sec) funktioniert das Ganze ganz gut.
Für mich ist das so okay:
WZSchalter1 {
my $laststate = ReadingsVal("WZSchalter1", "laststate", undef);
if ("$EVTPART0" eq "2.PRESS_SHORT:") {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Hell")
} elsif ("$EVTPART0" eq "1.PRESS_SHORT:") {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Aus")
} elsif ("$EVTPART0" eq "1.PRESS_LONG:" && "$laststate" ne "$EVTPART0") {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Nacht ; define resetState".time*int(rand(600))." at +00:00:05 setreading WZSchalter1 laststate 0")
} elsif ("$EVTPART0" eq "2.PRESS_LONG:" && "$laststate" ne "$EVTPART0") {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Gedimmt ; define resetState".time*int(rand(600))." at +00:00:05 setreading WZSchalter1 laststate 0")
}
}
Die Mindestdauer für einen "Langdruck" ist bei mir 0,5s. Das Licht reagiert also relativ direkt bei 0,5s und wer dann noch 4,5s auf der Taste bleibt, würde halt den gleichen Befehl nochmal senden.. damit kann ich aber leben.
Nicht schön, aber selten ;)
das ist echt blöd bei HmIP. Bei den HM Fernbedienungen gibt es mW immer ein RELEASE. Vielleicht kommt das ja mal mit einem Firmware Update.
Ich nabe schonmal darüber nachgedacht, ein Attribut einzuführen, das den Reset des Readings automatksch nach einer definierten Zeit macht und bis dahkn alle wiederholten PRESS_LONG ignoriert. Wäre halt ne Sonderlocke für wenige Devices.
Mal überlegen, ob das Nachteile hätte ....
Ich habe mein notify nochmal angepasst, dass ich nicht so viele ATs habe:
WZSchalter1 {
my $laststate = ReadingsVal("WZSchalter1", "laststate", undef);
if ("$EVTPART0" eq "2.PRESS_SHORT:") {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Hell")
} elsif ("$EVTPART0" eq "1.PRESS_SHORT:") {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Aus")
} elsif ("$EVTPART0" eq "1.PRESS_LONG:" && "$laststate" ne "1.PRESS_LONG:" && !defined($defs{'resetState1.PRESS_LONG'})) {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Nacht ; define resetState1.PRESS_LONG at +00:00:10 setreading WZSchalter1 laststate 0");
if (defined($defs{'resetState2.PRESS_LONG'})) {
fhem("delete resetState2.PRESS_LONG")
}
} elsif ("$EVTPART0" eq "2.PRESS_LONG:" && "$laststate" ne "2.PRESS_LONG:" && !defined($defs{'resetState2.PRESS_LONG'})) {
fhem("setreading WZSchalter1 laststate $EVTPART0 ; set WZScenes scene Gedimmt ; define resetState2.PRESS_LONG at +00:00:10 setreading WZSchalter1 laststate 0");
if (defined($defs{'resetState1.PRESS_LONG'})) {
fhem("delete resetState1.PRESS_LONG")
}
}
}
Werde ich jetzt für meine anderen Schalter ähnlich machen. Klappt eigentlich ganz gut. Die Regierung im Hause hat sich auf jeden Fall bisher begeistert gezeigt (ne Menge begeisterter, als bei den hue zigbee Schalter :) ).
Die Sache ist eigentlich viel (viel) einfacher lösbar. Mit dem Attribut event-min-interval.
z.B. event-min-interval PRESS_LONG:3
schickt nur alle 3 Sekunden ein PRESS_LONG event. FHEM Standard Attribut, siehe Commandref.
Ach du. Es gibt so viele Standard Attribute :)
Aber vielen Dank für den Hinweis. Ich werde das bei mir anpassen.
To be honest: Ich kannte es auch nicht und hatte schon überlegt, sowas in HMCCU einzubauen. Man lernt eben nie aus.
Trotzdem hoffe ich, dass EQ-3 mit einem Firmware Update PRESS_LONG_RELEASE implementiert. Wäre einfacher.