Hauptmenü

NOTIFY auf INTERNALS

Begonnen von stobor, 28 Juli 2022, 20:13:42

Vorheriges Thema - Nächstes Thema

stobor

Hallo,
ich würde gern Aktionen ausführen, sobald sich ein Internals Attribut bspw. unseres Rasenmähers ändert oder einen bestimmten Wert annimmt.
Konkret habe ich bei unserem Husqvarna Rasenmähroboter ein Internals Attribut "STATE", welches ich überwachen möchte. Sobald es den Wert "error" annimmt, soll eine Aktion ausgeführt werden. Wie kann ich denn das notify nutzen, um das STATE-Internal abzuprüfen?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

MadMax-FHEM

#1
INTERNALS erzeugen (norm.) kein Event -> kein Eventhandler möglich.

ABER: normalerweise wird das INTERNAL STATE durch das Reading state beeinflusst/abgeleitet -> das erzeugt ein Event -> Eventhandler u.a. eben auch notify möglich

Eventmonitor aufmachen (Filter setzen) und schauen welcher Event passt -> Zeile markieren und notify etc. erzeugen lassen :)
https://wiki.fhem.de/wiki/Event_monitor

Gruß, Joachim

P.S.: etwas besser auf das "Wording" achten, damit man auch weiß wovon exakt du sprichst! Es gibt:

INTERNALS
Readings
Attribute

Internal Attribute gibt es nicht ;)

Bei Attribut-Änderung gäbe es nämlich ein Event vom Device global (glaube ich) ;)
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

tschimi

Hi, ich hatte jetzt ein ähnliches Problem mit der Arlo_Cloud und hab folgenden Workaround gefunden.

Hintergrund: Arlo_cloud connector hat nur Internals. Wenn das Login geklappt hat, wollte ich die Snapshots der Kameras updaten. Dafür hab ich folgendes DoIf geschrieben:

defmod ArloState DOIF ([+00:00:03] && ReadingsVal("ArloState","state","") ne InternalVal("Arlo_cloud","STATE","") && InternalVal("Arlo_cloud","STATE","") eq "active") (set Arlo1 snapshot;set Arlo2 snapshot;set Arlo3 snapshot)
attr ArloState stateFormat {InternalVal("Arlo_cloud","STATE","")}

Das Doif vergleicht alle 3s den eigenen Status mit dem Status der Arlo_cloud. Zudem stellt das 2te Argument sicher, dass das Doif nur EINMAL ausgeführt wird. Ich denke, das ließe sich für beliebige Szenarien ähnlich gestalten. Soll hier nur ein Denkansatz sein wenn man unbedingt auf ein Internal reagieren will.

Lg, tschimi

Torxgewinde

Ich hatte auch so ein ähnliches Problem, ich wollte von FHEMWEB aus den Internals lesen wenn Bytes gelesen und geschrieben werden. Darüber kann man erkennen, ob jemand gerade auf dem FHEMWEB rumsurft. Ich habe da kein DOIF genommen, sondern ein einfach at, ist im Grunde aber sehr ähnlich von der Logik her. Ohne Polling habe ich aus Usersicht keine gute, andere Idee, außer im Grunde die Funktionen des Moduls selbst umzudefinieren und dort ggf. Code zu injizieren oder den Quelltext anzupassen.

defmod WEB.BusyIndicator.at at +*00:00:05 ##
attr WEB.BusyIndicator.at alias WEB Traffic
attr WEB.BusyIndicator.at alignTime 00:00:00
attr WEB.BusyIndicator.at event-min-interval state:60
attr WEB.BusyIndicator.at event-on-change-reading WEB\.Busy
attr WEB.BusyIndicator.at stateFormat Busy: WEB.Busy
attr WEB.BusyIndicator.at userReadings WEB.BusyDetection {\
my $this = ReadingsVal($name, $reading, "0,0,0");;\
\
my $wr = InternalVal("WEB", "BYTES_WRITTEN", 0);;\
my $rd = InternalVal("WEB", "BYTES_READ", 0);;\
my $cn = InternalVal("WEB", "CONNECTS", 0);;\
\
my ($wr_old, $rd_old, $cn_old) = ($this =~ /^(\d+),(\d+),(\d+)/);;\
\
if ( "$wr,$rd,$cn" ne "$wr_old,$rd_old,$cn_old" ) {\
fhem("sleep 0.1;; setreading $name WEB.Busy on");;\
fhem("cancel $name.timer quiet;; sleep 10 $name.timer quiet;; setreading $name WEB.Busy off");;\
}\
\
return "$wr,$rd,$cn";;\
}