FTUI Neue Version chart_widget

Begonnen von eki, 31 Januar 2016, 00:17:26

Vorheriges Thema - Nächstes Thema

Ulm32b

#480
Zitat von: curt am 12 November 2019, 05:22:23
[...]

Im Grunde gilt das für alle kontinuierlichen Signale, überall dort ist das spannend. Aber selbst bei diskreten Signalen ist das nicht uninteressant: "Teuerste, heute vor einem Jahr war ..." au weia. Ich denke das nicht zu Ende. :D
[...]
Auch ohne das zu Ende zu denken, kommt man schnell zu dem Ergebnis, dass die vorgeschlagene Lösung sofort neue Wünsche nach sich ziehen würde: Der Nächste würde z.B. die über das FHEM-Modul traffic erhobenen Verspätungen auf bestimmten Routen darstellen wollen. Da wäre dann ein offset von einer Woche bzw. der Durchschnitt eines Wochenprofils sinnvoll. Sprich: Vor dem Codieren erstmal ein Lastenheft erstellen ;) und in der Community abgleichen.

Eine Alternative (die ich mir mangels Bedarf noch nicht näher angesehen habe), wird beschrieben in https://www.youtube.com/watch?v=OyJSRLjFHRE&app=desktop: Grafana-Integration in FHEM und FTUI. Da scheint man sich richtig austoben zu können. Ich würde mich für damit gemachte Anwendererfahrungen interessieren.

curt

Zitat von: Ulm32b am 12 November 2019, 11:52:41
Auch ohne das zu Ende zu denken, kommt man schnell zu dem Ergebnis, dass die vorgeschlagene Lösung sofort neue Wünsche nach sich ziehen würde

Eulen nach Athen: Ein erfüllter Wunsch gebiert in dieser Sekunde drei neue Wünsche.
Aber das ist ja eher überall so.

Zitat von: Ulm32b am 12 November 2019, 11:52:41
Der Nächste würde z.B. die über das FHEM-Modul traffic erhobenen Verspätungen auf bestimmten Routen darstellen wollen. Da wäre dann ein offset von einer Woche bzw. der Durchschnitt eines Wochenprofils sinnvoll.

Ich finde Gefallen an diesem Gedanken <lacht>.

Zitat von: Ulm32b am 12 November 2019, 11:52:41
Sprich: Vor dem Codieren erstmal ein Lastenheft erstellen ;) und in der Community abgleichen.

Ich weiß nicht, ob es sinnvoll ist, @eki völlig zu verschrecken: Ist ja wirklich alles Hobby.

Es ist Zeit, mal wieder Danke zu sagen:
Eki, herzlichen Dank für Deine Mühen!
RPI 4 - Jeelink HomeMatic Z-Wave

eki

#482


1) Es gibt künftig eine Schaltoption "lastyear" mit 0 und 1.

2) Es gibt nur eine X-Achse. Sowohl aktuelles Jahr als auch Vorjahr werden in der gleichen Grafik dargestellt.



Mit 2 x-Achsen meine ich nicht die Striche unten mit den Ticks, das sind nur die Teile des Themas, die man direkt sofort sieht. Intern liegt da etwas mehr dahinter (Cursorwerte, Verschiebung, Zoom, ...). Wenn man das einbauen würde, dann müsste man das dem Benutzer irgendwie klarmachen und auch intern muss ein Bezug da sein. Wenn da unten dran November steht, dann gehört da auch das Jahr dazu, weil ja auch die Daten, die angezeigt werden immer absolute Datumswerte haben (und was soll denn dran stehen, wenn ich einen Monat mit einem anderen vergleichen will). Wenn man da etwas macht, dann muss man zumindest Intern 2 Bezugskoordinatensysteme halten (das meinte ich mit 2 x-Achsen)

Da das relativ viel Aufwand bedeuten würde, wozu ich aber grundsätzlich bereit bin, wenn wirklich Bedarf ist, sollte man sich gut überlegen, was man will, und wie man es genau macht. Ich denke erst mal drüber nach.

Hat sich denn einer mal den von mir oben verlinkten Vorschlag angesehen? Was meint Ihr denn dazu?

curt

OT

Nein, nicht angesehen.

Aber mal was anderes, hier völlig offtopic:
Wenn ich mir die Außentemperatur über das komplette Jahr ansehe (und noch nichtmal mit dem Vorjahr vergleichen will) - fällt etwas auf: Die angezeigte Grafik ist unbrauchbar [¹].

Wie @Ulm32b schon völlig richtig andeutete: Jeder erfüllte Wunsch zieht automatisch neue Wünsche nach sich - und dabei ist der Wunsch noch gar nicht erfüllt.

Im Grunde bräuchte man für eine Jahresgrafik (Temperatur oder Luftfeuchte oder Feinstaub oderoderoder) für jeden Tag die Werte höchst, niedrigst, mittel in einem weiteren Log.

Das passt nicht ansatzweise hier rein. Daher Hinweis auf den von mir eröffneten Thead: https://forum.fhem.de/index.php/topic,105439.0.html

[¹] Beispielhaften Screenshot liefere ich gern nach.
RPI 4 - Jeelink HomeMatic Z-Wave

Wolfgang Hochweller

Meine Temperaturdaten liegen in Tagesfiles.
Bekomme ich es im Chartwidget hin, einen Plot ueber die letzten 7 Tage zu erstellen ?
createGluedFile im FileLog-Device scheint da nicht zu wirken.

eki

Sollte mit logproxy gehen (siehe Wiki zu logproxy und die Beispiele, wie die Wetterplots im Chart Wiki)

Wolfgang Hochweller


adrian

Hallo zusammen,
für das Chart_Widget welches ich in einer Flexbox-Tablet-Ui verwende, habe ich mich an die Anleitung (https://wiki.fhem.de/wiki/FTUI_Widget_Chart) aus dem Wiki gehalten. Mit dem LogProxy hat auch alles einwandfrei funktioniert, bis ich eines Tages dblog aktiviert habe. Ich nutze Proplanta, aber ohne dbLog-Einträge, sprich DbLogExclude .*, daher würde ich auch gern logproxy weiter nutzen, denn sonst habe ich weder in der current-db noch in der history-db irgendwelche Einträge
Ich habe für dieses Problem leider nur einen Beitrag im google gefunden, weiß aber leider nicht was ich mit dieser Information anfangen soll. (https://github.com/knowthelist/fhem-tablet-ui/issues/235)
ZitatThe chart does not update automatically when using dblog and logproxy.

It is primarily because the required devices and readings are not included in the filter of Inform and JsonList requests. So you don't notice any data changes of the devices.

There are 2 reasons for this.
A) The widget_chart.js (init_attr) has to call AddReading for Columnspec
B) fhem-tablet-ui.js (addReading) must detect that Columnspec has been passed and extract DeviceName and Reading at the correct position in the string.

The next one is in widget_chart.js (update), the determination of the variable isLogdevice must be adapted for Columnspec.

This is my Quick and Dirty fix which I have to take over after every update. I am sure that my Quickfix is not the optimal one. For these 2 reasons I would ask you to fix it correctly.

Many thanks

Wer kann helfen das Chart_Widget und den Code in der 99_myUtils.pm so anzpassen, dass das Widget wieder die Temperaturgraphen anzeigt.
danke im Voraus
Adrian

eki

Das muss ich mir mal genauer anschauen. Eigentlich kümmert sich das Chart selbst um die Updates man muss eben data-device entsprechend setzen. Was hilfreich wäre, wären Auszüge aus dem Log und der Chart Definition.

adrian

Hallo eki,
im Anhang siehst du die UI für das Wetter.
Das Log liefert
Zitat2020.02.14 12:41:25 2: myLogProxy: unknown keyword temperature.* in column_spec, must be one of ConstX,ConstY,Func,Polar,FileLog,DbLog
2020.02.14 12:41:25 2: myLogProxy: unknown keyword temperature.* in column_spec, must be one of ConstX,ConstY,Func,Polar,FileLog,DbLog
2020.02.14 12:41:25 2: myLogProxy: unknown keyword statRain_yearHour01.* in column_spec, must be one of ConstX,ConstY,Func,Polar,FileLog,DbLog
2020.02.14 12:41:25 2: myLogProxy: unknown keyword rain.* in column_spec, must be one of ConstX,ConstY,Func,Polar,FileLog,DbLog

Die Definition des Wetter Proplanta Devices liefert die Standardreadings.

