[gelöst] Lampe schaltet trotz Zeitangabe aus

Begonnen von Thoffi1978, 11 April 2016, 21:54:22

Vorheriges Thema - Nächstes Thema

Thoffi1978

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

franky08

#1
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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Ellert

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.

Thoffi1978

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

Ellert

Das Attribut "event-on-change-reading" ist bei dem DOIF unnötig.

Das DOIF müsste so funktionieren, wie ich geschrieben habe.

Thoffi1978

#5
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.

Ellert

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.

Thoffi1978

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.

Brice

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.
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

Ellert

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.

Thoffi1978

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 :)