FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Mazz78 am 25 Januar 2017, 07:16:28

Titel: [gelöst] Differenz von zwei userreadings in dummy schreiben
Beitrag von: Mazz78 am 25 Januar 2017, 07:16:28
Hallo zusammen,

ich bräuchte hier eure (Programmier-)Unterstützung.

Vorab... ja ich habe die Suchfunktion verwendet und mir auch schon den Wolf gegoogled.  ;D

Kurz beschrieben was ich möchte:
Die beiden angelegten userreadings VentSpeed stellen die Lüftergeschwindigkeit der Lüftungsanlage dar.
Wobei VentSpeed_Zuluft ist immer höher ist.
Wenn im Sommer der Grobfilter oder im Winter die Lüftungsgitter vereist sind, driften die beiden Zahlenwerte auseinander.
Wenn die Differenz der beiden Werte eine bestimmte Grenze überschreitet, soll eine PushMeaage abgesetzt werden.

Für das Device LWZ403 (Modul THZ) habe ich die zwei userreadings:

   VentSpeed_Zuluft
   VentSpeed_Abluft

Beide sind mit Zahlenwerte ohne Einheit beschrieben.
Die Differenz der beiden userreadings möchte ich nun in ein Dummy übergeben.
Später möchte ich den Dummy für eine Push Message verwenden.

Wenn ich ehrlich bin hab ich grad kein Plan wie ich das darstellen kann/soll.
Ich hab mal damit angefangen...


define delta_VentSpeed dummy

define LWZ403_VentSpeed_anDummy at +*01:00:00 {\
my $VSA = "VentSpeed_Abluft ".ReadingsVal("LWZ403","VentSpeed_Abluft","");;\
my $VSZ = "VentSpeed_Zuluft ".ReadingsVal("LWZ403","VentSpeed_Zuluft","");;\
$delta = $VSZ-$VSA;;\
fhem ("set delta_VentSpeed $delta");;\
}

define Push_VentSpeed notify dummy_VentSpeed { if ( Value ("delta_VentSpeed") > 15) && ( ReadingsVal ("LWZ403","Aussentemperatur") < 0)) { fhem ("set Push message Lüftungsgitter auf Vereisung prüfen");


Hier habe ich jetzt die VSA von der VSZ abgezogen, weil ich nicht weiß wie man die Differenz sonst noch darstellen könnte.
Auch mit den Klammern bin ich mir total unsicher.

Könntet ihr das mal anschauen ?

Gibt es außer mit dem at-Befehl, vielleicht noch eine bessere/praktischere Weise den Dummy zu befüllen ?

Schon mal Danke vorab

Titel: Antw:Differenz von zwei userreadings in dummy schreiben
Beitrag von: marvin78 am 25 Januar 2017, 07:19:04
Warum denn ein Dummy und nicht ein weiteres userReading im Device? Bei richtiger Config kannst du auch das als Grundlage für push-Nachrichten verwenden und sparst das at.

Bitte nicht die config direkt editieren. Das nimmt bei vielen Dingen die Unsicherheit!

+*01:00:00 {
my $VSA = ReadingsNum("LWZ403","VentSpeed_Abluft",0);
my $VSZ = ReadingsNum("LWZ403","VentSpeed_Zuluft",0);
$delta = $VSZ-$VSA;
fhem ("set delta_VentSpeed $delta");
}


Code für den DEF Bereich des ats.
Titel: Antw:Differenz von zwei userreadings in dummy schreiben
Beitrag von: Omega am 25 Januar 2017, 08:54:28
Such mal in der Commandref nach difference. Damit hast du die Differenz bereits im Device und benötigst kein extra Dummy.
Titel: Antw:Differenz von zwei userreadings in dummy schreiben
Beitrag von: Mazz78 am 26 Januar 2017, 07:31:15
Hallo,

erst mal danke euch beiden für die schnellen Antworten.

Den Code von Marvin hab ich gestern probiert, obwohl er recht plausibel aussieht, wird mir aber folgende Fehlermeldung ausgegeben

Bad regexp: Nested quantifiers in regex; marked by <-- HERE in m/^+* <-- HERE 01:00:00$/ at ./FHEM/91_notify.pm line 44.


Kann jemand damit was anfangen? In der Commandref für at, steht es ja auch so beschrieben  ???


+*01:00:00


Falls das nicht klappt probier ich den Vorschlag mit dem difference.
Titel: Antw:Differenz von zwei userreadings in dummy schreiben
Beitrag von: marvin78 am 26 Januar 2017, 09:17:10
Es ist Code für das DEF in der Detailansicht nicht für das Einfügen in die Config.

Am besten lagerst du das aber ohnehin in eine myUtils aus.
Titel: Antw:Differenz von zwei userreadings in dummy schreiben
Beitrag von: Mazz78 am 29 Januar 2017, 23:40:01
Hier die (vorläufige) Lösung...


define delta_VentSpeed dummy

define VentSpeed_anDummy at +*01:00:00 {\
my $VSA = ReadingsNum("LWZ403","VentSpeed_Abluft",);;\
my $VSZ = ReadingsNum("LWZ403","VentSpeed_Zuluft",);;\
my $delta = $VSZ-$VSA;;\
fhem ("set delta_VentSpeed $delta");;\
}



Den Modifier difference für userreadings hab ich in der Commenref angeschaut, aber ich komm ehrlich gesagt nicht klar damit.
Und ich möchte auch daran zweifeln dass es für diesen Zweck geeignet ist.  ???
Das difference ist doch ein modifier, was dann die Differenz zum vorhergehenden Wert des jeweiligen userreadings ausrechnet.
Zitat
"Es gibt auch noch den Modifier difference, der die Wertänderung zwischen zwei aufeinanderfolgenden Messungen ermittelt."

attr myPowerMeter userReadings power differential { ReadingsVal("myPowerMeter","counters.A",0)/1250.0;; }