Hallo ihr Lieben.
Ich möchte gerne, zwischen 21 und 12 Uhr den Status meines Receiver abfragen.
Wenn Dieser in die Zeit ausgeht, soll die Lampe geschaltet werden.
Diese soll aber NUR ausgehen, wenn der Receiver ausgeht, also den Status von Presence auf Absent wechselt.
Ich habe diesen Code:
([?21:00-12:00] and [Coolstream] eq "absent") (set Schalter3 off)
und das Attribut "event-on-change-reading" mit zugefügt.
Jetzt schaltet der Receiver aber trotzdem die Lampe, wenn z.B. am Nachmittag TV geschaut wurde und Abends nicht.
Wie kann ich die Statusänderung nur in dem gewünschten Zeitraum abfragen?
Vielen Dank
Hoffi
Das schein ein DOIF Konstrukt zu sein, sorry verwende ich nicht. Über ein notify z.B.:
my $costr = Value("Coolstream");
if ( $costr eq "absent" && $hour ~~ [21..00] || $hour ~~ [00..11] ) {
fhem "set Schalter3 off";
}
ungetestet, nur schnell aufgeschrieben!!
VG
Frank
Folgendes könnte ein Problem sein:
Zitatund das Attribut "event-on-change-reading" mit zugefügt.
Wo hast Du das Attribut zugefügt?
Machmal ein Listing vom DOIF und von Coolstream.
Wird der Status von Coolstream regelmäßig aktualisiert? Wenn nicht, dann schaltet das DOIF nur, wenn Coolstream zwischen 21:00 und 12:00 auf "absent" geht. Falls Coolstream schon vorher "absent" war, wird nicht geschaltet.
Hallo,
anbei die List vom "DOIF"
Internals:
DEF ([?21:00-12:00] and [Coolstream] eq "absent") (set Schalter3 off)
NAME Coolstream_aus
NR 180
NTFY_ORDER 50-Helligkeit1
STATE cmd_1
TYPE DOIF
Readings:
2016-04-13 08:48:12 Device Coolstream
2016-04-12 21:06:00 cmd_event Coolstream
2016-04-12 21:06:00 cmd_nr 1
2016-04-13 08:48:12 e_Coolstream_STATE absent
2016-04-12 21:06:00 state cmd_1
2016-04-12 12:00:00 timer_1_c1 12.04.2016 21:00:00
2016-04-12 12:00:00 timer_2_c1 13.04.2016 12:00:00
2016-04-12 21:06:00 wait_timer no timer
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and InternalDoIf($hash,'Coolstream','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "absent"
Days:
Devices:
0 Coolstream
all Coolstream
Do:
0:
0 set Schalter3 off
1:
Helper:
event absent,presence: absent
globalinit 1
last_timer 2
sleepdevice Coolstream
sleepsubtimer -1
sleeptimer -1
timerdev Coolstream
timerevent absent,presence: absent
triggerDev Coolstream
timerevents:
absent
presence: absent
triggerEvents:
absent
presence: absent
Internals:
0 Coolstream:STATE
all Coolstream:STATE
Interval:
0 -1
1 0
Itimer:
Localtime:
0 1460487600
1 1460541600
Readings:
Realtime:
0 21:00:00
1 12:00:00
Regexp:
0:
All:
State:
Time:
0 21:00:00
1 12:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timers:
Trigger:
Triggertime:
1460541600:
localtime 1460541600
Hash:
Attributes:
event-on-change-reading 1
room Steckdosen
wait 300
und die List von Coolstream:
Internals:
ADDRESS 192.168.2.7
DEF lan-ping 192.168.2.7 180 300
MODE lan-ping
NAME Coolstream
NR 136
STATE absent
TIMEOUT_NORMAL 180
TIMEOUT_PRESENT 300
TYPE PRESENCE
Readings:
2016-04-11 09:37:24 absent 0
2016-04-13 08:48:12 presence absent
2016-04-13 08:48:12 state absent
Helper:
Attributes:
userattr room_map structexclude
Vielen Dank
Hoffi
Das Attribut "event-on-change-reading" ist bei dem DOIF unnötig.
Das DOIF müsste so funktionieren, wie ich geschrieben habe.
Hallo Ellert,
ich habe das Attribut "event-on-change-reading" entfernt.
Doch sobald die Coolstream "gepingt" wird, und diese absent ist, wird der Schaltbefehl ausgeführt
Internals:
DEF ([?11:49-11:00] and [Coolstream] eq "absent") (set Schalter3 off)
NAME Coolstream_aus
NR 176
NTFY_ORDER 50-Coolstream_aus
STATE cmd_2
TYPE DOIF
Readings:
2016-04-13 11:54:36 Device Coolstream
2016-04-13 11:39:05 cmd_event Coolstream
2016-04-13 11:39:05 cmd_nr 2
2016-04-13 11:54:36 e_Coolstream_STATE absent
2016-04-13 11:39:05 state cmd_2
2016-04-13 11:38:20 timer_1_c1 13.04.2016 11:49:00
2016-04-13 11:38:20 timer_2_c1 14.04.2016 11:00:00
2016-04-13 11:51:30 wait_timer 13.04.2016 11:56:30 cmd_1 Coolstream
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and InternalDoIf($hash,'Coolstream','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "absent"
Days:
Devices:
0 Coolstream
all Coolstream
Do:
0:
0 set Schalter3 off
1:
Helper:
event absent,presence: absent
globalinit 1
last_timer 2
sleepdevice Coolstream
sleepsubtimer 0
sleeptimer 0
timerdev Coolstream
timerevent absent,presence: absent
triggerDev Coolstream
timerevents:
absent
presence: absent
triggerEvents:
absent
presence: absent
Internals:
0 Coolstream:STATE
all Coolstream:STATE
Interval:
0 -1
1 0
Itimer:
Localtime:
0 1460540940
1 1460624400
Readings:
Realtime:
0 11:49:00
1 11:00:00
Regexp:
0:
All:
State:
Time:
0 11:49:00
1 11:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timers:
Trigger:
Triggertime:
1460624400:
localtime 1460624400
Hash:
Attributes:
room Steckdosen
wait 300
Edit: Sobald man in den Bereich der Zeitabfrage kommt und die Coolstream absent ist wird getriggert (11:49Uhr) und geschaltet. Es soll aber nur bei einer Statusänderung geschaltet werden. Nicht wenn die Collstream um 11:49Uhr absent ist.
Dann könntest Du es mit attr Coolstream event-on-change-reading presence
versuchen, und im DOIF die Bedingung auf [Coolstream:presence] eq "absent"
ändern.
Hallo,
ich habe den DOIF geändert:
([?10:10-10:00] and ([Coolstream] eq "absent")) (set Schalter3 off)
und das Attr hinzugefügt (List):
Internals:
DEF ([?10:10-10:00] and ([Coolstream] eq "absent")) (set Schalter3 off)
NAME Coolstream_aus
NR 176
NTFY_ORDER 50-Coolstream_aus
STATE cmd_1
TYPE DOIF
Readings:
2016-04-19 12:12:53 Device Coolstream
2016-04-19 10:16:56 cmd_event Coolstream
2016-04-19 10:16:56 cmd_nr 1
2016-04-19 12:12:53 e_Coolstream_STATE absent
2016-04-19 10:16:56 state cmd_1
2016-04-19 10:00:00 timer_1_c1 19.04.2016 10:10:00
2016-04-19 10:00:00 timer_2_c1 20.04.2016 10:00:00
2016-04-19 10:16:55 wait_timer no timer
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and (InternalDoIf($hash,'Coolstream','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "absent")
Days:
Devices:
0 Coolstream
all Coolstream
Do:
0:
0 set Schalter3 off
1:
Helper:
event absent,presence: absent
globalinit 1
last_timer 2
sleepdevice Coolstream
sleepsubtimer -1
sleeptimer -1
timerdev Coolstream
timerevent absent,presence: absent
triggerDev Coolstream
timerevents:
absent
presence: absent
triggerEvents:
absent
presence: absent
Internals:
0 Coolstream:STATE
all Coolstream:STATE
Interval:
0 -1
1 0
Itimer:
Localtime:
0 1461053400
1 1461139200
Readings:
Realtime:
0 10:10:00
1 10:00:00
Regexp:
0:
All:
State:
Time:
0 10:10:00
1 10:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timers:
Trigger:
Triggertime:
1461139200:
localtime 1461139200
Hash:
Attributes:
event-on-change-reading presence
room Steckdosen
wait 300
Heute um 10:16 Uhr, nach Ablauf der waitTimers, hat sich die Lampe ausgeschaltet :-(
Das funktioniert leider immer noch nicht so. wie gewünscht.
Ich könnte dir aus eigener Erfahrung nur mit notifys weiterhelfen, da ich keine DOIFs nutze. Versuche es doch mal mit einem Notify
Coolstream:absent.* {
my $Status=(ReadingsVal("Schalter3","state","on"))
if ($Status eq "on")
{
{fhem "set Schalter3 off"}
}
}
und schränke über
attr <Name des Notify> disabledForIntervals 12:00-21:00
das triggern ein.
Event-on-change-reading für Coolstream sollte gesetzt sein.
Zitat von: Thoffi1978 am 19 April 2016, 12:15:49
Hallo,
ich habe den DOIF geändert:
([?10:10-10:00] and ([Coolstream] eq "absent")) (set Schalter3 off)
und das Attr hinzugefügt (List):
Internals:
DEF ([?10:10-10:00] and ([Coolstream] eq "absent")) (set Schalter3 off)
NAME Coolstream_aus
NR 176
NTFY_ORDER 50-Coolstream_aus
STATE cmd_1
TYPE DOIF
Readings:
2016-04-19 12:12:53 Device Coolstream
2016-04-19 10:16:56 cmd_event Coolstream
2016-04-19 10:16:56 cmd_nr 1
2016-04-19 12:12:53 e_Coolstream_STATE absent
2016-04-19 10:16:56 state cmd_1
2016-04-19 10:00:00 timer_1_c1 19.04.2016 10:10:00
2016-04-19 10:00:00 timer_2_c1 20.04.2016 10:00:00
2016-04-19 10:16:55 wait_timer no timer
Condition:
0 DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and (InternalDoIf($hash,'Coolstream','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "absent")
Days:
Devices:
0 Coolstream
all Coolstream
Do:
0:
0 set Schalter3 off
1:
Helper:
event absent,presence: absent
globalinit 1
last_timer 2
sleepdevice Coolstream
sleepsubtimer -1
sleeptimer -1
timerdev Coolstream
timerevent absent,presence: absent
triggerDev Coolstream
timerevents:
absent
presence: absent
triggerEvents:
absent
presence: absent
Internals:
0 Coolstream:STATE
all Coolstream:STATE
Interval:
0 -1
1 0
Itimer:
Localtime:
0 1461053400
1 1461139200
Readings:
Realtime:
0 10:10:00
1 10:00:00
Regexp:
0:
All:
State:
Time:
0 10:10:00
1 10:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timers:
Trigger:
Triggertime:
1461139200:
localtime 1461139200
Hash:
Attributes:
event-on-change-reading presence
room Steckdosen
wait 300
Heute um 10:16 Uhr, nach Ablauf der waitTimers, hat sich die Lampe ausgeschaltet :-(
Das funktioniert leider immer noch nicht so. wie gewünscht.
Du hast ja meinen Vorschlag nicht umgesetzt.
Im DOIF ist "event-on-change-reading presence", das ist Unsinn, es muss bei Coolstream gesetzt werden und dann DOIF anpassen, wie ich bereits schrieb:
Zitat von: Ellert am 18 April 2016, 12:26:01
Dann könntest Du es mit attr Coolstream event-on-change-reading presence
versuchen, und im DOIF die Bedingung auf [Coolstream:presence] eq "absent"
ändern.
Hallo Ihr.
@Brice: mit dem Notify muss ich mal eperat beschäftigen, da ist mein Wissen noch nicht so ausgeprägt.
@Ellert: Nun scheint das so zu klappen wie ich es gern möchte.
Vielen Dank für Eure Hilfe
Hoffi :)