Funktion ausführen nur wenn sich Wert erhöht

Begonnen von hummeruli, 15 Juni 2026, 19:26:21

Vorheriges Thema - Nächstes Thema

hummeruli

cloudkey:oldreadings:-UC_wlan_users Das hatte ich aus Unverständnis rein gesetzt, da ich es nicht wirklich verstanden habe wie oldreadings zu verwenden ist.

Das Reading im cloudkey ist mit dem - am Anfang richtig.

Hab das jetzt so versucht, ohne Erfolg:

defmod Feuer_ntf notify cloudkey:-UC_wlan_users if (ReadingsNum("cloudkey", "-UC_wlan_users", "1") > OldReadingsNum("-UC_wlan_users", "-UC_wlan_users", "2")) fhem("set Optokoppler on-for-timer 1")
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

passibe

Nächstes Mal bitte googeln und versuchen zu verstehen wie Perl-Code in FHEM eingebunden werden muss (durch {}) und wie überhaupt ein korrektes Perl-if aussieht.

Insofern jetzt Schritt für Schritt:
  • attr cloudkey oldreadings -UC_wlan_users ausführen
  • Ein leeres notify erstellen: defmod Feuer_ntf notify cloudkey:-UC_wlan_users:.* {}
  • Das notify in FHEMWEB aufrufen und auf DEF klicken.
  • Dort das Folgende einfügen und dann auf modify Feuer_ntf klicken:
cloudkey:-UC_wlan_users:.* {
if (ReadingsNum("cloudkey", "-UC_wlan_users", "1") > OldReadingsNum("cloudkey", "-UC_wlan_users", "99")) {
fhem("set test on-for-timer 2");
}
}
Es kann sein, dass -UC_wlan_users einmal aktualisiert werden muss (d.h. ein Event generieren muss), bevor oldreadings funktioniert. Also ggfs. einmal mit trigger nachhelfen.

Ansonsten fällt mir grade auf, weil wir notify benutzen, kann man bei Schritt 4 auch mit $EVTPART1 arbeiten. Das ist dann etwas schlanker:
cloudkey:-UC_wlan_users:.* {
if ($EVTPART1 > OldReadingsNum("cloudkey", "-UC_wlan_users", "99")) {
fhem("set test on-for-timer 2");
}
}

hummeruli

Danke für die sehr gute Anleitung. Leider hat er aber nur einmal geschaltet.

-UC_wlan_users waren 34 und ich habe das WLAN an meinem Handy aktiviert. Dann zeigte der cloudkey die 35 und das Relais hat geschaltet. Jetzt habe ich bei zwei Geräten das WLAN abgeschaltet. Mein cloudkey zeigt jetzt die 33 an.
Soweit gut. Relais zieht nicht an. Wenn ich jedoch bei einem Gerät das WLAN einschalte wird es vom cloudkey erkannt und der Zähler um eins erhöht. Leider schaltet das Relais nicht. Auch wenn ich noch ein oder zwei einlogge erkennt es der cloudkey Problemlos. Das Notify triggert nicht und deshalb bleibt das Relais aus.
Der Zähler im cloudkey zeigt immer die Anzahl der aktiven Geräte im WLAN. Sprich wenn die Zahl sich verringert soll das Relais aus bleiben. Jedes mal wenn sich ein Gerät einloggt soll das Relais schalten.
Also auch dann wenn zuerst 35 User aktiv sind, dann Drei raus gehen und danach nur ein User hinzukommt.
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

passibe

Kannst du bitte mal ein list sowohl von Feuer_ntf als auch von cloudkey posten?
Alsolist Feuer_ntfund dannlist cloudkey(beim cloudkey ggfs. irgendwelche personenbezogenen Daten unkenntlich machen)

Danke!

hummeruli

Hier das Notify:
Internals:
  CFGFN     
  DEF        cloudkey:-UC_wlan_users:.* {
    if (ReadingsNum("cloudkey", "-UC_wlan_users", "1") > OldReadingsNum("cloudkey", "-UC_wlan_users", "99")) {
        fhem("set Optokoppler on-for-timer 5");
    }
}
  FUUID      6a31c6a4-f33f-9795-4196-09afc6b9ebb3167d
  NAME      Feuer_ntf
  NOTIFYDEV  cloudkey
  NR        591
  NTFY_ORDER 50-Feuer_ntf
  REGEXP    cloudkey:-UC_wlan_users:.*
  STATE      2026-06-17 18:47:24
  TRIGGERTIME 1781714844.05071
  TYPE      notify
  eventCount 7
  READINGS:
    2026-06-17 15:06:46  state          active
    2026-06-17 18:47:24  triggeredByDev  cloudkey
    2026-06-17 18:47:24  triggeredByEvent -UC_wlan_users: 37
  hmccu:
Attributes:
  room      Ausgang

Um den ganzen cloudkey hier rein zu bringen bräuchte ich bestimmt Stunden, da das Listing 6458 Zeilen umfasst.

Hier ein Auszug:
Internals:
  DEF        192.168.0.247 8909 crypt:53515254 crypt:580172794643090f10777e745254637450340b48036f431d395a794545 60
  FUUID      69a5d45a-f33f-9795-915b-b67be1978d0093a4
  FVERSION  74_Unifi.pm:0.235000/2021-01-09
  LASTInputDev cloudkey
  MSGCNT    337563
  NAME      cloudkey
  NOTIFYDEV  global
  NR        510
  NTFY_ORDER 50-cloudkey
  STATE      connected
  TYPE      Unifi
  UC_VERSION 10.4.57
  VERSION    3.5.2
  cloudkey_MSGCNT 337563
  cloudkey_TIME 2026-06-17 18:50:38
  eventCount 343979
  OLDREADINGS:
    2026-06-17 18:05:07  -UC_wlan_users  38
  READINGS:
    2026-06-17 18:50:38  -AP-lastUpdate  Wed Jun 17 16:50:38 2026
    2026-06-17 18:50:38  -AP_1_Flur_UAP-AC-Lite_clients 13
    2026-06-17 18:50:38  -AP_1_Flur_UAP-AC-Lite_essid xxx
    2026-06-17 18:50:38  -AP_1_Flur_UAP-AC-Lite_locate off
    2026-06-17 18:50:38  -AP_1_Flur_UAP-AC-Lite_state ok
    2026-06-17 18:50:38  -AP_1_Flur_UAP-AC-Lite_utilization 36,8
    2026-06-17 18:50:38  -AP_2_Wohnzimmer_UAP-AC-Lite_clients 19
    2026-06-17 18:50:38  -AP_2_Wohnzimmer_UAP-AC-Lite_essid xxx
    2026-06-17 18:50:38  -AP_2_Wohnzimmer_UAP-AC-Lite_locate off
    2026-06-17 18:50:38  -AP_2_Wohnzimmer_UAP-AC-Lite_state ok
    2026-06-17 18:50:38  -AP_2_Wohnzimmer_UAP-AC-Lite_utilization 34,7
    2026-06-17 18:50:38  -AP_3_Werkstatt_UAP-AC-Lite_clients 5
    2026-06-17 18:50:38  -AP_3_Werkstatt_UAP-AC-Lite_essid xxx
    2026-06-17 18:50:38  -AP_3_Werkstatt_UAP-AC-Lite_locate off
    2026-06-17 18:50:38  -AP_3_Werkstatt_UAP-AC-Lite_state ok
    2026-06-17 18:50:38  -AP_3_Werkstatt_UAP-AC-Lite_utilization 35,5
    2026-06-17 18:50:38  -UC_blockedClients
    2026-06-17 18:50:38  -UC_events      0 (last 24h)
    2026-06-17 18:50:38  -UC_newClients 
    2026-06-17 18:50:38  -UC_unarchived_alerts 0
    2026-06-17 18:50:38  -UC_wlan_accesspoints 3
    2026-06-17 18:50:38  -UC_wlan_guests 0
    2026-06-17 18:50:38  -UC_wlan_state  ok
    2026-06-17 18:50:38  -UC_wlan_users  37
Attributes:
  group      Unifi
  oldreadings -UC_wlan_users
  room      Sicherheit,System->Server

Der ganze Rest bezieht sich auf Daten der Clients und des Servers (cloudkey).

Seltsam ist dass er vorhin als ich geschrieben hatte nur einmal das Relais geschaltet hat. Jetzt schaltet er jedes mal wenn der cloudkey aktualisiert wird, also ca. jede Minute. Obwohl sich der Wert nicht erhöht.

