Hi,
ich möchte gern für meine S300th Devices the Temperatur- und Fuechtigkeitstendenz ausgeben lassen. Ich stelle mir das wie folge vor:
- Der letzte Temperatur/Luftfeuchtigkeitswert soll gespeichert werden
- Bei einem neuen Wert soll dieser mit dem gespeicherten Wert verglichen werden und dann z.B. als Icon ein Pfeil hoch, runder oder Gleich ausgegeben werden.
- Danach soll der momentane Wert den gespeicherten ersetzen.
Leider hab ich keine Ahnung wie ich dafür anfangen soll bzw. wo ich suchen sollte ob sowas schon existiert. So Ungewöhnlich ist meine Idee das doch nicht... oder?
Du meinst sowas?
(http://up.picr.de/18513952af.jpg)
Es funktioniert genau so, wie Du es oben angeführt hast.
Du musst den gemeldeten Wert mit dem vorherigen Wert vergleichen und entsprechend das Symbol ausgeben.
Dazu brauchst Du ein notify, das auf gemeldete Werte reagiert, hier am Beispiel der Luftfeuchtigkeit:
out_Balkon.humidity.* { n_humiCheck }
Die aufgerufene Funktion n_humiCheck liegt in der 99_myUtils.pm und sieht so aus:
sub n_humiCheck {
my $a;
$a = Value("out_balkonH_neu");
CommandSet(undef, "out_balkonH_alt $a");
$a = ReadingsVal("out_Balkon","humidity","");
CommandSet(undef, "out_balkonH_neu $a");
return;
}
out_balkonH_neu und out_BalkonH_alt sind dabei zwei dummy um Werte zwischenzuspeichern.
Und dann gibt es noch eine Funktion in der 99_myUtils.pm um das entsprechende Symbol für die Tendenz zu bekommen:
##########
#
# find icon for wheather conditions change
#
sub tendenz($$;$) {
#↑→↓
my ($alt,$neu,$t) = @_;
return '↑' if ($alt < $neu); # steigend
return $t if ($alt == $neu); # gleich
return '↓' if ($alt > $neu); # fallend
}
Das Symbol selbst wird ebenfalls in einem dummy gespeichert, bei mir heisst das out_balkonH_sig.
(http://up.picr.de/18514004ki.png)
Ich hoffe, das sind genug Informationen, damit Du Dir das nun selbst zusammenstricken kannst. Ein bisschen Selberdenken überlasse ich immer gerne den Fragestellern, das fördert die Weiterentwicklung :)
je nach dem wo und wie du die werte anzeigen möchtest gibt es mindestens ein dutzend möglichkeiten. ich würde extra dummys vermeiden und den trend als reading mit ins device stecken.
eine möglichkeit ist so etwas:trend:temperature difference {ReadingsVal($name,"temperature",0)}
und in einer readingsGroup den wert auf ein symbol oder icon mappen:trend => '{if($VALUE<0){return"v"}elsif($VALUE>0){return"^"}; return "-"
statt userReadings kannst du auch ein notify verwenden.
statt einer readingsGroup kannst du auch stateFormat verwenden.
gruss
andre
Vielen Dank für die Hilfe!
JustMe1968, ich wollte Deine Variante Umsetzen. Ich gleube mir fehlen leider noch ein paar Infos.
Also ich hab in meinen Devices folgendes userReading eingebaut:
userReadings trend:temperature difference {ReadingsVal($name,"temperature",0)}
In meiner readingsGroup hab ich dann folgendes eingestellt:
valueFormat {temperature => "%.1f °C",trend, humidity =>"%.1f %%"}
und
valueStyle if($READING eq "trend") { if($VALUE < 0) { return"v" } elsif($VALUE > 0) { return"^" } else { return "-" }}
Leider ohne ausgabe... Was mach ich falsch?
poste mal die komplette definition und die Versionen der module
gruss
andre
ich würde zusätzlich beachten daß die abruffrequenz des sensors den angezeigten wert beeinflußt. zb:
alle 10 sek -> absolutwert veränderung sehr gering
alle 60 sek -> angezeigter wert 6 mal höher
entweder takt der sensoren gleich einstellen (ich mache das bei mir nicht damit nicht immer alle gleichzeitig abgearbeitet werden müssen), oder mit perl umrechnen in festes zeitintervall (codemuster auf wunsch v.mir)
LG,florian
oder man verwendet differential statt difference bei den userReadings da wird die zeit gleich mit berücksichtigt.
gruss
andre
den Takt der Sensoren kann man aber in den meisten Fällen gar nicht beeinflussen. Aus diesem Grund verzichte ich auch auf die Darstellung der Variante "unverändert" und zeige nur "steigend" und "fallend" an.
Übrigens: mein Lösungansatz hat den entscheidenden Vorteil, dass ich das Ganze nur ein einziges Mal einbauen muss und nicht bei jedem gewünschten Sensor/Messwert anfange, mit userreadings rumzuhampeln.
Ich habe zu meinem Temperatur/Luftfeuchte-Sensor HM-WDS10-TH-O folgende userReadings hinzugefügt:
userReadings
trend_humidity difference {ReadingsVal("A_TH","humidity",0)}, trend_temperature difference {ReadingsVal("A_TH","temperature",0)}
Allerdings sind die Readings immer auf 0.
Ein Blick in den Event Monitor zeigt, dass das userReading sofort wieder auf 0 gesetzt wird.
2014-06-06 09:46:04 statistics Stat Updated stats for: A_TH
2014-06-06 09:46:04 CUL_HM A_TH temperature: 17.7
2014-06-06 09:46:04 CUL_HM A_TH battery: ok
2014-06-06 09:46:04 CUL_HM A_TH humidity: 67
2014-06-06 09:46:04 CUL_HM A_TH T: 17.7 H: 67
2014-06-06 09:46:04 CUL_HM A_TH trend_temperature: 0.0999999999999979
2014-06-06 09:46:04 CUL_HM A_TH trend_humidity: 0
2014-06-06 09:46:04 CUL_HM A_TH trend_temperature: 0
Woran kann das liegen?
Luigi
du musst bei jedem user reading angeben von welchem 'original' es abhängt. sonst wird z.b. die Differenz bei temperature auch berechnet wenn sich humidity ändert und die ist dann nun mal 0.
userReadings trend_humidity:humidity difference {ReadingsVal($name,"humidity",0)}, trend_temperature:temperature difference {ReadingsVal($name,"temperature",0)}
gruss
andre
Bringt leider keine Änderung!
2014-06-06 11:32:36 CUL_HM A_TH temperature: 22.2
2014-06-06 11:32:36 CUL_HM A_TH battery: ok
2014-06-06 11:32:36 CUL_HM A_TH humidity: 47
2014-06-06 11:32:36 CUL_HM A_TH T: 22.2 H: 47
2014-06-06 11:32:36 CUL_HM A_TH trend_temperature: 0.199999999999999
2014-06-06 11:32:36 CUL_HM A_TH trend_humidity: 0
2014-06-06 11:32:36 CUL_HM A_TH trend_temperature: 0
2014-06-06 11:32:36 CUL_HM A_TH trend_humidity: 0
userReadings
trend_humidity:humidity difference {ReadingsVal("A_TH","humidity",0)}, trend_temperature:temperature difference {ReadingsVal("A_TH","temperature",0)}
Luigi
hat du event-on-change-reading gesetzt?
wenn nicht ist die differenz natürlich auch 0 wenn der sensor den gleichen wert noch mal sendet.
und eventuell min-event-intervall um auch ohne änderung regelmäßig ein update zu bekommen.
gruss
andre
Hi,
ich bin nach einigen gefrickel etwas weiter gekommen. Jetzt wird der trend zumindest in der readingsGroup als Wert angezeigt. Meine Versuche den Wert auf ein Zeichen oder Icon zu mappen sind bisher fehlgeschlagen.
Unter welches Attribute der readingsGroup sollte ich den folgende Zeile eintragen:
trend_temperature => '{if($VALUE<0){return"v"}elsif($VALUE>0){return"^"}; return "-"
? Bzw. ist da irgendwo noch ein syntax Fehler? Ich hab momentan Tomaten auf den Augen...
das muss nach valueFormat und noch geschweifte klammern drum.
gruss
andre
Hmmm, hab ich versucht, geht aber nicht.
Ich hab neben den trend natürlich auch noch Temperatur und Luftfeuchte drin. Dann sieht valueFormat bei mir wie folgt aus:
{ temperature => "%.1f °C",trend_temperature => '{if($VALUE<0){return"v"}elsif($VALUE>0){return"^"}; return "-",humidity =>"%.1f %%"}
Dann werden aber noch nicht mal mehr °C und % dargestellt. Ohne trend sehe ich wenigsten °C und % aber halt nur den trend Wert.
dir fehlt das schließende einfache anführungszeichen nach dem "-" genau vor ,humidity.
... return "-" ' ,humidity...
gruss
andre
Hi,
Danke, nachdem ich neben dem '
auch noch ein }
eingefügt hab, geht es jetzt! Das valueFormat muss also wie folgt aussehen:
attr TempHygro valueFormat { temperature => "%.1f °C",trend_temperature => '{if($VALUE<0){return"v"}elsif($VALUE>0){return"^"};; return "-"}',humidity =>"%.1f %%",trend_humidity => '{if($VALUE<0){return"v"}elsif($VALUE>0){return"^"};; return "-"}'}
Jetzt hab ich mir aber beim einbauen meine Plots zerschossen. Wenn ich die Logfiles richtig deute, wird seitdem ich die userReadings und Events eingebaut habe nichts mehr in die Logfiles für die Plots geschrieben. Wie kann ich das wieder fixen?
Ich meine momentane cfg für ein Device:
# Wohnen
define Wohnen CUL_WS 7 [0,0]
attr Wohnen event-on-change-reading temperature,humidity
attr Wohnen group Haus
attr Wohnen room Temperaturen
attr Wohnen sortby 01
attr Wohnen userReadings trend_humidity:humidity difference {ReadingsVal("Wohnen","humidity",0)}, trend_temperature:temperature difference {ReadingsVal("Wohnen","temperature",0)}
define FileLog_Wohnen FileLog ./log/Wohnen-%Y.log Wohnen:T:.*
attr FileLog_Wohnen logtype temp4hum6:Temp/Hum,text
attr FileLog_Wohnen room 9.90_Logs
define weblink_Wohnen SVG FileLog_Wohnen:temp4hum6:CURRENT
attr weblink_Wohnen group Haus
attr weblink_Wohnen label "Wohnen Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr weblink_Wohnen room 07_Wohnen
define SVG_Wohnen SVG FileLog_Wohnen:temp4hum6:CURRENT
attr SVG_Wohnen label "Wohnen Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr SVG_Wohnen room Plots
Hallo betateilchen
[GELÖST] userReadings <NAME> measured-temp_trend difference { ReadingsVal("HeizungSzMotor_Clima","measured-temp",0) }
Ich bin Deinem Beispiel gefolgt, habe das notify, die 3 dummy´s und die 99_myUtils.pm Einträge erstellt.
Die beiden dummy´s für _neu und _alt nehmen die entsprechenden Werte an.
Wo ich nicht weiterkomme, ist der Umgang mit der Funktion tendenz.
Der entsprechende dummy wird nicht gefüllt, muss ich noch ein notify bauen, aber wie?
notify
Internals:
DEF HeizungSz_Climate.measured-temp.* { n_tempCheck }
NAME szTempTendenz
NR 1374
NTFY_ORDER 50-szTempTendenz
REGEXP HeizungSz_Climate.measured-temp.*
STATE 2017-10-31 13:25:15
TYPE notify
READINGS:
2017-10-31 12:03:43 state active
Attributes:
room Schlafzimmer
99_myUtils.pm
##########
#
# temperature check
#
sub n_tempCheck {
my $d;
$d = Value("HeizungSz_ClimateT_neu");
CommandSet(undef, "HeizungSz_ClimateT_alt $d");
$d = ReadingsVal("HeizungSz_Climate","measured-temp","");
CommandSet(undef, "HeizungSz_ClimateT_neu $d");
return;
}
##########
#
# find icon for temperature change
#
sub tendenz($$;$) {
#↑→↓
my ($alt,$neu,$t) = @_;
return '↑' if ($alt < $neu); # steigend
return $t if ($alt == $neu); # gleich
return '↓' if ($alt > $neu); # fallend
}
dummy
Internals:
NAME HeizungSz_ClimateT_sig
NR 1377
STATE tendenz
TYPE dummy
READINGS:
2017-10-31 12:19:04 state ???
Attributes:
room Schlafzimmer
Ich will die Tendenz weiter verwenden um Aktionen nur bei fallen oder steigen auszulösen.
Beste Grüße
Heinz