[gelöst] DOIF soll über FHEM2FHEM neue Dummy erstellen

Begonnen von abc2006, 23 Dezember 2018, 21:32:56

Vorheriges Thema - Nächstes Thema

abc2006

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
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

rischbiter123

Moin,

versuch mal defmod statt define.

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

abc2006

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
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

abc2006

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
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX