hallo,
ich habe folgendes DOIF. Das DOIF sollte bewirken, dass wenn die Aussentemp > 23 oder Bürotemp >26 ist (=Trigger) die Aussenrolladen runtergehen. Vorausgesetzt es ist zwischen 10-20.30 uhr, Sommer-Storen-Dumm ist auf on, und die Bürostore ist nicht schon "closed", sowie cmd ist nicht 1.
Hmm, eigentlich doch einfach. Doch heute habe ich aufgrund eines Gewitters die Storen hochgemacht. Dabei war cmd_nr 1. Also sollten doch die Storen nciht wieder runtergehen, bevor es um Mitternacht auf cmd_2 wechselt. Wieso ging es trotzdem runter? Ich weiss grad keinen Rat..
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?Buero_ST_FSB61] ne "closed"
and ([PoolController:Pool_Aussen_Num] > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:cmd_nr] ne "1")
(set Buero_ST_FSB61 closes)
(set Spiri_St_FSB61 closes)
DOELSEIF
([00:00])
()
"list" des DOIFs bitte
here we go, buah ist der lang.. und soviel chinesisch. ;)
Internals:
CHANGED
DEF ([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?Buero_ST_FSB61] ne "closed"
and ([PoolController:Pool_Aussen_Num] > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:cmd_nr] ne "1")
(set Buero_ST_FSB61 closes)
(set Spiri_St_FSB61 closes)
DOELSEIF
([00:00])
()
MODEL FHEM
NAME TEMP_Storen_Buero_Spiri_Sommer_DOIF
NR 185
NTFY_ORDER 50-TEMP_Storen_Buero_Spiri_Sommer_DOIF
STATE disabled
TYPE DOIF
READINGS:
2018-06-04 19:45:39 Device PoolController
2018-06-04 18:42:52 cmd 1.2
2018-06-04 18:42:52 cmd_event Netatmo_Buero
2018-06-04 18:42:52 cmd_nr 1
2018-06-04 18:42:52 cmd_seqnr 2
2018-06-04 19:44:51 e_Netatmo_Buero_temperature 26.1
2018-06-04 19:45:39 e_PoolController_Pool_Aussen_Num 19.44
2018-06-04 19:47:34 last_cmd disabled
2018-06-04 19:47:34 mode disabled
2018-06-04 19:47:34 state disabled
2018-06-03 20:30:00 timer_01_c01 04.06.2018 10:00:00
2018-06-03 20:30:00 timer_02_c01 04.06.2018 20:30:00
2018-06-04 00:00:00 timer_03_c02 05.06.2018 00:00:00
2018-06-04 18:42:52 wait_timer no timer
Regex:
condition:
0 DOIF_time($hash,0,1,$wday,$hms) and InternalDoIf($hash,'Sommer_Storenzeit_Dummy','STATE') eq "on" and InternalDoIf($hash,'Buero_ST_FSB61','STATE') ne "closed" and (ReadingValDoIf($hash,'PoolController','Pool_Aussen_Num') > 23 or ReadingValDoIf($hash,'Netatmo_Buero','temperature') > 26) and ReadingValDoIf($hash,'TEMP_Storen_Buero_Spiri_Sommer_DOIF','cmd_nr') ne "1"
1 DOIF_time_once($hash,2,$wday)
days:
devices:
0 PoolController Netatmo_Buero
all PoolController Netatmo_Buero
do:
0:
0 set Buero_ST_FSB61 closes
1 set Spiri_St_FSB61 closes
1:
0
2:
helper:
DOIF_Readings_events
DOIF_eventas
event Fluss_MS: 5.91 cm/s,Aussen: 19.44 °C,pH: 7.30 pH,Fluss: 5.27 m³/h,Druck: 536.96 mBar,Pool_Temp_Num: 26.12,Pool_Aussen_Num: 19.44
globalinit 1
last_timer 3
sleepdevice Netatmo_Buero
sleepsubtimer -1
sleeptimer -1
timerdev PoolController
timerevent Fluss_MS: 6.05 cm/s,Aussen: 22.12 °C,pH: 7.30 pH,Fluss: 5.12 m³/h,Druck: 534.54 mBar,Pool_Temp_Num: 26.19,Pool_Aussen_Num: 22.12
triggerDev PoolController
timerevents:
Fluss_MS: 6.05 cm/s
Aussen: 22.12 °C
pH: 7.30 pH
Fluss: 5.12 m³/h
Druck: 534.54 mBar
Pool_Temp_Num: 26.19
Pool_Aussen_Num: 22.12
timereventsState:
Fluss_MS: 6.05 cm/s
Aussen: 22.12 °C
pH: 7.30 pH
Fluss: 5.12 m³/h
Druck: 534.54 mBar
Pool_Temp_Num: 26.19
Pool_Aussen_Num: 22.12
triggerEvents:
Fluss_MS: 5.91 cm/s
Aussen: 19.44 °C
pH: 7.30 pH
Fluss: 5.27 m³/h
Druck: 536.96 mBar
Pool_Temp_Num: 26.12
Pool_Aussen_Num: 19.44
triggerEventsState:
Fluss_MS: 5.91 cm/s
Aussen: 19.44 °C
pH: 7.30 pH
Fluss: 5.27 m³/h
Druck: 536.96 mBar
Pool_Temp_Num: 26.12
Pool_Aussen_Num: 19.44
internals:
0 Sommer_Storenzeit_Dummy:STATE Buero_ST_FSB61:STATE
all Sommer_Storenzeit_Dummy:STATE Buero_ST_FSB61:STATE
interval:
0 -1
1 0
intervalfunc:
intervaltimer:
itimer:
localtime:
0 1528099200
1 1528137000
2 1528149600
perlblock:
readings:
0 PoolController:Pool_Aussen_Num Netatmo_Buero:temperature
all PoolController:Pool_Aussen_Num Netatmo_Buero:temperature
realtime:
0 10:00:00
1 20:30:00
2 00:00:00
time:
0 10:00:00
1 20:30:00
2 00:00:00
timeCond:
0 0
1 0
2 1
timer:
0 0
1 0
2 0
timers:
1 2
trigger:
triggertime:
1528137000:
localtime 1528137000
hash:
1528149600:
localtime 1528149600
hash:
uiState:
uiTable:
Attributes:
alias Sommer Store Büro Spiri DOIF
event-on-change-reading state
group 06_Temp
icon black/svg/thermometer-1
room 01_Automatisierung
wait 300
Kann nichts feststellen. Bist Du sicher, dass cmd_nr tatsächlich bei 1 war?
Dein DOIF ist disabled. Hast Du etwas, dass dein DOIF mit "set DOIFname disable" und vielleicht dann "set DOIFname initialize" steuert? Dann wäre cmd_nr nicht 1
Wann hast Du die Storen hochgemacht, und waren die auf "closed"?
Zitat von: amenomade am 04 Juni 2018, 20:44:04
Kann nichts feststellen. Bist Du sicher, dass cmd_nr tatsächlich bei 1 war?
Dein DOIF ist disabled. Hast Du etwas, dass dein DOIF mit "set DOIFname disable" und vielleicht dann "set DOIFname initialize" steuert? Dann wäre cmd_nr nicht 1
Wann hast Du die Storen hochgemacht, und waren die auf "closed"?
danke für deine hilfe
ja ich bin mir ziemlich sicher, dass cmd_nr auf 1 war..100% aber doch nicht.. vielleicht 80%
ich habe es manuell disabled weil ein Hagelgewitter aufkam und ich nicht riskieren wollte, dass sie wieder runtergehen.
ich habe es so um 19.40 Uhr hochgefahren und ja, damals waren Sie auf "closed".
Hmmm. Weitere Tests wären interessant. Wie gesagt, ich kann mir es nur erklären, wenn cmd_nr nicht auf 1 war. Ich habe jetzt es selbst auf einer Testinstallation simuliert... geht einfach wie gewünscht.
auch ich bin ratlos..
darf ich fragen, wie du eine solche Situation simulierst?
Mit Dummies und set / setreading Kommandos
Zitat von: choetzu am 04 Juni 2018, 21:19:29ich habe es manuell disabled
Nach dem enablen hatte es
cmd_1? Nicht vllt. 0? Lässt sich ja schnell nachstellen.
hallo zusammen,
ich glaube, ich habe den Fehler gefunden --> Meine Frau!! Also war ich mit meiner Annahme, dass es auf cmd_nr 1 war, doch vermutlich falsch.
und zwar kam das so: Am morgen hat meine Frau die Rolläden manuell (macht man doch nicht mehr ;) per Taster runtergelassen. Somit war es immer noch auf cmd_nr 2 vom Vorabend. Als ich nach hause kam, dachte ich, dass die Rolläden von selber (also cmd_nr 1) runter gegangen sind. Als das Gewitter kam, hat meine Frau die Rolläden hochgemacht per Taster, und somit blieb es immer noch bei cmd_nr 2. Weil die Temperatur noch > 23 war, sind sie dann wieder automatisch runter cmd_nr 1... bäng..
Damit das nicht mehr vorkommt, habe ich das DOIF angepasst, bin aber noch nicht sicher, ob es wirklich geht. Tests sind schonmal vielversprechend:
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [Buero_ST_FSB61:"down"])
()
DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?Buero_ST_FSB61:position] < 80
and ([PoolController:Pool_Aussen_Num] > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:cmd_nr] !~ '^(1|2)$')
(set Buero_ST_FSB61 closes)
DOELSEIF
([00:00])
()
Also, sollte meine Frau manuell runterlassen --> cmd 1
Wenn sie wieder hochmacht und wieder runter und wieder hoch und wieder runter --> cmd 1 . Um Mitternacht gehts dann wieder auf cmd 3
Wenn meine Frau nicht runterlässt und die Temperaturschwelle überschritten wird --> cmd 2.
Wenn man dann manuell eingreift, bleibt es bei --> cmd 2
So bin ich safe. oder sehe ich etwas nicht?
Und dann noch eine "letzte" Frage:
Ich möchte dies bei all meinen Rolladen (11 Stück) machen. Aber ich möchte den Code nur einmal nutzen. Wie kann man das nun so gestalten, dass man nicht bei allen 10 Rolläden oben stehende Code reinmachen muss? Sub in MyUtils?
Zitat von: choetzu am 05 Juni 2018, 21:33:28Ich möchte dies bei all meinen Rolladen (11 Stück) machen. Aber ich möchte den Code nur einmal nutzen. Wie kann man das nun so gestalten, dass man nicht bei allen 10 Rolläden oben stehende Code reinmachen muss? Sub in MyUtils?
Wenn alle auf die gleichen Trigger reagieren sollen, kannst du es in ein DOIF schreiben (evtl. mit FILTER und User-/DOIFReading). Sonst gibt es div. Möglichkeiten, für myUtils sehe ich aber zuwenig Perl.
[?$SELF:cmd_nr] !~ '^(1|2)$'
2 ist überflüssig wg. fehlendem
do always[?$SELF:cmd_nr] <> 1
Zitat von: choetzu am 05 Juni 2018, 21:33:28
Und dann noch eine "letzte" Frage:
Ich möchte dies bei all meinen Rolladen (11 Stück) machen. Aber ich möchte den Code nur einmal nutzen. Wie kann man das nun so gestalten, dass man nicht bei allen 10 Rolläden oben stehende Code reinmachen muss? Sub in MyUtils?
Das Problem: dein DOIF reagiert auf cmd_nr. Aber jedes Gerät wäre in der Lage dies zu ändern. => Deine Sequenz Logik musst Du mit user-/DOIFReadings statt $SELF:cmd_nr umbasteln, wie von Per geschrieben.
Zitat von: Per am 05 Juni 2018, 22:58:11
[?$SELF:cmd_nr] <> 1
<> als Vergleichsoperator? In Perl? :o ;)
Zitat von: amenomade am 06 Juni 2018, 08:22:27
Das Problem: dein DOIF reagiert auf cmd_nr. Aber jedes Gerät wäre in der Lage dies zu ändern. => Deine Sequenz Logik musst Du mit user-/DOIFReadings statt $SELF:cmd_nr umbasteln, wie von Per geschrieben.
super, danke per und amenomade... Eine Hürde genommen, die nächste steht an.. :)
Ich muss mich da in user/DOIFReadings (gibts DOIFReading überhaupt?) einlesen.. Sehe grad die Lösung nicht, wie man das machen muss...
Damit meinte ich ganz normale Readings, die man mit setreading auf dem DOIF setzt.
Somit muss dein DOIF den Zustand von den jeweiligen Geräte merken (und testen).
hmm, ich komm etwas an meine Grenzen.
Zitat von: amenomade am 06 Juni 2018, 08:22:27
Deine Sequenz Logik musst Du mit user-/DOIFReadings statt $SELF:cmd_nr umbasteln, wie von Per geschrieben.
Sequenzlogik? Das klingt gut, aber für mich etwas schwierig nach zuvollziehen. Wenn du mit Sequenz den Befehlsabschnitt (set...) meinst, dann kann ich es irgendwie nachvollziehen.
Ich habs mal versucht, aber noch nicht getestet, da ich unterwegs bin. Könnte das so gehen? Oder völlig auf dem Holzpfad?
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [.*_ST_.*:"down"]
and [$device:DOIFReading] ne "1")
(set $device DOIFReading 1)
DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?.*_ST_.*:position] < 80
and ([PoolController:Pool_Aussen_Num] > 23
or [Netatmo_Buero:temperature] > 26)
and [?(set $DEVICE:DOIFReading] !~ '^(1|2)$')
(set $device closes)
(set $device DOIFReading 2)
DOELSEIF
([00:00])
Eher sowas in der Art: https://fhem.de/commandref_DE.html#DOIF_Fenster_offen_Meldung
So ein DOIF triggert auf alle "battery" Events, egal das Device, und dann Speichert den Zustand "low" oder "ok" des jeweiligen Device in einem Reading B_<devicename> des DOIFs selbst. Und dieses Reading wird auch in der Bedingung geprüft.
Du hast das umgekehrt gemacht: statt ein Reading des DOIFs pro Device, hast Du ein Reading DOIFreading auf jedem Device gesetzt. Könnte auch gehen, aber Du hast nicht alles unten den Augen zum Testen. Wenn alles auf dem DOIF ist, kannst Du sofort sehen, welche Geräte in welcher Reihenfolge getriggert haben, und in welchem Zweig des DOIFs die gearbeitet haben.
Du warst aber auf dem guten Weg.
herzlichen dank. Ich bin der Sache auf der Spur.. Aber irgendwie komme ich nicht weiter. Alle Storen haben FSB61 im Namen, deshalb kann ich darüber filtern. Das DOIF steht immer auf INITIALIZED, auch wenn ich irgendeine Store hoch oder runtermache. Und checken kann ich ja net, weil kein device getriggert wird, oder?
Gestern noch euphorisch, heute wieder down.. ;)
([?06:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and ["^FSB61$:^up$"])
(setreading $SELF B_$DEVICE close)
(setreading $device test closes)
DOELSEIF
(["^FSB61:position"] < 80
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?10:00-18:30]
and [PoolController:Pool_Aussen_Num] > 23
and [?$SELF:St_$DEVICE] ne "closed")
(setreading $SELF B_$DEVICE closed)
(setreading $device test closes)
DOELSEIF
(["^FSB61$:^up$"]
and [?$SELF:B_$DEVICE] ne "open")
(setreading $SELF B_$DEVICE open)
(setreading $device test open)
attr do always
Warum auch immer, war mein Link hieroben falsch. Ich meinte dieses Beispiel:
Zitat von: CommandRefBatteriewarnung per E-Mail verschicken
define di_battery DOIF ([":battery: low"] and [?$SELF:B_$DEVICE] ne "low")
({DebianMail('yourname@gmail.com', 'FHEM - battery warning from device: $DEVICE')}, setreading $SELF B_$DEVICE low)
DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok")
(setreading $SELF B_$DEVICE ok)
attr di_battery do always
Aber zurück zu deinem Doif:
and ["^FSB61$:^up$"])
Sowas triggert auf dem Device, das genau FSB61 (nichts vorher da ^, und nichts nachher da $) heisst und wo genauso exakt "up" im Event vorkommt.
Was Du möchstest ist wahrscheinlich entweder alle Device, die im Namen FSB61 haben, dann
and ["FSB61:^up$"])
oder die mit FSB61 anfangen, dann
and ["^FSB61:^up$"])
oder die mit FSB61 enden, dann
and ["FSB61$:^up$"])
Zitat von: amenomade am 07 Juni 2018, 22:54:58
Warum auch immer, war mein Link hieroben falsch. Ich meinte dieses Beispiel:
Aber zurück zu deinem Doif:
and ["^FSB61$:^up$"])
Sowas triggert auf dem Device, das genau FSB61 (nichts vorher da ^, und nichts nachher da $) heisst und wo genauso exakt "up" im Event vorkommt.
Was Du möchstest ist wahrscheinlich entweder alle Device, die im Namen FSB61 haben, dann and ["FSB61:^up$"])
oder die mit FSB61 anfangen, dann and ["^FSB61:^up$"])
oder die mit FSB61 enden, dann and ["FSB61$:^up$"])
Herzlichen Dank. Es muss auf FSB61 enden...
Ich teste es wie folgt:
([?06:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and ["FSB61$:^down$"]
and [$SELF:ST_$DEVICE] ne "1")
(setreading $SELF ST_$DEVICE 1)
DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?"FSB61:position"] < 70
and ([PoolController:Pool_Aussen_Num] > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:ST_$DEVICE] !~ '^(1|2)$')
(setreading $SELF ST_$DEVICE 2)
DOELSEIF
([00:00])
(setreading $SELF ["^ST_"] 0)
mit do always. die erste Sequenz (down) konnte ich erfolgreich testen. Die zweite Sequenz (> 23) leider noch nicht. Und bei der dritten Sequenz (00:00) kommt eine Fehlermeldung.
setreading TEST_DOIF ST_S.* 0: WARNING: unsupported character in reading ST_S.* (not A-Za-z/\d_\.-)
Ich habe auch ^ und Anführungszeichen, [] etc versucht. geht wie nicht.
[?"^FSB61:position"] < 80
Und bei Sequenz 2, ist das so OK, oder muss ich da mit .* arbeiten?
hmm, ich komm da nicht weiter...
DOELSEIF
([00:00])
(setreading $SELF {(ST_.*) 0)
da kommt nun die Fehlermeldung
syntax error at (eval 390296) line 1, at EOF
Und das bedeutet nach meiner Recherche "zu wenig Klammern" (EOF). Wo will der denn noch mehr...gggrr
Zitat(setreading $SELF {(ST_.*) 0)
Aber ich glaube nicht, dass Du auf einmal so mehrere Readings setzen kannst. <reading> ist nicht wie <devspec>, der Filter und regex akzeptiert. Evtl musst Du hier bischen Perl schreiben.
Zitat von: amenomade am 09 Juni 2018, 00:40:03
Aber ich glaube nicht, dass Du auf einmal so mehrere Readings setzen kannst. <reading> ist nicht wie <devspec>, der Filter und regex akzeptiert. Evtl musst Du hier bischen Perl schreiben.
danke, den KlammerFehler habe ich auch bemerkt. Geht trotzdem nicht. Ich habe gefühlte 1000 Kombinationen {|][(" etc versucht. Alles geht nicht. Und ich finde auch im Forum etc nichts ähnliches. Ich befürchte Onkel Perl muss helfen.. Den kenn ich aber brutal schlecht.. Wie kann ich dies ändern? Danke.
Zitat von: choetzu am 09 Juni 2018, 10:20:26
danke, den KlammerFehler habe ich auch bemerkt. Geht trotzdem nicht. Ich habe gefühlte 1000 Kombinationen {|][(" etc versucht. Alles geht nicht. Und ich finde auch im Forum etc nichts ähnliches. Ich befürchte Onkel Perl muss helfen.. Den kenn ich aber brutal schlecht.. Wie kann ich dies ändern? Danke.
setreading unterstützt offenbar keine regex für Readingnamen, das Setzen der einzelnen Readings musst du dann explizit mit mehreren setreading-Aufrufen regeln.
Danke. Dann muss ich einen anderen Weg finden. Vermutlich muss ich die Readings in den entsprechenden Devices schreiben anstelle DoifReadings.. zurück auf Feld 1 ;)
Zitat von: Damian am 09 Juni 2018, 10:42:25
setreading unterstützt offenbar keine regex für Readingnamen
setreading nicht, aber
deletereading (wenn ich mich nicht irre). Und ob 0 oder Nul ;) ist relativ egal und lässt sich abfangen.
Also... mit bisschen Perl auch nicht so kompliziert: auf Basis foreach in $defs{$SELF}{READINGS} o.ä. Kann im Moment aber nicht entwickeln/testen.
DOELSEIF
([00:00])
{ my $readings = $defs{$SELF}->{READINGS}; for my $key (keys %$readings) {fhem("setreading $SELF $key 0") if $key =~ "ST_.*";} }
wow, super, das funktioniert bestens. Herzlichen Dank. Ich habe es Testweise mal so gemacht.
([?06:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and ["FSB61$:^down$"]
and [$SELF:ST_$DEVICE] !~'^(1|2)$')
(setreading $SELF ST_$DEVICE 1)
DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?"FSB61:position"] < 70
and ([PoolController:Pool_Aussen_Num] > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:ST_$DEVICE] !~ '^(1|2)$')
(setreading $SELF ST_$DEVICE 2)
DOELSEIF
([00:00])
{ my $readings = $defs{$SELF}->{READINGS}; for my $key (keys %$readings) {fhem("setreading $SELF $key 0") if $key =~ "ST_.*";} }
cmd_1 klappt, cmd_3 nun auch. Doch wird cmd_2 mit
and [?"FSB61:position"] < 70
auch klappen? Wenn ja, dann werde ich nebst den Setreadings noch close-/open Befehle ergänzen.
danke nohcmals.. super..
Zitat von: choetzu am 11 Juni 2018, 23:20:34
Doch wird cmd_2 mit
and [?"FSB61:position"] < 70
auch klappen?
Nö, das finde ich komisch. Hast Du jetzt ein Device, das "FSB61" heisst? Dann mit [?FSB61:position] testen.
Aber wenn Du auf Events von mehreren Devices triggern möchtest, wird es nicht sauber mit [PoolController:Pool_Aussen_Num] oder [Netatmo_Buero:temperature] kombiniert.
Zitat von: amenomade am 11 Juni 2018, 23:34:22
Nö, das finde ich komisch. Hast Du jetzt ein Device, das "FSB61" heisst? Dann mit [?FSB61:position] testen.
Aber wenn Du auf Events von mehreren Devices triggern möchtest, wird es nicht sauber mit [PoolController:Pool_Aussen_Num] oder [Netatmo_Buero:temperature] kombiniert.
hmm, hier will ich eigentlich einen Zustand und keinen Event abfragen. Also, wenn [PoolController:Pool_Aussen_Num] oder [Netatmo_Buero:temperature] triggert soll mit and [?"FSB61:position"] < 70 gecheckt werden, bei welchen Rolladen mit FSB61 im Namen die Position < 70 ist. Es triggert also keinen Event sondern einen Zustand/Reading. Das [?"FSB61$:position"] < 70 triggert doch einen Event, oder geht das auch beim Zustand?
Zitat von: choetzu am 12 Juni 2018, 07:45:08Das [?"FSB61$:position"] < 70 triggert doch einen Event, oder geht das auch beim Zustand?
Das ? triggert gar nix (dafür ist es ja da) und in Kombination mit Event kommt nix Gescheites raus. Und Zustände kannst du nicht generalisieren.
Zitat von: Per am 12 Juni 2018, 11:17:58
Das ? triggert gar nix (dafür ist es ja da) und in Kombination mit Event kommt nix Gescheites raus. Und Zustände kannst du nicht generalisieren.
jep, klar. sorry, falsch ausgedrückt. Ich will dies auch nicht triggern. Sondern wenn es draussen zu warm ist, sollen all diejenigen Rolläden runter, welche weniger als 70% geschlossen sind. und um diesen Check geht es bei [?"FSB61$:position"] < 70. Aber, wenn ich dich richtig verstanden habe, dann geht das nicht so.. Wie denn?
Ne, so geht das nicht.
? am Anfang = abfragen, nicht triggern. Wenn es aber nicht triggert, kommt aber auch das Device nicht in $DEVICE
"" = Event Syntax. Das hat aber keinen Sinn, ? und "" zu kombinieren. Was wäre der Zustand eines Events? Und wenn < 70 noch dazu kommt, wird es noch sinnloser.
Ich vermute, Du muss hier wieder auf Perl Ebene gehen.
Zitat von: amenomade am 12 Juni 2018, 11:44:52Ich vermute, Du muss hier wieder auf Perl Ebene gehen.
Oder mal im Klartext sagen, was er damit bezwecken will.
Denn eine Liste mit allen Rollos ("FSB61") und Position > 70 bekommt DOIF ja noch alleine hin (#).
Vermutlich will er sowas machen, aber nicht nur für Büro, sondern für alle Rolladen mit einem einzigen DOIF:
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [Buero_ST_FSB61:"down"])
()
DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?Buero_ST_FSB61:position] < 80
and ([PoolController:Pool_Aussen_Num] > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:cmd_nr] !~ '^(1|2)$')
(set Buero_ST_FSB61 closes)
DOELSEIF
([00:00])
()
Und wir sind jetzt bei Zweig 2
Die Vermutung ist definitiv richtig [emoji6] Zweig 1 und 3 gehen dank Euch. Nun sollte noch Zeig 2 gehen, damit das Kunstwerk vollendet ist.. [emoji6]
DOELSEIF
([?10:00-20:30] and [?Sommer_Storenzeit_Dummy] eq "on" and ([PoolController:Pool_Aussen_Num] > 23 or [Netatmo_Buero:temperature] > 26))
{my $readings = $defs{$SELF}->{READINGS};
for my $key (keys %$readings) {
if ($key =~ /ST_(.*)/) {
my $device = $1;
if ([?$device:position] < 70 and [?$SELF:ST_$device] !~ '^(1|2)$' ) {
fhem("setreading $SELF $key 2")
}
}
}
Nicht getestet
super, herzlichen Dank. Es geht noch nicht, es fehlt irgendwo noch ein right bracket.. weiss jedoch nicht wo, hab alles mögliche probiert.
no right bracket: {my $readings = $defs{TEST_DOIF}->{READINGS};
danke nochmals..
Einfach am Ende
DOELSEIF
([?10:00-20:30] and [?Sommer_Storenzeit_Dummy] eq "on" and ([PoolController:Pool_Aussen_Num] > 23 or [Netatmo_Buero:temperature] > 26))
{my $readings = $defs{$SELF}->{READINGS};
for my $key (keys %$readings) {
if ($key =~ /ST_(.*)/) {
my $device = $1;
if ([?$device:position] < 70 and [?$SELF:ST_$device] !~ '^(1|2)$' ) {
fhem("setreading $SELF $key 2")
}
}
}
}
danke. Das DOIF motzt zwar nicht mehr, aber dafür werden seit heute Morgen folgende Fehlermeldungen angezeigt, in regelmässigen Abständen.. Um diese Uhrzeit habe ich eine Store runtergelassen und dann wieder hoch... evtl. erklärt das irgendwas.. ;)
.06.13 10:30:02 1: ERROR evaluating {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) { my $device = $1; if ( < 70 and !~ '^(1|2)$' ) { fhem("setreading TEST_DOIF $key 2") } } } }: Unterminated <> operator at (eval 359768) line 1.
2018.06.13 10:30:02 2: TEST_DOIF: {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) { my $device = $1; if ( < 70 and !~ '^(1|2)$' ) { fhem("setreading TEST_DOIF $key 2") } } } }: Unterminated <> operator at (eval 359768) line 1.
2018.06.13 10:30:17 3: EnOcean set Buero_St_FSB61 closed
2018.06.13 10:30:21 1: ERROR evaluating {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) { my $device = $1; if ( < 70 and !~ '^(1|2)$' ) { fhem("setreading TEST_DOIF $key 2") } } } }: Unterminated <> operator at (eval 359877) line 1.
2018.06.13 10:30:21 2: TEST_DOIF: {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) { my $device = $1; if ( < 70 and !~ '^(1|2)$' ) { fhem("setreading TEST_DOIF $key 2") } } } }: Unterminated <> operator at (eval 359877) line 1.
2018.06.13 10:30:21 1: ERROR evaluating {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) { my $device = $1; if ( < 70 and !~ '^(1|2)$' ) { fhem("setreading TEST_DOIF $key 2") } } } }: Unterminated <> operator at (eval 359900) line 1.
2018.06.13 10:30:21 2: TEST_DOIF: {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) { my $device = $1; if ( < 70 and !~ '^(1|2)$' ) { fhem("setreading TEST_DOIF $key 2") } } } }: Unterminated <> operator at (eval 359900) line 1.
2018.06.13 10:35:02 1: ERROR evaluating {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) { my $device = $1; if ( < 70 and !~ '^(1|2)$' ) { fhem("setreading TEST_DOIF $key 2") } } } }: Unterminated <> operator at (eval 360392) line 1.
2018.06.13 10:35:02 2: TEST_DOIF: {my $readings = $defs{TEST_DOIF}->{READINGS}; for my $key (keys %$readings) { if ($key =~ /ST_(.*)/) {
Stattif ([?$device:position] < 70 and [?$SELF:ST_$device] !~ '^(1|2)$'
, versuch mal mitif (ReadingsVal("$device", "position", 100) < 70 and ReadingsVal("$SELF", "ST_$device", 2) !~ '^(1|2)$'
Die default Werte 100 und 2 sind evtl. anzupassen: ich weiss nicht, was in deinem Fall am besten funktioniert, die Bedingung lieber wahr oder lieber falsch zu haben.
Du bist mein Held, amenomade! Dankeeee.. Es klappt seit heute Morgen bestens. Ich beobachte weiter.
Ich versuch mal den perl code zu verstehen..