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
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ß
Moin
Gestern gerade erst ausprobiert:
set my_DoIf cmd_x
Gruss Christoph
Edith: Mist darkness war schneller!
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.
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!?
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
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
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
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?
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.
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.
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.
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).
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