MQTT2 und owntracks: Automatischer Wechsel des Monitoring-Modes mit DOIF

Begonnen von h002, 22 Dezember 2023, 14:21:49

Vorheriges Thema - Nächstes Thema

h002

Über ein Notify möchte ich ein set-Kommando für mein MQTT2_DEVICE absetzen, wenn sich in diesem das Reading "tst" ändert. Das MQTT2-Device löst das Event für das Reading "tst" aus (Event-Monitor) und ich kann auch im Log sehen, dass der IF-Zweig des Notifys mit "fhem("set $NAME signifikant")" reagiert. Allerdings hat das "set" bei dem MQTT2-Device keine Auswirkung. Auch wenn ich $NAME mit dem konkreten Device "MQTT2_owntracks_mobil" ersetze, passiert nichts.

Führe ich folgende Kommandos (FHEMWEB) direkt über die FHEM Web UI aus, ändert sich der Modus (signifikant) des MQTT2-Devices sofort.

- {fhem("set MQTT2_owntracks_mobil signifikant")}
- set MQTT2_owntracks_mobil signifikant


Mein Versuch mit einem DOIF hat auch nichts gebracht und es verhält sich wie das Notify. Ich habe hier keine Idee mehr, was ich noch prüfen könnte. Hat jemand Tipps? Vielen Dank!

List vom Notify

Internals:
   DEF        MQTT2_owntracks_.*:tst.* {
    Log 1, "Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT";
    if ( Value("presence.phone.user") eq "absent" and ReadingsVal("$NAME","m",0) != 2) {       
        ##fhem("set $NAME signifikant");
        fhem("set $NAME signifikant");
       
       
    }
    if ( Value("presence.phone.user") eq "present" ) {
        fhem("set $NAME manual");
    }
}
   FUUID      658574c9-f33f-8b20-1f24-b0f815701c15c7d6
   NAME       testNotify
   NOTIFYDEV  MQTT2_owntracks_.*
   NR         997
   NTFY_ORDER 50-testNotify
   REGEXP     MQTT2_owntracks_.*:tst.*
   STATE      2023-12-22 13:56:31
   TRIGGERTIME 1703249791.97355
   TYPE       notify
   eventCount 16
   READINGS:
     2023-12-22 13:48:30   state           active
     2023-12-22 13:56:31   triggeredByDev  MQTT2_owntracks_mobil
     2023-12-22 13:56:31   triggeredByEvent tst: 1703249383
Attributes:

List vom MQTT2_DEVICE

Internals:
   CID        owntracks_mobil
   DEF        owntracks_mobil
   FUUID      647ee545-f33f-8b20-70f8-a09071b8941244f0
   IODev      MQTTClient
   LASTInputDev MQTTClient
   MQTTClient_MSGCNT 114
   MQTTClient_TIME 2023-12-22 14:00:59
   MSGCNT     114
   NAME       MQTT2_owntracks_mobil
   NR         210
   STATE      absent
   TYPE       MQTT2_DEVICE
   eventCount 116
   READINGS:     
     2023-12-22 11:15:39   IODev           MQTTClient     
     2023-12-22 14:00:59   _type           cmd
     2023-12-22 13:56:32   acc             40
     2023-12-22 14:00:59   action          setConfiguration
     2023-06-28 17:29:01   associatedWith  MQTTClient_Bridge
     2023-12-22 13:56:32   batt            100
     2023-12-22 13:56:32   bs              3
     2023-12-22 14:00:59   configuration__type configuration
     2023-12-22 14:00:59   configuration_monitoring 1
     2023-12-22 13:56:32   conn            m
     2023-12-22 13:56:32   created_at      1703249791
     2023-12-22 11:49:48   desc            Home
     2023-12-22 11:49:48   event           enter
     2023-12-22 13:56:32   inregions_1     Home
     2023-09-29 11:54:03   name            user
     2023-06-27 10:17:41   rad             300
     2023-12-22 14:00:59   state           signifikant     
     2023-12-22 14:00:59   tst             1703249757     
     2023-12-22 11:30:17   wlanPresence    absent
     
Attributes:
   alias      User Telefon
   event-on-change-reading (?!face).*
   readingList owntracks/user/mobil:.* { json2nameValue($EVENT) }
