FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: flurin am 23 Juli 2014, 20:01:29

Titel: Dynamic Range in einem Plot
Beitrag von: flurin am 23 Juli 2014, 20:01:29
Hallo,

Ich möchte bei meinem Temperatur-Diagramm den Temperatur-Bereich dynamisch definieren.

Statisch sieht es so aus:

attr SVG_FileLog_tmp_office_1 label "[20:26]"

Dynamisch:

attr SVG_FileLog_tmp_office_1 label "[$data{min1}-1:$data{max1}+1]"

Also unten und oben ein 1 Grad Abstand vom Rand.

Leider geht es  nicht, wie könnte ich sonst ein Dynamic Range definieren?

Titel: Antw:Dynamic Range in einem Plot
Beitrag von: justme1968 am 23 Juli 2014, 20:11:26
label ist nur für die Überschrift über dem plot zuständig und hat nichts mit dem wertebereich der achsen zu tun.

den wertebereich gibst du für die y achsen mit range im plotfile an. wenn du keinen range setzt wird automatisch ein passender wertebereich bestimmt.

gruss
  andre
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 23 Juli 2014, 20:19:28
Danke für die Antwort.

Zitat von: justme1968 am 23 Juli 2014, 20:11:26
label ist nur für die Überschrift über dem plot zuständig und hat nichts mit dem wertebereich der achsen zu tun.

Bist Du sicher? Ich kann doch mehrere Labels definieren <L1>, <L2> ... für den Titel benutze ich <TL>

mein .gplot sieht so aus:
# Created by FHEM/98_SVG.pm, 2014-07-23 19:00:15
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid y2tics
set ylabel ""
set y2label "Temperature"
set y2range <L1>

#FileLog 4:tmp_office.temperature\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'Temperature' ls l0 lw 2 with lines


und mit:
attr SVG_FileLog_tmp_office_1 label "[20:26]"

funktioniert es einwandfrei.
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Puschel74 am 23 Juli 2014, 20:50:34
Hallo,

label habe ich z.B. so
label "Super E10 Gehring $data{currval2} € Shell $data{currval5} €"
oder so
label "DG_Badezimmer Min: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}"

Wozu das noch "dynamischer" sein soll weiß ich jetzt nicht.

Ich denke mal andre hat schon recht und meinst nicht die Überschrift des weblink (wenn doch häng mal einen Screenshot an - wir sehen ja nicht was du siehst oder sehen möchtest  ;) ) sondern du meinst den Range des weblink - und der "dynamisiert" sich automatisch wenn du KEINEN range angibst.

Grüße
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: justme1968 am 23 Juli 2014, 20:54:54
die title und label attribute arbeiten im prinzip über reines tex ersetzen.

du hast in deinem plotfile set y2range <L1>stehen. hier wird dann tatsächlich das was du als label angibst als y2range verwendet. das das geht ist ein netter nebeneffekt. vielleicht sogar zufall.

damit das rechnen in diesem perl ausdruck geht dürfen die rechenoperationen nicht im string selber enthalten sein sondern du musst den string aus den werten zusammen bauen. etwa in dieser art:attr SVG_FileLog_tmp_office_1 label "[".$data{min1}-1.":".$data{max1}+1."]"

wenn du die set y2range ... zeile komplett weg lässt sind die achsen aber automatisch dynamisch skaliert.

gruss
  andre
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 23 Juli 2014, 21:21:18
@andre
Vielen Dank für Deine Antwort.

Ich habe vor ein paar Tagen mit fhem angefangen und mal neugierig einiges ausprobiert.

Ohne die Range-Definition ist die Skalierung dynamisch, das finde ich gut. Jedoch geht die Kurve bis zum Rand.
Ich wollte versuchen, zum Max und Min einen Abstand zu definieren, damit es schöner aussieht.

Sobald ich herausgefunden habe, wie man Bilder hochladen kann, poste ich zwei Bilder zur Klärung.

Gruss,
flurin
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: justme1968 am 23 Juli 2014, 21:23:41
ich weiss was du meinst.

schau dir mal an ob die version die ich oben gepostet habe geht.

gruss
  andre
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 23 Juli 2014, 21:42:35
@andre

Nein es geht nicht aber so geht es:

.plog
set y2range [<L1>:<L2>]

fhem.cfg
attr SVG_FileLog_tmp_office_1 label $data{min1}-1::$data{max1}+1

Vielen Dank für Deine Hilfe.

Gruss,
flurin
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 23 Juli 2014, 22:00:06
vorher:

(http://forum.fhem.de/index.php?action=dlattach;topic=25618.0;attach=17452;image)


nachher:

(http://forum.fhem.de/index.php?action=dlattach;topic=25618.0;attach=17454;image)
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: frank am 23 Juli 2014, 22:22:50
coole idee, danke.  :)
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: frank am 24 Juli 2014, 10:02:40
wenn man 4 Kurven in einem plot hat, hilft das hier:

attr SVG_FileLog_tmp_office_1 label min($data{min1},$data{min2},$data{min3},$data{min4})-1::max($data{max1},$data{max2},$data{max3},$data{max4})+1

gruss frank
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 24 Juli 2014, 10:18:26
@frank

Zuzeit habe ich nur eine Temperaturkurve aber später kommt noch die Feuchtigkeitskurve dazu, gut zu wissen. Danke.

Meine letzte Version:

# Created by FHEM/98_SVG.pm, 2014-07-23 23:39:31
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid y2tics
set ylabel ""
set y2label "Temperature"
set yrange [<L1>:<L2>]
set y2range [<L1>:<L2>]

#FileLog 4:tmp_office.temperature\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'Temperature' ls l0 lw 2 with lines


attr SVG_FileLog_tmp_office_1 label int($data{min1}-0.3)::$data{max1}+0.5

Damit a) ist die Skalierung rechts und links gleich und b) sind die Skalazahlen gerundet.

Gruss,
flurin

Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Jojo11 am 27 September 2014, 13:19:50
Zitat von: frank am 24 Juli 2014, 10:02:40
wenn man 4 Kurven in einem plot hat, hilft das hier:

attr SVG_FileLog_tmp_office_1 label min($data{min1},$data{min2},$data{min3},$data{min4})-1::max($data{max1},$data{max2},$data{max3},$data{max4})+1

gruss frank

Hallo Frank,

ich verwende diese Lösung auch. Allerdings habe ich alle paar Wochen mal den Fall, dass

min($data{min1},$data{min2})

anscheinend falsch ausgewertet wird. Es wird nur der Minimalwert von einem Sensor genommen. Leider kann ich kein Muster erkennen, so dass ich vollkommen ahnungslos bin, woran das liegen könnte. Nehme ich nur den einen oder nur den anderen Min-Wert, funktioniert alles. Ist Dir das auch schon mal aufgefallen?

schöne Grüße
Jo
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: frank am 28 September 2014, 13:36:46
ZitatIst Dir das auch schon mal aufgefallen?

nein. wie macht sich das bemerkbar? gibt es eine fehlermeldung?

gruss frank
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Jojo11 am 28 September 2014, 13:42:57
Habe zwei Aussentemperatur-Sensoren in einem log file und plot. Beide liegen  manchmal 1-2°C auseinander. Der eine definiert meist der Minimalwert und der andere den maximalen. Wenn die Berechnung klappt, sind die Kurven  vollständig sichtbar und die Extremwerte im Titel stimmen mit denen überein, die man aus dem plot ablesen kann. Nutze die Formel sowohl für den Titel als auch für die Achsenskalierung mit label. Wenn es mal nicht geht, stimmen die Werte nicht und eine Kurve ragt aus dem plot heraus. Fehlermeldungen gibt es keine.

schöne Grüße
Jo

Titel: Antw:Dynamic Range in einem Plot
Beitrag von: frank am 28 September 2014, 13:52:52
bleibt der effekt auch, wenn du zb in den plot reinzoomst?
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Jojo11 am 28 September 2014, 13:56:12
Gerade getestet: ja. Mir fällt auch bei den Daten nichts auf. Außer dass die Werte des einen Sensors 4 Nachkommastellen haben. Aber das geht ja sonst auch.

schöne Grüße
Jo

Titel: Antw:Dynamic Range in einem Plot
Beitrag von: frank am 28 September 2014, 19:40:20
du kannst mal verbose5 am plot einschalten oder bei global. vielleicht gibt das fehlerhinweise. sonst fhem über telnet starten und fehlermeldungen am terminal beobachten. hier gibt es wohl die meisten.
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 28 September 2014, 19:54:55
Hallo,

