Tendenzen berechnen und ausgeben

Begonnen von iceman, 05 Juni 2014, 13:42:45

Vorheriges Thema - Nächstes Thema

iceman

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?


betateilchen

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 :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

iceman

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?

justme1968

poste mal die komplette definition und die Versionen der module

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

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

epsrw1

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
Ich habe keine Ahnung, aber davon wenigstens ganz viel

justme1968

oder man verwendet differential statt difference bei den userReadings da wird die zeit gleich mit berücksichtigt.

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

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Luigi

#8
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

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Luigi

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

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

iceman

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...

justme1968

das muss nach valueFormat und noch geschweifte klammern drum.

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

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

iceman

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.