FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Chris_XXX am 05 Februar 2019, 17:45:29

Titel: [gelöst] userReadings setzen Abhängig von Wertänderung
Beitrag von: Chris_XXX am 05 Februar 2019, 17:45:29
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: MadMax-FHEM am 05 Februar 2019, 18:41:07
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: Chris_XXX am 05 Februar 2019, 19:51:09
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: KernSani am 05 Februar 2019, 20:05:15
Du könntest die Timestamps der readings auslesen und davon abhängig das userreading setzen...


Kurz, weil mobil
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: chanky am 05 Februar 2019, 23:27:12
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

Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: Chris_XXX am 06 Februar 2019, 19:40:02
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: MadMax-FHEM am 06 Februar 2019, 19:46:33
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: Chris_XXX am 06 Februar 2019, 19:50:43
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: MadMax-FHEM am 06 Februar 2019, 19:57:45
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: stefanpf am 06 Februar 2019, 20:06:39
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


Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: Chris_XXX am 06 Februar 2019, 20:49:01
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. :(
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: CoolTux am 06 Februar 2019, 20:51:28
Schau Dir mal timestamp-on-change-reading an.
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: MadMax-FHEM am 06 Februar 2019, 20:53:25
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
Titel: Antw:userReadings setzen Abhängig von Wertänderung
Beitrag von: Chris_XXX am 09 Februar 2019, 09:18:45
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