Hier das Logfile des Optokopplers:
2026-06-17_19:18:47 Optokoppler on-for-timer 5
2026-06-17_19:22:03 Optokoppler on-for-timer 5
2026-06-17_19:23:07 Optokoppler on-for-timer 5
2026-06-17_19:24:13 Optokoppler on-for-timer 5
2026-06-17_19:25:17 Optokoppler on-for-timer 5
2026-06-17_19:26:23 Optokoppler on-for-timer 5
2026-06-17_19:28:33 Optokoppler on-for-timer 5
2026-06-17_19:29:38 Optokoppler on-for-timer 5
2026-06-17_19:30:43 Optokoppler on-for-timer 5
2026-06-17_19:31:48 Optokoppler on-for-timer 5
2026-06-17_19:32:53 Optokoppler on-for-timer 5
2026-06-17_19:33:58 Optokoppler on-for-timer 5
2026-06-17_19:35:03 Optokoppler on-for-timer 5
2026-06-17_19:36:08 Optokoppler on-for-timer 5
2026-06-17_19:37:13 Optokoppler on-for-timer 5
2026-06-17_19:39:23 Optokoppler on-for-timer 5
2026-06-17_19:40:28 Optokoppler on-for-timer 5
2026-06-17_19:41:33 Optokoppler on-for-timer 5
2026-06-17_19:42:38 Optokoppler on-for-timer 5
2026-06-17_19:43:43 Optokoppler on-for-timer 5
2026-06-17_19:44:48 Optokoppler on-for-timer 5
2026-06-17_19:45:53 Optokoppler on-for-timer 5
2026-06-17_19:46:58 Optokoppler on-for-timer 5
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

bertl

Vielleicht mal folgendes ergänzen:

attr cloudkey event-on-change-reading -UC_wlan_users

hummeruli

Sodele,

Es funktioniert.

Vielen lieben Danke an den sehr geduldigen passibe und das i-Düpfele wie man bei uns sagt, von bertl.

Früher war das mit dem Google bemühen noch okay. Mittlerweile kann man es total vergessen, von zehn Ergebnissen sind 6x "Gesponsert" 2x "reddit mit Blafasl" Und mit viel Glück eine "halbwegs Antwort". Klar jetzt sagen viele warum, da ist doch gleich ganz oben von Gemini-Genie die richtige Antwort. Doch das ist für mich keine Option. Ich verweigere mich der KI vehement, und lebe trotzdem.
Deshalb frage ich lieber hier im Forum, wo es sehr viele wirklich gute Programmierer gibt.

Danke nochmal

Gruß

Uli
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

bertl

Nur zur Sicherheit:

Bis jetzt hattest du für 'cloudkey' die Attribute 'event-on-update-reading' und 'event-on-change-reading' NICHT in Verwendung.
Somit wurde bis jetzt für jedes Reading bei einem Update ein Event erzeugt.
Sobald du nun eines der beiden Attribute verwendest, werden nur mehr Events für das angegebene Reading erzeugt und alle anderen werden deaktiviert.

Falls du also von irgend einem anderen Reading dieses Gerätes ein Event erwartest (egal ob durch Notify, DOIF, ...), musst du dieses in eines der obigen Attribute angeben.

hummeruli

Ja das ist mir klar. Diese Installation ist nur für den cloudkey und der Auswertung dass wenn sich ein WLAN-Client einloggt, ein Ein Optokoppler eine externe Steuerung triggert. Das funktioniert mit dieser Lösung.

Danke
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

elektron-bbs

Mal abgesehen davon, das es sowieso sinnvoll ist, die Events einzuschränken, könnte man das Attribut "oldreadings" auch um die Erweiterung "oldreadingsAlways" ergänzen:
Zitatoldreadings
Dieses Attribut enthält eine durch Kommata getrennte Liste von Readings. regex sind erlaubt. Für jedes Reading aus der Liste speichert FHEM intern den vorherigen Wert wenn sich das Reading ändert. Zum Zugriff auf die Werte gibt es die OldReadings.* Routinen. Falls der vorherige Wert immer, d.h. auch wenn es sich nicht ändert, gespeichert werden soll, dann muss der letzte Werte der Komma getrennten Liste oldreadingsAlways sein.