Der Quellcode für diese Seite sieht folgend aus:
<!DOCTYPE html>
<html>
<body>
<div class="page" id="content_chart_wetterheute">
<div class="phone-back-btn">
<div data-type="link" data-url="#content_chart.html" data-load="#content_chart" data-color="white" data-icon="mi-chevron_left" class="large"></div>
</div>

<div class="hbox">
<div class="vbox phone-width">
<div class="card lift">
<header>Temperaturverlauf Woche</header>
<section>
<div data-type="chart"
data-device="Wetter_GruenKraut_Proplanta"
data-logdevice="myLogProxy"
data-logfile="-"
data-columnspec="temperature.*"
data-style="ftui l3"
data-ptype="lines"
data-uaxis="primary"
data-legend="Temperatur"
data-yunit="&deg;C"
data-ytext="Temperatur"
data-yticks="auto"
data-xticks="auto"
data-timeformat="ee"
data-minvalue="auto"
data-maxvalue="[10,20,30,40,50]"
data-daysago_start="6"
data-nofulldays="true"
data-cursorgroup="1"
data-scrollgroup="1"
data-height="180px">
</div>
</section>
</div>

<div class="card lift">
<header>Temperatur / Regen heute</header>
<section>
<div data-type="chart"
data-device="Wetter_GruenKraut_Proplanta"
data-logdevice="myLogProxy"
data-columnspec='["temperature.*","statRain_yearHour01.*","rain.*"]'
data-style='["ftui l3fill","ftui l1fill","ftui l2"]'
data-ptype='["lines","histeps","histeps"]'
data-uaxis='["primary","secondary","secondary"]'
data-legend='["Temperature","Rain/hour","Rain/day"]'
data-yunit="&deg;C"
data-ytext="Temperature"
data-minvalue="auto"
data-maxvalue="[10,20,30,40,50]"
data-yunit_sec="mm"
data-ytext_sec="Rain (mm)"
data-yticks="auto"
data-minvalue_sec="0"
data-maxvalue_sec="[0,5,10,20,30,40,50,60,70,80,90,100]"
data-nofulldays="true"
data-cursorgroup="1"
data-scrollgroup="1"
data-xticks="auto"
data-timeformat="hh"
data-height="180px">
</div>
</section>
</div>

</div>

<div class="vbox phone-width">
<div class="card lift">
<header>Wettervorhersage</header>
<section>
<div data-type="chart"
data-device="Wetter_GruenKraut_Proplanta"
data-logfile="CURRENT"
data-logdevice='[
"myLogProxy",
"myLogProxy",
"myLogProxy",
"myLogProxy",
"myLogProxy",
"myLogProxy"
]'
data-columnspec='[
"Func:logProxy_proplanta2Plot(\\x22Wetter_GruenKraut_Proplanta\\x22,\\x22rain_\\x22,$from,$to,0,\\x22day\\x22)",
"Func:logProxy_proplanta2Plot(\\x22Wetter_GruenKraut_Proplanta\\x22,\\x22chOfRain_\\x22,$from,$to,0,\\x22day\\x22)",
"Func:logProxy_proplanta2Plot(\\x22Wetter_GruenKraut_Proplanta\\x22,\\x22cloud_\\x22,$from,$to,0,\\x22day\\x22)",
"Func:logProxy_proplanta2Plot(\\x22Wetter_GruenKraut_Proplanta\\x22,\\x22sun\\x22,$from,$to,15,\\x22day\\x22)",
"Func:logProxy_proplanta2Plot(\\x22Wetter_GruenKraut_Proplanta\\x22,\\x22rad\\x22,$from,$to,12,\\x22day\\x22)",
"Func:logProxy_proplanta2Plot(\\x22Wetter_GruenKraut_Proplanta\\x22,\\x22wind_\\x22,$from,$to,0,\\x22day\\x22)"
]'
data-style='[
"ftui l6fill",
"ftui l5fill",
"ftui l1fill",
"ftui l3fill",
"ftui l2",
"ftui l4"
]'
data-ptype='[
"quadraticSmooth",
"quadraticSmooth",
"quadraticSmooth",
"bars",
"lines",
"quadraticSmooth"
]'
data-uaxis='[
"primary",
"secondary",
"secondary",
"secondary",
"primary",
"secondary"
]'
data-legend='[
"Regen",
"Regenwahrscheinlichkeit",
"Wolkenbedeckung",
"Sonne",
"Radiation",
"Wind"
]'

data-ytext="Regen / Radiation"
data-ytext_sec="Regen / Wolken / Sonne / Wind"
data-minvalue="auto"
data-maxvalue="[10,20,30,40,50]"
data-minvalue_sec="0"
data-maxvalue_sec="100"
data-daysago_start = "0"
data-daysago_end = "-7"
data-xticks="1440"
data-yticks="auto"
data-timeformat="ee"
data-height="180px"
class="nobuttons">
</div>
</section>
</div>

</div>
</div>
</div>
</body>
</html>


Da ich das Proplanta Modul laut Definition nutze und auch das Chart Widget anhand des Wiki-Eintrages aufgebaut habe, und es auch schon einmal genau so funktioniert hat, bin ich ratlos, woran es liegen kann.

gruß
adrian

eki

Also der Wettervorhersage Teil müsste eigentlich funktionieren (habe den Teil mal direkt nur mit Änderung der Devicenamen für logProxy und Proplanta getestet und das geht bei mir). Daran dürfte sich durch Umstellung von FileLog auf DBLog auch nichts ändern, weil da gar nicht auf Logs sondern mithilfe der Funktion "logProxy_proplanta2Plot" (aus 99_myUtils.pm oder wo auch immer Du die definiert hast) auf die Readings des Proplanta Devices zugegriffen wird).
Bei den anderen beiden Charts musst Du bei der Umstellung von DBLog oder FileLog auf logProxy vor den bisherigen Teil "FileLog:<DeinLogfile>:" oder "DbLog:<DeineLogDb>:" setzen (natürlich entsprechend für <DeinLogfile> bzw. <DeineLogDb> die Namen entsprechend Deiner FHEM Konfiguration ersetzen).

Beispiel:
data-columnspec='["DbLog:<DeineLogDb>:temperature.*","DbLog:<DeineLogDb>:statRain_yearHour01.*","DbLog:<DeineLogDb>:rain.*"]'

adrian

nutzt du auch logproxy und DBlog parallel, oder nur filelog?

der Vorteil bei logproxy ist doch, dass für die Formeln und Berechnungen in der Funktion auf die aktuellen Daten zugegriffen wird, oder? die Wetterdaten interessieren mich historisch gar nicht, daher schreibe ich diese auch nicht ins DBLog, daher sind diese auch excludet. (DbLogExclude .*)
Besteht nicht die Möglichkeit direkt auf das Proplanta-Device zuzugreifen?

die funktion für logproxy hängt in 99_myUtils.pm
#Proplanta - Smarphone-UI
#---------------------------------------
# Proplanta LogProxy-Funktion
#---------------------------------------
sub logProxy_proplanta2Plot($$$$;$$) {
my ($device, $fcValue, $from, $to, $fcHour, $expMode) = @_;
    my $regex;
    my @rl;
   
return undef if(!$device);
   
    if($fcValue =~ s/_$//) {
        $regex = "^fc[\\d]+_".$fcValue."[\\d]{2}\$";
    }
    else {
        $regex = "^fc[\\d]+_".$fcValue."\$";
    }
   
    $fcHour = 12 if(!defined $fcHour);
    $expMode = "point" if(!defined $expMode);

if( defined($defs{$device}) ) {
if( $defs{$device}{TYPE} eq "PROPLANTA" ) {
            @rl = sort{
                my ($an) = ($a =~ m/fc(\d+)_.*/);
                my ($bn) = ($b =~ m/fc(\d+)_.*/);
                $an <=> $bn or $a cmp $b;
                }( grep /${regex}/,keys %{$defs{$device}{READINGS}} );
return undef if( !@rl );
} else {
Log3 undef, 2, "logProxy_proplanta2Plot: $device is not a PROPLANTA device";
return undef;
}
}

my $fromsec = SVG_time_to_sec($from);
my $tosec   = SVG_time_to_sec($to);
my $sec = $fromsec;
my ($h,$fcDay,$mday,$mon,$year);
my $timestamp;
   
my $reading;
my $value;
my $prev_value;
my $min = 999999;
my $max = -999999;
my $ret = "";

# while not end of plot range reached
while(($sec < $tosec) && @rl) {
#remember previous value for start of plot range
$prev_value = $value;

$reading = shift @rl;
        ($fcDay) = $reading =~ m/^fc(\d+).*/;
    $h = ($reading =~ m/.*(\d\d)$/)?$1:$fcHour;
$value = ReadingsVal($device,$reading,undef);
       
($mday,$mon,$year) = split('\.',ReadingsVal($device,"fc".$fcDay."_date",undef));
$timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, $h, 0, 0);
$sec = SVG_time_to_sec($timestamp);
       
# skip all values before start of plot range
next if( SVG_time_to_sec($timestamp) < $fromsec );

# add first value at start of plot range
if( !$ret && $prev_value ) {
  $min = $prev_value if( (looks_like_number($prev_value) && ($prev_value < $min)) || ($prev_value lt $min) );
  $max = $prev_value if( (looks_like_number($prev_value) && ($prev_value > $max)) || ($prev_value gt $max) );
  $ret .= "$from $prev_value\n";
}

# done if after end of plot range
last if($sec > $tosec);

$min = $value if( (looks_like_number($value) && ($value < $min )) || ($value lt $min) );
$max = $value if( (looks_like_number($value) && ($value > $max )) || ($value gt $max) );

# add actual controll point
$ret .= "$timestamp $value\n";

# Log 1, "$timestamp $value -0- $reading";
}
    if(($sec < $tosec) && !@rl && ($expMode eq "day")) {
    $timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, 23, 59, 59);
    if(SVG_time_to_sec($timestamp) < $tosec) {
        $ret .= "$timestamp $value\n";
        }
        else {
$ret .= "$to $value\n";
        }
    }
    elsif(($sec > $tosec) && ($expMode eq "day")) {
        $value = $prev_value + ($value - $prev_value)*(86400 + ($tosec - $sec))/86400;
        $ret .= "$to $value\n";
    }
return ($ret,$min,$max,$prev_value);
}

eki

Das Chart braucht (mal mit Ausnahme der x/y Plots) immer eine Liste mit Zeitstempeln und dazugehörigen Anzeigewerten. Diese Liste holt es sich grundsätzlich immer von FHEM (per HTTP Get). Am einfachsten ist das im Fall von Logs, die sind schon entsprechend angelegt (mit Datum und Wert). Falls das Ganze über eine logProxy Funktion stattfinden soll, muss diese Funktion auch solche Listen liefern (genau das macht die Funktion logProxy_proplanta2Plot). Logproxy hat noch jede Menge anderer Möglichkeiten (dazu gern mal das Wiki bemühen).

Was möchtest Du denn genau in den Charts haben? Mein Verständnis war:
1. Im Chart Temperaturverlauf  möchtest Du die historischen Wetterdaten für die letze Woche haben (data-daysago_start = 6). Dafür brauchst Du Logs (entweder Datenbank oder File). In Proplanta sind nur Daten von heute und in der Zukunft in den Readings.
2. Im Chart Temperatur / Regen heute möchtest Du die Daten von heute haben. Das ginge ohne Logdaten, nur aus den Readings (es gibt für den aktuellen Tag die Readings für Regenmenge und Temperatur im 3 Stunden Abstand). Das würde dann über einen Ansatz wie in 3 gehen, aber mit anderer Zeiteinteilung (eigentlich die gleiche Definition wie in 3 nur ohne die ...daysago... Zeilen.
3. Im Chart Wettervorhersage möchtest Du, wie der Name schon sagt, die Vorhersage (für die kommenden 7 Tage) haben. Das geht, wie gesagt, ohne Log und ist in Deinem Beispiel auch schon richtig.

adrian

... da bin ich bei dir. Nur leider kommt eben, trotz richtiger Definition nichts bei der Vorhersage an. Gibt es die Möglichkeit zu prüfen ob Logproxy richtig funktioniert? Ich mein im DBLog kann ich in den Current und History Logs nachschauen, was reingeschrieben wurde.

eki

Na die ersten beiden Definitionen liefern garantiert keine Inhalte. Die Dritte müsste passen, wenn Du ein logProxy Device in FHEM hast, das "myLogProxy" heißt und ein Proplanta Device, das "Wetter_GruenKraut_Proplanta" heißt.
Gib mal
list myLogProxy
und
list Wetter_GruenKraut_Proplanta
ein, und poste hier das Ergebnis.