Doif einmalig ohne wait ausführen?

Begonnen von FHEMAN, 14 August 2018, 00:16:25

Vorheriges Thema - Nächstes Thema

FHEMAN

Hallo,
ich habe ein doif zur autom. Beschattung durch unsere Rollos. Mit mehreren Blöcken für die verschiedenen Temps und Sonnenintensitäten. Und (eigentlich) nur bei Abwesenheit. Damit bei einer Wolke die Rollos nicht ständig hoch und runterfahren, verwende ich wait. Das funktioniert alles soweit gut.

Jetzt möchte ich jedoch auch bei Anwesenheit einmal das Doif nutzen, also die Rollos in Position bringen lassen, allerdings ohne Warterei. Z.B. ein Button im UI oder "Alexa, Beschattung". (Ich will dazu nicht direkt ein bestimmtes cmd darin ausführen.)

Einfach gefragt also:
Gibt es die Möglichkeit, ein Doif quasi einmalig ohne Wait zu "starten"?
Und am besten trotz disabled mode.

Viele Grüße
Ronny
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

darkness

#1
Morgen,

du kannst doch im DOIF direkt jedes "cmd_X" direkt setzen? Oder habe ich dich da falsch verstanden

set DeinDOIF  cmd_2

Zitat
Ich will dazu nicht direkt ein bestimmtes cmd darin ausführen

Verstehe ich nicht genau? Das cmd sollte doch genau das machen, was du möchtest?

Gruß

pc1246

Moin
Gestern gerade erst ausprobiert:
set my_DoIf cmd_x
Gruss Christoph

Edith: Mist darkness war schneller!
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

rabehd

Zitatein Button im UI oder "Alexa, Beschattung"

Wieso soll das ins DOIF? Einfach ein set-Befehl an den Button.

Hast Du Dein DOIF an Deine Anwesenheit geknüpft? Sonst könnte das Ganze zu lustigen Aktionen führen.
Auch funktionierende Lösungen kann man hinterfragen.

FHEMAN

Moin moin,

Ich prüfe auch auf Anwesenheit, ja.

"cmd_X" möchte ich, wie gesagt, nicht verwenden. Denn ich möchte nicht darauf verzichten, dass die Bedingungen, wie Sonnenintensität und Temperatur geprüft werden.
Im Prinzip will ich das attr "wait" kurz löschen und neu hinzufügen. Aber eigentlich nicht auf die harte Tour, sofern das geht. Meine Annahme ist, dass es bei der Vielzahl an Doif Attributen auch irgendwo genau das gibt!?
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

pc1246

Zitat von: FHEMAN am 14 August 2018, 10:15:33
Moin moin,

Ich prüfe auch auf Anwesenheit, ja.

"cmd_X" möchte ich, wie gesagt, nicht verwenden. Denn ich möchte nicht darauf verzichten, dass die Bedingungen, wie Sonnenintensität und Temperatur geprüft werden.
Im Prinzip will ich das attr "wait" kurz löschen und neu hinzufügen. Aber eigentlich nicht auf die harte Tour, sofern das geht. Meine Annahme ist, dass es bei der Vielzahl an Doif Attributen auch irgendwo genau das gibt!?
Moin
Naja, dann veroderst Du halt Abwesenheit mit einem dummy, den Du per UI schaltest.
Oder Du zeigst uns ein list Deines DoIF!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

FHEMAN

Zitat von: pc1246 am 14 August 2018, 10:20:58
Naja, dann veroderst Du halt Abwesenheit mit einem dummy, den Du per UI schaltest.
Oder Du zeigst uns ein list Deines DoIF!

Das habe ich schon begonnen, in dem ich Anwesenheit durch ein weiteres Reading "active" im Doif selbst setze. (enable/disable kann ich ja nicht verwenden, da bei disabled das Doif bzw. dessen cmds nicht mehr getriggert werden kann. Was ich ja auch nicht möchte, siehe oben.)

Hier mal ein List. Bitte nicht vom setex irritieren lassen - ich schreibe mir da quasi den Trigger bzw. ein paar Infos mit an das Zieldevice.

Internals:
   DEF        ([Autobeschattung:active] eq "on" and [?isDay] eq "on" and [TempDiffSen.01:T2_T1]>6 and [TempDiffSen.01:Aussentemperatur]>20) (
setex Rollos.SUED off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C,
setex Rollos.WEST off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C,
{ if (sunrise("HORIZON=+45") lt "24:00:00") {
fhem("setex Rollos.OST_SUED off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C")
}
},
setreading TempDiffSen.01 rolloTrigger off
) DOELSEIF ([Autobeschattung:active] eq "on" and [?isDay] eq "on" and [TempDiffSen.01:T2_T1]>3 and [TempDiffSen.01:Aussentemperatur]>17) (
setex Rollos.SUED off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C,
setreading TempDiffSen.01 rolloTrigger off
) DOELSEIF ([Autobeschattung:active] eq "on" and [?isDay] eq "on" and [TempDiffSen.01:T2_T1]<3 and [?TempDiffSen.01:rolloTrigger] eq "off") (
setex Rollos.SUED on-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C,
setex Rollos.WEST on-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C,
setex Rollos.OST_SUED on-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C,
setreading TempDiffSen.01 rolloTrigger on
) DOELSE()
   MODEL      FHEM
   NAME       Autobeschattung
   NR         559
   NTFY_ORDER 50-Autobeschattung
   STATE      cmd_4
   TYPE       DOIF
   READINGS:
     2018-08-14 10:26:40   Device          TempDiffSen.01
     2018-08-14 10:10:05   active          off
     2018-08-13 23:45:27   cmd             4
     2018-08-13 23:45:27   cmd_event       TempDiffSen.01
     2018-08-13 23:45:27   cmd_nr          4
     2018-08-14 10:10:05   e_Autobeschattung_active off
     2018-08-14 10:26:40   e_TempDiffSen.01_Aussentemperatur 21.7
     2018-08-14 10:26:40   e_TempDiffSen.01_T2_T1 1.5
     2018-08-13 23:43:23   mode            enabled
     2018-08-13 23:45:27   state           cmd_4
   Regex:
   attr:
     cmdState:
     wait:
       0:
         600
       1:
         900
       2:
         1800
     waitdel:
   condition:
     0          ReadingValDoIf($hash,'Autobeschattung','active') eq "on" and InternalDoIf($hash,'isDay','STATE') eq "on" and ReadingValDoIf($hash,'TempDiffSen.01','T2_T1')>6 and ReadingValDoIf($hash,'TempDiffSen.01','Aussentemperatur')>20
     1          ReadingValDoIf($hash,'Autobeschattung','active') eq "on" and InternalDoIf($hash,'isDay','STATE') eq "on" and ReadingValDoIf($hash,'TempDiffSen.01','T2_T1')>3 and ReadingValDoIf($hash,'TempDiffSen.01','Aussentemperatur')>17
     2          ReadingValDoIf($hash,'Autobeschattung','active') eq "on" and InternalDoIf($hash,'isDay','STATE') eq "on" and ReadingValDoIf($hash,'TempDiffSen.01','T2_T1')<3 and ReadingValDoIf($hash,'TempDiffSen.01','rolloTrigger') eq "off"
   devices:
     0           Autobeschattung TempDiffSen.01
     1           Autobeschattung TempDiffSen.01
     2           Autobeschattung TempDiffSen.01
     all         Autobeschattung TempDiffSen.01
   do:
     0:
       0            setex Rollos.SUED off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C, setex Rollos.WEST off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C, { if (sunrise("HORIZON=+45") lt "24:00:00") {  fhem("setex Rollos.OST_SUED off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C") } }, setreading TempDiffSen.01 rolloTrigger off
     1:
       0            setex Rollos.SUED off-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C, setreading TempDiffSen.01 rolloTrigger off
     2:
       0            setex Rollos.SUED on-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C, setex Rollos.WEST on-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C, setex Rollos.OST_SUED on-force Autobeschattung:[TempDiffSen.01:Aussentemperatur]°C:[Wandthermostat.2.Weather:temperature]°C, setreading TempDiffSen.01 rolloTrigger on
     3:
       0         
   helper:
     event      Aussentemperatur: 21.7,T1: 24.0,T2: 25.5,T2_T1: 1.5
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   TempDiffSen.01
     timerevent Aussentemperatur: 21.7,T1: 24.0,T2: 25.5,T2_T1: 1.5
     triggerDev TempDiffSen.01
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: TempDiffSen.01
       state: cmd_4
     timerevents:
       Aussentemperatur: 21.7
       T1: 24.0
       T2: 25.5
       T2_T1: 1.5
     timereventsState:
       Aussentemperatur: 21.7
       T1: 24.0
       T2: 25.5
       T2_T1: 1.5
     triggerEvents:
       Aussentemperatur: 21.7
       T1: 24.0
       T2: 25.5
       T2_T1: 1.5
     triggerEventsState:
       Aussentemperatur: 21.7
       T1: 24.0
       T2: 25.5
       T2_T1: 1.5
   internals:
     0           isDay:STATE
     1           isDay:STATE
     2           isDay:STATE
     all         isDay:STATE
   itimer:
   readings:
     0           Autobeschattung:active TempDiffSen.01:T2_T1 TempDiffSen.01:Aussentemperatur
     1           Autobeschattung:active TempDiffSen.01:T2_T1 TempDiffSen.01:Aussentemperatur
     2           Autobeschattung:active TempDiffSen.01:T2_T1
     all         Autobeschattung:active TempDiffSen.01:T2_T1 TempDiffSen.01:Aussentemperatur
   trigger:
   uiState:
   uiTable:
Attributes:
   room       Klima,Rollos
   verbose    4
   wait       600:900:1800
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Damian

#7
Das könntest du wie folgt realisieren.

Du legst dir Readings in deinem DOIF an z. B. setcmd1, setcmd2, usw.

Durch Setzen des jeweiligen Readings auf Null: setreading <dein DOIF> setcmd1 0 wird der jeweilige Zweig geprüft und ggf. ohne Verzögerung ausgeführt.

Deine Definition wird ergänzt mit:

DOIF ([$SELF:setcmd1] or <Rest der bisherigen Bedingung>)(<bisheriger Definition>, setreading $SELF setcmd1 600)
DOELESEIF ([$SELF:setcmd2]  or <Rest der bisherigen Bedingung>)(<bisheriger Definition>, setreading $SELF setcmd2 900)
usw.


Das Attribut wait wird definiert durch:

[$SELF:setcmd1]:[$SELF:setcmd2]:[$SELF:setcmd3]



Edit: Vielleicht erweitere ich irgendwann den set-Befehl um eine checkcond-Option z. B: set mydoif cmd_1 checkcond
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEMAN

Hi Damian,

ich glaube, ich verstehe. Die Möglichkeiten sind ja echt krank.. (was ich positiv meine)
Aber wird der Zweig dann nicht bedingungslos ausgeführt? Bzw. müsste es dann nicht eine "and" Verknüpfung sein?

Außerdem muss ich dann aber immer noch jedes CMD einzeln starten, richtig? Ich kann nicht von außen sagen "jetzt mache mal das komplette Doif ohne zu Warten". Richtig?
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Damian

#9
Zitat von: FHEMAN am 14 August 2018, 11:37:38
Hi Damian,

ich glaube, ich verstehe. Die Möglichkeiten sind ja echt krank.. (was ich positiv meine)
Aber wird der Zweig dann nicht bedingungslos ausgeführt? Bzw. müsste es dann nicht eine "and" Verknüpfung sein?

Außerdem muss ich dann aber immer noch jedes CMD einzeln starten, richtig? Ich kann nicht von außen sagen "jetzt mache mal das komplette Doif ohne zu Warten". Richtig?

ja, du hast Recht, or würde funktionieren, wenn setcmd1 immer 0 wäre, ist aber gleichzeitig ja sonst die wait-Zeit und damit ungleich 0, daher ist or nicht gut. Bei and müsste setcmd1 immer ungleich 0 sein, damit hätte man eine Verzögerung.

Man könnte statt or and nehmen und dann setreading <dein DOIF> setcmd1 0.1 setzen.

Aber so wie ich dich jetzt verstehe, willst du alle Zweige prüfen. Also so etwas

set mydoif checkall withoutwait (gibt ja noch nicht :) )

Das wäre dann sogar etwas einfacher, dafür reicht ein dummy

define cmd dummy
Vorbelegung mit: set cmd 2

Prüfung wird ausgelöst mit: set cmd 1

DOIF ([cmd] and <Rest der bisherigen Bedingung>)(<bisheriger Definition>, set cmd 2)
DOELESEIF ([cmd]  and <Rest der bisherigen Bedingung>)(<bisheriger Definition>, set cmd 2)
usw.


wait-Attribut

([cmd]==1 ? 0:600):([cmd]==1 ? 0:900):([cmd]==1 ? 0:600)


Nach dem Motto: Es gibt nichts, was nicht geht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Ganz ehrlich? Für den einen Spezialfall finde ich es einfacher, die Bedingungen einfach nochmal reinzukopieren.

Oder wait als Variable zu belegen. Sollte mit
($SELF:irgendwas ne "irgendwasanderes")?0:100
oder so
doch gehen.

Damian

Zitat von: Per am 15 August 2018, 11:45:08
Ganz ehrlich? Für den einen Spezialfall finde ich es einfacher, die Bedingungen einfach nochmal reinzukopieren.

Oder wait als Variable zu belegen. Sollte mit
($SELF:irgendwas ne "irgendwasanderes")?0:100
oder so
doch gehen.

ja, z. B.

attr mydoif wait ([$SELF:check,0] ? 0:600):...

und dann einfach Prüfung ohne wait auslösen durch:

setreading mydoif check 1;set mydoif checkall;setreading mydoif check 0

Das funktioniert dann ohne Änderung der eigentlichen DOIF-Definition.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Damian am 15 August 2018, 11:52:15setreading mydoif check 1;set mydoif checkall;setreading mydoif check 0
Oder in wait abfragen, ob der Taster oder was anderes der Auslöser war (Richtung -> $DEVICE).

FHEMAN

Im Prinzip wäre es das gleiche, wie das wait Attribut zu löschen, oder? Nur dass dann eine unnötige Änderung samt Fragezeichen registriert wird. Aber ich denke, mit Eurem letzten Vorschlag kann ich mir was bauen.
Zitat
Ganz ehrlich? Für den einen Spezialfall finde ich es einfacher, die Bedingungen einfach nochmal reinzukopieren.
Hatte ich schon, in ein notify. Aber ich will die Logik nicht so gern zwei mal parallel pflegen.

Danke für Eure Hilfe!
Ronny
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB