Tendenz von Messwerten wie Temperatur, Feuchte etc.

Begonnen von der-sigi, 28 Juli 2017, 11:11:41

Vorheriges Thema - Nächstes Thema

der-sigi

Hallo

habe mir zur schnellen Übersicht eine Tendenz Ausgabe für meine Sensoren gebaut. Vielleicht hilft das jemand.

In die "./FHEM/99_myUtils.pm" folgendes eintüdeln:


# --- calculate tendency
# --- 2017-07-20 Siegfried Kerkow
#
# my $tendency = calcTendency(device,sourcereading,ageinseconds);
#
# uses device readings from "sourcereading" enhanced to
# "sourcereading"old"ageinseconds" and "sourcereading"tendency"ageinseconds"
# like in a notify for the device "LACROSSEONE"
#
#   my $tendency = calcTendency("LACROSSEONE","temperature",120);
#   fhem("set LACROSSEONE temperaturetendency120 $tendency");
#
# Uses readings "temperature" to read, "temperatureold120" to
# read/write and "temperaturetendency120" to read in device "LACROSSEONE".
# If the "age" readings not exist they would be set.
#
sub calcTendency($$$) {
  # --- get parameter
  my ($deviceName,$valueName,$useAge) = @_;
  # --- get current value
  my $newValue = ReadingsVal($deviceName,$valueName,0);
  # --- build names
  my $tendencyName = $valueName."tendency".$useAge;
  my $oldValueName = $valueName."old".$useAge;
  # --- get old tendency
  my $tendency = ReadingsVal($deviceName,$tendencyName,"?");
  # --- get age of old value
  my $oldAge = ReadingsAge($deviceName,$oldValueName,0);
  # --- run on parts
  # --- reading not exists ?
  if ($oldAge == 0) {
    # --- set reading to work with
    fhem("setreading $deviceName $oldValueName $newValue");
  }
  # --- usable ?
  if ($oldAge > $useAge) {
    # --- old enough - get old value
    my $oldValue = ReadingsVal($deviceName,$oldValueName,0);
    # --- preset tendency
    $tendency = "=";
    # --- check tendency
    if ($oldValue < $newValue) { $tendency = "+"; }
    if ($oldValue > $newValue) { $tendency = "-"; }
    # --- recalculate old value
    my $oldValue = ($oldValue + $newValue) / 2;
    # --- return current tendency
    fhem("setreading $deviceName $oldValueName $oldValue");
  }
  # --- return current tendency
  return $tendency;
}


Das ergibt dann beispielsweise folgende (zusammengebaute) State Ausgaben:


AUSSEN: 19.2|=|+|73|=|-|14.2|ok
KUECHE: 21.6|=|+|64|=|-|14.5|20.8|67.0|-|-|ok


Bei AUSSEN haben wir Temperatur, Feuchte, Taupunkt und Batteriestatus. Hinter Temperatur und Feuchte gibt es jeweils zwei Felder mit einer Tendenz mit 60 und 3600 Sekunden. Somit sieht man einen schnellen und einen Langzeit Wechsel. Hier sieht man, dass die Temperatur langsam steigt und die Feuchte langsam sinkt. Bei der KUECHE ist es ähnlich, da kommt vor dem Batteriestatus noch die errechnete Wand-Temperatur und Feuchte. Letztere hat auch die Tendenz-Angaben. Hier sieht man ein identisches Verhalten wie bei den AUSSEN-Angaben, die Wandfeuchte sinkt allerdings schneller. Mit den Tendenz-Angaben ist es leichter die Lüftung und/oder Heizung zu regeln und entsprechende Infos auszugeben.

Viele Grüße
Sigi

Skusi

Seehr schön.

Sowas hab ich schon lange gesucht.
Schon eingebaut !

Vielen herzlichen Dank...

Einfach toll, das man nicht jedes Rad neu erfinden muß !
RPI3B, SIGNALduino, NanoCul868 (a-culfw), JeeLink Clone (LaCrosse), Firmata  für FB Heizung,Wasser+Gas+Klingel+Lux, Somfy Rolladen, Pollin Steckd.,TX29DTH,ESPEasy an S0 Stromz., MAX Fensterkontakte, IButton, SonOff Tasmota, ESP LED Controler

Skusi

Seit kurzem meckert Fhem im Log folgendes:

PERL WARNING: "my" variable $oldValue masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 105.

Die Zeile ist folgende und gehört zu Deine Script das ich schon lange erfolgreich benutze:

    my $oldValue = ($oldValue + $newValue) / 2;

Was ist denn nun plötzlich an der Zeile falsch ?
Ich kann ehrlich gesagt die Fehlermeldung nicht deuten.

Jemand einen Hinweis ???
RPI3B, SIGNALduino, NanoCul868 (a-culfw), JeeLink Clone (LaCrosse), Firmata  für FB Heizung,Wasser+Gas+Klingel+Lux, Somfy Rolladen, Pollin Steckd.,TX29DTH,ESPEasy an S0 Stromz., MAX Fensterkontakte, IButton, SonOff Tasmota, ESP LED Controler

Maista

@Skusi

my $oldValue = ($oldValue + $newValue) / 2;


Hier eventuell das "my" entfernen und schauen was passiert.

Die variable wird dadurch zum zweiten mal definiert.
Was vermutlich nicht gewollt ist?!

Gruß Gerd

der-sigi

Maista hat recht, das wurde zweimal deklariert. Mein Fehler. Tschuldigung. Gruß Sigi