[gelöst] Argument Übergabe von SVG-Plot zu myUtils

Begonnen von Bond246, 01 Oktober 2017, 21:21:39

Vorheriges Thema - Nächstes Thema

Bond246

Hallo zusammen,

ich habe meine Heizungssteuerung mit MAX-Thermostaten auf den PID20-Regler umgestellt. Deswegen möchte ich jetzt die SVG-Plots mit bisher 2 Werten auf der Linken Skala (Feuchtigkeit + ValuePosition) auf insgesamt 5 Werte erweitern.

Da ich gerne eine dynamisch angepasste Skalierung hätte, habe ich bisher diesen Code verwendet, um min und max festzulegen:
Für den Range-Aufruf {getRange($data{min1}, $data{min2}, $data{max1}, $data{max2}, 1)}

Und für in der myUtils habe ich folgende Funktion:
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;
 
  if($min < 0) {
  $min = 0;
  }

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

  return $range;
}


Die neue Funktion soll bestenfalls unabhängig von der Anzahl der eingehenden Daten sein, aus denen dann min und max rausgesucht werden.
Deswegen würde ich gerne die "List::Util"-Funktion verwenden, die min und max ohne größeren Aufwand ausgeben sollen könnte.

Deswegen habe ich eine neue Funktion erstellt:
getRange2 {
  use List::Util qw(min max);

  my $min = min @_;
  my $max = max @_;
 
  $min -= 1;
  $max += 1;
 
  if($min > 0) {
  $min = 0;
  }
 
  my $range = sprintf("[%d:%d]", $min, ceil($max));

  return $range;
}


Mit @_ sollte man auf einen Schlag ein array haben, das alle Argument enthält.
Allerdings verstehe ich noch nicht so richtig, wie ich von insgesamt 7 werden lediglich die Werte 3-7 aus dem SVG-Plot an die Funktion übergebe. Zumindest denke ich, dass hier das Problem ist, warum es bisher noch nicht funktioniert und warum die Plot im Moment so aussieht, wie im Screenshot.

Mein Ansatz für die Range-Funktion war:
{getRange2($data{3}, $data{4}, $data{5}, $data{6}, $data{7})}

Vielleicht brauche ich auch generell einen Einblick in Perl, ich weiß nur nicht, wo ich suchen soll.

Besten Dank
Bond

justme1968

die list until min und max routinen kenne ich nicht. aber fhem hat eingebaute minNum und maxNum funktionen die du verwenden kannst. beide arbeiten mit einer beliebigen anzahl parameter.

ansonsten teste mit einem mini perl programm ob sie routinen machen was du erwartest.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Bond246

Zitat von: justme1968 am 01 Oktober 2017, 22:46:57
die list until min und max routinen kenne ich nicht. aber fhem hat eingebaute minNum und maxNum funktionen die du verwenden kannst. beide arbeiten mit einer beliebigen anzahl parameter.

ansonsten teste mit einem mini perl programm ob sie routinen machen was du erwartest.

Danke für die Antwort,
Leider fehlt mir dann immer noch die Info, wie ich die Argumente vom SVG an die Funktion übergebe.

justme1968

genau so wie du es oben vorgeschlagen hast.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Bond246

[{minNum($data{3},$data{4},$data{5},$data{6},$data{7})}:{maxNum($data{3},$data{4},$data{5},$data{6},$data{7})}]
gibt als untere Grenze jetzt 0 und als obere Grenze 1 zurück.

Im Fhem Log wird folgender Fehler produziert:
ZitatPERL WARNING: Argument "{minNum($data{3},$data{4},$data{5},$data{6},$data{7})}" isn't numeric in subtraction (-) at ./FHEM/98_SVG.pm line 1315.

justme1968

der perl code muss einen string zurück geben. so wie es oben deine getRange2 routine gemacht hat.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Bond246

#6
Hallo,

ich habs jetzt hinbekommen.

Der Code für meine Funktion in myUtils sieht so aus:
use strict;
use warnings;
use POSIX;

sub
getRange2 {
  use List::Util qw(min max);

  my $min = min(@_);
  my $max = max(@_);

  $min -= 1;
  $max += 1;

  if($min > 0) {
        $min = 0;
  }

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

  return $range;
}


Der Knackpunkt war, wie ich die Funktion aufrufe. Es reicht nicht, einfach nur $data{1} zu nehmen, ich muss $data{min1} und $data{max1} nehmen. Wenn ich nur min oder max nehme, werden scheinbar auch nicht alle Werte an die Funktion übergeben.
{getRange2($data{min3},$data{min4},$data{min5},$data{min6},$data{min7},$data{max3},$data{max4},$data{max5},$data{max6},$data{max7})}