owntracks/user/mobil/waypoints:.* { json2nameValue($EVENT) }
owntracks/user/mobil/event:.* { json2nameValue($EVENT) }
owntracks/user/mobil/cmd:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    report owntracks/user/mobil/cmd {"_type":"cmd","action":"reportLocation"}
move owntracks/user/mobil/cmd {"_type":"cmd","action":"setConfiguration","configuration":{"_type":"configuration","monitoring":2}}
signifikant owntracks/user/mobil/cmd {"_type":"cmd","action":"setConfiguration","configuration":{"_type":"configuration","monitoring":1}}
silent owntracks/user/mobil/cmd {"_type":"cmd","action":"setConfiguration","configuration":{"_type":"configuration","monitoring":-1}}
manual owntracks/user/mobil/cmd {"_type":"cmd","action":"setConfiguration","configuration":{"_type":"configuration","monitoring":0}}
   stateFormat wlanPresence

Otto123

Hi,

Du willst ein Reading durch ein notify in dem Device setzen, welches das notify getriggert hat. Das unterbindet FHEM mMn wegen der Gefahr von Endlosschleifen?

eventuell Abhilfe: sleep 0.1; set ....

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Hallo,

wegen event-on-change-reading (?!face).* gibts gar kein Event auf dass das notify triggern könnte, meine Vermutung.

edit:
ZitatDu willst ein Reading durch ein notify in dem Device setzen, ...

Da steht nirgendwo was von setreading, ich seh nur das set-Befehle ausgeführt werden sollen ?

h002

Zitat von: TomLee am 22 Dezember 2023, 14:28:03wegen event-on-change-reading (?!face).* gibts gar kein Event auf dass das notify triggern könnte, meine Vermutung.

Wie geschrieben, der Trigger funktioniert, das Notify registriert das Event korrekt.

(?!face).* bedeutet, alles triggern aus "face" - so meine Vorstellung. ;-)

Otto123

Zitat von: TomLee am 22 Dezember 2023, 14:28:03Da steht nirgendwo was von setreading, ich seh nur das set-Befehle ausgeführt werden sollen ?
setreading erzeugt keinen Event in der Konstellation.

Währenddessen, ich sehe das notify hat getriggert. ;)

Aber mein Ansatz ist derzeit nur eine Ahnung, ich muss nicht richtig liegen.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ok, ich sehe ein das ich zu vorschnell war, bestätigt halt wieder unseren Oberlehrer.

Value("presence.phone.user") eq "absent"
steht in STATE wirklich nur pesent oder absent ?

Wieder vorschnell, ohne es zuvor auszuprobieren ich frage allgemein:
ReadingsVal("$NAME","m",0) != 2
Funzt sowas, wenn man einen String mit einem numerischen Wert vergleicht ?

h002

Kann sein, dass es da noch "Formfehler" beim IF gibt. Ich korrigiere das mit "ne". Ich habe ja auch geschrieben, dass ich in den IF-Zweig komme. Die Bedingung wird also als "wahr" interpretiert und die Kommandos ohne erkennbare Fehler im Log ausgeführt.

fhem("sleep 0.1; set MQTT2_owntracks_mobil signifikant"); funktioniert leider auch nicht - aus dem Notify. Über FHEMWEB mit {fhem("sleep 4;;set MQTT2_owntracks_mobil signifikant")} allerdings geht es.

Otto123

Dann liege ich falsch, aber beim nachdenken fällt mir auf: Ist sinnvoll set MQTT2_owntracks_mobil signifikant zu machen und damit den state zu setzen? Setzt das Device den nicht selbst? Was ist wenn das Device kurz nach dem set den state selbst neu setzt - anders als in "Ruhe"?
Hast mal mit dem Eventmonitor geschaut?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

h002

Zitat von: Otto123 am 22 Dezember 2023, 15:07:17Ist sinnvoll set MQTT2_owntracks_mobil signifikant zu machen und damit den state zu setzen? Setzt das Device den nicht selbst? Was ist wenn das Device kurz nach dem set den state selbst neu setzt - anders als in "Ruhe"?
Hast mal mit dem Eventmonitor geschaut?

Den Ansatz habe ich eben mal verfolgt und versucht mittels
fhem("set MQTTClient publish owntracks/user/mobil/cmd {\"_type\":\"cmd\",\"action\":\"setConfiguration\",\"configuration\":{\"_type\":\"configuration\",\"monitoring\":1}} "); im Notify den Monitoring-Mode zu setzen. Auch hier das gleiche Ergebnis. Setze ich das Kommando wieder über FHEMWEB ab, klappt es.

Der Event-Monitor liefert
MQTT2_DEVICE MQTT2_owntracks_mobil tst: 1703255016 und im Notify steht im Reading "triggeredByEvent" ebenfalls "1703255016". Auch ein nachträglich eingefügtes Log 1, "test"; im IF-Zweig zeigt mir, dass er wirklich aus dem Notify das Kommando ausführen müsst.

frank

und was steht in fhem.log?
der eventmonitor mit option log zeigt nicht alles!!!
also in die echte datei schauen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Otto123

sorry ich begreife gerade erst was Du eigentlich machen willst  :-X - ich habe Blödsinn geredet.

Ich meine jetzt: die Frage ist, ob der set Befehl beim owntracks Device wirklich ankommt, nicht ob der set Befehl abgesetzt wird. Den publish Befehl kannst Du im MQTT2_Server sehen.

Nur zur Info: mein Ansatz seinerzeit in der setlist im MQTT2 Device:
mode:Quite,Manual,Significant,Move { my %h=(Quite=>'-1',Manual=>'0',Significant=>'1',Move=>'2');fhem("set $NAME config ".qq({"_type":"configuration","monitoring":$h{$EVTPART1}})) }
Ich weiß aber, das dieses setzen sensibel war und nicht immer funktioniert hat. Also eventuell musst Du den sleep im notify einfach mal im Sekundenbereich versuchen.
Ich wollte damals zu Hause "Strom sparen" und hohe Genauigkeit nur beim Fahren haben. Das habe ich irgendwann wieder aufgegeben.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

Ich habe jetzt mal etwas rumprobiert und Deine event-on-change Einstellung übernommen.
Mein notify, das sleep ist nur zur Sicherheit, spielt aber keine Rolle.
defmod MQTT2_owntracks_mi6_notify_1 notify MQTT2_owntracks_mi6:timestamp:.* sleep 3;; set MQTT2_owntracks_mi6 mode Manual
Dabei fällt mir auf: der Modus quite erzeugt keine Events. Ansonsten funktioniert das notify, egal was (und wo) ich als Modus einstelle, er macht immer wieder manual draus.
Man sieht das auch im Eventmonitor gut
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 raw: {"_type":"location","BSSID":"c4:41:1e:37:57:ca","SSID":"LEDE-1996","acc":10,"alt":155,"batt":60,"bs":1,"conn":"w","created_at":1703261502,"inregions":["zuHause"],"lat":5x.xxxxxx,"lon":1x.xxxxxx,"m":1,"tid":"hk","tst":1703261491,"vac":6,"vel":0}
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 accuracy: 10
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 longitude: 1x.xxxxxx
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 m: 1
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 accuracyVertical: 6
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 timestamp: 1703261491
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 latitude: 5x.xxxxxx
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 created_at: 1703261502
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 location: 5x.xxxxxx,1x.xxxxxx
2023-12-22 17:11:43 MQTT2_DEVICE MQTT2_owntracks_mi6 location_url: https://maps.google.com/maps?hl=en&q=5x.xxxxxx,1x.xxxxxx&t=k&z=19&ie=UTF8&iwloc=&output=embed
2023-12-22 17:11:46 MQTT2_DEVICE MQTT2_owntracks_mi6 raw: {"_type":"cmd","action":"setConfiguration","configuration":{"_type":"configuration","monitoring":0}}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

h002

Vielen lieben Dank für euren wertvollen Input und die Zeit. Hat mich motiviert, weiter nach einer Lösung zu suchen. :-)

Zitat von: Otto123 am 22 Dezember 2023, 16:07:04Ich wollte damals zu Hause "Strom sparen" und hohe Genauigkeit nur beim Fahren haben. Das habe ich irgendwann wieder aufgegeben.
Genau das ist der Grund. Das Ganze wird noch mit dem PRESENCE-Modul verbunden und sobald das Telefon zu Hause ist, soll owntracks den Modus "manual" aktivieren, damit der Akku geschont wird. Bin ich außerhalb vom WLAN, soll auf "signifikant" geschalten werden. Sollte ich unterwegs manuell auf "Move" schalten, soll nix passieren.

Ich weiß, auch ein Notify würde reichen, aber bin nun doch wieder bei einem DOIF gelandet. Grund ist auch, dass ich mit DOIF etwas Erfahrung habe und nicht "zweigleisig" fahren wollte. Außerdem finde ich es angenehmer, alle zu verarbeitenden Events für einen konkreten Anwendungsfall in einem DOIF zu haben, anstatt mehrere Notify zu nutzen.

Vermutlich hing es wirklich damit zusammen, dass ich bei dem MQTT-Device den Monitoring-Mode auf dem "state" gesetzt habe. Anbei mein DOIF (muss noch "optimiert" werden) und ich schaue mal, was der Alltag bringt.

