userReading mehrere Events

Begonnen von GunterB, 07 März 2021, 13:14:19

Vorheriges Thema - Nächstes Thema

GunterB

Hallo,

ich möchte zwei Temperaturen meiner Heizung subtrahieren und mache das über userReadings:
Solar-Spreizung {sprintf("%.2f",ReadingsVal("myZentralheizung","Temp-Kollektor-Ist",0)-ReadingsVal("myZentralheizung","Temp-Speicher-Ist",0))}

Es ist jetzt aber so, dass bei jedem Reading Event, das userReading auch einen Event auslöst.
Ich möchte aber nur einen Event, wenn sich entwender der Minuend oder Subtrahenb ändert.

Das Logging, loggt sonst 50x (Event eines jeden Readings im Device) den gleichen Wert.

Ich habe versucht, das üner ein NOTIFY zu lösen (Forenvorschlag), da ist aber das Problem, dass das setReading aus einem NOTIFY kein EVENT im Device auslöst!
defmod myZentralheizung_Solar_Spreizung notify myZentralheizung:Temp-Kollektor-Ist:.* {\
my $TempKollektorIst = ReadingsVal("myZentralheizung","Temp-Kollektor-Ist",0);;\
my $TempSpeicherIst = ReadingsVal("myZentralheizung","Temp-Speicher-Ist",0);;\
\
my $SolarSpreizung = round($TempKollektorIst-$TempSpeicherIst, 1);;\
fhem "setreading myZentralheizung Solar-Spreizung $SolarSpreizung";;\
}


Könnte mir bitte jemand einen Tipp geben, wie ich zwei Werte - Eventbasierend - voneinander Subtrahiere und das Ergebnis mit einem Event setze??

DS_Starter

Im Userreading eine Triggerbedingung mit setzen:

userReadings lt. Commandref:
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:

    <reading>[:<trigger>] [<modifier>] { <perl code> }

Also z.B.:


Solar-Spreizung:Temp-Kollektor-Ist{sprintf("%.2f",ReadingsVal("myZentralheizung","Temp-Kollektor-Ist",0)-ReadingsVal("myZentralheizung","Temp-Speicher-Ist",0))}


Dann wird das userreading Solar-Spreizung nur berechnet wenn Temp-Kollektor-Ist einen Event liefert. Nur Beispiel. Anpassen an deine Gegebenheiten.

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

TomLee

Zitatwenn sich entwender der Minuend oder Subtrahenb ändert

Bei beiden Readings anhand dem Beispiel oben dann so:

Solar-Spreizung:Minuend_Readingname|Subtrahend_Readingname:.*

Wenn du ReadingsNum statt ReadingsVal verwendest kannst dir das sprintf sparen mit der Angabe des 4.Parameter round.

Und etwas kürzer wirds noch wenn du $name statt den Devicenamen myZentralheizung verwendest.

Gruß

Thomas

GunterB

Vielen Dank für deine schnelle und Kompetente Antwort.
Leider bekomme ich nun die Readings nicht mehr aktualisiert.
Ich kaomme da als C++ Programmierer irgendwie nicht klar  :-[

Auch wenn ich mich wohl ziemlich dumm anstelle, ich kann mir aber mit der Doku nicht helfen.

defmod myZentralheizung VCONTROL300 192.168.xxx.xxx:3002 /opt/fhem/FHEM/V200KW6.cfg 300
attr myZentralheizung oldreadings Temp.*|Fehler.*
attr myZentralheizung room Haus,Heizung
attr myZentralheizung userReadings Solar-Spreizung:Temp-Kollektor-Ist {sprintf("%.2f",ReadingsVal("myZentralheizung","Temp-Kollektor-Ist",0)-ReadingsVal("myZentralheizung","Temp-Speicher-Ist",0))},\
Speicher-Spreizung:Temp-WarmWasser-Ist {sprintf("%.2f",ReadingsVal("myZentralheizung","Temp-WarmWasser-Ist",0)-ReadingsVal("myZentralheizung","Temp-Speicher-Ist",0))},\
Speicher-Solar_Erhitzung:Speicher-Spreizung {(ReadingsVal("myZentralheizung","Speicher-Spreizung",0) < 1.5)?1:0;;;;}
attr myZentralheizung vitotronicType 200_KWx

setstate myZentralheizung defined
setstate myZentralheizung 2021-03-07 13:40:23 Temp-Kollektor-Ist 55.8
setstate myZentralheizung 2021-03-07 13:40:22 Temp-Speicher-Ist 45.8
setstate myZentralheizung 2021-03-07 13:40:21 Temp-WarmWasser-Ist 43.9
setstate myZentralheizung 2021-03-07 13:40:23 Temp-WarmWasser-Soll 60
setstate myZentralheizung 2021-03-07 13:36:51 Speicher-Solar_Erhitzung 1
setstate myZentralheizung 2021-03-07 13:36:51 Speicher-Spreizung -1.60
setstate myZentralheizung 2021-03-07 13:33:43 Solar-Spreizung 10.4

GunterB

Danke TomLee. Du hast mir mit dem .* sehr geholfen  ;D

attr myZentralheizung userReadings Solar-Spreizung:Temp-Kollektor-Ist.* {sprintf("%.2f",ReadingsVal("myZentralheizung","Temp-Kollektor-Ist",0)-ReadingsVal("myZentralheizung","Temp-Speicher-Ist",0))},\
Speicher-Spreizung:Temp-WarmWasser-Ist.* {sprintf("%.2f",ReadingsVal("myZentralheizung","Temp-WarmWasser-Ist",0)-ReadingsVal("myZentralheizung","Temp-Speicher-Ist",0))},\
Speicher-Solar_Erhitzung:Speicher-Spreizung.* {(ReadingsVal("myZentralheizung","Speicher-Spreizung",0) < 1.5)?1:0;;;;}

TomLee

Wird schon seinen Grund haben weshalb das im Wiki gleich als erstes in dem gelben Kasten (Randnotiz) erwähnt wird . ;)

GunterB

Danke auf für den Hinweis zu ReadingsVal.

Ich habe das sprintf verwendet, da mir das statistics Device bei der Speicher-Spreizung irgendwelche verrückten Dinge gemacht hat...
Obwohl alle Readings nur max zwei Nachkommastelle kommen.
Das sprintf hat aber auch nichts geändert.

setstate myZentralheizung 2021-03-07 13:50:32 statSolar-SpreizungDay Min: -39.30 Avg: -24.00 Max: 16.70
setstate myZentralheizung 2021-03-07 13:50:32 statSpeicher-SpreizungDay Min: -2.40000000000000 Avg: 13.28807865957660 Max: 16.70000000000000