Ich habe das mal mit folgendem notify durchprobiert:
cloudkey:-UC_wlan_users:.*
{
  my $oldVal = OldReadingsNum($NAME, "-UC_wlan_users", "99");
  Log3 $NAME, 3, "$NAME: Feuer_ntf -UC_wlan_users oldVal=$oldVal newVal=$EVTPART1";
  if (ReadingsNum("cloudkey", "-UC_wlan_users", "1") > OldReadingsNum("cloudkey", "-UC_wlan_users", "99")) {
    Log3 $NAME, 3, "$NAME: Feuer_ntf -UC_wlan_users newVal > oldVal";
    # fhem("set Optokoppler on-for-timer 5");
  }
}

Das Ergebnis sieht so aus:
2026.06.18 12:49:11 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=99 newVal=10
2026.06.18 12:49:25 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=99 newVal=10
2026.06.18 12:49:49 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=99 newVal=10
--- ab hier Attribut "oldreadings -UC_wlan_users,oldreadingsAlways" gesetzt
2026.06.18 12:53:17 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=10 newVal=10
2026.06.18 13:32:24 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=10 newVal=10
2026.06.18 13:34:02 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=10 newVal=10
2026.06.18 13:35:50 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=10 newVal=34
2026.06.18 13:35:50 3: cloudkey: Feuer_ntf -UC_wlan_users newVal > oldVal
2026.06.18 13:36:54 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=34 newVal=35
2026.06.18 13:36:54 3: cloudkey: Feuer_ntf -UC_wlan_users newVal > oldVal
2026.06.18 13:37:19 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=35 newVal=33
2026.06.18 13:37:44 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=33 newVal=34
2026.06.18 13:37:44 3: cloudkey: Feuer_ntf -UC_wlan_users newVal > oldVal
2026.06.18 13:39:22 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=34 newVal=33
2026.06.18 13:39:26 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=33 newVal=33
2026.06.18 13:41:22 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=33 newVal=34
2026.06.18 13:41:22 3: cloudkey: Feuer_ntf -UC_wlan_users newVal > oldVal
--- ab hier wieder ohne oldreadingsAlways:
2026.06.18 13:41:28 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=33 newVal=34
2026.06.18 13:41:28 3: cloudkey: Feuer_ntf -UC_wlan_users newVal > oldVal
2026.06.18 13:41:34 3: cloudkey: Feuer_ntf -UC_wlan_users oldVal=33 newVal=34
2026.06.18 13:41:34 3: cloudkey: Feuer_ntf -UC_wlan_users newVal > oldVal
Intel(R) Atom(TM) CPU N270 mit 2 SIGNALduino nanoCC1101 + ESPEasy 2x serial server SIGNALduino nanoCC1101, Raspberry Pi 2 mit 2 CUL Stackable CC1101, Raspberry Pi 3 mit SIGNALduino radino + nano328 + 2 x SIGNAL-ESP CC1101 + 1 x rf_Gateway + 1 x SIGNAL-STM

hummeruli

Ehrlich gesagt ist für mich dein Code komplizierter und was macht er besser? Wo ist der Vorteil drin?

Erspare ich mir das

attr cloudkey event-on-change-reading -UC_wlan_users
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

elektron-bbs

Ich habe den Code nur um 3 Zeilen ergänzt, weil ich Log-Ausgaben sehen wollte. Entscheidend ist das Attribut "oldreadings":
-UC_wlan_users,oldreadingsAlways
Intel(R) Atom(TM) CPU N270 mit 2 SIGNALduino nanoCC1101 + ESPEasy 2x serial server SIGNALduino nanoCC1101, Raspberry Pi 2 mit 2 CUL Stackable CC1101, Raspberry Pi 3 mit SIGNALduino radino + nano328 + 2 x SIGNAL-ESP CC1101 + 1 x rf_Gateway + 1 x SIGNAL-STM

hummeruli

Zitat von: elektron-bbs am 18 Juni 2026, 17:52:10Ich habe den Code nur um 3 Zeilen ergänzt, weil ich Log-Ausgaben sehen wollte. Entscheidend ist das Attribut "oldreadings":
-UC_wlan_users,oldreadingsAlways

Sorry aber verstehe nur Bahnhof. Was bringt mir das?
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........