Summe aus Werten eines Readings über mehrere Devices

Begonnen von flipse, 25 April 2019, 07:23:27

Vorheriges Thema - Nächstes Thema

flipse

Hallo zusammen,

für ein notify, ob ein Windsensor gerade aktiv ist, benötige ich eine Summenbildung von Werten über mehrere Devices.
Im aktuellen notify frage ich den State per regex ab:

tahoma_15\d+:PriorityLockTimerState:.*


Kann ich hierüber irgendwie (einfach) die Summe aus allen ReadingVals für PriorityLockTimerState über alle Devices erstellen?
Wenn diese nämlich > 0 ist, weiß ich, dass der Windsensor ausgelöst hat.

Vielen Dank schon mal

87insane

Guten Morgen,

bitte gib mal ein wenig mehr Info... Nach mehrmaligem lesen kann ich noch immer nur wenig damit anfangen.

CoolTux

Also erstmal, Du fragst den state nicht ab sondern Du triggerst mit der RegEx auf ein Event. Das ist wichtig da man so weiß das nur rudimentär Daten innerhalb des Notifys vorhanden sind zum weiterarbeiten.

$NAME
$EVENT
$EVTPART0
$EVTPART1

und noch ein zwei andere. Was Du nun machen musst ist innerhalb des Notify etwas abbilden welches Dich zum Ziel führt.
Mit Perl wäre es alle benötigten Readings mit ReadingsNum bei Zahlenwerten ab zu fragen und die Ergebnisse auf zu addieren.

Um Dir aber helfen zu können immer ein list von allen beteiligten Devices angeben und schreibe welche Readings wie benötigt werden.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

flipse

Ok, sorry. Etwas wenig Info:

Hintergrund:
- Ich kann unseren Windsensor leider nicht als einzelnes Device abfragen
- Ich habe aber für jedes Raffstor ein Reading: PriorityLockTimerState
- Wenn dies > 0 ist, hat der Windsensor eingegriffen

Ich möchte nun gerne von Unterwegs wissen, ob das Ding ausgelöst hat, weil dann alle Raffstore automatisch hochfahren, das System der Rollläden aber keine Benachrichtigung gibt.

Was habe ich gemacht:
- Ein Dummy Device: dummy_Windsensor erstellt
- Ein notify, dass auslöst, wenn sich in einem Device der Wert PriorityLockTimerState ändert:
- Notify:

tahoma_15\d+:PriorityLockTimerState:.*

{Log 5, "Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT"};

{
my $realname = ReadingsVal($NAME, 'NameState', 'undefined');;
$realname = UmlauteUmwandeln($realname);;
fhem("setreading dummy_Windsensor $realname $EVTPART1");;

sumWindsensorLockTimerOverall;;

};


IF ($EVTPART1 > 0 && [dummy_Windsensor:state] eq "off")
(
set dummy_Windsensor on,
{
sleep 2;;
sendWindsensorReport("aktiviert");;
}
)
ELSE
(
set dummy_Windsensor off,
IF ([dummy_Windsensor:lockTimer] > 0)
(
{
sleep 2;;
sendWindsensorReport("deaktiviert");;
}
)
);


setreading dummy_Windsensor myLastEvent $EVENT;
setreading dummy_Windsensor lockTimer $EVTPART1;



Ich weiß. Hier ist noch sehr viel mehr zum Debuggen drin.

Das notify funktioniert soweit super.
Mein Problem ist nun aber, dass ich, gestern ca. 45 E-Mails und Benachrichtigungen bekommen habe, da manche 0 melden, manche >0. Das heißt, der Sensor würde angeblich immer mal aktiviert und mal deaktiviert.
Hintergrund: Nicht alle Devices haben direkt zur selben Zeit den Status des Windsensors bekommen und hängen dann noch bei 0.

Nun habe ich gedacht es ist besser zu schauen, ob die Summe aller LockTimerStates > 0 ist und nicht nur das eines einzelnen.

Ich habe nun eben ein Modul geschrieben:

# sum up Readings PriorityLockTimerState from exterior venetian blinds
sub
sumWindsensorLockTimerOverall()
{

my $totalLockTimer;
foreach my $devi (devspec2array("inClass=ExteriorVenetianBlind")) {
my $lockTimer = ReadingsNum($devi, 'PriorityLockTimerState',0);
$totalLockTimer += $lockTimer;
}

fhem("setreading dummy_Windsensor totalLockTimer ".$totalLockTimer);

Log 3, "sumWindsensorLockTimerOverall: ".$totalLockTimer;

}



Mein Problem ist aber weiterhin das Triggern. Wenn das Modul nun 30mal von allen Raffstoren getriggert wird, habe ich auch nichts gewonnen.

Hilft das mehr?

CoolTux

Gegen mehrfach triggern also eigentlich das senden mehrerer Events hilft in den Devices (Raffstores) ein event-on-change-reading

Dann hast Du eine Perlfunktion geschrieben die soweit okay aus schaut (schaue mit Handy)
Was aber fehlt ist die Deklarierung von $totalLockTimer außerhalb der Schleife. Ein einfaches
my $totalLockTimer
sollte hier reichen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

#5
OK sorry, habe gerade die Deklarierung gefunden.

Also für mich sieht die Funktion gut aus. So solltest Du auf jeden Fall herausfinden ob einer der Stores größer null hat.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

87insane

Habe es aber richtig verstanden...?

.. Du willst mehrere Geräte einfach nicht mit 100 Mails sondern am Ende einfach nur eine gesammelte?

CoolTux

Mal ab von dem Thema das ja alle Stores triggern, sollte ein Event wie erwähnt ja nur bei Änderung des Readings PriorityLockTimerState kommen und nicht bei einem einfachen Update.

Desweiteren kann man auch nach dem ersten Triggern das notify lahm legen für X Sekunden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

flipse

Zitat von: 87insane am 25 April 2019, 08:06:35
Habe es aber richtig verstanden...?

.. Du willst mehrere Geräte einfach nicht mit 100 Mails sondern am Ende einfach nur eine gesammelte?

ja genau

87insane

Dann hilft in jedem Fall das was CoolTux sagte.

Zum einen event-on-change auf dem Gerät, welches auch die Events erzeugt. Nun würde nur noch getriggert wenn auch wirklich eine Veränderung statt findet.
Danach, wenn immer noch zu viel Mail-Müll/Spam kommt, würde ich vermutlich auch hingehen und das notify so umbauen, das er etwas wartet und dann gesammelt meldet.

Ich meine, was ist genau das Ziel? Wenig Mails und reine Info (so wie ich das verstanden habe).

Ich kenne die Geräte nicht, aber vermutlich löst das Ding bzw. soll nur auslesen wenn alles = 0? Oder löst es wirklich bei jedem der Geräte aus?