Hi,
ich habe eine FHEM-Instanz("fhem"), bei der Temperaturdevices angelegt sind. Diese erzeugen regelmäßig Events, die per FHEM2FHEM auf eine weitere Instanz("hzfhem") übertragen werden.
Dort könnte (und kann) ich jetzt alle devices anlegen, um dann mit einem DOIF oder einem Notify die Temperaturen in die Devices zu aktualisieren.
Leider bin ich aber zu faul, alle Temperatursensoren (ich glaub es sind 30 Stück) von hand anzulegen
(und es müsste ja auch irgendwie automatisch gehen...).
Deshalb habe ich folgendes DOIF gebaut, welches nicht funktioniert, und ich weiss nicht, warum.
Hier erstmal die Devices:
FHEM2FHEM:
Internals:
DEF 192.168.0.30 LOG:RE_TEMP.*|D_HZfhem.*|PID.*
FD 8
Host 192.168.0.30:7072
NAME fhemTOhzfhem
NR 18
PARTIAL
STATE connected
TYPE FHEM2FHEM
informType LOG
regexp RE_TEMP.*|D_HZfhem.*|PID.*
Attributes:
room FHEM2FHEM
DOIF:
Internals:
DEF (["RE_TEMP"])({
my ($reading,$value) = split(/ /,"$EVENT");
chop $reading;
Log3(undef, 0, "DF_F2F Device: $DEVICE Event: $EVENT");
if(ReadingsVal("$DEVICE","temperature","error") eq "error"){
Log3(undef, 0, "DF_F2F Event: $EVENT");
Log3(undef, 0, "DF_F2F Events: $EVENTS");
Log3(undef, 0, "DF_F2F Device: $DEVICE");
Log3(undef, 0, "DF_F2F Value: $value");
Log3(undef, 0, "DF_F2F Reading: $reading");
my $order = "define $DEVICE dummy";
Log3(undef, 0, "DF_F2F Order: _".$order."_");
fhem("$order");
##fhem("attr $DEVICE room FHEM2FHEM");
##fhem("setreading $DEVICE $reading $value");
} else {
##fhem("setreading $DEVICE $reading $value");
}
})
MODEL FHEM
NAME DF_F2F
NR 40
NTFY_ORDER 50-DF_F2F
STATE cmd_1
TYPE DOIF
READINGS:
2018-12-23 21:23:18 Device RE_TEMP_BRT
2018-12-23 21:09:02 _device RE_TEMP_BRT
2018-12-23 21:09:02 _event temperature: 21.75
2018-12-23 21:09:02 _events temperature: 21.75
2018-12-23 21:09:02 _order define RE_TEMP_BRT dummy
2018-12-23 21:09:02 _reading temperature
2018-12-16 21:32:05 _reading_dbl temperature
2018-12-23 21:09:02 _value 21.75
2018-12-23 21:23:18 cmd 1
2018-12-23 21:23:18 cmd_event RE_TEMP_BRT
2018-12-23 21:23:18 cmd_nr 1
2018-12-23 21:23:18 error { my ($reading,$value) = split(/ /,"temperature: 23.75"); chop $reading; Log3(undef, 0, "DF_F2F Device: RE_TEMP_BRT Event: temperature: 23.75"); if(ReadingsVal("RE_TEMP_BRT","temperature","error") eq "error"){ Log3(undef, 0, "DF_F2F Event: temperature: 23.75"); Log3(undef, 0, "DF_F2F Events: temperature: 23.75"); Log3(undef, 0, "DF_F2F Device: RE_TEMP_BRT"); Log3(undef, 0, "DF_F2F Value: $value"); Log3(undef, 0, "DF_F2F Reading: $reading"); my $order = "define RE_TEMP_BRT dummy"; Log3(undef, 0, "DF_F2F Order: _".$order."_"); fhem("$order"); } else { } }: RE_TEMP_BRT already defined, delete it first
2018-12-23 21:14:02 mode enabled
2018-12-23 21:23:18 state cmd_1
Regex:
cond:
:
0:
"RE_TEMP" RE_TEMP
attr:
cmdState:
wait:
waitdel:
condition:
0 ::EventDoIf('RE_TEMP',$hash,'',0)
devices:
do:
0:
0 { my ($reading,$value) = split(/ /,"$EVENT"); chop $reading; Log3(undef, 0, "DF_F2F Device: $DEVICE Event: $EVENT"); if(ReadingsVal("$DEVICE","temperature","error") eq "error"){ Log3(undef, 0, "DF_F2F Event: $EVENT"); Log3(undef, 0, "DF_F2F Events: $EVENTS"); Log3(undef, 0, "DF_F2F Device: $DEVICE"); Log3(undef, 0, "DF_F2F Value: $value"); Log3(undef, 0, "DF_F2F Reading: $reading"); my $order = "define $DEVICE dummy"; Log3(undef, 0, "DF_F2F Order: _".$order."_"); fhem("$order"); } else { } }
1:
helper:
event temperature: 23.75
globalinit 1
last_timer 0
sleeptimer -1
timerdev RE_TEMP_BRT
timerevent temperature: 23.75
triggerDev RE_TEMP_BRT
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: RE_TEMP_BRT
error: { my ($reading,$value) = split(/ /,"temperature: 23.75"); chop $reading; Log3(undef, 0, "DF_F2F Device: RE_TEMP_BRT Event: temperature: 23.75"); if(ReadingsVal("RE_TEMP_BRT","temperature","error") eq "error"){ Log3(undef, 0, "DF_F2F Event: temperature: 23.75"); Log3(undef, 0, "DF_F2F Events: temperature: 23.75"); Log3(undef, 0, "DF_F2F Device: RE_TEMP_BRT"); Log3(undef, 0, "DF_F2F Value: $value"); Log3(undef, 0, "DF_F2F Reading: $reading"); my $order = "define RE_TEMP_BRT dummy"; Log3(undef, 0, "DF_F2F Order: _".$order."_"); fhem("$order"); } else { } }: RE_TEMP_BRT already defined, delete it first
state: cmd_1
timerevents:
temperature: 23.75
timereventsState:
temperature: 23.75
triggerEvents:
temperature: 23.75
triggerEventsState:
temperature: 23.75
internals:
itimer:
readings:
trigger:
uiState:
uiTable:
Attributes:
do always
room FHEM2FHEM,_doif
Bei einem ankommenden Event reagiert das DOIF und loggt auch fleissig mit:
2018.12.23 21:24:33.018 0: DF_F2F Device: RE_TEMP_BRT Event: temperature: 22.75
2018.12.23 21:24:33.019 0: DF_F2F Event: temperature: 22.75
2018.12.23 21:24:33.019 0: DF_F2F Events: temperature: 22.75
2018.12.23 21:24:33.019 0: DF_F2F Device: RE_TEMP_BRT
2018.12.23 21:24:33.020 0: DF_F2F Value: 22.75
2018.12.23 21:24:33.020 0: DF_F2F Reading: temperature
2018.12.23 21:24:33.020 0: DF_F2F Order: _define RE_TEMP_BRT dummy_
Soweit, sogut. Nur: ein neues Device wird nicht angelegt.
Der Grund dafür:
2018-12-23 21:23:18 error [...] : RE_TEMP_BRT already defined, delete it first
Aber: Es gibt kein Device RE_TEMP_BRT.:
No device named RE_TEMP_BRT found
Es gibt auch ein FHEM2FHEM in die andere Richtung(auf "fhem", natürlich), dort sind aber keinerlei Event, die mit RE_TEMP anfangen, gelistet: (damit wäre ja eine Schleife ausgeschlossen)
Internals:
DEF 192.168.0.32 LOG:OWX.*|Endschalter.*
FD 20
Host 192.168.0.32:7072
NAME hzfhemTOfhem
NR 735
PARTIAL
STATE connected
TYPE FHEM2FHEM
informType LOG
regexp OWX.*|Endschalter.*
Attributes:
room FHEM2FHEM
Ich hab keine Ideen mehr... Kann jemand helfen?
Danke schonmal und ein schönes Weihnachtsfest - ist ja nicht mehr weit ... :)
Stephan
Moin,
versuch mal defmod statt define.
LG
Andreas
Hey,
danke erstmal für deine Antwort.
Ich hab vorhin noch überlegt, ob ich dem ne Zeile widme, und dachte, es ist selbsterklärend.
Dann aber hier nochmal meine Gedanken dazu:
Mit defmod bekomm ich natürlich den Fehler(=Symptome) in den Griff, weil fhem sich nicht mehr beschwert, dass das Device bereits vorhanden ist.
Aber: Angelegt werden sie trotzdem nicht ...
Grüße,
Stephan
Hi,
also, offenbar war das Problem, dass sich das DOIF mit dem erstellen von einem Device mit gleichem Namen selbst getriggert hätte. Hab jetzt den Namen der Devices auf dem Zielsystem abgeändert, schon gehts einwandfrei!
Grüße,
Stephan