[gelöst] userReadings setzen Abhängig von Wertänderung

Begonnen von Chris_XXX, 05 Februar 2019, 17:45:29

Vorheriges Thema - Nächstes Thema

Chris_XXX

Hallo,

funktioniert das folgende über ein userReading oder braucht man dazu ein notify bzw. doif:

Ich habe einen Stromzähler.
Bei Bezug ändert sich der Wert 1.8.0. Bei Einspeisung der Wert 2.8.0
Abhängig davon möchte ich ein Userreading setzen dass entweder +1 oder -1 ist.
Lässt sich sowas im selben Geärt mit den userReadings abbilden?

Grüße
Christian

MadMax-FHEM

Wenn beide Werte an dem selben "Gerät" als Reading aktualisiert werden geht das nat. mit userReadings...

Was immer du bei userReadings angibst wird "berechnet" wenn immer etwas an dem Gerät aktualisiert wird (sofern du das userReadings nicht "einschränkst")...

Gruß, Joachim
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)

Chris_XXX

hmmm das bedeutet aber ich kann denn Wert nicht auf = -1 oder = +1. Wenn sich das reading das gleichen Gerats 1.8.0 ändert soll das userreadings einen bestimmten, immer gleichen Wert annehmen und wenn sich das reading 2.8.0 des gleichen Gerätes soll das userreadings einen immer gleichen aber zur ersten Situation anderen Wert annehmen. z.b. eben +1 oder -1. Oder Bezug oder Einspeisung...

Grüße
Christian

KernSani

Du könntest die Timestamps der readings auslesen und davon abhängig das userreading setzen...


Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

chanky

Ich hab bei mir sowas

state ist zB. T:24.4 und von dem baue ich eine userreading Temperature ohne "T:"
Also  Temperature 24.4

Dieses geht so: unter Attribut UserReading gibt man der Code unten:

Temperature
{
    if(ReadingsVal("RoomTemp", "state", 0) =~ /(\d+.\d+)/)
    {
        $1;
    }
}

Du kannst bei Dir ähnlich machen, du holst Dir deine Reading über ReadingsVal() und rechnest dann eine neue Reading aus. Und mit return xxx setzst du dann die neue Reading.

LG
Chanky

Sent from my SM-G930F using Tapatalk


Chris_XXX

Hallo zusammen,

ich habe das nun mal nach Chankys Tip wie folgt versucht:
attr Stromzaehler1 event-on-change-reading 1.8.0,1.8.1_Bezug_HT:1,1.8.2_Bezug_NT:1,16.7_aktuelle_Leistung:0.02,2.8.0,2.8.0_Einspeisung:1,Flussrichtung
attr Stromzaehler1 userReadings 2.8.0_Einspeisung { ReadingsVal("Stromzaehler1","2.8.0", 0) }, Flussrichtung {if(ReadingsVal("Stromzaehler1", "1.8.0", 0) =~ /(\d+.\d+)/) {+1;;}}, Flussrichtung {if(ReadingsVal("Stromzaehler1", "2.8.0", 0) =~ /(\d+.\d+)/) {-1;;}}

Leier nimmt das userreadings Flussrichtung immer den Wert -1 an. Warum?
Es ändert sich ledigdiglich das Reading 1.8.0 im Wert. 2.8.0 bleibt im Moment wie es ist.  ???
Steh ich auf dem Schlauch oder geht das nicht so ganz wie ich mir das vorstelle?

Grüße
Christian

MadMax-FHEM

Ohne es jetzt genau geprüft zu haben aber:

du hast 2x das Reading "Flussrichtung"...
...d.h. es könnte sein, dass die erste "Definition" von Flussrichtung von der 2ten "überschrieben" wird?

Und es wird getriggert egal welcher Wert/Reading sich ändert...
...und du prüfst ja nicht auf Änderung...

Gruß, Joachim
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)

Chris_XXX

Ich dachte es wird nur getriggert wenn sich der Wert ändert. Deswegen das event-on-change-reading.
Wie prüfe ich dann auf eine Wertänderung wenn nicht damit?

Grüße
Christian

MadMax-FHEM

#8
event-on-change-reading ist schon richtig...

Aber auch wenn sich nur Reading "1.8.0" ändert wird das ganze userReadings-Konstrukt durchlaufen.

Du könntest mittels ReadingsAge prüfen und so sehen wann ein bestimmtes Reading zuletzt geändert wurde...

Aber trotzdem würde ich (bzw. musst du sogar?) die "Berechnung" des Readings "Flussrichtung" zusammenfassen, also nur EINMAL "definieren":

userReadings Flussrichtung {if(...){}elsif(...){}else{}}

statt wie bisher:

userReadings Flussrichtung {if(...){}}, Flussrichtung {if(...){}}

EDIT: eventuell ist auch $EVENT "definiert", dann kannst du da auch rauslesen "WAS" getriggert hat, evtl. mal: userReadings Flussrichtung $EVENT   um zu sehen, ob es zur Verfügung steht und was da so drin steht...

Gruß, Joachim
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)

stefanpf

Bisschen hässlich, da just am Handy zusammengetippt:



defmod d1 dummy
attr d1 room 00
attr d1 userReadings Richtung {\
time_str2num(ReadingsTimestamp($name, "a",0))\
> time_str2num (ReadingsTimestamp ($name,"b",0)) ? "1" : "-1"\
}

setstate d1 2019-02-06 20:05:53 Richtung -1
setstate d1 2019-02-06 20:05:42 a test
setstate d1 2019-02-06 20:05:53 b test



Chris_XXX

Gibt es irgend etwas womit ich auf Wertänderungen prüfen kann?
Der Zeitstempel ändert sich bei mir mit dem Abfrageinterval. Ich denke das hängt mit dem Gerät zusammen dass ich angelegt habe. Ein Stromzähler den ich aktiv ansprechen muss damit er mir was erzählt. Somit bekommen die Readings bei jedem pull einen neuen Zeitstempel. :(

CoolTux

Schau Dir mal timestamp-on-change-reading an.
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

MadMax-FHEM

Zitat von: commandref
OldReadingsVal(<devicename>,<reading> ,<defaultvalue>)
OldReadingsNum(<devicename>,<reading>, <defaultvalue>,<round>)
OldReadingsTimestamp(<devicename>,<reading> ,<defaultvalue>)
OldReadingsAge(<devicename>,<reading>,< defaultvalue>)
analog zu den Routinen oben, aber zum Zugriff auf die vorherigen Werte. siehe: oldreadings

https://fhem.de/commandref_DE.html#oldreadings

Gruß, Joachim
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)

Chris_XXX

Hallo zusammen,
ich mittlerweile läuft es. Danke an alle für die Unterstützung. Wen es interessiert:

attr Stromzaehler1 event-on-change-reading 1.8.0,1.8.1_Bezug_HT:1,1.8.2_Bezug_NT:1,16.7,16.7_aktuelle_Leistung:20,2.8.0,2.8.0_Einspeisung:1,Flussrichtung
attr Stromzaehler1 timestamp-on-change-reading 1.8.0,2.8.0
attr Stromzaehler1 userReadings 2.8.0_Einspeisung { ReadingsVal("Stromzaehler1","2.8.0", 0) }, \
Flussrichtung {time_str2num(ReadingsTimestamp($name, "1.8.0",0))> time_str2num (ReadingsTimestamp ($name, "2.8.0",0)) ? "1000" : "-1000"}, \
16.7_aktuelle_Leistung { ReadingsVal("Stromzaehler1","16.7", 0) * ReadingsVal("Stromzaehler1","Flussrichtung", 0)}


Vielen Danke nochmals
Christian