Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: Inputsammler am 23 November 2014, 14:04:35

Aber mit der Verkürzung nicht
([13:56-15:00|7]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on))


DOIF kann mit Leerzeichen umgehen, der set-Befehl offenbar nicht, daher:


([13:56-15:00|7]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01,CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on))

Gruß

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

FunkOdyssey

Hat jemand einen Tipp, warum die Lampen bei folgendem DOIF um 0:00 Uhr ausgehen?


Internals:
   CFGFN      ./FHEM/zwischenstecker.cfg
   DEF        (
(
      [15:00-02:00|56] or
      [15:00-02:00] and [nrw_feiertag:tomorrow] ne "none" or
      [15:00-23:00|01234] and [nrw_feiertag:tomorrow] eq "none"
      ) and [twilight:twilight_weather] <50
)
(
set switch_fb_1 on,set switch_powerMeter_1 on
) DOELSE (
set switch_fb_1 off,set switch_powerMeter_1 off
)
   NAME       di_innenbeleuchtung
   NR         128
   NTFY_ORDER 50-di_innenbeleuchtung
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2014-11-23 16:56:25   cmd_event       twilight
     2014-11-23 16:56:25   cmd_nr          1
     2014-11-23 00:00:02   e_nrw_feiertag_tomorrow none
     2014-11-23 20:26:27   e_twilight_twilight_weather 0
     2014-11-23 16:56:25   state           cmd_1
     2014-11-23 15:00:00   timer_1_c1      24.11.2014 15:00:00|56
     2014-11-23 02:00:00   timer_2_c1      24.11.2014 02:00:00|56
     2014-11-23 15:00:00   timer_3_c1      24.11.2014 15:00:00
     2014-11-23 02:00:00   timer_4_c1      24.11.2014 02:00:00
     2014-11-23 15:00:00   timer_5_c1      24.11.2014 15:00:00|01234
     2014-11-22 23:10:21   timer_6_c1      23.11.2014 23:00:00|01234
     2014-11-23 16:56:25   wait_timer      no timer
   Condition:
     0          (      DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"56") or      DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf('nrw_feiertag','tomorrow','') ne "none" or      DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"01234") and ReadingValDoIf('nrw_feiertag','tomorrow','') eq "none"      ) and ReadingValDoIf('twilight','twilight_weather','') <50
   Days:
     0          56
     1          56
     4          01234
     5          01234
   Devices:
     0           nrw_feiertag twilight
     all         nrw_feiertag twilight
   Do:
     0          set switch_fb_1 on,set switch_powerMeter_1 on
     1          set switch_fb_1 off,set switch_powerMeter_1 off
   Helper:
     last_timer 6
     sleepdevice twilight
     sleeptimer -1
   Internals:
   Readings:
     0           nrw_feiertag:tomorrow twilight:twilight_weather
     all         nrw_feiertag:tomorrow twilight:twilight_weather
   Realtime:
     0          15:00:00
     1          02:00:00
     2          15:00:00
     3          02:00:00
     4          15:00:00
     5          23:00:00
   State:
   Time:
     0          15:00:00
     1          02:00:00
     2          15:00:00
     3          02:00:00
     4          15:00:00
     5          23:00:00
   Timecond:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   Timerfunc:
   Timers:
     0           0  1  2  3  4  5
Attributes:
   alias      Automatik Zwischenstecker
   group      Automation
   room       Server
   sortby     90
   wait       900


Merkwürdigerweise hatte ich es vor einiger Zeit auch schon, dass beide Lampen zu unterschiedlichen Zeiten geschaltet wurde. Dem bin ich aber nie nachgegangen. Wahrscheinlich auch nur ein Typo im Set-Aufruf.

Damian

Zitat von: Funk.Odyssey am 23 November 2014, 20:32:28
Hat jemand einen Tipp, warum die Lampen bei folgendem DOIF um 0:00 Uhr ausgehen?


Internals:
   CFGFN      ./FHEM/zwischenstecker.cfg
   DEF        (
(
      [15:00-02:00|56] or
      [15:00-02:00] and [nrw_feiertag:tomorrow] ne "none" or
      [15:00-23:00|01234] and [nrw_feiertag:tomorrow] eq "none"
      ) and [twilight:twilight_weather] <50
)
(
set switch_fb_1 on,set switch_powerMeter_1 on
) DOELSE (
set switch_fb_1 off,set switch_powerMeter_1 off
)


Merkwürdigerweise hatte ich es vor einiger Zeit auch schon, dass beide Lampen zu unterschiedlichen Zeiten geschaltet wurde. Dem bin ich aber nie nachgegangen. Wahrscheinlich auch nur ein Typo im Set-Aufruf.

Wenn [nrw_feiertag:tomorrow] um Mitternach gesetzt wird und "none" ist, dann ist deine Bedingung nicht wahr und DOELSE-Fall schlägt zu. Wenn nrw_feiertag nicht triggern soll, dann kannst du auch mit ReadingsVal("nrw_feiertag","tomorrow","") statt [nrw_feiertag:tomorrow] arbeiten.