Internals:
   DEF        setReadings {
if ( ["presence.phone"] ) {
set_Reading("$DEVICE",Value("$DEVICE"),1);
}
if ( ["MQTT2_owntracks:tst"] ) {
if ( get_Reading("presence.phone.user") eq "present") {
fhem("set $SELF user manual");
} elsif ( get_Reading("presence.phone.user") eq "absent" and ReadingsVal("$DEVICE","m",0) ne "2" ) {
fhem("set $SELF user signifikant");
}
if ( get_Reading("presence.phone.user2") eq "present") {
fhem("set $SELF user2 manual");
} elsif ( get_Reading("presence.phone.user2") eq "absent" and ReadingsVal("$DEVICE","m",0) ne "2" ) {
fhem("set $SELF user2 signifikant");
}
##set_Reading("$DEVICE",ReadingsVal("$DEVICE","tst",0),1);
}
}

setMode {
if ( ["$SELF:(user|user2)"] ) {
my $command;
my $mode;
my $topic;
my $dev = "$EVENT";

if ( $dev =~ m/user2/ ) {
$dev = "MQTT2_owntracks_mobil2";
$mode = get_Reading("user2");
$topic = "owntracks/user2/mobil2/cmd";

}
if ( $dev =~ m/user/ ) {
$dev = "MQTT2_owntracks_mobil";
$mode = get_Reading("user");
$topic = "owntracks/user/mobil/cmd";
}

if ( $mode eq "report" ) {
$command = $topic . " {\"_type\":\"cmd\",\"action\":\"reportLocation\"}";
} else {
$command = $topic . " {\"_type\":\"cmd\",\"action\":\"setConfiguration\",\"configuration\":{\"_type\":\"configuration\",\"monitoring\":$mode\}\}";
}
Log 1, "Device: $DEVICE Event: $EVENT Events: $EVENTS $command";
fhem("set MQTTClient publish $command");
}
}
   FUUID      63558f3b-f33f-8b20-0b53-34c4a82e4a65feee
   MODEL      Perl
   NAME       owntracks_mode
   NOTIFYDEV  .*(presence.phone).*,.*(MQTT2_owntracks).*,global,.*(owntracks_mode).*
   NR         185
   NTFY_ORDER 50-owntracks_mode
   STATE      initialized
   TYPE       DOIF
   VERSION    27740 2023-07-10 09:31:11
   eventCount 168
   OLDREADINGS:
   READINGS:
     2023-12-22 21:23:22   Device          MQTT2_owntracks_mobil
     2023-12-22 20:01:49   MQTT2_owntracks_mobil 1703271408
     2023-12-22 19:59:23   MQTT2_owntracks_mobil2 1703271263
     2023-12-22 21:23:22   block_setMode   executed
     2023-12-22 21:23:22   block_setReadings executed
     2023-12-22 21:23:22   user            1
     2023-12-22 21:06:14   mode            enabled
     2023-12-22 21:08:35   presence.phone.user absent
     2023-12-22 21:06:14   state           initialized
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       :
         0:
           "MQTT2_owntracks:tst" MQTT2_owntracks:tst
           "presence.phone" presence.phone
         1:
           "owntracks_mode:(user|user2)" owntracks_mode:(user|user2)
   condition:
     0         
if ( ::EventDoIf('presence.phone',$hash,'',0) ) {
set_Reading("$DEVICE",Value("$DEVICE"),1);
}
if ( ::EventDoIf('MQTT2_owntracks',$hash,'tst',0) ) {
if ( get_Reading("presence.phone.user") eq "present") {
fhem("set owntracks_mode user manual");
} elsif ( get_Reading("presence.phone.user") eq "absent" and ReadingsVal("$DEVICE","m",0) ne "2" ) {
fhem("set owntracks_mode user signifikant");
}
if ( get_Reading("presence.phone.user2") eq "present") {
fhem("set owntracks_mode user2 manual");
} elsif ( get_Reading("presence.phone.user2") eq "absent" and ReadingsVal("$DEVICE","m",0) ne "2" ) {
fhem("set owntracks_mode user2 signifikant");
}
}

     1         
