Userreadings wird bei jedem Event getriggert

Begonnen von newby, 14 April 2016, 09:53:33

Vorheriges Thema - Nächstes Thema

newby

Hallo,
ich habe eine UserReadings das nur auf "appCountsPerHour" geändert werden soll.
Leider wird es aber bei jedem Event des Devices getriggert.
Auszug cfg

define CN.Gasverbrauch HourCounter GPIOGaszaehler:on GPIOGaszaehler:off
attr CN.Gasverbrauch group Gas
attr CN.Gasverbrauch room Energie
attr CN.Gasverbrauch userReadings HourskWh:appCountsPerHour {ReadingsVal("CN.Gasverbrauch","appCountsPerHour",0) /100*9.8116}


hier die Readings
HourskWh                3.728408       2016-04-14 09:43:39
appCountsPerDay         597            2016-04-14 00:00:16
appCountsPerHour        38             2016-04-14 09:00:12
appCountsPerHourTemp    32             2016-04-14 09:43:39
appCountsPerMonth       32003          2016-04-01 00:00:00
appCountsPerMonthTemp   8370           2016-04-14 09:43:39
appCountsPerWeek        4327           2016-04-10 00:00:22
appCountsPerWeekTemp    2424           2016-04-14 09:43:39

Wie man sieht wird "HourskWh" auch getriggert wenn z.B. appCountsPerHourTemp 32   ein Event auslöst.
Was mache ich falsch?


Danke und Gruß
Sven

justme1968

der trigger teil wird als regex verwendet und die regex appCountsPerHour matched auch auf appCountsPerHourTemp.

versuch malattr CN.Gasverbrauch userReadings HourskWh:appCountsPerHour$ {ReadingsVal("CN.Gasverbrauch","appCountsPerHour",0) /100*9.8116}

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

newby

attr CN.Gasverbrauch userReadings HourskWh:appCountsPerHour$ {ReadingsVal("CN.Gasverbrauch","appCountsPerHour",0) /100*9.8116}

leider wird das Userreading so jetzt gar nicht mehr getriggert. :'(

gruss
Sven

justme1968

hab gerade gesehen das das $ an dieser stelle nicht erlaubt ist weil es kein erlaubtes ziehen in reading namen ist.

nimm statt des user readings ein notify und setze das reading von dort aus mit setreading. da bist du flexibler was die regex und auch die bedingungen angeht.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

newby

Habe jetzt das Reading tickHour dafür genommen.
Das ist zwar nicht die saubere Lösung aber es funktioniert ohne weiteres zutun.#

Danke für die schnelle Unterstützung.

Gruss
Sven

rudolfkoenig

Zitatder trigger teil wird als regex verwendet und die regex appCountsPerHour matched auch auf appCountsPerHourTemp.
@Boris: gibt es einen Grund, warum der userreadings Trigger nur mit einem ^ ergaenzt wird, und nicht mit ^$, so wie bei notify? Ich wuerde es sonst auf ^$ aendern.

justme1968

ich glaube der patch für die trigger war von mir. ich weiß aber nicht warum das $ fehlt.

ich würde ja sagen das $ sollte mit rein. es ist aber nicht wirklich rückwärts kompatibel.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Zitatich würde ja sagen das $ sollte mit rein.
Habs reingenommen.

Zitates ist aber nicht wirklich rückwärts kompatibel.
Stimmt, aber da sollten wir jetzt  (aka lieber frueher als spaeter) durch

dev0

Durch diese Änderung werden userReadings mit einem Trigger nicht mehr ausgelöst:

inform timer D1
define D1 dummy
2016-04-17 10:45:42.642 Global global DEFINED D1

attr D1 userReadings new:orig {(ReadingsVal($name,"orig","0")>0?1:0)}
2016-04-17 10:46:06.224 Global global ATTR D1 userReadings new:orig {(ReadingsVal($name,"orig","0")>0?1:0)}
setreading D1 orig 1
2016-04-17 10:46:17.213 dummy D1 orig: 1

attr D1 userReadings new:orig.* {(ReadingsVal($name,"orig","0")>0?1:0)}
2016-04-17 10:46:27.335 Global global ATTR D1 userReadings new:orig.* {(ReadingsVal($name,"orig","0")>0?1:0)}
setreading D1 orig 1
2016-04-17 10:46:32.734 dummy D1 orig: 1
2016-04-17 10:46:32.734 dummy D1 new: 1

rudolfkoenig

