DOIF neue Features: Generalisierung, $DEVICE, $EVENT, Attribut notexist

Begonnen von Damian, 28 Dezember 2015, 22:06:42

Vorheriges Thema - Nächstes Thema

crusader

Zitat von: Damian am 06 Februar 2016, 22:07:51
Hast du das System für die neue Version neu gestartet?

Soeben probiert.
Fehlermeldung taucht dann nicht mehr auf.

Danke!

Reinerlein

#106
Hallo Damian,

gerade mal provoziert:

Internals:
   DEF        ([heizung_Schlafzimmer_FK_Links] eq "opened" and [aussen_Temperatur:temperature] >= [heizung_Schlafzimmer_WT:desiredTemperatureWeekprofile]) ((
  set telegram message Du hast vergessen das Fenster "Schlafzimmer FK Links" zu schließen, es ist aussen aber warm genug.
)) DOELSEIF ([heizung_Schlafzimmer_FK_Links] eq "opened" and [heizung_Schlafzimmer_WT:temperature] >= [heizung_Schlafzimmer_WT:desiredTemperatureWeekprofile]) ((
  set telegram message Du hast vergessen das Fenster "Schlafzimmer FK Links" zu schließen, es ist innen aber warm genug.
)) DOELSEIF ([heizung_Schlafzimmer_FK_Links] eq "opened") ({
  my $duration = ReadingsVal("heizung_Schlafzimmer_FK_Links", 'stateChanged', '');;
  $duration = (time() - SONOS_GetTimeFromString($1)) if ($duration =~ m/.*\|(.*)/);;

  fhem("set telegram message Du hast vergessen das Fenster \"Schlafzimmer FK Links\" zu schließen.\nEs ist seit ".(FormatDauer($duration))
  ." geöffnet, und es sind nun ".ReadingsVal("heizung_Schlafzimmer_WT", 'temperature', '-')."°C in dem Raum (anstatt der gewünschten "
  .ReadingsVal("heizung_Schlafzimmer_WT", 'desiredTemperatureWeekprofile', '-')."°C).")
}) DOELSE ({
  sendPlot("heizung_Schlafzimmer_Plot", 'Das Fenster "Schlafzimmer FK Links" wurde wieder geschlossen!')
})
   NAME       heizung_FTK_Mailer_Schlafzimmer_FK_Links
   NR         1613
   NTFY_ORDER 50-heizung_FTK_Mailer_Schlafzimmer_FK_Links
   STATE      Geschlossen gemeldet
   TYPE       DOIF
   Readings:
     2016-02-06 23:25:56   Device          aussen_Temperatur
     2016-02-04 23:29:44   cmd_event       heizung_Schlafzimmer_WT
     2016-02-04 23:29:44   cmd_nr          4
     2016-02-06 23:25:56   e_aussen_Temperatur_temperature 5.3125
     2016-02-06 23:12:25   e_heizung_Schlafzimmer_FK_Links_STATE opened
     2016-02-06 23:24:09   e_heizung_Schlafzimmer_WT_desiredTemperatureWeekprofile 16.5
     2016-02-06 23:24:09   e_heizung_Schlafzimmer_WT_temperature 16.5
     2016-02-04 23:29:44   state           Geschlossen gemeldet
     2016-02-06 23:25:56   wait_timer      no timer
   Condition:
     0          InternalDoIf('heizung_Schlafzimmer_FK_Links','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "opened" and ReadingValDoIf('aussen_Temperatur','temperature','',AttrVal($hash->{NAME},'notexist',undef)) >= ReadingValDoIf('heizung_Schlafzimmer_WT','desiredTemperatureWeekprofile','',AttrVal($hash->{NAME},'notexist',undef))
     1          InternalDoIf('heizung_Schlafzimmer_FK_Links','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "opened" and ReadingValDoIf('heizung_Schlafzimmer_WT','temperature','',AttrVal($hash->{NAME},'notexist',undef)) >= ReadingValDoIf('heizung_Schlafzimmer_WT','desiredTemperatureWeekprofile','',AttrVal($hash->{NAME},'notexist',undef))
     2          InternalDoIf('heizung_Schlafzimmer_FK_Links','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "opened"
   Devices:
     0           heizung_Schlafzimmer_FK_Links aussen_Temperatur heizung_Schlafzimmer_WT
     1           heizung_Schlafzimmer_FK_Links heizung_Schlafzimmer_WT
     2           heizung_Schlafzimmer_FK_Links
     all         heizung_Schlafzimmer_FK_Links aussen_Temperatur heizung_Schlafzimmer_WT
   Do:
     0:
       0          (  set telegram message Du hast vergessen das Fenster "Schlafzimmer FK Links" zu schließen, es ist aussen aber warm genug.)
     1:
       0          (  set telegram message Du hast vergessen das Fenster "Schlafzimmer FK Links" zu schließen, es ist innen aber warm genug.)
     2:
       0          {   my $duration = ReadingsVal("heizung_Schlafzimmer_FK_Links", 'stateChanged', '');;  $duration = (time() - SONOS_GetTimeFromString($1)) if ($duration =~ m/.*\|(.*)/);;  fhem("set telegram message Du hast vergessen das Fenster \"Schlafzimmer FK Links\" zu schließen.\nEs ist seit ".(FormatDauer($duration))  ." geöffnet, und es sind nun ".ReadingsVal("heizung_Schlafzimmer_WT", 'temperature', '-')."°C in dem Raum (anstatt der gewünschten "  .ReadingsVal("heizung_Schlafzimmer_WT", 'desiredTemperatureWeekprofile', '-')."°C).")}
     3:
       0          {  sendPlot("heizung_Schlafzimmer_Plot", ' Das Fenster "Schlafzimmer FK Links" wurde wieder geschlossen!')}
   Helper:
     event      temperature: 5.3125,alarm: 0
     globalinit 1
     last_timer 0
     sleepdevice heizung_Schlafzimmer_WT
     sleepsubtimer 0
     sleeptimer -1
     timerdev   aussen_Temperatur
     timerevent temperature: 5.3125,alarm: 0
     triggerDev aussen_Temperatur
     timerevents:
       temperature: 5.3125
       alarm: 0
     triggerEvents:
       temperature: 5.3125
       alarm: 0
   Internals:
     0           heizung_Schlafzimmer_FK_Links:STATE
     1           heizung_Schlafzimmer_FK_Links:STATE
     2           heizung_Schlafzimmer_FK_Links:STATE
     all         heizung_Schlafzimmer_FK_Links:STATE
   Itimer:
   Readings:
     0           aussen_Temperatur:temperature heizung_Schlafzimmer_WT:desiredTemperatureWeekprofile
     1           heizung_Schlafzimmer_WT:temperature heizung_Schlafzimmer_WT:desiredTemperatureWeekprofile
     all         aussen_Temperatur:temperature heizung_Schlafzimmer_WT:desiredTemperatureWeekprofile heizung_Schlafzimmer_WT:temperature
   Regexp:
     0:
     1:
     2:
     All:
   State:
   Trigger:
Attributes:
   alias      Schlafzimmer FK Links FTK Mailer
   cmdState   Offen - Aussen warm|Offen - Innen warm|Offen gemeldet|Geschlossen gemeldet
   group      Heizung
   icon       edit_settings
   repeatcmd  0:0:3600
   room       _Server,Heizung,Schlafzimmer
   wait       1800:1800:1800

Hilft das?

Der erste Versuch kam hier nur verstümmelt an... deshalb editiert... Der kommt irgendwie mit den Unicode-Zeichen hier nicht klar...

Grüße
Reiner

Damian

Der Trigger ist der Aussensensor, die ersten beiden Bedingung sind nicht wahr, die dritte wird nicht ausgewertet, weil Aussensensor dort nicht vorkommt - es bleibt der letzte Fall übrig, daher cmd_4.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Reinerlein

Hi Damian,

soll das bedeuten, dass sich das so korrekt verhält?
Sollte beim Auswerten der Events nicht berücksichtigt werden, was unter wait_timer vorher mal entschieden wurde? Es kann doch nicht nur das auslösende Device wichtig sein... Dann müsste man die Bedingungen ja immer vollständig aufschreiben, und die Aussage mit "die Bedingungen werden alle der Reihe nach ausgewertet" wäre dann unwichtig, da ja nur die Bedingungen berücksichtigt werden, die das Event-Device enthalten...

Ich bin mir auch irgendwie sicher, dass es mit der "alten" Version so noch ging. Dann habe ich auf die neue generalisierte Version geupdatet, und versucht, das damit umzusetzen (wie beschrieben)...

Grüße
Reiner

Damian

Zitat von: Reinerlein am 07 Februar 2016, 00:31:11
Hi Damian,

soll das bedeuten, dass sich das so korrekt verhält?
Sollte beim Auswerten der Events nicht berücksichtigt werden, was unter wait_timer vorher mal entschieden wurde? Es kann doch nicht nur das auslösende Device wichtig sein... Dann müsste man die Bedingungen ja immer vollständig aufschreiben, und die Aussage mit "die Bedingungen werden alle der Reihe nach ausgewertet" wäre dann unwichtig, da ja nur die Bedingungen berücksichtigt werden, die das Event-Device enthalten...

Ich bin mir auch irgendwie sicher, dass es mit der "alten" Version so noch ging. Dann habe ich auf die neue generalisierte Version geupdatet, und versucht, das damit umzusetzen (wie beschrieben)...

Grüße
Reiner

Das Verhalten hat sich mit der neuen Version nicht geändert. "die Bedingungen werden alle der Reihe nach ausgewertet" ist falsch. In der Commandref steht:
ZitatZu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten.

Vielleicht baue ich noch ein Attribut checkall ein, da einige User danach fragten - für Nebenwirkungen bin ich dann aber nicht verantwortlich.

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Habe gerade das Problem, dass beim Einsatz von wait für "$DEVICE $EVENT" "wait_timer: no timer" zurückgegeben wird. Werden die Werte nicht gecached?

Zitat von: Damian am 07 Februar 2016, 08:46:34Vielleicht baue ich noch ein Attribut checkall ein, da einige User danach fragten
:D

Damian

Zitat von: Per am 07 Februar 2016, 18:28:21
Habe gerade das Problem, dass beim Einsatz von wait für "$DEVICE $EVENT" "wait_timer: no timer" zurückgegeben wird. Werden die Werte nicht gecached?
:D

Ich habe das Problem nicht, es sei denn du triggerst auf dein DOIF-Modul selbst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loredo

Hallo Damian,


ich versuche gerade $DEVICE in einem Finite-DOIF Bedingungsteil zu nutzen:


Internals:
   DEF        (
   [":^currentAlbum.*Sprachdurchsagen"] and
   [?di_HouseAnn] ne "on"
)
(
   setreading HouseAnn lastDevice $DEVICE,
   setreading HouseAnn:FILTER=state!=active lastState [HouseAnn:state],
   set HouseAnn active,
   set LR_AVR:FILTER=mute=off mute on
)


DOELSEIF
(
   [":^currentAlbum"] and
   [?HouseAnn:lastDevice] eq $DEVICE
   [?di_HouseAnn] eq "on"
)
(
   set HouseAnn [HouseAnn:lastState],
   set LR_AVR:FILTER=mute=on mute off
)


DOELSE


   NAME       di_HouseAnn
   NR         253
   NTFY_ORDER 50-di_HouseAnn
   STATE      initialized
   TYPE       DOIF
   Readings:
     2016-02-14 18:00:27   state           initialized
   Condition:
     0             EventDoIf('',$hash,'^currentAlbum.*Sprachdurchsagen',0) and   InternalDoIf('di_HouseAnn','STATE','',AttrVal($hash->{NAME},'notexist',undef)) ne "on"
     1             EventDoIf('',$hash,'^currentAlbum',0) and   ReadingValDoIf('HouseAnn','lastDevice','',AttrVal($hash->{NAME},'notexist',undef)) eq $DEVICE   InternalDoIf('di_HouseAnn','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
   Devices:
   Do:
     0:
       0             setreading HouseAnn lastDevice $DEVICE,   setreading HouseAnn:FILTER=state!=active lastState [HouseAnn:state],   set HouseAnn active,   set LR_AVR:FILTER=mute=off mute on
     1:
       0             set HouseAnn [HouseAnn:lastState],   set LR_AVR:FILTER=mute=on mute off
     2:
       0
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Internals:
     0           di_HouseAnn:STATE
     1           di_HouseAnn:STATE
     all         di_HouseAnn:STATE
   Itimer:
   Readings:
     1           HouseAnn:lastDevice
     all         HouseAnn:lastDevice
   Regexp:
     0:
       0          :^currentAlbum.*Sprachdurchsagen
     1:
       0          :^currentAlbum
     All:
       0          :^currentAlbum.*Sprachdurchsagen
       1          :^currentAlbum
   State:
Attributes:
   DbLogExclude .*
   alias      Announcement: Activity
   cmdState   on|off|off
   devStateIcon on:general_an@green off:general_aus
   event-on-change-reading state
   room       Apartment,Automation,Living



Es wird aber hier bei der 2. Kommando-Bedingung wohl nicht aufgelöst, weshalb ich diesen Fehler erhalte:



perl error in condition:    EventDoIf('',$hash,'^currentAlbum',0) and   ReadingValDoIf('HouseAnn','lastDevice','',AttrVal($hash->{NAME},'notexist',undef)) eq $DEVICE   InternalDoIf('di_HouseAnn','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "on": syntax error at (eval 84711) line 1, near "Sonos_Living_Room   InternalDoIf"



Was läuft denn hier schief?


Übrigens:
Zuerst wollte ich das Reading "Device" vom DOIF Device selbst nehmen, in welchem das zuletzt getriggerte Device ja steht. Das würde mir auch genügen, aber offenbar werden alle vorherigen Readings vor dem Zeitpunkt der Abarbeitung des Befehlsteils schon gelöscht, so dass man auf diese nicht mehr zurückgreifen kann. Ich hätte halt gerne, dass das zweite Kommando nur von dem Device ausgelöst werden kann, welches das erste Kommando ausgelöst hat.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Damian

$DEVICE ist nur ein Platzhalter für das aktuelle Device. Wenn du es in der Bedingung außerhalb der eckigen Klammern benutzen willst, dann musst du bedenken, dass du in der Perl-Welt bist und mit einem Device als Bezeichner kann Perl nichts anfangen. Du hast zwei Möglichkeiten:

1. $DEVICE in Anführungszeichen zu setzen: [?HouseAnn:lastDevice] eq "$DEVICE"

oder eleganter:

2. direkt die Variable $device zu nutzen: [?HouseAnn:lastDevice] eq $device

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loredo

Zitat von: Damian am 14 Februar 2016, 19:06:43
2. direkt die Variable $device zu nutzen: [?HouseAnn:lastDevice] eq $device


Danke! Hätte schwören können das schonmal drin gehabt zu haben. Hm!  ;D
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Per

War nen bissl offline, dehalb erst jetzt:
Zitat von: Damian am 07 Februar 2016, 19:01:10Ich habe das Problem nicht, es sei denn du triggerst auf dein DOIF-Modul selbst.
Komisch, gerade wieder probiert: jetzt gehts  :o
Vllt. hatte ich ein update verpasst?!

Dann kann ich mich der nächsten Baustelle (AMAD) widmen.

kjmEjfu

Zitat von: Loredo am 24 Januar 2016, 20:15:22
Hi Damian,


wollte mich jetzt auch mal versuchen:


define di_rr_Julian_car2
(
   ["^rr_:^locationPresence$"] eq "absent" and
   [?$DEVICE:location] eq "BMW"
)
(
(msg push @$DEVICE |Parkplatz für [$DEVICE:location]| Das Auto wurde hier geparkt O[{"URLTITLE":"'In Google Maps öffnen'","ACTION":"'comgooglemapsurl://maps.google.com/?q=[$DEVICE:locationLat],[$DEVICE:locationLong]'","RETRY":0,"EXPIRE":0}])
)
DOELSE

attr di_rr_Julian_car2 do always
attr di_rr_Julian_car2 wait 300



Allerdings wird cmd_1 nie ausgelöst.
Im Reading e_regexp_c1 sehe ich aber, dass das passende Event eigentlich vorbeiläuft:



rr_Julian:locationPresence: absent locationLat: 48.XXX locationLong: 11.XXX locationAddr: Strasse ABC PLZ Stadt location: BMW



Wo liegt denn hier der Fehler?




Gruß
Julian

Wie verhinderst du eigentlich, dass folgendes passiert:

- Auto steht im Carpot
- Du musst fegen
- kommst zu nahe am Auto vorbei, wirst dort vom Sensor (iBeacon?) erfasst
- bist wieder zwei Meter vom Auto weg, die Zone meldet sich ab
- befindest dich aber noch immer in der Home-Zone und hast dadurch kein neues Entry-Event
- wirst als absent markiert, was zum einen der falsche Status ist und zum anderen auch noch die Parkplatz-MSG auslöst

Oder verhinderst du wirkungsvoll, dass du von Auto-Zone erfasst wirst, solange du in der Home-Zone bist?

Viele Grüße,
kjmEjfu
Migriere derzeit zu Home Assistant

Loredo

Zitat von: kjmEjfu am 19 Februar 2016, 12:55:42
Wie verhinderst du eigentlich, dass folgendes passiert:

- Auto steht im Carpot
- Du musst fegen
- kommst zu nahe am Auto vorbei, wirst dort vom Sensor (iBeacon?) erfasst
- bist wieder zwei Meter vom Auto weg, die Zone meldet sich ab
- befindest dich aber noch immer in der Home-Zone und hast dadurch kein neues Entry-Event
- wirst als absent markiert, was zum einen der falsche Status ist und zum anderen auch noch die Parkplatz-MSG auslöst

Oder verhinderst du wirkungsvoll, dass du von Auto-Zone erfasst wirst, solange du in der Home-Zone bist?


Ich habe keinen Carport und die TG fegt der Hausmeister ;)
Aber selbst wenn der iBeacon auslöst, da passiert einfach dann nix, da ich als zusätzliche Bedingung noch die Home-presence!=present meines ROOMMATE Devices abfrage (ist nur zum testen hinderlich  ;) ). Der Homestatus wird nicht vom iBeacon im Auto gesteuert.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

kjmEjfu

Zitat von: Loredo am 21 Februar 2016, 11:04:54

Ich habe keinen Carport und die TG fegt der Hausmeister ;)
Aber selbst wenn der iBeacon auslöst, da passiert einfach dann nix, da ich als zusätzliche Bedingung noch die Home-presence!=present meines ROOMMATE Devices abfrage (ist nur zum testen hinderlich  ;) ). Der Homestatus wird nicht vom iBeacon im Auto gesteuert.

Ah, da war mein Denkfehler. Wenn der iBeacon (bzw. das Auto) natürlich seinen eigenen Webhook hat, löst sich das Problem generell sehr angenehm. Man lernt hier nie aus :-)
Migriere derzeit zu Home Assistant

Loredo

Dafür braucht man keinen eigenen Webhook, geht alles über einen.


Gruß
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER