PRESENCE cover version - anderer Ansatz basierend auf aktuellem Code

Begonnen von martinp876, 23 Dezember 2020, 14:38:45

Vorheriges Thema - Nächstes Thema

JoWiemann

Hallo,

ich habe das ganze überarbeitet und auch das Toggeln funktioniert jetzt. commandRef ist gepflegt. Bitte einmal testen und vielen Dank.

@Robert, ich habe Deine Anregungen aufgenommen und wurde für einen neuen Lösungsansatz motiviert.

Bitte nach dem Einspielen Fhem neu starten. Ein reload reicht nicht aus.

Grüße Jörg
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

bertl

Hallo Jörg,

hier meine Erkenntnisse:
Wenn das Gerät auf "absent" geht und der Threshold auch abläuft funktioniert alles wie erwartet (in die Gegenrichtung funktionert es auch).

Wenn das Gerät auf "absent" geht und der Threshold noch nicht abgelaufen ist, sondern das Gerät vorher wieder auf "present" geht passiert folgendes:
"presence" geht von "maybe absent" auf "maybe present" und "state" geht von "present" auf "undefined" (in die Gegenrichtung passiert das Gleiche).

Gruß, Robert

bertl

Weiteres Problem:
Wenn das erste Mal (nach einem Neustart) ein Gerät auf "absent" geht, wird der Threshold nicht berücksichtigt und "state" inklusive "presence" gehen sofort auf "absent" (ohne "maybe ...").
Das Reading "thresHldCnt" gibt es in diesem Fall auch nicht.

Und dann steht alles, egal ob das Gerät "absent" oder "present" ist - keine Reaktion mehr - und dann auf einmal einige Zeit später ...

... ich glaube da passt noch mehr nicht - bitte überarbeiten!

JoWiemann

Zitat von: bertl am 25 September 2026, 12:24:14Wenn das Gerät auf "absent" geht und der Threshold noch nicht abgelaufen ist, sondern das Gerät vorher wieder auf "present" geht passiert folgendes:
"presence" geht von "maybe absent" auf "maybe present" und "state" geht von "present" auf "undefined" (in die Gegenrichtung passiert das Gleiche).
arbeitet, wie programmiert. Siehe auch commandRef. In Fall des Toggelns ist ja unklar welcher Zustand herrscht.

Zitat von: bertl am 25 September 2026, 12:24:14Wenn das erste Mal (nach einem Neustart) ein Gerät auf "absent" geht, wird der Threshold nicht berücksichtigt und "state" inklusive "presence" gehen sofort auf "absent" (ohne "maybe ...").
Das Reading "thresHldCnt" gibt es in diesem Fall auch nicht.
arbeitet, wie programmiert. Siehe auch commandRef. Hier handelt es sich um die Initialisierung. Da habe ich keine threshold vorgesehen.

Zitat von: bertl am 25 September 2026, 12:24:14Und dann steht alles, egal ob das Gerät "absent" oder "present" ist - keine Reaktion mehr - und dann auf einmal einige Zeit später ...

verstehe ich nicht.

Grüße Jörg
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

bertl

Zitat von: JoWiemann am 25 September 2026, 13:24:32In Fall des Toggelns ist ja unklar welcher Zustand herrscht.

Wenn es 1x einen Ausreißer gibt wird das aktuell bereits als Toggeln gewertet!

Zitat von: JoWiemann am 25 September 2026, 13:24:32Da habe ich keine threshold vorgesehen.

Warum nicht?

JoWiemann

Zitat von: bertl am 25 September 2026, 13:35:10Wenn es 1x einen Ausreißer gibt wird das aktuell bereits als Toggeln gewertet!
sehe ich so.

Zitat von: JoWiemann am 25 September 2026, 13:24:32Da habe ich keine threshold vorgesehen.
Warum nicht?
[/quote]
Nach einem Neustart ist die vorhandene Information veraltet und keiner kann sagen, welche Zustände in der Zeit vorhanden waren. Ich möchte also schnell den aktuellen Zusatand wissen.
Ähnliches gilt für ein Define. Auch da möchte ich schnell den aktuellen Zustand wissen.

Sollte sich beim nächsten Zustand ein neuer ggf. wahrer Zustand ergeben, dann würde hier der Threshold wieder greifen.

Grüße Jörg
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

bertl

Hallo Jörg,

nachdem ich jetzt etwas darüber geschlafen und noch weiter getestet habe, hier meine Anmerkungen:

  • Ich bin mit der Tatsache, dass bereits 1 Ausreißer als Toggeln gewertet wird und "state" auf "undefined" geht, nicht sehr glücklich.
    Daher mein Wunsch an dich:
    Wäre es möglich ein Attribut einzuführen über welches definiert werden kann, ab wievielen Ausreißern ein Toggeln erkannt wird und "state" auf "undefined" geht?

  • Die Readings "thresHldCntA" und "thresHldCntP" werden zwar nicht mehr verwendet, aber aus irgend einem Grund angelegt.

  • Die Doku passt bezüglich "thresHldCnt", "thresHldCntA" und "thresHldCntP" auch noch nicht.

  • Die Doku bezüglich "thresholdPresence" bzw. "thresholdAbsence" müsste aus meiner Sicht wie folgt heißen - Änderungen sind rot:

    attr <name> thresholdAbsence <Anzahl Prüfungen>
    Die Anzahl der Prüfungen, welche in "absent" resultieren müssen, bevor der Status der PRESENCE-Definition auf "absent" wechselt.
    Mit dieser Funktion kann man die Abwesenheit eines Gerätes verifizieren bevor der Status final auf "absent" geändert wird.
    Wenn dieses Attribut auf einen Wert >1 gesetzt ist, wird das Reading "presence" auf den Wert "maybe absent" gesetzt, bis der Status final auf "absent" wechselt.

    Standardwert ist 1 (keine Kontrolle der Anwesenheitsverifizierung)
    Bei einer Initialisierung von Fhem oder einem define/defmod (wenn hier schon das Attribut mitgegeben wird) wird das Attribut ignoriert.
    Sind beide Attribute, thresholdAbsence und thresholdPresence, gesetzt und kommt es zu einem Toggeln der Anwesen-/Abwesenheit, so wird das Reading 'state' auf 'undefined' gesetzt.

    attr <name> thresholdPresence <Anzahl Prüfungen>
    Die Anzahl der Prüfungen, welche in "present" resultieren müssen, bevor der Status der PRESENCE-Definition auf "present" wechselt.
    Mit dieser Funktion kann man die Anwesenheit eines Gerätes verifizieren bevor der Status final auf "present" geändert wird.
    Wenn dieses Attribut auf einen Wert >1 gesetzt ist, wird das Reading "presence" auf den Wert "maybe present" gesetzt, bis der Status final auf "present" wechselt.

    Standardwert ist 1 (keine Kontrolle der Abwesenheitsverifizierung)
    Bei einer Initialisierung von Fhem oder einem define/defmod (wenn hier schon das Attribut mitgegeben wird) wird das Attribut ignoriert.
    Sind beide Attribute, thresholdAbsence und thresholdPresence, gesetzt und kommt es zu einem Toggeln der Anwesen-/Abwesenheit, so wird das Reading 'state' auf 'undefined' gesetzt.

Danke, Robert

JoWiemann

    Zitat von: bertl am 28 September 2026, 14:23:03Ich bin mit der Tatsache, dass bereits 1 Ausreißer als Toggeln gewertet wird und "state" auf "undefined" geht, nicht sehr glücklich.
    Daher mein Wunsch an dich:
    Wäre es möglich ein Attribut einzuführen über welches definiert werden kann, ab wievielen Ausreißern ein Toggeln erkannt wird und "state" auf "undefined" geht?
    Mache ich.
    Zitat von: bertl am 28 September 2026, 14:23:03Die Readings "thresHldCntA" und "thresHldCntP" werden zwar nicht mehr verwendet, aber aus irgend einem Grund angelehnt.
    Kann ich nicht nachvollziehen. Hattest Du sie gelöscht?
    Zitat von: bertl am 28 September 2026, 14:23:03Die Doku passt bezüglich "thresHldCnt", "thresHldCntA" und "thresHldCntP" auch noch nicht.
    Die Doku bezüglich "thresholdPresence" bzw. "thresholdAbsence" müsste aus meiner Sicht wie folgt heißen - Änderungen sind rot:

    attr <name> thresholdAbsence <Anzahl Prüfungen>
    Die Anzahl der Prüfungen, welche in "absent" resultieren müssen, bevor der Status der PRESENCE-Definition auf "absent" wechselt.
    Mit dieser Funktion kann man die Abwesenheit eines Gerätes verifizieren bevor der Status final auf "absent" geändert wird.
    Wenn dieses Attribut auf einen Wert >1 gesetzt ist, wird das Reading "presence" auf den Wert "maybe absent" gesetzt, bis der Status final auf "absent" wechselt.

    Standardwert ist 1 (keine Kontrolle der Anwesenheitsverifizierung)
    Bei einer Initialisierung von Fhem oder einem define/defmod (wenn hier schon das Attribut mitgegeben wird) wird das Attribut ignoriert.
    Sind beide Attribute, thresholdAbsence und thresholdPresence, gesetzt und kommt es zu einem Toggeln der Anwesen-/Abwesenheit, so wird das Reading 'state' auf 'undefined' gesetzt.

    attr <name> thresholdPresence <Anzahl Prüfungen>
    Die Anzahl der Prüfungen, welche in "present" resultieren müssen, bevor der Status der PRESENCE-Definition auf "present" wechselt.
    Mit dieser Funktion kann man die Anwesenheit eines Gerätes verifizieren bevor der Status final auf "present" geändert wird.
    Wenn dieses Attribut auf einen Wert >1 gesetzt ist, wird das Reading "presence" auf den Wert "maybe present" gesetzt, bis der Status final auf "present" wechselt.

    Standardwert ist 1 (keine Kontrolle der Abwesenheitsverifizierung)
    Bei einer Initialisierung von Fhem oder einem define/defmod (wenn hier schon das Attribut mitgegeben wird) wird das Attribut ignoriert.
    Sind beide Attribute, thresholdAbsence und thresholdPresence, gesetzt und kommt es zu einem Toggeln der Anwesen-/Abwesenheit, so wird das Reading 'state' auf 'undefined' gesetzt.
    [/li][/list]
    commandRef muss ich in Ruhe einmal durcharbeiten.

    Grüße Jörg
    Jörg Wiemann

    RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

    ioBroker als Datenlieferant für z.B. Anker, Samsung

    bertl

    Zitat von: JoWiemann am 28 September 2026, 14:45:48Kann ich nicht nachvollziehen. Hattest Du sie gelöscht?

    Ja ich habe die Readings vorher gelöscht.

    Ich habe im Code mal nach "thresHldCntA" und "thresHldCntP" gesucht, diese kommen unter "get statusInfo" noch vor.

    bertl

    Zitat von: JoWiemann am 25 September 2026, 13:56:09Nach einem Neustart ist die vorhandene Information veraltet und keiner kann sagen, welche Zustände in der Zeit vorhanden waren. Ich möchte also schnell den aktuellen Zusatand wissen.
    Ähnliches gilt für ein Define. Auch da möchte ich schnell den aktuellen Zustand wissen.

    Aktuell wird der Threshold nach einem Neustart solange ignoriert, bis das erste Mal eine Änderung von "present" auf "absent" oder umgekehrt kommt.
    d.h. wenn nach einem Neustart z.B. 1000 "present" Zyklen kommen, wird beim ersten "absent" der Threshold nicht berücksichtigt (bei einem Interval von 5 Minuten kann das Tage später sein).

    Sollte das wirklich so sein?

    JoWiemann

    Zitat von: bertl am 28 September 2026, 14:51:56Aktuell wird der Threshold nach einem Neustart solange ignoriert, bis das erste Mal eine Änderung von "present" auf "absent" oder umgekehrt kommt.
    d.h. wenn nach einem Neustart z.B. 1000 "present" Zyklen kommen, wird beim ersten "absent" der Threshold nicht berücksichtigt (bei einem Interval von 5 Minuten kann das Tage später sein).

    Sollte das wirklich so sein?

    Verstehe ich nicht.
    Jörg Wiemann

    RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

    ioBroker als Datenlieferant für z.B. Anker, Samsung

    bertl

    Beispiel:
    Internals:
       ADDRESS    192.168.1.110
       DEBUGLOG   OFF
       DEF        lan-ping 192.168.1.110
       FUUID      6a06b9e7-f33f-3e1e-8fcb-d6b73e48e32bd932
       INTERVAL   1
       MISSING_MODUL Net::Async::Ping
       MODE       lan-ping
       NAME       IpCam1_UpLAN
       NOTIFYDEV  global
       NR         102
       NTFY_ORDER 50-IpCam1_UpLAN
       STATE      present
       TIMEOUT    60
       TYPE       PRESENCE2
       VERSION    01.06 Test
       eventCount 2
       OLDREADINGS:
         2026-09-28 14:26:45   state           absent
       READINGS:
         2026-09-28 14:27:44   appearCnt       4
         2026-09-28 14:27:44   lastAppear      2026-09-28 14:27:44
         2026-09-28 14:26:45   lastDisappear   2026-09-28 14:26:45
         2026-09-27 02:00:20   maybeCnt        1
         2026-09-28 13:25:21   model           lan-ping
         2026-09-28 14:27:44   presence        present
         2026-09-28 14:27:44   state           present
         2026-09-27 02:00:20   thresHldCnt     1
         2026-09-28 14:15:00   thresHldCntA    0
         2026-09-28 14:15:00   thresHldCntP    0
       helper:
         DISABLED   0
         FhemLog3Std 0
         IO_Async_Loop 1
         List_Util  1
         Net_Async_Ping 0
         Ping       1
         active     1
         curState   present
         debugLog   IpCam1_UpLAN_debugLog
         logDebug  
         maybe      0
         nextScan   1790605370.84032
         treshHold  present
         updateConfig IpCam1_UpLAN.Initialize
         cnt:
           exec       2
           maybe      0
           state      4
           th         0
         disp:
           condense   1
           verbose    0
         interval:
           absent     300
           init       30
           present    300
         os:
           Cmd        ping -c 1 -w 1 192.168.1.110 2>&1
           search     (ttl|TTL)=\d+
         timestamp:
           absent     2026-09-28 14:26:45
           present    2026-09-28 14:27:44
    Attributes:
       devStateIcon {
      my $text = Value( $name );
      if( AttrVal( $name,'disable','0' ) == 1 or $text eq 'disabled' ) {
        "<span style='color:red;padding-left:1em;font-weight:bold'>".$text."</span>"
      }
      else {
        "<span>".( ( $text eq 'present' or $text eq 'defined' )?( FW_makeImage('general_ok@green') ):( FW_makeImage('message_attention@red') ) )."&nbsp&nbsp&nbsp</span>"
        ."<span style='color:black;padding-left:1em;font-weight:bold'>(".ReadingsTimestamp( 'PsnceDaemon','pr_'.$name,'Invalid-Time' ).")</span>"
      }
    }
       event-on-change-reading presence,state
       group      Global
       icon       it_camera
       intervalNormal 300
       intervalPresent 300
       oldreadings state
       room       system
       sortby     07
       thresholdAbsence 3

    • FHEM wird neu gestartet
    • Die IpCam1 wird vom Modul angepingt und ist vorhanden - "present"
    • Die IpCam1 wird zyklich angepingt und ist immer vorhanden - "present"
    • Nach z.B. 100 Zyklen/Intervallen (100 * 300 = 8,33 Stunden) wird die LAN-Verbindung zur IpCam1 getrennt
    • "state" geht direkt auf "absent" (ohne vorher ein "maybe" auszulösen, da es das erste mal nach dem Neustart war)

    JoWiemann

    Hallo Robert,

    nach einem Neustart ist das verdeckte State auf init gesetzt. Somit wird im ersten Zyklus aktualisiert. Das muss ich dann anpassen.

    Grüße Jörg
    Jörg Wiemann

    RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

    ioBroker als Datenlieferant für z.B. Anker, Samsung