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