logProxy modul zum manipulieren und ergänzen von SVG plots

Begonnen von justme1968, 26 August 2014, 22:47:55

Vorheriges Thema - Nächstes Thema

gero

Hallo Andre,

ich habe gerade mit der Polardarstellung vom logProxy etwas rumgespielt.
Ziel ist es die Ventilstellungen meiner Räume darzustellen (s. angehängtes Bild). Damit die Grafik gut aussieht, möchte ich aber nur die Räume dargestellt bekommen, die maxValveSetting > 0 haben.

Der erste Versuch

#lp Polar::[map{ReadingsVal($_,"maxValveSetting",0)}devspec2array(".*.MAX.Room:FILTER=maxValveSetting>0")]

ist fehlgeschlagen mit

2015.10.22 11:38:05 1: lp: [map{ReadingsVal($_,"maxValveSetting",0)}devspec2array(".*.MAX.Room: Can't find string terminator '"' anywhere before EOF at (eval 124331) line 1.

Ich nehme an, dass der Doppelpunkt vor FILTER an dieser Stelle nicht erlaubt ist.(korrekt?)
Also habe ich das devspec2array in eine kleine sub ausgelagert:


sub activeRooms(){
  return devspec2array(".*.MAX.Room:FILTER=maxValveSetting>0");
}

und das gplot-File entsprechend angepasst:


#lp Polar::[map{ReadingsVal($_,"maxValveSetting",0)}activeRooms()]


Jetzt habe ich nur noch zwei Probleme:
1. Falls das device Array leer ist, weil alle Ventile geschlossen sind, verabschiedet sich fhem mit

2015.10.22 11:54:37 1: PERL WARNING: Use of uninitialized value in pattern match (m//) at ./FHEM/98_logProxy.pm line 1053.
2015.10.22 11:54:37 3: stacktrace:
2015.10.22 11:54:37 3:     main::__ANON__                      called by ./FHEM/98_logProxy.pm (1053)
2015.10.22 11:54:37 3:     main::logProxy_Get                  called by fhem.pl (3085)
2015.10.22 11:54:37 3:     main::CallFn                        called by fhem.pl (1600)
2015.10.22 11:54:37 3:     main::CommandGet                    called by fhem.pl (1051)
2015.10.22 11:54:37 3:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2086)
2015.10.22 11:54:37 3:     main::FW_fC                         called by ./FHEM/98_SVG.pm (1147)
2015.10.22 11:54:37 3:     main::SVG_getData                   called by ./FHEM/98_SVG.pm (1115)
2015.10.22 11:54:37 3:     main::SVG_doShowLog                 called by ./FHEM/98_SVG.pm (991)
2015.10.22 11:54:37 3:     main::SVG_showLog                   called by ./FHEM/01_FHEMWEB.pm (671)
2015.10.22 11:54:37 3:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (436)
2015.10.22 11:54:37 3:     main::FW_Read                       called by fhem.pl (3085)
2015.10.22 11:54:37 3:     main::CallFn                        called by fhem.pl (651)
Illegal division by zero at ./FHEM/98_logProxy.pm line 1063.

Hier habe das Problem zur Zeit mit folgendem Patch gelöst:

--- FHEM/98_logProxy.pm (revision 9585)
+++ FHEM/98_logProxy.pm (working copy)
@@ -1050,6 +1050,7 @@
       next if( $values && ref($values) ne "ARRAY" );

       $segments = scalar @{$values} if( !$segments );
+      next if( !$segments );
       my $isText = $values && @{$values}[0] !~ m/^[.\d+-]*$/;

       $axis = 1 if( $isText );

D.h. sobald das Array leer ist, bleibt auch der Plot leer. Vielleicht gibt es aber auch eine schönere Lösung.

2. Das Grid ist zur Zeit wohl nur für Temperaturwerte vorgesehen (Wertebereich 0-30).
Für den Plot unten habe ich den Wertebereich hart geändert. Vielleicht fällt dir eine elegante Lösung ein, wie man den Wertebereich von außen setzen kann.

Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor

gima84

Hi,

ich versuche einen Plot um ein Monat zu verschieben, was leider nicht funktioniert:

DbLog:myDBLog,offset=-1m:EG_HWR_SZWP:StromverbrauchletzterMonat

Im Log steht dazu
lp: offset=-1m: Search pattern not terminated at (eval 3877) line 2.

Ausgelesene Werte (im Plot Editor):
#DbLog:myDBLog,offset=-1m:EG_HWR_SZWP:StromverbrauchletzterMonat

Im Plot wird dabei komischerweise nichts angezeigt. Mach ich bei der Definition irgendwas falsch?
2015-09-25_12:56:44 0
2015-09-25_13:02:47 0
2015-09-26_13:55:58 0
2015-09-27_09:39:24 0
2015-09-27_09:45:21 0
2015-09-27_14:12:08 0
2015-09-27_18:16:48 0
2015-09-27_18:21:52 0
2015-09-27_18:25:17 0
2015-09-28_15:11:36 0
2015-09-29_15:11:36 0
2015-10-01_15:11:38 35.397
2015-10-02_16:11:36 35.397
2015-10-03_16:11:36 35.397
2015-10-04_16:11:36 35.397
2015-10-05_16:11:36 35.397
2015-10-05_20:55:18 35.397
2015-10-06_20:55:18 35.397
2015-10-07_20:55:19 35.397
2015-10-08_20:55:19 35.397
2015-10-09_20:55:19 35.397
2015-10-10_20:55:19 35.397
2015-10-11_11:09:44 35.397
2015-10-12_11:09:44 35.397
2015-10-13_11:09:44 35.397
2015-10-13_20:19:16 35.397
2015-10-13_20:28:37 35.397
2015-10-14_20:28:38 35.397
2015-10-15_20:21:30 35.397
2015-10-16_20:21:30 35.397
2015-10-17_20:21:30 35.397
2015-10-18_20:21:30 35.397
2015-10-19_19:56:50 35.397
2015-10-20_19:56:50 35.397
2015-10-21_19:15:51 35.397
2015-10-22_19:15:51 35.397
2015-10-23_19:15:51 35.397
2015-10-24_20:15:51 35.397
2015-10-25_19:15:52 35.397

gero

Ich kann den Fehler bestätigen.
Das -1m scheint als Anfang einer regexp geparst zu werden.

Vermutlich reicht es in der Funktion logProxy_shiftTime folgende Zeile
if( $offset =~ m/((-)?\d)*m/ ) {

auf
if( "$offset" =~ m/((-)?\d)*m/ ) {

abzuändern.

Vielleicht sieht Andre hier nochmal rein.

Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor

justme1968

das problem ist vermutliche ein anderes. je nach perl version werden die internen $X variablen des macht durch das folgende split zurück gesetzt. zumindest hatte ich das schon mal an anderer stelle.

bitte ändert den block mal so ab:  if( $offset =~ m/((-)?\d)*m/ ) {
    my $diff = $1;
    my @t = split("[-_:]", $time);
    $time = mktime($t[5],$t[4],$t[3],$t[2],$t[1]-1+$diff,$t[0]-1900,0,0,-1);;
  } else {         
    $time = SVG_time_to_sec($time);
    $time += $offset;
  }                 


geht es dann ?

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

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

gima84

Hi, funktioniert leider beides nicht.

Soll ich nen logfile mit verbose=5 beim SVG erzeugen? Brauchst du noch andere Daten?

gruß martin

justme1968

bitte bau mal das folgende an die gleiche stelle ein und schau was im log steht.

gruss
  andre

Log 1, "offset :$offset";
  if( $offset =~ m/((-)?\d)*m/ ) {
    my $diff = $1;
Log 1, "diff: $diff";
Log 1, "time: $time";
    my @t = split("[-_:]", $time);
Log 1, Dumper @t;
    $time = mktime($t[5],$t[4],$t[3],$t[2],$t[1]-1+$diff,$t[0]-1900,0,0,-1);;
  } else {         
Log 1, "else: $time";
    $time = SVG_time_to_sec($time);
    $time += $offset;
  }                 
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

gima84

Mein Vorgehen:
1. logproxy.pm ändern.
2. shutdown restart
3. alle Plots aufrufen
4. tail -f -n 0 fhem-2015-11.log > logproxy.txt
5. spezifischen Plot aufrufen
6. Reload Webseite
7. tail -f abgebrochen

Anbei das Ergebnis.

gandy

#292
Hallo,

ich suche nach einer Möglichkeit, mit FHEM Bordmitteln einen Plot-Bereich zwischen zwei Datenreihen einzufärben - im Endresultat möchte ich eine Darstellung wie im angefügten plot-7b anstelle von plot7a. Möglicherweise bietet logProxy hier einen Ansatz, nur die Details zur Umsetzung sind mir noch nicht ganz klar.

Der zu füllende Bereich wird nach oben und unten von zwei Datenreihen A und B abgegrenzt. In Anlehnung an das Beispiel im Wiki

#logProxy Func:logProxy_values2Plot([[$from,19],[$to,19],[$to,21],[$from,21]])

sollte es möglich sein, eine Funktion zu schreiben, die ausgehend von den Datenreihen A und B eine neue Datenreihe generiert, die einen geschlossenen Linienzug darstellt. Dazu genügt es im wesentlichen, die Reihenfolge der Punkte in B umzukehren und an A anzuhängen.

Die Frage ist, wie A und B an die Funktion übergeben werden können. Ein möglicher Ansatz könnte sein, die ursprünglichen Specs

#FileLog_HM_0A0000 4:HM_0A0000.duct_far_temperature_in\x3a::
#FileLog_HM_0A0000 4:HM_0A0000.duct_far_temperature_out\x3a::

wiederzuverwerten, etwa in der Form

#logProxy Func:area_plot($from,$to,'FileLog_HM_0A0000 4:HM_0A0000.duct_far_temperature_in\x3a::','FileLog_HM_0A0000 4:HM_0A0000.duct_far_temperature_out\x3a::')


Sollte das Leerzeichen in den Strings ein Problem sein, könnte es auch durch '|' oder ':' ersetzt werden. Die Idee ist aber, möglichst alle vorhanden logProxy Optionen nutzen zu können, wie extend, predict, offset, etc

Die zentrale Frage hier ist, wie die zu schreibende area_plot-Funktion aus den Strings an die passenden Daten kommt. Gibt es in logProxy eine Hilfsfunktion, mit der das einfach zu bewerkstelligen ist, und wie muss ich sie aufrufen?

Danke schonmal für's in die richtige Richtung deuten,
Andy.
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

gandy

Ich denke ich habe die Lösung gefunden, zumindest komme ich aus meiner Funktion an die beiden Datenreihen ran und kann sie in der richtigen Reihenfolge wieder zusammensetzen, um die gewünschte Fläche plotten zu können. Allerdings muss ich momentan die Funktion wie folgt angeben:


#myLogProxy Func:area_plot('FileLog|FL_Wetter,expand=1000|4|temperature|10|','FileLog|FL_Wetter,expand=1000|4|humidity|50|','myLogProxy',$from,$to)


Die '|' sind nötig, weil sonst ein Fehler gemeldet wird, dass nach "area_plot('FileLog" kein schließendes "'" mehr gefunden wird. Das wiederum liegt daran, dass die ganze column_spec mit ":" als Trennzeichen gesplittet wird, was den String zerreisst.

Andre, wäre es denkbar, die betreffende Stelle in logProxy so abzuändern, dass eine Angabe

#myLogProxy Func:area_plot('FileLog:FL_Wetter,expand=1000:4:temperature:10:','FileLog:FL_Wetter,expand=1000:4:humidity:50:','myLogProxy',$from,$to)

möglich ist? Ich kann mich auch gern an einem Patch versuchen..

Danke,
Andy.
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

justme1968

@gima84: kannst du bitte das log noch mal mit gesetztem stacktrace attribut erzeugen. meine log zeilen tauchen scheinbar garnecht erst auf.

@handy: sorry. hab dein posting eben erst gesehen.

das problem  mit den : ist das die in der column_spec zeile von schon als treuer zwischen den einzelnen spalten verwendet werden und in unterschiedlichen modulen ein split auf : erfolgt und : eigentlich nicht weiter erlaubt ist.

da im Funk fall keine zusätzlichen spalten vorkommen können kannst du mal versuchen direkt nach zeile 1006 ein$fld[1] = join( ':', @fld[1..@fld-1]);einzufügen. wenn es damit geht checke ich es ein.

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

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

gero

Hallo Andre,

wenn du Zeit hast, kannst du dir bitte mal meinen Post weiter oben ansehen:
http://forum.fhem.de/index.php/topic,26529.msg348177.html#msg348177

Vielleicht ist er untergegangen.

Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor

justme1968

#296
@gero: ja. ein : ist in der zeile eigentlich nicht erlaubt. siehe oben.

in der angehängten version müsste das aber gehen. da ist auch dein patch drinnen und es gibt eine neue option isolines für den polar plot. also z.b. so:#lp Polar:isolines=10|30|60|70|80|90|100:[map{ReadingsVal($_,"maxValveSetting",0)}activeRooms()]

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

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

gandy

Zitat von: justme1968 am 11 November 2015, 15:12:17
@handy: sorry. hab dein posting eben erst gesehen.

das problem  mit den : ist das die in der column_spec zeile von schon als treuer zwischen den einzelnen spalten verwendet werden und in unterschiedlichen modulen ein split auf : erfolgt und : eigentlich nicht weiter erlaubt ist.

da im Funk fall keine zusätzlichen spalten vorkommen können kannst du mal versuchen direkt nach zeile 1006 ein$fld[1] = join( ':', @fld[1..@fld-1]);einzufügen. wenn es damit geht checke ich es ein.

Kein Problem, hab die Lösung gefunden :-) Aber danke für den fld Vorschlag, funktioniert perfekt. Bitte gerne einchecken.

Meine Funktion sieht jetzt so aus:

sub area_plot($$$$$)
{
  my ($spec1,$spec2,$lpn,$from,$to) = @_;
  return undef if( !defined($defs{$lpn}) );
  my $lph = $defs{$lpn};

  my $data1 = logProxy_Get($lph,$lpn,'CURRENT','-',$from,$to,$spec1);
  my $data2 = logProxy_Get($lph,$lpn,'CURRENT','-',$from,$to,$spec2);

  my @dvec1 = split("\n", $data1 );
  my @dvec2 = split("\n", $data2 );

  pop(@dvec1); # get rid of last line, data may not be interrupted w/ comments
  pop(@dvec2);

  return join("\n", @dvec1) . "\n" . join("\n", reverse(@dvec2)) . "\n$dvec1[0]\n";
}


Ein wenig unklar ist mir, ob CURRENT an der Stelle richtig ist, wie siehst du das?

Grüße,
Andy.
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

justme1968

logproxy verwendet den $inf parameter nicht sondern verwendet bei aufruf der entsprechenden dblog oder filelog routine automatisch HISTORY bzw. CURRENT. d.h. es ist egal was du hier übergibst.

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

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

gero

Zitat von: justme1968 am 11 November 2015, 16:41:04
@gero: ja. ein : ist in der zeile eigentlich nicht erlaubt. siehe oben.

in der angehängten version müsste das aber gehen. da ist auch dein patch drinnen und es gibt eine neue option isolines für den polar plot. also z.b. so:#lp Polar:isolines=10|30|60|70|80|90|100:[map{ReadingsVal($_,"maxValveSetting",0)}activeRooms()]

gruss
  andre
Vielen Dank. Ich werde es Morgen testen.
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor