24 Stunden Aussen Messwerte als ASCII Grafik

Begonnen von der-sigi, 04 August 2017, 14:21:08

Vorheriges Thema - Nächstes Thema

der-sigi

Hallole

ich wollte die gegebenen stündlichen Aussen Messwerte von 24 Stunden als kleine ASCII Grafik zur schnellen Übersicht haben. Eine ASCII Grafik kann man auch schnell und günstig versenden. Folgendes habe ich gemacht (geht sicher besser):

In die fhem.cfg gibt es neu:


# === DAY DATA
define DayData dummy
attr DayData group Initialization
define EveryHourJob at +*01:00:00 { insertDayData() }
attr EveryHourJob alignTime 00:00


In der ./FHEM/99_myUtils.pm gibt es zuerst mal:


# --- add current data to hourly daily data
sub insertDayData() {
  # --- need current hour
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  # --- build day data
  my $result = ReadingsVal("LaCrosseD","temperature",-99);
  $result .= "|".ReadingsVal("LaCrosseD","humidity",-9);
  $result .= "|".ReadingsVal("LaCrosseD","dewpoint",-99);
  $result .= "|".ReadingsVal("LaCrosseE","pressure",0);
  # --- save to current hour
  fhem("setreading DayData outside_".sprintf("%02d",$hour)." ".$result);
}


Der LaCrosseD ist bei mir der Aussen Sensor mit Temperatur und Feuchte. Der Taupunkt wird ausgerechnet. Und der Luftdruck kommt von einem modifizierten LaCrosseE. Das erzeugt beim DayData dummy 24 user readings von outside_00 bis outside_23. Hier werden nun immer als Loop stündlich die aktuellen Werte reingeschrieben und damit alte Werte überschrieben. Somit habe ich immer die aktuellen Werte der letzten 24 Stunden. Das sieht dann so aus:


outside_00   22.2|74|17.3|1009.7   2017-08-04 00:00:00
outside_01   21.7|76|17.3|1009.9   2017-08-04 01:00:00
outside_02   21.2|77|17.0|1009.7   2017-08-04 02:00:00
outside_03   20.6|78|16.6|1009.5   2017-08-04 03:00:00
...


Pro Stunden-Speicher outside_xx sind alle vier Werte, mit dem Pipe Symbol getrennt, abgelegt. Das wird dann in der nächsten Routine produceDailyDayData() in der ./FHEM/99_myUtils.pm mit split() wieder auseinandergenommen:


# --- produce a daily ascii graphics of outside data
sub produceDailyDayData() {
  # --- need current hour
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  # --- range temperature -20..40 / humidity 0..100 / dewpoint -20..40
  #               0.........1.........2.........3
  # --- start output
  my $result = "\n";
  # --- temperature scale
  $result .= "T -20..-10....0...10...20...30...40\n";
  # --- calculate usable part
  my $usehour = $hour - 24 + 1;
  while ($usehour > 23) { $usehour = $usehour - 24; }
  while ($usehour < 0) { $usehour = $usehour + 24; }
  # --- thru all day data
  for (my $i = 0; $i < 24; $i++) {
    # --- get data per hour
    my $data = ReadingsVal("DayData","outside_".sprintf("%02d",$usehour),"?");
    # --- data usable
    if ($data ne "?") {
      # --- separate data
      my ($temperature,$humidity,$dewpoint,$pressure) = split('\|',$data);
      # --- make a empty line
      my $line = "...............................";
      # --- dewpoint
      if ($dewpoint != -99) {
        $dewpoint = int(($dewpoint + 20.5) / 60 * 30);
        substr($line,$dewpoint,1) = "D";
      }
      # --- pressure
      if ($pressure != 0) {
        $pressure = int(($pressure - 950 + 0.5) / 100 * 30);
        substr($line,$pressure,1) = "P";
      }
      # --- humidity
      if ($humidity != -9) {
        $humidity = int(($humidity + .5) / 100 * 30);
        substr($line,$humidity,1) = "H";
      }
      # --- temperature
      if ($temperature != -99) {
        $temperature = int(($temperature + 20.5) / 60 * 30);
        substr($line,$temperature,1) = "T";
      }
      # --- paste together
      $result .= sprintf("%02d  %s",$usehour,$line."\n");
    }
    # --- next hour
    $usehour = $usehour + 1;
    while ($usehour > 23) { $usehour = $usehour - 24; }
    while ($usehour < 0) { $usehour = $usehour + 24; }
  }
  # --- humidity scale
  $result .= "H   0....20....40....60....80...100\n";
  $result .= "P 950...970...990..1010..1030..1050\n";
  # --- that's all
  return $result;
}


Diese Routine produceDailyDayData() kann ich jetzt jederzeit plus beispielsweise um 23:59:59 Uhr aufrufen um eine Darstellung zu bekommen. Ich schick mir das auf Anfrage per E-Mail. Das sieht dann beispielsweise so aus:


T -20..-10....0...10...20...30...40
00  ...................PT.....H....
01  ...................PT.....H....
02  ...................PT.....H....
03  ...................PT.....H....
04  ...................PT.....H....
05  ...................PT.....H....
06  ...................PT.....H....
07  ...................PT.....H....
08  ...................PT.....H....
09  ...................PT....H.....
10  ...................P.T...H.....
11  ...................PDT..H......
12  ...................PD.HT.......
13  ...................PH...T......
14  ...................PHD..T......
15  ................H..P.D....T....
16  ................H..PD....T.....
17  ..................HP...T.......
18  ...................H...T.......
19  ..................PH...T.......
20  ..................PDH.T........
21  ..................PD.HT........
22  ..................PD..T........
23  ..................PD.T.H.......
H   0....20....40....60....80...100
P 950...970...990..1010..1030..1050


Wichtig: Wenn Werte auf die gleiche Position der Grafik kommen, hat das zuletzt definierte den Vorrang und ist dadurch sichtbar. Bei mir ist in der Reihenfolge DPHT definiert, womit ich auf jeden Fall die Temperatur sehe, falls alle die gleiche Position haben sollten.

Wenn ich das kurz nach 14:00 Uhr aufrufe, bekomme ich beispielsweise folgende Ausgabe:


T -20..-10....0...10...20...30...40
15  ..................P.D.HT.......
16  .................P..DH.T.......
17  .................P..DH.T.......
18  .................P..DH.T.......
19  .................P.H...T.......
20  .................P.H..T........
21  .................P.DH.T........
22  .................P.D.T.........
23  .................P.D.TH........
00  ..................P..TH........
01  ..................P..TH........
02  ..................P.T..H.......
03  ..................P.T..H.......
04  ..................P.T...H......
05  .................PD.T...H......
06  .................PD.T...H......
07  .................PD.T...H......
08  .................P.DT..H.......
09  ..................PD.TH........
10  ..................P.H.T........
11  ..................PH..T........
12  .................HP...T........
13  ................HDP...T........
14  ...............H.DP...T........
H   0....20....40....60....80...100
P 950...970...990..1010..1030..1050


Vielleicht kanns jemand gebrauchen.

Viele Grüße
Sigi