if ( ::EventDoIf('owntracks_mode',$hash,'(user|user2)',0) ) {
my $command;
my $mode;
my $topic;
my $dev = "$EVENT";

if ( $dev =~ m/user2/ ) {
$dev = "MQTT2_owntracks_mobil2";
$mode = get_Reading("user2");
$topic = "owntracks/user2/mobil2/cmd";

}
if ( $dev =~ m/user/ ) {
$dev = "MQTT2_owntracks_mobil";
$mode = get_Reading("user");
$topic = "owntracks/user/mobil/cmd";
}

if ( $mode eq "report" ) {
$command = $topic . " {\"_type\":\"cmd\",\"action\":\"reportLocation\"}";
} else {
$command = $topic . " {\"_type\":\"cmd\",\"action\":\"setConfiguration\",\"configuration\":{\"_type\":\"configuration\",\"monitoring\":$mode\}\}";
}
Log 1, "Device: $DEVICE Event: $EVENT Events: $EVENTS $command";
fhem("set MQTTClient publish $command");
}

   helper:
     NOTIFYDEV  .*(presence.phone).*,.*(MQTT2_owntracks).*,global,.*(owntracks_mode).*
     event      user: signifikant
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev owntracks_mode
     triggerEvents:
       user: signifikant
       block_setMode: executed
     triggerEventsState:
       user: signifikant
       block_setMode: executed
   internals:
   perlblock:
     0          setReadings
     1          setMode
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   eventMap   -1:silent 0:manual 1:signifikant 2:move
   readingList user
   room       DOIF,MQTT2_DEVICE
   setList    user2:report,move,signifikant,silent,manual
user:report,move,signifikant,silent,manual


h002

Danke Otto für deine Hinweise zum setList am MQTT Device. Damit habe ich mich noch mal beschäftigt, da ich anfangs dazu noch Verständnisprobleme bei der Perl-Syntax ( z.B. qq() oder %var für hash-List) hatte und nicht weiter drüber nachgedacht habe.

Ich nutze einen eigenen MQTT-Server und owntracks auf meinen Android-Telefonen. Bei owntracks kann man die Fernkonfiguration aktivieren und über FHEM den Monitoring-Mode der Geräte ändern oder abfragen (report), wo sich das Gerät aktuell befindet. owntracks sendet aller 5 Minuten einen Timestamp ( Reading tst), egal in welchem Monitoring-Mode man ist. Darauf kann mein DOIF reagieren und ich kann den Monitoring-Mode automatisiert ändern. Die Nutzer müssen also nichts manuell ändern und die Geräte sparen, wenn zu Hause, eine Menge Strom.

Das setList für das MQTT2_DEVICE sieht jetzt so aus (formatiert für bessere Lesbarkeit - ansonsten ist es ein Einzeiler):

mode:report,silent,manual,signifikant,move {
    my %mode_mapping = (report => 'report', silent => '-1', manual => '0', signifikant => '1', move => '2');
    if ( $mode_mapping{$EVTPART1} eq 'report' ) {
        return "$DEVICETOPIC " . qq({"_type":"cmd","action":"reportLocation"});
    } else {
        return "$DEVICETOPIC " . qq({"_type":"cmd","action":"setConfiguration","configuration":{"_type":"configuration","monitoring":$mode_mapping{$EVTPART1}}});
    }
}

Die Definition des DOIF sieht wie folgt aus:

#In der Bedingung und im Ausführungsteil werden die Schlüsselwörter $SELF durch den eigenen Namen des DOIF-Moduls,
#$DEVICE durch das aktuelle Device, $EVENT durch die passende Eventzeile, $EVENTS kommagetrennt durch alle Eventzeilen
#des Triggers ersetzt.
#-1 Quiet
#0 Manual
#1 Significant
#2 Move
checkWLANPresenceEvents {
##Check WLAN Presence - nur sich der Status des WLAN-Devices ändert, wird der Monitoring-Mode geändert
    if ( ["presence.phone"] ) {
        fhem("set " . AttrVal('$DEVICE','MQTTDevice',0) . " mode signifikant");
    }
    Log 1, "WLAN-Status $DEVICE auf $EVENT. Monitoring-Mode von MQTT-Device " . AttrVal('$DEVICE','MQTTDevice',0) . " auf signifikant gesetzt.";
}
setMonitoringMode {
    if ( ["MQTT2_owntracks_:tst"] ) {
        my $phoneWLANDevice = AttrVal("$DEVICE","WLANDev",0);
        my $monitoringMode;
        my $actMonitoringMode;
        my $ageLastWLANStateSec;
        my $actWLANState;
        my $ageLastLocation;
        my $setMonitoringMode = 0;
        ##aktueller WLAN-Status des MQTT-Device
        $actWLANState = ReadingsVal("$phoneWLANDevice","state",0);
        ##Alter des letzten Readings vom presence-Device in Sekunden
        $ageLastWLANStateSec = OldReadingsAge("$phoneWLANDevice","state",0);
        ##Alter des letzten Standorts vom MQTT-Devices
        $ageLastLocation = OldReadingsAge("$DEVICE","lat",0);
        ##Aktuell hinterlegter Monitoring-Mode des MQTT-Devices
        $actMonitoringMode = ReadingsVal("$DEVICE","m",0);
        ##wiederholt auf manual setzen, wenn letzter presenter WLAN-Status nicht älter 15 Minuten ist
        if ( $actWLANState eq "present" and $ageLastWLANStateSec < 900 ) {
            fhem("set $DEVICE mode manual");
            Log 1, "$DEVICE $EVENT: Monitoring-Mode auf manual gesetzt."
        }
        if ( $actWLANState eq "absent" and $actMonitoringMode ne "2") {
            fhem("set $DEVICE mode signifikant");
            fhem("set $DEVICE mode report");
            Log 1, "$DEVICE $EVENT: Monitoring-Mode auf signifikant gesetzt."
        }
        if ( $actWLANState eq "absent" and $actMonitoringMode eq "2") {
            fhem("set $DEVICE mode move");
            Log 1, "$DEVICE $EVENT: Monitoring-Mode auf move gesetzt."
        }
    }
}

Die Definitionen sind jetzt aus meiner Sicht generischer. Die Geräte vom Typ MQTT2_DEVICE und PRESENCE haben ein Attribut, wo jeweils das andere Gerät in Beziehung gesetzt wurde und ich dies in dem DOIF nutzen kann.

Bis jetzt läuft alles zuverlässig. Vielleicht helfen die Infos jemandem weiter.

Hier zur Vollständigkeit noch ein list eines MQTT2-Devices:

Internals:
   CID        owntracks_phone1
   DEF        owntracks_phone1
   FUUID      647ee545-f33f-8b20-70f8-a0907ef3341244f0
   IODev      MQTTClient
   LASTInputDev MQTTClient
   MQTTClient_MSGCNT 1052
   MQTTClient_TIME 2023-12-26 12:08:29
   MSGCNT     1052
   NAME       MQTT2_owntracks_phone1
   NR         210
   STATE      1
   TYPE       MQTT2_DEVICE
   eventCount 1057
   OLDREADINGS:
     2023-12-26 12:04:46   lat             xxx
   READINGS:
     2023-12-26 12:08:29   BSSID           xx:xx:xx:xx:xx:xx
     2023-12-26 12:08:29   SSID            xx
     2023-12-26 12:08:29   _type           cmd
     2023-12-26 12:08:29   acc             7
     2023-12-26 12:08:29   action          setConfiguration
     2023-12-26 12:08:29   alt             208
     2023-12-26 12:08:29   batt            43
     2023-12-26 12:08:29   bs              1
     2023-12-26 12:08:29   configuration__type configuration
     2023-12-26 12:08:29   configuration_monitoring 0
     2023-12-26 12:08:29   conn            w
     2023-12-26 12:08:29   created_at      1703588910
     2023-12-26 12:08:29   inregions_1     Home
     2023-12-26 12:08:29   lat             xx
     2023-12-26 12:08:29   lon             xx
     2023-12-26 12:08:29   m               1
     2023-12-26 12:08:29   state           mode
     2023-12-26 12:08:29   t               u
     2023-12-26 12:08:29   tid             h
     2023-12-26 12:08:29   tst             1703588684
     2023-12-26 12:08:29   vac             10
     2023-12-26 12:08:29   vel             0
Attributes:
   WLANDev    presence.phone.user1
   devicetopic owntracks/user1/phone1/cmd
   event-on-change-reading (?!face).*
   oldreadings lat,event
   readingList owntracks/user1/phone1:.* { json2nameValue($EVENT) }
owntracks/user1/phone1/cmd:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    mode:report,silent,manual,signifikant,move { my %mode_mapping = (report => 'report', silent => '-1', manual => '0', signifikant => '1', move => '2'); if ( $mode_mapping{$EVTPART1} eq 'report' ) { return "$DEVICETOPIC " . qq({"_type":"cmd","action":"reportLocation"}); } else { return "$DEVICETOPIC " . qq({"_type":"cmd","action":"setConfiguration","configuration":{"_type":"configuration","monitoring":$mode_mapping{$EVTPART1}}}); } }
   stateFormat m