Hallo zusammen,
ich habe einen DOIF erstellt. Dieser soll zum Sonnenuntergang oder wenn der Wind zu stark oder wenn der Gewitterwarner anschlägt die Markise einfahren. Aber nur wenn die Markise auch wirklich ausgefahren ist. Den Code siehe unten
Internals:
DEF (
(
[[Sonnenuntergang]] || [Windwarner] == "on" || [Gewitterwarner] == "on"
)
&& [Markise:position] > 0
)
(
set Markise up
)
FUUID 5c937ae4-f33f-ab72-e8dc-99b04ab41e1ad91e
MODEL FHEM
NAME di_Markise_zu
NR 213
NTFY_ORDER 50-di_Markise_zu
STATE cmd_2
TYPE DOIF
VERSION 18890 2019-03-13 18:56:41
Helper:
DBLOG:
cmd:
logmysql:
TIME 1563965813.83629
VALUE 2
cmd_event:
logmysql:
TIME 1563965813.83629
VALUE di_Markise_zu
cmd_nr:
logmysql:
TIME 1563965813.83629
VALUE 2
error:
logmysql:
TIME 1563965800.16069
VALUE condition c01
mode:
logmysql:
TIME 1563965812.83145
VALUE enabled
state:
logmysql:
TIME 1563965813.83629
VALUE cmd_2
warning:
logmysql:
TIME 1563965980.21711
VALUE condition c01
READINGS:
2019-07-24 12:59:40 Device Windwarner
2019-07-24 12:56:53 cmd 2
2019-07-24 12:56:53 cmd_event di_Markise_zu
2019-07-24 12:56:53 cmd_nr 2
2019-07-24 12:59:40 e_Windwarner_STATE off
2019-07-24 12:56:52 mode enabled
2019-07-24 12:56:53 state cmd_2
2019-07-24 12:56:52 timer_01_c01 24.07.2019 21:00:00
2019-07-24 12:59:40 warning condition c01: Argument "off" isn't numeric in numeric eq (==)
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0 ( ::DOIF_time_once($hash,0,$wday) || ::InternalDoIf($hash,'Windwarner','STATE') == "on" || ::InternalDoIf($hash,'Gewitterwarner','STATE') == "on" ) && ::ReadingValDoIf($hash,'Markise','position') > 0
days:
devices:
0 Windwarner Gewitterwarner Markise
all Windwarner Gewitterwarner Markise
do:
0:
0 set Markise up
1:
helper:
event off
globalinit 1
last_timer 1
sleeptimer -1
timerdev Windwarner
timerevent off
triggerDev Windwarner
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: di_Markise_zu
state: cmd_2
timerevents:
off
timereventsState:
state: off
triggerEvents:
off
triggerEventsState:
state: off
internals:
0 Windwarner:STATE Gewitterwarner:STATE
all Windwarner:STATE Gewitterwarner:STATE
intervalfunc:
itimer:
all Sonnenuntergang
localtime:
0 1563994800
readings:
0 Markise:position
all Markise:position
realtime:
0 21:00:00
time:
0 [Sonnenuntergang]
timeCond:
0 0
timer:
0 0
timers:
0 0
trigger:
triggertime:
1563994800:
localtime 1563994800
hash:
uiState:
uiTable:
Attributes:
Es kommt aber der Fehler "condition c01: Argument "off" isn't numeric in numeric eq (==)". Was ist denn hier der Fehler? Ist mein ersten größeres DOIF. Passen die Operatoren, muss ich die Parameter noch irgenwie casten?
Vielen Dank!
Grüße Martin
Falscher Operator du musst eq statt == vewenden.
ok vielen Dank, dachte ich mir schon, dass das sowas ist.
Gibt es eine Liste mit den ganzen Operatoren? Ich finden nur welche für Perl... Das sollte eigentlich in den Einsteigerleitfaden.
Grüße Martin
ZitatDie Unterscheidung wird also nicht zum Zeitpunkt der Variablendeklaration durchgeführt, sondern
durch die Auswahl des Operators (hier > oder gt). Daher merke:
<, >, <=, >=, ==, != sind numerische Operatoren
lt, gt, le, ge, eq, ne sind die entsprechenden Stringvergleichsoperatoren
Seite 40 Einsteigerleitfaden ;D
Aha, leider steht das nicht im entsprechenden wiki-Artikel. Da hatte ich zuerst geschaut. Generell habe ich diese Hinweise im Wiki nicht so wirklich gefunden.
Dankeschön! :D