Ev. geht es mit dieser vereinfachten Variante (seit Wochen ohne Probleme in Betrieb):

fhem.cfg:

attr SVG_FileLog_temp_office_1 label sprintf( "[%d:%.1f]",int(min($data{min1},$data{min2})-0.3),max($data{max1},$data{max2})+0.5)

gplot:

# Created by FHEM/98_SVG.pm, 2014-08-25 14:22:17
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid y2tics
set ylabel "Target"
set y2label "Temperature"
set yrange <L1>
set y2range <L1>

#FileLog 4:temp_office.temperature\x3a::
#FileLog 4:temp_office.target1\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'Temperature' ls l0 lw 2 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Target' ls l7 lw 2 with lines


Gruss
flurin

Ergänzung

So sieht es aus:

(http://cisana.net/wp-content/uploads/2014/09/TempPlot.jpg)
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Jojo11 am 28 September 2014, 20:49:57
Danke! Zu verbose5 fehlte mir bisher die Zeit. Werde das die Tage mal anschauen. Evtl sind auch Fehler in den Log files das Problem. Heute lief alles wie gewünscht.

schöne Grüße
Jo

Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Jojo11 am 04 Oktober 2014, 10:45:48
Hallo,

nach längerer Fehlersuche habe ich das Problem nun reproduzierbar einkreisen können. Sobald einer der Temperatursensoren einen minimalen Wert unter 10°C hat, der andere aber seinen Minimalwert >10°C, wird nur der größere Wert bei min() berücksichtigt. In diesem Fall schießt die tatsächlich niedrigere Kurve nach unten aus dem Plot. Als min-Wert wird im Plot-Titel dann auch der größere Wert angegeben. Ein typischer log-Auszug sieht so aus:

2014-10-04_07:41:24 WS temperature: 9.6
2014-10-04_08:13:40 sensor2 temperature: 11.3125
2014-10-04_08:15:48 WS temperature: 10.2
2014-10-04_08:17:40 sensor2 temperature: 11.25
2014-10-04_08:19:23 WS temperature: 10.5
2014-10-04_08:19:23 WS humidity: 88
2014-10-04_08:19:23 WS battery: ok
2014-10-04_08:23:40 sensor2 temperature: 11.3125


In diesem Fall wird 11.25°C als absolutes Minimum genommen, nicht aber 9.6°C.
Ich habe jetzt mal ein paar Verläufe in der Vergangenheit überprüft und festgestellt, dass es immer das gleiche Muster ist.
Kann es am Übergang von ein- zu zweistelligen Werten liegen?

schöne Grüße
Jo
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: volschin am 04 Oktober 2014, 11:01:56
Wenn er den Wert als String und nicht als Zahl interpretiert, wäre 9... größer 1...

Gruß
Veit
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 04 Oktober 2014, 11:19:11
Zitat von: volschin am 04 Oktober 2014, 11:01:56
Wenn er den Wert als String und nicht als Zahl interpretiert, wäre 9... größer 1...

so ist es.

siehe 99_Utils.pm:

sub
min($@)
{
  my ($min, @vars) = @_;
  for (@vars) {
    $min = $_ if $_ lt $min;
  }           
  return $min;
}
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: justme1968 am 04 Oktober 2014, 11:20:44
min ist für string vergleiche. das ist historisch... es gibt ein minNum für zahlen.

gruss
  andre
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Jojo11 am 04 Oktober 2014, 13:40:26
Danke, das war der richtige Hinweis  :)
Mit minNum klappt es nun endlich.

schöne Grüße
Jo
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: frank am 04 Oktober 2014, 23:16:38
gut zu wissen. dann werde ich mal umstellen.

gruss frank
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: holzwurm83 am 07 Oktober 2014, 22:15:42
Zitat von: flurin am 23 Juli 2014, 22:00:06
vorher:

(http://forum.fhem.de/index.php?action=dlattach;topic=25618.0;attach=17452;image)


nachher:

(http://forum.fhem.de/index.php?action=dlattach;topic=25618.0;attach=17454;image)

Hallo zusammen,

ich versuche für meine RTs auch einen Plot mit so einem Abstand zu realisieren, aber irgendwie komme ich da nicht ans Ziel. Könnt ihr mir Hilfestellung geben.

Hier ist meine Plotdatei.
# Created by FHEM/98_SVG.pm, 2014-10-07 22:08:09
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Arbeitszimmer'
set ytics
set y2tics
set grid
set ylabel "Eingestellt"
set y2label "Gemessen"
set yrange <L1>

#FileLog 4:AZ_RT_links_Clima.T\x3a::
#FileLog 6:AZ_RT_links_Clima.T\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'gemessen' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'eingestellt' ls l1fill lw 1 with lines
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 01 Februar 2015, 17:38:36
Hallo holzwurm83

Ev. hilft Dir diese einfache Subroutine (in 99_myUtils.pm einfügen):

# argument: none
# return value: Range as [min:max]
sub
getLabel()
{
  my $label;
 
  if (defined($data{currval1}) && defined($data{currval2})) {
    my $min = int(minNum($data{min1},$data{min2})-0.3);
    my $max = maxNum($data{max1},$data{max2})+0.5;
    $label = sprintf("[%d:%.1f]",$min,$max);
  } else {
    $label = "";
  }
  #Log(3, "$label");
  return $label;
}


in fhem.cfg einfügen (Beispiel):

attr SVG_FileLog_temp_office_1 label getLabel()

Gruss
flurin

Titel: Antw:Dynamic Range in einem Plot
Beitrag von: holzwurm83 am 02 Februar 2015, 22:28:12
Hallo Flurin,

danke für dein Feedback. Hab das gleich mal ausprobiert. Die Subroutine in die  99_myUtils.pm eingefügt und neu geladen.

attr auch eingefügt:
Zitatdefine SVG_FileLog_AZ_RT_links_Clima_1 SVG FileLog_AZ_RT_links_Clima:SVG_FileLog_AZ_RT_links_Clima_1:CURRENT
attr SVG_FileLog_AZ_RT_links_Clima_1 group Heizung
attr SVG_FileLog_AZ_RT_links_Clima_1 label getLabel()
attr SVG_FileLog_AZ_RT_links_Clima_1 room Arbeitszimmer,Plots

Es ändert sich nur leider nicht!?

Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 03 Februar 2015, 06:37:27
In der Sub ist eine Zeile in Kommentar, ändere diese Zeile wie folgt (# entfernen):

Log(3, "label = $label");

reload 99_myUtils.pm

und schaue im Logfile (fhem-2015-02.log) nach; nach dem Aufruf deines Plots müsste ein Eintrag vorhanden sein, etwa:

2015.02.03 06:15:47 3: label = [11:21.0]

sollte es so aussehen:

2015.02.03 06:15:47 3: label =

also ohne Range, dann stimmt was nicht mit den Werten in $data. Könntest du die letzen Einträge deiner FileLog Datei (AZ_RT_links_Clima-2015.log) posten. Ist deine Plotdatei oben noch aktuell?

Gruss
flurin
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: holzwurm83 am 03 Februar 2015, 21:24:46
Zitatund schaue im Logfile (fhem-2015-02.log) nach; nach dem Aufruf deines Plots müsste ein Eintrag vorhanden sein, etwa:

Code: [Auswählen]
2015.02.03 06:15:47 3: label = [11:21.0]
Das past soweit. Eintrag wird nach jedem Aufruf erzeugt.

ZitatKönntest du die letzen Einträge deiner FileLog Datei (AZ_RT_links_Clima-2015.log) posten.
2015-02-03_21:00:08 AZ_RT_links_Clima T: 19.7 desired: 16.0 valve: 0
2015-02-03_21:00:08 AZ_RT_links_Clima partyStart: -
2015-02-03_21:00:08 AZ_RT_links_Clima partyEnd: -
2015-02-03_21:00:08 AZ_RT_links_Clima partyTemp: -
2015-02-03_21:03:09 AZ_RT_links_Clima measured-temp: 19.7
2015-02-03_21:03:09 AZ_RT_links_Clima ValvePosition: 0
2015-02-03_21:03:09 AZ_RT_links_Clima motorErr: ok
2015-02-03_21:03:09 AZ_RT_links_Clima desired-temp: 16.0
2015-02-03_21:03:09 AZ_RT_links_Clima controlMode: auto
2015-02-03_21:03:09 AZ_RT_links_Clima boostTime: -
2015-02-03_21:03:09 AZ_RT_links_Clima T: 19.7 desired: 16.0 valve: 0
2015-02-03_21:03:09 AZ_RT_links_Clima partyStart: -
2015-02-03_21:03:09 AZ_RT_links_Clima partyEnd: -
2015-02-03_21:03:09 AZ_RT_links_Clima partyTemp: -
2015-02-03_21:05:55 AZ_RT_links_Clima measured-temp: 19.7
2015-02-03_21:05:55 AZ_RT_links_Clima ValvePosition: 0
2015-02-03_21:05:55 AZ_RT_links_Clima motorErr: ok
2015-02-03_21:05:55 AZ_RT_links_Clima desired-temp: 16.0
2015-02-03_21:05:55 AZ_RT_links_Clima controlMode: auto
2015-02-03_21:05:55 AZ_RT_links_Clima boostTime: -
2015-02-03_21:05:55 AZ_RT_links_Clima T: 19.7 desired: 16.0 valve: 0
2015-02-03_21:05:55 AZ_RT_links_Clima partyStart: -
2015-02-03_21:05:55 AZ_RT_links_Clima partyEnd: -
2015-02-03_21:05:55 AZ_RT_links_Clima partyTemp: -
2015-02-03_21:08:27 AZ_RT_links_Clima measured-temp: 19.7
2015-02-03_21:08:27 AZ_RT_links_Clima ValvePosition: 0
2015-02-03_21:08:27 AZ_RT_links_Clima motorErr: ok
2015-02-03_21:08:27 AZ_RT_links_Clima desired-temp: 16.0
2015-02-03_21:08:27 AZ_RT_links_Clima controlMode: auto
2015-02-03_21:08:27 AZ_RT_links_Clima boostTime: -
2015-02-03_21:08:27 AZ_RT_links_Clima T: 19.7 desired: 16.0 valve: 0
2015-02-03_21:08:27 AZ_RT_links_Clima partyStart: -
2015-02-03_21:08:27 AZ_RT_links_Clima partyEnd: -
2015-02-03_21:08:27 AZ_RT_links_Clima partyTemp: -
2015-02-03_21:10:59 AZ_RT_links_Clima measured-temp: 19.7
2015-02-03_21:10:59 AZ_RT_links_Clima ValvePosition: 0
2015-02-03_21:10:59 AZ_RT_links_Clima motorErr: ok
2015-02-03_21:10:59 AZ_RT_links_Clima desired-temp: 16.0
2015-02-03_21:10:59 AZ_RT_links_Clima controlMode: auto
2015-02-03_21:10:59 AZ_RT_links_Clima boostTime: -
2015-02-03_21:10:59 AZ_RT_links_Clima T: 19.7 desired: 16.0 valve: 0
2015-02-03_21:10:59 AZ_RT_links_Clima partyStart: -
2015-02-03_21:10:59 AZ_RT_links_Clima partyEnd: -
2015-02-03_21:10:59 AZ_RT_links_Clima partyTemp: -



ZitatIst deine Plotdatei oben noch aktuell?
Hier zur Sicherheit noch mal ein aktueller Auszug.
# Created by FHEM/98_SVG.pm, 2014-10-07 23:05:00
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid
set ylabel "Eingestellt"
set y2label "Gemessen"

#FileLog 4:AZ_RT_links_Clima.measured-temp\x3a::
#FileLog 4:AZ_RT_links_Clima.desired-temp\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'gemessen' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'eingestellt' ls l1fill lw 1 with lines


Es hat sich an dem Plot selbst noch nicht geändert.
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 03 Februar 2015, 21:41:50
Ich teste es mal bei mir mit deinen Daten aber was mir sofort auffällt:

in der Plotdatei fehlt:

set yrange <L1>
set y2range <L1>


<L1> kannst du auch mit dem Ploteditor im Feld Range as [min:max] eintragen.

Edit:

Bei mir funktioniert es mit dieser Plotdatei:

# Created by FHEM/98_SVG.pm, 2015-02-03 22:19:29
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid
set ylabel "Eingestellt"
set y2label "Gemessen"
set yrange <L1>
set y2range <L1>

#FileLog_AZ_RT_links_Clima 4:AZ_RT_links_Clima.measured-temp\x3a::
#FileLog_AZ_RT_links_Clima 4:AZ_RT_links_Clima.desired-temp\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'gemessen' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'eingestellt' ls l1fill lw 1 with lines
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: holzwurm83 am 05 Februar 2015, 23:19:43
Hallo flurin,

vielen Dank für deine Hilfe! Funktioniert jetzt super!
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 06 Februar 2015, 11:22:46
@holzwurm83
OK

In der Zwischenzeit habe ich eine neue Sub [ Ersatz für getLabel() ] geschrieben:

getRange(padding_bottom, padding_top)

getRange ist universell für eine beliebige Anzahl Kurven und zudem können die "Abstände" (padding_bottom und padding_top) als Parameter frei definiert werden. Z.B:

getRange(1,2)

# arguments: padding_bottom, padding_top
# return value: Range as [min:max]
sub
getRange($$)
{
  my ($padding_bottom, $padding_top) = @_;
  my $range = "";
 
  if (exists($data{currval1}) && ($data{min1} ne "undef") && ($data{max1} ne "undef")) {
    my $min = $data{min1};
    my $max = $data{max1};
    my $index = 2;

    while (exists($data{"currval".$index})) {
      my $min_i = $data{"min".$index};
      my $max_i = $data{"max".$index};
      $min = $min_i if (($min_i ne "undef") && ($min_i < $min));
      $max = $max_i if (($max_i ne "undef") && ($max_i > $max));
      $index++;
    }
    $range = sprintf("[%d:%.1f]",$min - $padding_bottom,$max + $padding_top);
  }
  #Log(3, "range = $range");
  return $range;
}


Gruss
flurin
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: flurin am 10 Februar 2015, 14:14:17
Nach dem Update von 98_SVG.pm (7926 2015-02-09 16:52:31) lässt sich getRange vereinfachen:


# arguments: padding_bottom, padding_top
# return value: Range as [min:max]
sub
getRange($$)
{
  my ($padding_bottom, $padding_top) = @_;
  my $range = "";
 
  if ($data{minAll} < 999999 && $data{maxAll} > -999999) {
    $range = sprintf("[%d:%.1f]",$data{minAll}-$padding_bottom,$data{maxAll}+$padding_top);
  } else {
    Log(3, "Invalid Range");
  }
  #Log(3, "range = $range");
  return $range;
}
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: bernhard23 am 02 Juni 2016, 09:37:13
Ich hatte folgendes Problem: Ich wollte mehrere dynamische Ranges für mehrere Kurven in einem Plot. Wenn aber die Temperatur 0°C ist und die Luftfeuchte 99%, ist die Range für sowohl die Temperatur- als auch die Feuchtigkeitsskala [0:99]. Das macht aber wenig Sinn, weil die Temperatur ja nie 99°C oder die Feuchtigkeit nie 0% beträgt. Das verzerrt die Darstellung der Skala im Plot. Ich möchte also für jeden Wert eine eigene Range haben, für Temperatur z.b. [0:20], für Luftfeuchte [50:90], und das jeweils noch mit einem Mindestabstand nach oben und unten, damit der Plot schöner aussieht. So habe ich es gelöst:

Edit: Die folgende Methode ist veraltet und unnötig kompliziert, siehe meinen neuen Post weiter unten auf dieser Seite, wo ich eine noch bessere Lösung gepostet habe.

Zunächst habe ich auf der Eigenschaftsseite des betreffenden SVG-Plots folgendes Attribut hinzugefügt:

attr SVG_FileLog_Balkon label getRange(1)::getRange(2)::getRange(3)

So erzeuge ich drei Label, eins für jedes der gemessenen Readings. 1 ist Temperatur, 2 ist Luftfeuchte, 3 ist absolute Luftfeuchte.

In meiner Plotdatei balkon.gplot steht dann:

set ylabel "Temperature"
set y2label "Humidity"
set y3label "AbsFeuchte"
set yrange <L1>
set y2range <L2>
set y3range <L3>


Die dazugehörige Funktion in der myUtils.pm:


sub
getRange
{
  my $curIndex = shift;
  my ($padding_bottom, $padding_top) = (1,1);
  my $range = "";

  if (exists($data{"currval".$curIndex}) && ($data{"min".$curIndex} ne "undef") && ($data{"max".$curIndex} ne "undef")) {
    my $min = $data{"min".$curIndex};
    my $max = $data{"max".$curIndex};
    $range = sprintf("[%d:%.1f]",$min - $padding_bottom,$max + $padding_top);
  }
# Log(3, "range = $range");
  return $range;
}



Die Funktion getRange() wird dreimal aufgerufen mit den Werten 1, 2 und 3 als Argument, die jeweils für Temperatur, Luftfeuchte und absolute Feuchte stehen. Wer andere Werte oder eine andere Reihenfolge bei den Readings hat, muss das natürlich in der Label-Definition (ganz oben) anpassen. Das Padding habe ich in der Funktion fest eingestellt, da ich dort immer denselben Wert haben will. Schnell und dreckig, ich weiß, aber funktioniert erstmal, und vielleicht hilft es ja jemandem. Im Anhang seht ihr einen Screenshot, wie das ganze in Aktion aussieht. Jeder der drei Werte hat eine eigene Range, und durch das Padding sieht es schöner aus, weil die Werte nicht immer oben und unten an den Plot stoßen.

Vorher (ohne Padding):
(https://abload.de/thumb/balkon1llx62.png) (http://abload.de/image.php?img=balkon1llx62.png)

Nachher (mit Padding):
(https://abload.de/thumb/balkon3m2ass.png) (http://abload.de/image.php?img=balkon3m2ass.png)

Ein weiteres Problem war, dass bei Werten mit geringer Schwankung und grober Abstufung riesige Ausschläge in der Plotkurve entstehen. Wenn etwa die Luftfeuchte immer zwischen 60% und 62% schwankt, habe ich eine dicke gezackte Linie, die abgehackt von ganz unten bis nach ganz oben im Plot springt. Gelöst habe ich das, indem ich für solche Werte eine Art "Minimal-Range" nach oben und unten drauf addiere, also für die Luftfeuchte dann von 55-67% anstatt 60-62%. Die Funktion sieht dann so aus:


sub
getRange
{
  my $curIndex = shift;
  my ($padding_bottom, $padding_top) = (1,1);
  my $range = "";

  if (exists($data{"currval".$curIndex}) && ($data{"min".$curIndex} ne "undef") && ($data{"max".$curIndex} ne "undef")) {
    my $min = $data{"min".$curIndex};
    my $max = $data{"max".$curIndex};

        #für die feuchtigkeit höheres padding, weil die werte sehr grob sind
        #und dann die linienschwankungen zu abrupt werden
    if($curIndex==2) {
        if($max - $min <= 5) {
                $padding_bottom+=4;
                $padding_top+=4;
        }
    }
    $range = sprintf("[%d:%.1f]",$min - $padding_bottom,$max + $padding_top);
  }
# Log(3, "range = $range");
  return $range;
}

Sehr hässlicher Code, ich weiss, aber ich bin da pragmatisch und wollte es einfach schnell gelöst haben.
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: justme1968 am 02 Juni 2016, 10:50:12
der umweg über das label attribut ist seit einiger zeit nicht mehr nötig. man kann direkt für dir yrange attribute perl code als wert angeben. entweder direkt: set y2range {"[".($data{min2}-.1).":".($data{max2}+.1)."]"} oder du rufst dann dort deine routine auf: set y2range {getRange(2)}

statt dem index könnte man auch min und max direkt übergeben und die routine generisch für alle plots verwenden.

gruss
  andre
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: bernhard23 am 02 Juni 2016, 11:07:12
Das ist ja der Hammer. Funktioniert einwandfrei, danke. Das ist natürlich die eindeutig elegantere Lösung gegenüber dem zweckentfremdeten Label.
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: bernhard23 am 02 Juni 2016, 13:32:59
Hier nochmal eine neue Version mit der Variante ohne Label. Ich habe es jetzt so gemacht, dass der Subroutine ein optionales Argument mitgegeben wird (isIntegerValue), das aussagt, ob ein Reading ganzzahlig ist oder nicht. Wenn ja, wird das Padding zusätzlich etwas erhöht, um die groben Sprünge im Plot abzumildern.

myUtils.pm:


sub getRange {
        my $min = shift;
        my $max = shift;
        my $isIntegerValue = shift;

        my $padding = 1;

        if($isIntegerValue) {
                $padding += 3;
        }

        $min -= $padding;
        $max += $padding;

        my $range = sprintf("[%d:%d]", $min, $max);

        return $range;
}


Plotfile:

set yrange {getRange($data{min1},$data{max1})}
set y2range {getRange($data{min2},$data{max2},1)}
set y3range {getRange($data{min3},$data{max3})}


y2range ist die Feuchtigkeit, also ein ganzzahliger Wert, deshalb wird als Argument am Ende die "1" mitgegeben, um das Padding zu erhöhen und die Kurve zu glätten.

Und so sieht's dann aus. Hier kann man sehr gut sehen, dass jedes Reading seine individuelle Skala hat, dadurch verlaufen die Kurven alle schön gleichmäßig, und dass durch das Padding oben und unten immer ein Abstand eingehalten wird, die Kurven stoßen also nicht mehr an den Rand, was optisch schöner ist.

(https://abload.de/thumb/balkon4xsjg4.png) (http://abload.de/image.php?img=balkon4xsjg4.png)
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: Igge am 19 Dezember 2016, 21:14:38
Achtung, alter Thread!

Danke für das Script, ich habe das noch etwas erweitert, falls man 2 Kurven das Minimum und Maximum berechnen will. Ich habe zum Beispiel Soll- und Isttemperatur auf einer Achse, hier muss man prüfen, welche kleiner bzw. größer ist.

sub getRange {
  my $min1 = shift;
  my $min2 = shift;
  my $max1 = shift;
  my $max2 = shift;
  my $padding = shift;

  my $min = $min1 < $min2 ? $min1 : $min2;
  my $max = $max1 > $max2 ? $max1 : $max2;

  $min -= $padding;
  $max += $padding;

  my $range = sprintf("[%d:%d]", $min, ceil($max));

  return $range;
}


set yrange {getRange($data{min1}, $data{min2}, $data{max1}, $data{max2}, 0.5)}

Das Padding kann man direkt als Wert übergeben, ohne das ein True/False-If notwendig ist.

Igge
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: TheTrumpeter am 01 März 2017, 13:51:27
Ich habe auch versucht die Achsenbeschriftung dynamisch mittels der Labels einzustellen...

Leider klappt das bei einem der Plots nicht. Ich habe
attr SVG_FileLog_LBE_3 label int(min($data{min1},$data{min2},$data{min3},$data{min4},$data{min5},0))-5-(int(min($data{min1},$data{min2},$data{min3},$data{min4},$data{min5},0))%5)::int(max($data{max1},$data{max2},$data{max3},$data{max4},$data{max5},0))+5-(int(max($data{max1},$data{max2},$data{max3},$data{max4},$data{max5},0))%5)
und
set yrange [<L1>:<L2>]
set y2range [<L1>:<L2>]


Für die untere Grenze klappt es, für die obere Grenze nicht.
Hab es nun schon mehrfach durchgeschaut, ich finde den Fehler einfach nicht.

Dargestellt werden übrigens Temperaturen. Die Achsen sollen in ganzen 5er-Schritten beschriftet werden und mindestens von -5 bis 25 reichen, daher die 0 in der Min- und 20 in der Max-Bildung.
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: justme1968 am 01 März 2017, 13:55:26
der ganze umweg ist seit langem nicht mehr nötig. du kannst direkt bei den beiden range angaben perl code haben das einen passenden string zurück liefert 

set yrange [{...}]

es gibt einen zweiten thread in dem das beschrieben ist.

gruss
  andre
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: TheTrumpeter am 01 März 2017, 14:23:22
Danke.
Ich finde es mit den Labeln eigentlich übersichtlicher.

Bin nun aber auch selbst draufgekommen... ich habe min/max statt minNum/maxNum verwendet.
War wohl Zufall, dass es in den anderen Plots (bisher) richtig war.
Titel: Antw:Dynamic Range in einem Plot
Beitrag von: jostmario am 17 November 2018, 11:21:23
Hallo,

ist zwar schon älter klink mich aber trotzdem mal hier ein.
wie kann ich es hinbekommen das die Achse Dynamisch bleibt aber auf ca 2000 obergrenze gedeckelt bleiben.
Diagramm Zeigt den Stromverbrauch möchte es Detailierter im unteren Bereich haben.
Die kurzen Peaks interessieren mich nicht möchte es aber nich generell Fix haben.

quasi wenn $data{max1} > 2000 dann die Max YRange = 2000


Gruß Josty