Verstehe ich nicht: du demonstierst es gerade, dass es geht.

dev0

In meinem Beispiel ist der Trigger der vollständige Readingname. Wird aber erst ausgelöst, wenn man den Readingnamen um ein .* ergänzt.

Command ref:
Zitat
Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Daraus lese ich, dass als Trigger der Readingname reicht. Habe ich das falsch verstanden?

rudolfkoenig

Weiss nicht, weder der urspruengliche Code noch die Doku stammt von mir.

Tatsache ist, dass es sich hier um Events handelt, und man muss (seit der Aenderung) das komplette Event (Name _und_ Wert) per Regexp spezifizieren, genauso wie in notify/watchdog/etc. Vor der Aenderung reichte es den vorderen Teil des Events zu spezifizieren, was je nach Glueck mit dem Namen des gewuenschten Readings identisch war.

justme1968

wie gesagt es ist von mir und war einer meiner aller ersten vorschläge.

und jetzt weiss ich auch wieder warum das $ im ursprünglichen patch nicht mit drin war. aktuell ist es so tatsächlich zu keinem bisherigen userreading das das trigger feature verwendet mehr kompatibel da ich vermute das fast alle anwender hier nur den reading namen verwenden.

wie wäre es : zu ergänzen statt $ dann würde man immer auf den reading namen eingrenzen und nicht auf das event. es wäre anders als notify aber rückwärtskompatibel.

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Ich bin fuer lieber mehr Konformitaet als Kompatibilitaet.
Lass mich aber ueberstimmen.

stromer-12

Ich hatte bei mir das vorher mit einer Klammer um das Reading hinbekommen. Damit wurden andere Readings mit gleichen Namen beginnend nicht berücksichtigt.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Mihca

sorry, ich bin etwas verloren, was nun zu ändern ist. Ich hatte bisher folgendes userreading:

attr Temp.Feuchte.Norden userReadings TDach:temperature {ReadingsVal("Temp.Dach","temperature",0);;}

und der Trigger hat funktioniert. Nun habe ich es auf folgendes umgestellt:

attr Temp.Feuchte.Norden userReadings TDach:temperature$ {ReadingsVal("Temp.Dach","temperature",0);;}

und es funktioniert nicht mehr. Was mache ich falsch?

Vielen Dank vorab
Achim
Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

newby


Versuchs mal damit

attr Temp.Feuchte.Norden userReadings TDach:temperature.* {ReadingsVal("Temp.Dach","temperature",0);;}


das hat bei mir funktioniert.
Gruß
Sven

rudolfkoenig

Merkregel: Regexp genauso wie in notify/FileLog/watchdog/etc.
Der Regexp muss das komplette Event erwischen, d.h. mit dem dazugehoerigen Wert.

Mihca

Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

Mihca

... fast alles geht jetzt, außer Folgendem:

attr Stromzaehler userReadings power:energy.* differential {ReadingsVal("Stromzaehler","energy",0)*3600;;}

"power" wird bei dem Triggerevent nicht berechnet. Hat jemand eine Idee?

Vielen Dank für Hilefe vorab.

Gruß Achim
Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

FunkOdyssey

#20
Ich habe bei meinem HM-Sen-DB-PCB ein userreading wie folgt hinzugefügt:

lastAction:trigger {ReadingsTimestamp("$name","trigger","")}

Es sieht danach aus, als hätte ich bei diesem Commit einfach Pech, weil ich auf das Reading "trigger" gesetzt habe, oder?

Schaue ich mir meine anderen Geräte (BM) an, so funktioniert es nämlich grundsätzlich:

lastAction:motion {ReadingsTimestamp("$name","motion","")}

Ich suche mir mal ein neues Readings aus, welches ich dafür benutzen kann. Hoffentlich liegt es daran. :-)




Nachtrag: Ich glaube, dass ich es jetzt verstanden habe. Ich habe nun auch die Schreibweise geändert und warte mal ab.


lastAction:state.* {ReadingsTimestamp("$name","state","")}

scooty

#21
Zitat von: Mihca am 18 April 2016, 16:08:59
... fast alles geht jetzt, außer Folgendem:

attr Stromzaehler userReadings power:energy.* differential {ReadingsVal("Stromzaehler","energy",0)*3600;;}

"power" wird bei dem Triggerevent nicht berechnet. Hat jemand eine Idee?

Vielen Dank für Hilefe vorab.

Gruß Achim

Kann es sein, dass das Reading "energy" einen Wert mit Einheit enthält, z.B. "5 kWh"?
Probiere 'mal:
attr Stromzaehler userReadings power:energy.* differential {ReadingsNum("Stromzaehler","energy",0)*3600;;}

Andreas
Fhem auf Gigabyte Brix
CUL V3 HM / CUL V3 MAX / MaxCube aFW Homematic&MAX / ZWave.me ZME_UZB1 / SDuino 433 / Velux KLF200
Homematic / MAX / Logitech Hub / ZWave / Wifi LED / div. 433 Temperatursensoren / pywws WH10880 / IO Homecontrol

Mihca

Hallo Scooty,
vielen Dank. Nein, das reading "energy" hat keine Einheit. Es funktioniert nun ohne weitere Änderungen doch.
Grüße Achim
Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

Dr. Boris Neubert

Hallo,

Zitat von: rudolfkoenig am 15 April 2016, 18:37:22
@Boris: gibt es einen Grund, warum der userreadings Trigger nur mit einem ^ ergaenzt wird, und nicht mit ^$, so wie bei notify? Ich wuerde es sonst auf ^$ aendern.

sorry, bin erst jetzt auf dieses Thema aufmerksam geworden - lese dieses Board nicht.

Ich finde es richtig, dass sich Regexe durchgehend gleich verhalten.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

sw586

Hallo,

wenn ich es richtig verstanden habe muss jetzt immer ein ".*" angehängt werden.
Damit funktioniert es bei mir jedenfalls wieder.

Sollte dann nicht auch die Dokumentation geändert werden?

z.B. hier: http://fhem.de/commandref.html#userReadings

Gruß
Stefan

rudolfkoenig


MEitelwein

Ein kleiner Tip, wenn man Readings mit gleichem Wortanfang hat, z.B. die Readings

rain
rain_min
rain_max

Ein userReading mit rain als Trigger kann dann über die Wortgrenze eindeutig identifiziert werden, die im Regex über \b definiert wird:

... userReading rain_1h:rain\b.* {myDiff(   60*60, "logDB", "out_Wetterstation:rain_total")}

dev0

Ein Doppelpunkt statt einer regexp erscheint mir lesbarer/sinnvoller...

drdownload

#28
sorry, verlesen, gelöscht.
CUL 868 Slow-RF (FS20 Aktoren, Sender, FHT8V), CUL 868 (WMBUS-Empfang), Jeelink (PCA301), WS3600 (WH3080 über USB-Basis), Bewässerung mit ESP-Easy und Proplanta, RFXTRX433 Home-Easy Empfang und Senden, Oregon TH, WS001 TH), Blackbean IR, Mopidy-Snapcast MR Audio, Kodi, Forum-LED-Controller,

unimatrix

habe ich es richtig verstanden, dass man die userReadings nicht von ausserhalb eines Moduls triggern kann? Hintergrund: In einer HTTPMOD Definition berechne ich auch eine verbleibende Zeit in Minuten. Die soll minuetlich neu gerechnet werden (um eben immer zu stimmen), aber das Modul soll nicht alle 60 Sekunden auch die URL abfragen.

justme1968

userReadings werden nur durch readings änderungen im selben device getriggert.

wenn du readings von hand setzen willst nimm setreading.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Tueftler1983

#31
Darf ich hier nochmal einharken??

Habe ein Userreading
result_01_consumptionS {ReadingsVal("Discovergy2","result_1_consumption",0) / 1000}

Das reading: "result_01_consumption" gibt es 12 mal wo sich halt nur die Zahl ändert.
Gibt es eine Möglichkeit das userreading flexibel zu machen?
So in etwa
result_$_consumptionS {ReadingsVal("Discovergy2","result_$_consumption",0) / 1000}

dev0

Nimm 1 notify und benutze setreading. Wenn Du die Events der neuen Readings benötigst, dann setreading mit einem 'sleep 0.1' davor.

Tueftler1983

Aber muss ich das dann im notify für jedes reading machen?
Habe 12 mal Start zeit
12 mal endlich Zeit
Und 12 mal Zählerstand
Oder gibt es ne Möglichkeit das mit 3 notifys zu machen wo die Zahl zwischen den _ _ variabel ist?

Tueftler1983

Es geht sich ja darum das ich da nicht 36 userreadings oder spalten im notify schreiben muss. Also ob man in den RedingNamen die Zahl zwischen _ _ als automatisch erkennende Variable beschreiben kann über ein regex oder so?

dev0