Hi,
nach langer Zeit will ich mal wieder etwas automatisieren...
Nehmen wir an ich habe verschiedene Inputs. Beispiele:
Wenn das erfüllt dann soll das als "Regen" gelten für die nächsten 10 Minuten
Regen.*:rainrate",0]<638
Regen2.*:rainrate",0]<555
Macht man das aktuell am einfachsten per doif, oder ist meine Info hier veraltet ?
Also für den Anfang mal:
define DI_Regen DOIF ([[Regen.*:rainrate",0]<638]) (set Regen on) DOELSE (set Regen off)
Mal angenommen meine Klammersetzung wäre schon richtig, wie könnte ich nun am einfachsten einstellen, dass der "Regen" dann für 10 Minuten "on" sein soll ?
Wenn keine neuen Messwerte kommen, soll nach 10 Minuten der Regen wieder "off" sein.
Und ich möchte den Wert auch manuell auf off setzen können...
Freue mich über möglichst konkrete Hinweise, könnte mir gut vorstellen dass ich die Passagen in der Command-Ref + Wiki übersehen habe...
Hi,
wenn ich Dich richtig verstanden habe würde ich noch ein
attr DI_Regen wait 0:600
machen.
Gruß Otto
Hmm, ich versuche s nochmals andes zu beschreiben.
Ich habe z.B. eine "Wippe" als Regensensor, und diverse andere Möglichkeiten. Wenn einer davon anschlägt, dann nehme ich für die nächsten 10 Minuten an dass es regnet. Solange bis 10 Minuten lang keine Daten mehr gekommen sind. Oder umgekehrt: Immer wenn ein neuer Messwert reinkommt der auf Regen hindeutet würde ich gerne Regen für 10 Minuten lang auf "on" setzen...
Wenn das mit deiner Ergänzung klappt, dann wäre das viel einfacher als erwartet!
ZitatDOIF ([[Regen.*:rainrate",0]<638])
Das wird problematisch.... Mit Regex muss es Ereignis-gesteuert sein. Ein Ereignis, der kleiner als 638 sein soll...
Am besten mit aggregation Funktionen von DOIF arbeiten, z.B. Anzahl von Sensoren, wo rainrate > wert, grösser als 0, dann...
https://fhem.de/commandref_DE.html#DOIF_aggregation
Etwas in der Art:
DOIF ([#"^Regen":rainrate:$_ > 638] != 0) (es regnet) DOELSE (es regnet nicht)
attr <name> wait 0:600
Wenn Anzahl der Sensoren, die mit Regen anfangen, und rainrate über 638 haben, nicht gleich 0, dann regnet es
Wenn es nicht mehr der Fall ist, warte 600 Sek, dann regnet es nicht (mehr)
EDIT: und mit
attr <name> cmdState on|off
kannst Du dir dein "Regen" dummy sparen, und liest den Status direkt am DOIF
ja sorry hatte ich komplett übersehen, an dem ([[Regen.*:rainrate",0]<638]) ist auch die Klammer sicher falsch. Der Inhalt [Regen.*:rainrate",0]<638 würde als wahrscheinlich als Zeit interpretiert weil er nochmal in [] steht.
https://commandref.fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
Und es hat nur ein " Zeichen, das geht also eh nicht.
Aber amenomade hat es ja schon richtiggestellt.
ZitatWenn einer davon anschlägt, dann nehme ich für die nächsten 10 Minuten an dass es regnet. Solange bis 10 Minuten lang keine Daten mehr gekommen sind. Oder umgekehrt: Immer wenn ein neuer Messwert reinkommt der auf Regen hindeutet würde ich gerne Regen für 10 Minuten lang auf "on" setzen...
Bei der Aufgabenstellung würde ja ein beliebiger Event reichen?
Gruß Otto
ZitatWenn Anzahl der Sensoren, die mit Regen anfangen, und rainrate über 638 haben, nicht gleich 0, dann regnet es
Sorry da habe ich mein Problem wohl nicht genau genau genug beschrieben.
Regen wäre z.B.
Sensor1:Rainrate < 666
Sensor2:Rainrate < 444
Sensor3:Rainrate < 222
Sensor4:Regen = on
Sensor5:Raincounter ist angestiegen
Ich vermute ich sollte also alle Sensoren mit einem einheitlichen zusätzlichen Wert ausstatten. Beispiel:
Wenn bei "Sensor1:Rainrate <638"
=>
Sensor1:regen = on
Wäre das ein Ansatz ?
Allen Regensensoren bekommen wie vorgeschlagen das selbe Namensschema bekommen und ich könnte:
DOIF ([#"^Regen":regen:$_ =on] != 0) (es regnet) DOELSE (es regnet nicht)
PS: Was ich etwas unterschlagen habe... Ich würde dann zum beispiel alle 15 Minuten einen AT absetzen mit:
-Wenn "kein Regen" und "kein Sturm" und z.B. "Temperatur= 25 Grad" dann => fahre Markise auf 100%
-Wenn "kein Regen" und "kein Sturm" und z.B. "Helligkeit > 1000" dann => fahre Markise auf 100%
-Wenn "kein Sturm" und z.B. "Helligkeit > 1000" dann => fahre Jalosie auf 100%
So. ca. war der Plan.
Zitat von: Ranseyer am 07 August 2019, 11:25:41
Sorry da habe ich mein Problem wohl nicht genau genau genug beschrieben.
Regen wäre z.B.
Sensor1:Rainrate < 666
Sensor2:Rainrate < 444
Sensor3:Rainrate < 222
Sensor4:Regen = on
Sensor5:Raincounter ist angestiegen
Ich vermute ich sollte also alle Sensoren mit einem einheitlichen zusätzlichen Wert ausstatten. Beispiel:
Wenn bei "Sensor1:Rainrate <638"
=>
Sensor1:regen = on
Wäre das ein Ansatz ?
Allen Regensensoren bekommen wie vorgeschlagen das selbe Namensschema bekommen und ich könnte:
DOIF ([#"^Regen":regen:$_ =on] != 0) (es regnet) DOELSE (es regnet nicht)
PS: Was ich etwas unterschlagen habe... Ich würde dann zum beispiel alle 15 Minuten einen AT absetzen mit:
-Wenn "kein Regen" und "kein Sturm" und z.B. "Temperatur= 25 Grad" dann => fahre Markise auf 100%
-Wenn "kein Regen" und "kein Sturm" und z.B. "Helligkeit > 1000" dann => fahre Markise auf 100%
-Wenn "kein Sturm" und z.B. "Helligkeit > 1000" dann => fahre Jalosie auf 100%
So. ca. war der Plan.
Dann machst Du einfach
DOIF ([Sensor1:Rainrate] < 666
or [Sensor2:Rainrate] < 444
or [Sensor3:Rainrate] < 222
or [Sensor4:Regen] eq "on"
or [Sensor5:Raincounter:diff2] > 5)
(es regnet)
DOELSE
(es regnet nicht)
attr wait usw
Hi,
Kannst Du die 10 Minuten nicht einfach mit off-for-timer 600 lösen?
Gruß Arnd
Signalduino (Nano, ESP, ...), CUL (Busware, Nano, Maple, ...), Homematic (HM-MOD-UART-RPI, ESP, Maple, ...), LaCrosseGateway (LGW, ESP, ...), 1-wire, ESPEasy, Bravia, Yamaha, ...
Zitat von: RaspiLED am 08 August 2019, 13:51:16
Hi,
Kannst Du die 10 Minuten nicht einfach mit off-for-timer 600 lösen?
Gruß Arnd
Signalduino (Nano, ESP, ...), CUL (Busware, Nano, Maple, ...), Homematic (HM-MOD-UART-RPI, ESP, Maple, ...), LaCrosseGateway (LGW, ESP, ...), 1-wire, ESPEasy, Bravia, Yamaha, ...
Eher on-for-timer, oder?
Wenn dann aber nur mit einem leeren DOELSE am Ende
Hi,
folgendes funktioniert: "trigger Regen_Helligkeit_Daechle rainrate: 5" setzt mir "WG_Wetter den Regen auf "on".
Folgendes funktioniert nicht: "trigger Regen_Helligkeit_Daechle rainrate: 999" setzt mir "WG_Wetter den Regen nicht auf "off".
Internals:
CFGFN
DEF ([Regen_Helligkeit_Daechle:rainrate] < 638
or [Sensor2:rainrate] < 638
or [Sensor3:rainrate] < 222
or [Sensor4:Regen] eq "on"
or [Sensor5:Raincounter:diff2] > 5)
(setreading WG_Wetter Regen on)
DOELSE
(setreading WG_Wetter Regen off)
FUUID 5d4aa85b-f33f-0eb4-bf44-3c7507745053fb60
MODEL FHEM
NAME DOIF_Regen
NR 645
NTFY_ORDER 50-DOIF_Regen
STATE cmd_1
TYPE DOIF
VERSION 19786 2019-07-05 21:47:08
READINGS:
2019-08-09 15:52:04 Device Regen_Helligkeit_Daechle
2019-08-09 15:44:58 cmd 1
2019-08-09 15:44:58 cmd_event Regen_Helligkeit_Daechle
2019-08-09 15:44:58 cmd_nr 1
2019-08-09 15:45:07 e_Regen_Helligkeit_Daechle_rainrate 728
2019-08-09 15:43:23 mode enabled
2019-08-09 15:44:58 state cmd_1
2019-08-09 15:45:07 warning [color=red]condition c01: Argument "" isn't numeric in numeric lt (<)[/color]
Regex:
accu:
Sensor5:
accu:
Raincounter ^Sensor5$:^Raincounter:
accu:
Sensor5 Raincounter:
dim 2
value:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Regen_Helligkeit_Daechle','rainrate') < 638 or ::ReadingValDoIf($hash,'Sensor2','rainrate') < 638 or ::ReadingValDoIf($hash,'Sensor3','rainrate') < 222 or ::ReadingValDoIf($hash,'Sensor4','Regen') eq "on" or ::ReadingValDoIf($hash,'Sensor5','Raincounter','','diff2') > 5
devices:
0 Regen_Helligkeit_Daechle Sensor2 Sensor3 Sensor4 Sensor5
all Regen_Helligkeit_Daechle Sensor2 Sensor3 Sensor4 Sensor5
do:
0:
0 setreading WG_Wetter Regen on
1:
0 setreading WG_Wetter Regen off
helper:
event brightness1: 2137
globalinit 1
last_timer 0
sleeptimer -1
timerdev Regen_Helligkeit_Daechle
timerevent rainrate: 0
triggerDev Regen_Helligkeit_Daechle
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: Regen_Helligkeit_Daechle
state: cmd_1
timerevents:
rainrate: 0
timereventsState:
rainrate: 0
triggerEvents:
brightness1: 2137
triggerEventsState:
brightness1: 2137
internals:
itimer:
readings:
0 Regen_Helligkeit_Daechle:rainrate Sensor2:rainrate Sensor3:rainrate Sensor4:Regen Sensor5:Raincounter
all Regen_Helligkeit_Daechle:rainrate Sensor2:rainrate Sensor3:rainrate Sensor4:Regen Sensor5:Raincounter
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
room 0.03_Wintergarten
Bitte um Verständniss dass ich da etwas langsamer bin...
Wenn das läuft, wäre die Verzögerung um 10 Minuten der nächste Step...
Ich bin nicht sicher, ob man mit fake triggern diese Umgebung mit realen Sensoren testen kann.
Ich denke Du setzt zwar mit trigger einen trigger auf das DOIF, das liest aber anschließend die richtigen Werte aus:
rainrate: 0
Außerdem wertest Du ja readings aus, sendest aber einen Event mit Inhalt. Ich denke das geht nicht.
Teste doch mit einem dummy wo Du mit setreading das reading setzt?
Gruß Otto
Danke, kann ich tun. Mit realen Daten ist es aber genau so.
Es regnet in der Praxis selten. Ich konnte manuell und real den "Regen" auf on setzen. Weg bekomme ich ihn nicht mehr.
Der aktuelle Fall war doch aber dieser Auslöser
2019-08-09 15:45:07 e_Regen_Helligkeit_Daechle_rainrate 728
Damit ist ja die Bedingung nicht erfüllt [Regen_Helligkeit_Daechle:rainrate] < 638
Trotzdem geht er auf cmd 1
Er sagt aber condition c01: Argument "" isn't numeric in numeric lt
Das interpretiere ich so. Er will die etwas lesen, das ist aber leer.
Wenn jetzt alle Readings so stehen, dass cmd 2 kommen müsste: was macht er denn bei checkall?
ZitatWenn jetzt alle Readings so stehen, dass cmd 2 kommen müsste: was macht er denn bei checkall?
leider das:
2019.08.09 17:05:20.998 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 123765) line 1.
2019.08.09 17:05:20.998 3: eval: DOIF_Regen: warning in condition c01
Dann mach mal bitte folgendes:
list Regen_Helligkeit_Daechle rainrate
list Sensor2 rainrate
list Sensor3 rainrate
list Sensor4 Regen
list Sensor5 Raincounter
Und zeig mal die Ausgaben. :)
Zitat von: Otto123 am 09 August 2019, 17:36:19
Dann mach mal bitte folgendes:
list Regen_Helligkeit_Daechle rainrate
list Sensor2 rainrate
list Sensor3 rainrate
list Sensor4 Regen
list Sensor5 Raincounter
Und zeig mal die Ausgaben. :)
Danke, das war der richtige Ansatz. Es gibt bei mir gerade nicht alle dieser Sensoren. Somit konnte er wohl nie zu CMD2 kommen.
Somit habe ich diese vorerst mal drastisch reduziert.
Nun steht er auf "off".
Der Status:
Internals:
CFGFN
DEF ([Regen_Helligkeit_Daechle:rainrate] < 638
)
(setreading WG_Wetter Regen on)
DOELSE
(setreading WG_Wetter Regen off)
FUUID 5d4aa85b-f33f-0eb4-bf44-3c7507745053fb60
MODEL FHEM
NAME DOIF_Regen
NR 645
NTFY_ORDER 50-DOIF_Regen
STATE cmd_2
TYPE DOIF
VERSION 19786 2019-07-05 21:47:08
READINGS:
2019-08-10 10:27:55 Device Regen_Helligkeit_Daechle
2019-08-10 10:27:55 cmd 2
2019-08-10 10:27:55 cmd_event Regen_Helligkeit_Daechle
2019-08-10 10:27:55 cmd_nr 2
2019-08-10 10:27:55 e_Regen_Helligkeit_Daechle_rainrate 641
2019-08-10 10:26:25 mode enabled
2019-08-10 10:27:55 state cmd_2
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Regen_Helligkeit_Daechle','rainrate') < 638
devices:
0 Regen_Helligkeit_Daechle
all Regen_Helligkeit_Daechle
do:
0:
0 setreading WG_Wetter Regen on
1:
0 setreading WG_Wetter Regen off
helper:
event rainrate: 641
globalinit 1
last_timer 0
sleeptimer -1
timerdev Regen_Helligkeit_Daechle
timerevent rainrate: 641
triggerDev Regen_Helligkeit_Daechle
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: Regen_Helligkeit_Daechle
state: cmd_2
timerevents:
rainrate: 641
timereventsState:
rainrate: 641
triggerEvents:
rainrate: 641
triggerEventsState:
rainrate: 641
internals:
itimer:
readings:
0 Regen_Helligkeit_Daechle:rainrate
all Regen_Helligkeit_Daechle:rainrate
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
room 0.03_Wintergarten
Aktuell ist kein Regen (Schellwert: <638)
Internals:
DEF 101
FUUID 5cc45a41-f33f-0eb4-5b5c-3770d5bd09814baa
IODev mySensGwRS485
NAME Regen_Helligkeit_Daechle
NR 548
STATE received presentation
TYPE MYSENSORS_DEVICE
ack 0
radioId 101
repeater 0
READINGS:
2019-07-05 19:15:45 SKETCH_NAME Analog-Rain Light Sensor
2019-07-05 19:15:45 SKETCH_VERSION 0.2
2019-08-10 10:29:35 brightness1 1909
2019-07-05 19:15:45 parentId 0
2019-08-10 10:27:55 rainrate 641
2019-04-27 16:20:08 state received presentation
gets:
readingMappings:
0:
6:
name rain
7:
name rainrate
1:
23:
name brightness1
37:
name level1
sensorMappings:
0:
receives:
sends:
16
15
1:
receives:
sends:
16
15
10:
receives:
sends:
6
7
11:
receives:
sends:
11
12:
receives:
sends:
12
14
13:
receives:
24
sends:
17
18
54
55
56
24
14:
receives:
sends:
45
21
0
2
15:
receives:
sends:
13
43
16:
receives:
sends:
23
37
17:
receives:
sends:
18:
receives:
sends:
19:
receives:
36
sends:
36
2:
receives:
sends:
16
15
20:
receives:
32
sends:
33
50
32
21:
receives:
24
sends:
34
35
24
22:
receives:
sends:
37
43
23:
receives:
24
25
26
27
28
sends:
24
25
26
27
28
24:
receives:
sends:
37
43
25:
receives:
sends:
19
20
26:
receives:
40
17
3
sends:
40
17
3
27:
receives:
41
17
3
sends:
41
17
3
28:
receives:
40
sends:
40
29:
receives:
sends:
2
0
45
44
21
46
22
3:
receives:
2
17
sends:
2
17
30:
receives:
sends:
38
39
14
31:
receives:
sends:
2
16
32:
receives:
sends:
16
15
33:
receives:
sends:
37
16
15
34:
receives:
sends:
37
16
15
35:
receives:
sends:
37
16
15
36:
receives:
47
sends:
47
37:
receives:
sends:
34
35
38:
receives:
sends:
49
39:
receives:
sends:
0
51
52
53
2
4:
receives:
2
3
17
sends:
2
3
17
5:
receives:
29
30
31
3
sends:
29
30
31
3
6:
receives:
sends:
0
42
7:
receives:
sends:
1
8:
receives:
sends:
4
5
9:
receives:
sends:
8
9
10
setcommands:
sets:
clear noArg
flash noArg
fwType
reboot noArg
time noArg
typeMappings:
0:
type temperature
1:
type humidity
10:
type direction
11:
type uv
12:
type weight
13:
type distance
14:
type impedance
15:
type armed
val:
0 off
1 on
16:
type tripped
val:
0 off
1 on
17:
type power
18:
type energy
19:
type button_on
2:
type status
val:
0 off
1 on
20:
type button_off
21:
type hvacflowstate
22:
type hvacspeed
23:
type brightness
range:
max 100
min 0
step 1
24:
type value1
25:
type value2
26:
type value3
27:
type value4
28:
type value5
29:
type up
3:
type percentage
range:
max 100
min 0
step 1
30:
type down
31:
type stop
32:
type ir_send
33:
type ir_receive
34:
type flow
35:
type volume
36:
type lockstatus
val:
0 off
1 on
37:
type level
38:
type voltage
39:
type current
4:
type pressure
40:
type rgb
41:
type rgbw
42:
type id
43:
type unitprefix
44:
type hvacsetpointcool
45:
type hvacsetpointheat
46:
type hvacflowmode
47:
type text
48:
type custom
49:
type position
5:
type forecast
val:
0 stable
1 sunny
2 cloudy
3 unstable
4 thunderstorm
5 unknown
50:
type ir_record
51:
type ph
52:
type orp
53:
type ec
54:
type value
55:
type va
56:
type power_factor
6:
type rain
7:
type rainrate
8:
type wind
9:
type gust
Attributes:
IODev mySensGwRS485
group Umwelt
mapReading_brightness1 1 brightness
mapReading_level1 1 level
mapReading_rain 0 rain
mapReading_rainrate 0 rainrate
mode node
room 0.03_Wintergarten
Mir scheint es funktioniert !
Leider muss ich das ganze noch länger testen. Es scheint so als ob du Recht hattest und man die Werte nicht manuell triggern kann.
So bekomme ich den Regen nicht weg !
Zitattrigger Regen_Helligkeit_Daechle rainrate: 999
Ich bedanke mir nochmals und hoffe, dass das Thema damit erledigt ist.