Gruß

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

FunkOdyssey

Oh. Cool. Danke für die Erklärung. Ich werde mir das die Tage mal näher anschauen.

Kann man eigentlich innerhalb eines DOIF mehrere Perl-Befehle ausführen? Ich hatte das mal ausprobiert und eine ganze Latte an ReadingsVal an Variabeln zugewiesen. Diese wollte ich im Condition-Part abfragen. Aber irgendwie ging das nicht. Nun habe ich alles in die MyUtil.pm ausgelagert.

moonsorrox

Zitat von: Damian am 23 November 2014, 14:10:37
Als Empfehlung: Versuche den DOELSE-Fall durch einen DOELSEIF-Fall zu ersetzen.

also ich sollte das DOELSE im Code durch DOELSEIF ersetzen..! das hatte ich nämlich auch schon probiert

Dann bekomme ich diesen Fehler:
di_Aussenlampe DOIF: no state, reading or time in condition: set WegLampe_Sw_01 off,set WegLampe_Sw_02 on
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: moonsorrox am 24 November 2014, 00:01:06
also ich sollte das DOELSE im Code durch DOELSEIF ersetzen..! das hatte ich nämlich auch schon probiert

Dann bekomme ich diesen Fehler:
di_Aussenlampe DOIF: no state, reading or time in condition: set WegLampe_Sw_01 off,set WegLampe_Sw_02 on

Natürlich musst du dir vorher die passende Bedingung zu diesem DOELSEIF-Fall überlegen. DOELSEIF ohne Bedingung kann ja nicht funktionieren.

Gruß

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

Damian

Zitat von: Funk.Odyssey am 23 November 2014, 22:48:44
Oh. Cool. Danke für die Erklärung. Ich werde mir das die Tage mal näher anschauen.

Kann man eigentlich innerhalb eines DOIF mehrere Perl-Befehle ausführen? Ich hatte das mal ausprobiert und eine ganze Latte an ReadingsVal an Variabeln zugewiesen. Diese wollte ich im Condition-Part abfragen. Aber irgendwie ging das nicht. Nun habe ich alles in die MyUtil.pm ausgelagert.

In der Bedingung von DOIF kannst du alles angeben, was du auch in einer Perl-if-Bedingung angeben kannst, denn es wird ja von Perl ausgewertet. Getriggert wird allerdings nur auf Angaben in eckigen Klammern.

Gruß

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

Brockmann

Zitat von: moonsorrox am 24 November 2014, 00:01:06
also ich sollte das DOELSE im Code durch DOELSEIF ersetzen..! das hatte ich nämlich auch schon probiert
Du sollst das DOELSE durch ein DOELSEIF ersetzen, aber das DOELSEIF benötigt eine Bedingung, während beim DOELSE nur die Aktion steht.
Genau darum geht es ja. Wenn Du ein DOELSE verwendest, kannst Du Seiteneffekte bekommen, die manchmal schwer zu kontrollieren sind. Weil das DOELSE eben immer gezogen wird, wenn eine der Bedingungen getriggert wird, aber nicht wahr ist.

Zitat( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}-{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}- {sunset("CIVIL",9000,"19:00","22:20")}|06]))
    (set WegLampe_Sw_01 on)

DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
    (set WegLampe_Sw_02 off)
DOELSE
    (set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)

Vorschlag: Komm doch mal von dem Intervall weg und verwende statt dessen Anfangs- und Endzeit direkt, etwa so (ungeprüft):

( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
    (set WegLampe_Sw_01 on)

DOELSEIF ( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",9000,"19:00","22:20")}|06]))
    (set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)

DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
    (set WegLampe_Sw_02 off)


Sollte genau dasselbe bewirken, nur dass Du ohne DOELSE auskommst.

satprofi

Hallo.
Ich habe eine frage zum set befehl. Bei fs20 actoren wird mit set on-till der befehl zum actor gesendet der dann selbst abschaltet. Gestern entdeckte ich per zufall das DOIF ein at generiert der den actor zur gesetzten zeit abschaltet. Ust das eine doif eigenheit oder von fhem. Klappt das on-till nur mit Fs20 sender?

Gesendet von meinem GT-I9300

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: satprofi am 24 November 2014, 12:48:49
Hallo.
Ich habe eine frage zum set befehl. Bei fs20 actoren wird mit set on-till der befehl zum actor gesendet der dann selbst abschaltet. Gestern entdeckte ich per zufall das DOIF ein at generiert der den actor zur gesetzten zeit abschaltet. Ust das eine doif eigenheit oder von fhem. Klappt das on-till nur mit Fs20 sender?

Gesendet von meinem GT-I9300

on-till ist keine Eigenschaft von DOIF, sondern des set Befehls bzw. der Hardwarekomponente.

Gruß

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

FunkOdyssey

Zitat von: Brockmann am 24 November 2014, 08:27:05
Vorschlag: Komm doch mal von dem Intervall weg und verwende statt dessen Anfangs- und Endzeit direkt, etwa so (ungeprüft):
...
Sollte genau dasselbe bewirken, nur dass Du ohne DOELSE auskommst.

Jepp. Ich hatte ähnliche Probleme wie moonsorrox und habe mein DOIF vor einigen Tagen auch umgestellt. Dadurch wurde es (für mich) viel einfacher.


([{getJalTime("workdayOpenSoft")}|8] or [{getJalTime("weekendOpenSoft")}|7])
(
  IF ([auto_jal_open_mit_tueren] eq "ja")
  (set alle_jalousien_mit_tueren:FILTER=STATE!=on 10)
  ELSE
  (set alle_jalousien_ohne_tueren:FILTER=STATE!=on 10)
)
DOELSEIF
([{getJalTime("workdayOpen")}|8] or [{getJalTime("weekendOpen")}|7])
(
  IF ([auto_jal_open_mit_tueren] eq "ja")
  (set alle_jalousien_mit_tueren on)
  ELSE
  (set alle_jalousien_ohne_tueren on)
)
DOELSEIF
([{getJalTime("closeRealSoft")}])
(
  IF ([auto_jal_close_mit_tueren] eq "ja")
  (set alle_jalousien_mit_tueren:FILTER=STATE!=off 50)
  ELSE
  (set alle_jalousien_ohne_tueren:FILTER=STATE!=off 50)
)
DOELSEIF
([{getJalTime("closeReal")}])
(
  IF ([auto_jal_close_mit_tueren] eq "ja")
  (set alle_jalousien_mit_tueren off)
  ELSE
  (set alle_jalousien_ohne_tueren off)
)

FunkOdyssey

Zitat von: Damian am 24 November 2014, 08:22:00
In der Bedingung von DOIF kannst du alles angeben, was du auch in einer Perl-if-Bedingung angeben kannst, denn es wird ja von Perl ausgewertet. Getriggert wird allerdings nur auf Angaben in eckigen Klammern.

Könntest du mir dann bitte einen Tipp geben, wie ich z.B. - innerhalb eines DOIF - oft verwendete ReadingsVal vorziehe und einer Variable zuweise? Beziehungsweise: Ob der folgende Ansatz in die richtig Richtung geht? Ich möchte den Code halt schlank und lesbar gestalten.

Ich habe es mal quick&dirty anhand des Beispiels mit der Aussenbeleuchtung ausprobiert.


(
{my $feiertag = ReadingsVal("nrw_feiertag","tomorrow","")}
(
      [16:30-23:00|56] or
      [16:30-23:00] and $feiertag ne "none" or
      [16:30-22:00|01234] and $feiertag eq "none"
      ) and [twilight:twilight_weather] <25
)
(
set ku_aussenlampe on,set hwr_aussenlampe on
) DOELSE (
set ku_aussenlampe off,set hwr_aussenlampe off
)


In diesem DOIF wurden die Timer sogar angelegt. Damit hatte ich nicht gerechnet, denn in vorherigen Versuchen bin ich gescheitert.


moonsorrox

Zitat von: Brockmann am 24 November 2014, 08:27:05
Sollte genau dasselbe bewirken, nur dass Du ohne DOELSE auskommst.
Ok heute Abend/Nacht weiß ich mehr, ich werde mir dieses mal genau anschauen... mal schauen ob das so funktioniert
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: Funk.Odyssey am 24 November 2014, 14:08:47
Könntest du mir dann bitte einen Tipp geben, wie ich z.B. - innerhalb eines DOIF - oft verwendete ReadingsVal vorziehe und einer Variable zuweise? Beziehungsweise: Ob der folgende Ansatz in die richtig Richtung geht? Ich möchte den Code halt schlank und lesbar gestalten.

Ich habe es mal quick&dirty anhand des Beispiels mit der Aussenbeleuchtung ausprobiert.


(
{my $feiertag = ReadingsVal("nrw_feiertag","tomorrow","")}
(
      [16:30-23:00|56] or
      [16:30-23:00] and $feiertag ne "none" or
      [16:30-22:00|01234] and $feiertag eq "none"
      ) and [twilight:twilight_weather] <25
)
(
set ku_aussenlampe on,set hwr_aussenlampe on
) DOELSE (
set ku_aussenlampe off,set hwr_aussenlampe off
)


In diesem DOIF wurden die Timer sogar angelegt. Damit hatte ich nicht gerechnet, denn in vorherigen Versuchen bin ich gescheitert.

Das geht so nicht. In einer Bedingung kannst du keinen ausführenden Code einstellen. Das würde auch bei Perl-if nicht funktionieren. Wenn du es möglichst kurz und einfach machen willst, dann musst du dich noch auf die nächste Version gedulden, da habe ich [?Device:Reading] eingeplant für eine Abfrage eines Readings ohne Triggerung.

Gruß

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

FunkOdyssey

Danke für die Klarstellung.