GROHE SENSE GUARD

Begonnen von Heuberg, 08 Dezember 2017, 19:15:15

Vorheriges Thema - Nächstes Thema

McShire

Guten Abend JOEK3R,

Zitat von: J0EK3R am 25 November 2021, 20:24:54

Inzwischen bin ich am Überlegen, einfach selbst in ein eigenes Log-File zu schreiben - dann müsste man den ganzen *Pfusch* nicht machen.
Man könnte das eigene Log-File dann wohl über ein readonly FileLog-Device für den Plot zugänglich zu machen.

Was meinst Du?


Ich habe hierbei erst einmal eine Menge gelernt. Wenn du mit einer neuen Methode in ein eigenes Logfile schreibst, bist Du aber nicht mehr
systemkonform, sowohl was weitere Erweiterungen möglicher anderer user betrifft, als auch die Verwendung weiterer Standards.
Das Update würde ja wohl funktionieren, da ja alle Funktionen dann in deinem Modul enthalten sind.

Letztlich ist es Deine Entscheidung, es ist schließlich Dein Modul.
Aber ich denke, Du bist kurz vorm Ziel, da ja nur noch die Funktion fertiggestellt werden muss.
Das würde ich ja gerne machen, bin aber mit fhem und Perl nicht so vertraut.

Ich verstehe nicht, wie die Daten in dem Datenarray verpackt sind.
Was ich bis jetzt herausgefunden habe (oder meine herausgefunden zu haben, ist evtl. vollkommen daneben) ist.
$data ist eine Referenz auf ein array. Dieses array enthält scheinbar wieder Referenzen auf arrays, in denen die Daten stehen.

Wenn man die Struktur kennt und verstanden hat, kann man diese für die Rückgabe in der benötigten Form verändern.
Ich sehe das für mich als Herausforderung an. Wenn Du mich dabei unterstützt, bin ich Dir sehr dankbar dafür.
Mir geht es um den Lerneffekt, wie schon gesagt, im Moment sind Perl und fhem noch einige böhmische Dörfer für mich.

Viele Grüße
Werner

McShire

Hallo JOEK3R,
so ich habe die Funktion noch einmal erweitert.
jetzt haben wir auch das, was in den Parametern steht.
scheinbar kein Triple sondern nur Zeitstempel und Wert (wert = messwertZeitstempel . Messwert)


2021.11.25 22:14:33 1: FileLog:FileLog_Unter_Wasseruhr,postFn='pF_GroheSense':4:Unter_Wasseruhr.MeasurementTemperature\x3a::
2021.11.25 22:14:33 1: ARRAY
2021.11.25 22:14:33 1: 566
2021.11.25 22:14:33 1: ARRAY
2021.11.25 22:14:33 1: 2
2021.11.25 22:14:33 1: 1637807510
2021.11.25 22:14:33 1: data_array Element 0
2021.11.25 22:14:33 1: dz Element 0
2021.11.25 22:14:33 1: 1637807510
2021.11.25 22:14:33 1: dz Element 1
2021.11.25 22:14:33 1: 163770908815.6
2021.11.25 22:14:33 1: data_array Element 1
2021.11.25 22:14:33 1: dz Element 0
2021.11.25 22:14:33 1: 1637807510
2021.11.25 22:14:33 1: dz Element 1
2021.11.25 22:14:33 1: 163770908815.6
2021.11.25 22:14:33 1: data_array Element 2
2021.11.25 22:14:33 1: dz Element 0
2021.11.25 22:14:33 1: 1637807510
2021.11.25 22:14:33 1: dz Element 1
2021.11.25 22:14:33 1: 163770908815.6
2021.11.25 22:14:33 1: data_array Element 3
2021.11.25 22:14:33 1: dz Element 0
2021.11.25 22:14:33 1: 1637807510
2021.11.25 22:14:33 1: dz Element 1
2021.11.25 22:14:33 1: 163770908815.6
2021.11.25 22:14:33 1: data_array Element 4
2021.11.25 22:14:33 1: dz Element 0
2021.11.25 22:14:33 1: 1637807510
2021.11.25 22:14:33 1: dz Element 1
2021.11.25 22:14:33 1: 163770908815.6


Die Funktion dazu:


#### postFN Funktion für GroheSense Plots #######################
# Aufruf in 74_GroheOndusSmartDevice.pm
# myPostFn($devspec,$data)  $devspec = Zeile aus gplot-file, $data = array mit Datenpunkten

sub pF_GroheSense
{ my $devspec = $_[0];                       #Zeile im gplotfile
  my $data    = $_[1];                           #Referenz auf Array mit Triple Datenpunkte (Timestemp Zahl, Wert, Timestemp String
  my @data_array = @$data;             #Array mit Zeigern zu den Datenpunkten
  my $max_index = $#data_array;      #max Anzahl Datenpunkte
  my $dpk = $data_array[0];                #Referenz auf Array mit Daten zum ersten Datenpunkt
  my @dz = @$dpk;                            #Array mit Daten zum ersten Datenpunkt
  my $max_dz = $#dz;                         #max Anzahl Einträge zum ersten Datenpunkt

Log3 ("pFGroheSense", 1, $devspec);      #Zeile aus dem gplot-file
Log3 ("pFGroheSense", 1, ref($data));      #Typ der Variablen, auf die $data zeigt (ist ein ARRAY)
Log3 ("pFGroheSense", 1, $max_index);  #Anzahl Elemente in @data_array
Log3 ("pFGroheSense", 1, ref($dpk));       #Typ der Variablen, auf die der erste Eintrag in @data_array zeigt (ist ein ARRAY)
Log3 ("pFGroheSense", 1, $max_dz);       #Anzah Elemente in @dz
Log3 ("pFGroheSense", 1, $dz[0]);            #erstes Element in dz

for(my $b = 0; $b < 5; $b = $b +1 ) {
    Log3 ("pFGroheSense", 1,"data_array Element " . $b );
    for(my $a = 0; $a < $max_dz; $a = $a + 1 ) {
          Log3 ("pFGroheSense", 1,"dz Element " . $a);
          Log3 ("pFGroheSense", 1, $dz[$a]);
    }
}

return ($devspec,$data);
}



Falls ich morgen oder übermorgen dazu komme, versuche ich mich mal an der Manipulation für den return-Wert.

Viele Grüße
Werner

McShire

Korrektur: Triple


FileLog:FileLog_Unter_Wasseruhr,postFn='pF_GroheSense':4:Unter_Wasseruhr.MeasurementTemperature\x3a::
2021.11.25 22:30:19 1: ARRAY
2021.11.25 22:30:19 1: 647
2021.11.25 22:30:19 1: ARRAY
2021.11.25 22:30:19 1: 2
2021.11.25 22:30:19 1: 1637807510
2021.11.25 22:30:19 1: data_array Element 0
2021.11.25 22:30:19 1: dz Element 0
2021.11.25 22:30:19 1: 1637807510
2021.11.25 22:30:19 1: dz Element 1
2021.11.25 22:30:19 1: 163770908815.6
2021.11.25 22:30:19 1: dz Element 2
2021.11.25 22:30:19 1: 2021-11-25_03:31:50
2021.11.25 22:30:19 1: data_array Element 1
2021.11.25 22:30:19 1: dz Element 0
2021.11.25 22:30:19 1: 1637807510
2021.11.25 22:30:19 1: dz Element 1
2021.11.25 22:30:19 1: 163770908815.6
2021.11.25 22:30:19 1: dz Element 2
2021.11.25 22:30:19 1: 2021-11-25_03:31:50
2021.11.25 22:30:19 1: data_array Element 2
2021.11.25 22:30:19 1: dz Element 0
2021.11.25 22:30:19 1: 1637807510
2021.11.25 22:30:19 1: dz Element 1
2021.11.25 22:30:19 1: 163770908815.6
2021.11.25 22:30:19 1: dz Element 2
2021.11.25 22:30:19 1: 2021-11-25_03:31:50
2021.11.25 22:30:19 1: data_array Element 3
2021.11.25 22:30:19 1: dz Element 0
2021.11.25 22:30:19 1: 1637807510
2021.11.25 22:30:19 1: dz Element 1
2021.11.25 22:30:19 1: 163770908815.6
2021.11.25 22:30:19 1: dz Element 2
2021.11.25 22:30:19 1: 2021-11-25_03:31:50
2021.11.25 22:30:19 1: data_array Element 4
2021.11.25 22:30:19 1: dz Element 0
2021.11.25 22:30:19 1: 1637807510
2021.11.25 22:30:19 1: dz Element 1
2021.11.25 22:30:19 1: 163770908815.6
2021.11.25 22:30:19 1: dz Element 2
2021.11.25 22:30:19 1: 2021-11-25_03:31:50

dz-Element 0,1,2 in 647 Datensätzen in data_array

McShire

So sieht jetzt das return-array zum Plotten aus


2021.11.26 03:30:45 1: data_array Element 0
2021.11.26 03:30:45 1: dz Element 0
2021.11.26 03:30:45 1: 1637795473
2021.11.26 03:30:45 1: dz Element 1
2021.11.26 03:30:45 1: 15.7
2021.11.26 03:30:45 1: dz Element 2
2021.11.26 03:30:45 1: 2021-11-26_02:12:02
2021.11.26 03:30:45 1: data_array Element 1
2021.11.26 03:30:45 1: dz Element 0
2021.11.26 03:30:45 1: 1637799073
2021.11.26 03:30:45 1: dz Element 1
2021.11.26 03:30:45 1: 15.7
2021.11.26 03:30:45 1: dz Element 2
2021.11.26 03:30:45 1: 2021-11-26_02:12:02
2021.11.26 03:30:45 1: data_array Element 2
2021.11.26 03:30:45 1: dz Element 0
2021.11.26 03:30:45 1: 1637802673
2021.11.26 03:30:45 1: dz Element 1
2021.11.26 03:30:45 1: 15.8
2021.11.26 03:30:45 1: dz Element 2
2021.11.26 03:30:45 1: 2021-11-26_02:12:02
2021.11.26 03:30:45 1: data_array Element 3
2021.11.26 03:30:45 1: dz Element 0
2021.11.26 03:30:45 1: 1637809854
2021.11.26 03:30:45 1: dz Element 1
2021.11.26 03:30:45 1: 15.8
2021.11.26 03:30:45 1: dz Element 2
2021.11.26 03:30:45 1: 2021-11-26_02:12:02
2021.11.26 03:30:45 1: data_array Element 4
2021.11.26 03:30:45 1: dz Element 0
2021.11.26 03:30:45 1: 1637795473
2021.11.26 03:30:45 1: dz Element 1
2021.11.26 03:30:45 1: 15.7
2021.11.26 03:30:45 1: dz Element 2
2021.11.26 03:30:45 1: 2021-11-26_02:26:31


Viele Grüße
Werner

J0EK3R

Moin moin :)

So, ich denke, dass ich eine funktionierende Version eingecheckt habe: V3.0.21.

Die Werte für die Measurement-readings werden nun aus Zeitstempel in Sekunden und direkt danach dem eigentlichen Wert gebildet - so, wie unser letzter Stand war.
Alle anderen Arten von Trennzeichen führen zu Warning-Ausgaben im FileLog...


                # force the timestamp-seconds-string to have a well known length
                # fill with leading zeros
                my $dataTimestamp_s = sprintf ("%0${ForcedTimeStampLength}d", time_str2num(substr($currentDataTimestamp, 0, 18)) );
               
                readingsBeginUpdate($hash);

                readingsBulkUpdateIfChanged( $hash, "MeasurementDataTimestamp", $dataTimestamp_s . " " . $currentDataTimestamp )
                  if ( defined($currentDataTimestamp) );
                readingsBulkUpdateIfChanged( $hash, "MeasurementHumidity", $dataTimestamp_s . $currentDataHumidity )
                  if ( defined($currentDataHumidity) );
                readingsBulkUpdateIfChanged( $hash, "MeasurementTemperature", $dataTimestamp_s . $currentDataTemperature )
                  if ( defined($currentDataTemperature) );

                readingsEndUpdate( $hash, 1 );


Außerdem habe ich die Funktion "GroheOndusSmartDevice_PostFn" spendiert, die man direkt als postFn eines LogProxys eintragen kann.


##################################
# GroheOndusSmartDevice_PostFn
# This function splits a raw-value string containing a timestamp in seconds and
# a value with a well known timestamp length in the timestamp and the value and
# puts them into the point structure for a plot
sub GroheOndusSmartDevice_PostFn($$)
{     
  my($devspec, $array) = @_;
 
  foreach my $point ( @{$array} )
  {
    my $timeStamp_Value = $point->[1]; # take raw-value i.e. "163780529817.3"

    # first part of the raw-value is the timestamp in seconds (it has a well known length) -> 1637805298
    # second part - the rest - of the raw-value is the value                               -> 17.3
    $point->[0] = substr($timeStamp_Value, 0, $ForcedTimeStampLength);
    $point->[1] = substr($timeStamp_Value, $ForcedTimeStampLength);
  }   

  return $array;
}


Hier meine gplot-Datei

# Created by FHEM/98_SVG.pm, 2021-11-26 09:03: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 "Humidity"
set y2label "Temperature"
set yrange [40:60]
set y2range [10:20]

#logProxy FileLog:FileLog_KG_Heizraum_Sense,postFn='GroheOndusSmartDevice_PostFn':4:KG_Heizraum_Sense.MeasurementTemperature\x3a::
#logProxy FileLog:FileLog_KG_Heizraum_Sense,postFn='GroheOndusSmartDevice_PostFn':4:KG_Heizraum_Sense.MeasurementHumidity\x3a::

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


Freue mich auf Feedback :)

Beste Grüße
JOEK3R

McShire

Hallo JOEK3R

Vielen Dank für Deine viele Zeit, die Du spendiert hast, um das Modul und die Plot zum Laufen zu bringen.
Es funktioniert alles besten. Die postFNnFunktion hast Du elegant gelöst.

Ich hatte das auf konventionelle Weise etwas umständlicher gemacht.
Anbei meine Version nur mal zum Angucken. Die Log Einträge sind darin nur,
damit ich das Ergebnis im Logfile sehen konnte. Eine bessere Möglichkeit ist mir nicht eingefallen.


#### postFN Funktion für GroheSense Plots #######################
# Aufruf in 74_GroheOndusSmartDevice.pm
# myPostFn($devspec,$data)  $devspec = Zeile aus gplot-file, $data = array mit Datenpunkten

sub pF_GroheSense ($$)
   { my $devspec = $_[0];                        #Zeile im gplotfile
     my $data    = $_[1];                           #Referenz auf Array mit Triple Datenpunkte (Timestemp Zahl, Wert, Timestemp String
     my @data_array = @$data;                 #Array mit Zeigern zu den Datenpunkten
     my $max_index = $#data_array;         #max Anzahl Datenpunkte
     my $dpk = $data_array[0];                 #Referenz auf Array mit Daten zum ersten Datenpunkt
     my @dz = @$dpk;                              #Array mit Daten zum ersten Datenpunkt
     my $max_dz = $#dz;                          #max Anzahl Einträge zum ersten Datenpunkt

    Log3 ("pFGroheSense", 1, $devspec);      #Zeile aus dem gplot-file
    Log3 ("pFGroheSense", 1, ref($data));      #Typ der Variablen, auf die $data zeigt (ist ein ARRAY)
    Log3 ("pFGroheSense", 1, $max_index);  #Anzahl Elemente in @data_array
    Log3 ("pFGroheSense", 1, ref($dpk));       #Typ der Variablen, auf die der erste Eintrag in @data_array zeigt (ist ein ARRAY)
    Log3 ("pFGroheSense", 1, $max_dz);       #Anzah Elemente in @dz
    Log3 ("pFGroheSense", 1, $dz[0]);            #erstes Element in dz

    for(my $b = 0; $b < $max_index+1; $b = $b +1 ) {
       if ($b<20) {Log3 ("pFGroheSense", 1,"data_array Element " . $b );};
       $dpk = $data_array[$b];                                                                #Referenz auf Array mit Daten zum b-ten Datenpunkt
       @dz = @$dpk;                                                                              #Array mit Daten zum b-ten Datenpunkt
       $dz[0] = substr($dz[1],0,10);
       $dz[1] = substr($dz[1],10);
       for(my $a = 0; $a < 3; $a = $a + 1 ) {
             if ($b<20) {Log3 ("pFGroheSense", 1,"dz Element " . $a);};
             if ($b<20) {Log3 ("pFGroheSense", 1, $dz[$a]);};
       }
    }

return $data;
}



Aber jetzt haben wir mit deiner Version eine viel bessere Lösung.
Jetzt fehlt nur noch für die Anwender (vielleicht unter der Hilfe) eine Anleitung,
wie der normale Plot auf logProxy umgestellt wird.

Im Anhang kannst Du mal 2 Plots sehen. Da sieht man auch dass die aktuellen Daten noch nicht übertragen wurden.
Der 03:00 Uhr Punkt fehlt, warum auch immer.

Viele Grüße
Werner

J0EK3R

#141
Hallo Werner,

Dir ebenfalls vielen Dank - Du hast ja nicht weniger Zeit investiert.  :)

Deine postFn macht ja im Wesentlichen das selbe wie meine - ist nur eben eine Debug Variante.
Und ich verwende foreach statt der klassischen for-Schleife.

Zitat
Im Anhang kannst Du mal 2 Plots sehen. Da sieht man auch dass die aktuellen Daten noch nicht übertragen wurden.
Der 03:00 Uhr Punkt fehlt, warum auch immer.

Letztendlich kannst Du im Ploteditor, über show preprocessed input die Datenpunkte sehen, die an den Plot gehen - stimmt was noch nicht, schauen wir danach... ;)

Zitat
Jetzt fehlt nur noch für die Anwender (vielleicht unter der Hilfe) eine Anleitung, wie der normale Plot auf logProxy umgestellt wird.

...ich hab's im Hinterkopf...
Das alte Doku-Problem eines Programmierers: Programmier ich oder dokumentiert ich!?
...und wenn's Programm dann läuft, dann "vergisst" man schnell, sauber zu dokumentieren...  :-X

Ich habe noch eine weitere Idee, um etwas zukunftsfester zu werden: eine Datenformat-Version im Wert der Measurement-readings.

Momentan ist das Datenformat der Measurement-readings
<10 ZiffernZeitstempel><float-Wert>

Ich würde gerne noch eine Version mit hineinpacken, damit bei eventuellen Änderungen des Formats die aufgezeichneten Daten nicht futsch sind:
<2 Ziffern Version><10 Ziffern Zeitstempel><float-Wert>

Damit unsere aktuellen Werte noch funktionieren, definiere ich diese als Version 16

So sehen die aktuellen Werte aus:

2021-11-27_04:59:49 KG_Heizraum_Sense MeasurementTemperature: 163798518216.9


Das neue Format mit Version ,,00" würde so aussehen:

2021-11-27_04:59:49 KG_Heizraum_Sense MeasurementTemperature: 00163798518216.9


Ist drin: V3.0.22


##################################
# GroheOndusSmartDevice_PostFn
# This function splits a raw-value string containing a timestamp in seconds and
# a value with a well known timestamp length in the timestamp and the value and
# puts them into the point structure for a plot
sub GroheOndusSmartDevice_PostFn($$)
{     
  my($devspec, $array) = @_;
 
  foreach my $point ( @{$array} )
  {
    my $timeStamp_Value = $point->[1]; # take raw-value i.e. "163780529817.3"

    # first 2 numbers are the version information
    my $measurementFormatVersion = $point->[0] = substr($timeStamp_Value, 0, 2);

    # no version information: Format: <10 timettamp><rest value>
    if($measurementFormatVersion eq "16")
    {
      # first part of the raw-value is the timestamp in seconds (it has a well known length) -> 1637805298
      # second part - the rest - of the raw-value is the value                               -> 17.3
      $point->[0] = substr($timeStamp_Value, 0, 10);
      $point->[1] = substr($timeStamp_Value, 10);
    }
    # with version information:  Format: <2 Version><10 timestamp><rest value>
    elsif($measurementFormatVersion eq "00")
    {
      # first part of the raw-value is the timestamp in seconds (it has a well known length) -> 1637805298
      # second part - the rest - of the raw-value is the value                               -> 17.3
      $point->[0] = substr($timeStamp_Value, 2, 10);
      $point->[1] = substr($timeStamp_Value, 12);
    }
    # default
    else
    {
      # first part of the raw-value is the timestamp in seconds (it has a well known length) -> 1637805298
      # second part - the rest - of the raw-value is the value                               -> 17.3
      $point->[0] = substr($timeStamp_Value, 0, 10);
      $point->[1] = substr($timeStamp_Value, 10);
    }
  }   

  return $array;
}


Beste Grüße
JOEK3R

J0EK3R

#142
Html-Hilfe von GroheOndusSmartDevice hat ab V3.0.24 ein Beispiel für ein gplotfile und einiges mehr...

McShire

#143
Hallo JOEK3R,
ich verstehe noch nicht ganz, was die Version bezwecken soll.
Mit else wird immer das alte Format verwendet außer wenn 00 vorne ist, nicht nur 16.

Und eins verstehe ich beim Plot nicht.
Ich habe die Log-Datei auf monatlichen Dateiwechsel gestellt, d.h. alle Vortagswerte sind enthalten.
Damit auch Zeitstempel von gestern mit debugforceupdate heute generiert.
Im Plot-Editor sieht man auch die auf gestern datierten Werte in preprocessed values.
Der Plot von heute zeigt die Werte von 0:00 bis 4:00Uhr.
Wenn ich den Plot von gestern aufrufe (<= links über dem Plot), Wird gestern angezeigt, aber ohne Werte.
Die Werte stehen aber doch in dem logfile und das Pilotprogramm weiß doch nicht,
Daß diese erst heute erzeugt wurden. Der Zeitstempel hat den gestrigen Tag.
Was mache ich falsch?
Viele Grüße Werner.

McShire

Frage: in Deiner Funktion steht @{$array}
Ist @$array falsch oder das gleiche?
Viele Grüße
Werner

McShire

 Hallo JOEK3R,
Update kann ich erst Montag am PC machen. Das mache ich ungern am IPad.
Wenn irgendetwas schief läuft, habe ich kein Putty und kein RemoteDesktop.

Zitat von: J0EK3R am 27 November 2021, 07:01:00
Html-Hilfe von GroheOndusSmartDevice hat ab V3.0.24 ein Beispiel für ein gplotfile und einiges mehr...

Viele Grüße
Werner

J0EK3R

Hallo Werner  :)

ZitatUnd eins verstehe ich beim Plot nicht.
Ich habe die Log-Datei auf monatlichen Dateiwechsel gestellt, d.h. alle Vortagswerte sind enthalten.
Damit auch Zeitstempel von gestern mit debugforceupdate heute generiert.
Im Plot-Editor sieht man auch die auf gestern datierten Werte in preprocessed values.
Der Plot von heute zeigt die Werte von 0:00 bis 4:00Uhr.
Wenn ich den Plot von gestern aufrufe (<= links über dem Plot), Wird gestern angezeigt, aber ohne Werte.
Die Werte stehen aber doch in dem logfile und das Pilotprogramm weiß doch nicht,
Daß diese erst heute erzeugt wurden. Der Zeitstempel hat den gestrigen Tag.
Was mache ich falsch?

Bei den Plots werden die Zeitstempel der readings im LogFile berücksichtig, also die erste Spalte des LogFiles und nicht ,,unsere" Zeitstempel. Die werden ja erst in der postFn ausgepackt.

Die Format-Version ist einfach dafür gedacht, dass bei einer Änderung des Formats auch noch die Werte mit älteren Formaten behandelt werden können. Z.B. wenn der Zeitstempel statt den aktuell 10 Ziffern irgendwann 15 Zeichen hat - nur ein Beispiel.

Damit das ,,alte Format" vor V3.0.22 auch noch eingelesen werden kann - diese Zeitstempel beginnen sicher mit ,,16" - habe ich das eben mit der Versionskennung ,,16" definiert.
Vielleicht stelle ich die If-Elsif-Kette noch um - der else-Zweig ist als default drin, eigentlich dürfte dieser Fall nie auftreten.

ZitatFrage: in Deiner Funktion steht @{$array}
Ist @$array falsch oder das gleiche?
...keine Ahnung  ;)
Ich bin (noch) kein perl-Programmierer und kopier mir das Zeug nur zusammen  :-X
Vielleicht ist es auch falsch... - zumindest tut's.

Beste Grüße
JOEK3R

McShire

Zitat von: J0EK3R am 27 November 2021, 19:36:11

Bei den Plots werden die Zeitstempel der readings im LogFile berücksichtig, also die erste Spalte des LogFiles und nicht ,,unsere" Zeitstempel. Die werden ja erst in der postFn ausgepackt.


Das heißt, mit unserer Methode bekommen wir immer nur den Zeitraum von 00:00Uhr bis zur Übergabe der Daten von Grohe in den Plot.
Dann sollten wir doch vielleicht die Zeilen, die von Grohe übergeben werden, modifiziert (Timestamp Messwert nach links) ins Logfile schreiben.
Wo kann man denn in Deinem Modul die eingelesenen Daten finden?


Ich bin (noch) kein perl-Programmierer und kopier mir das Zeug nur zusammen  :-X


Was Du machst, ist aber schon sehr profihaft. und funktioniert!

Viele Grüße
Werner

J0EK3R

Moin Werner :)

ZitatDann sollten wir doch vielleicht die Zeilen, die von Grohe übergeben werden, modifiziert (Timestamp Messwert nach links) ins Logfile schreiben.

Aber genau das ist doch die Krux:
Werte werden mit readingsBulkUpdateIfChanged, readingsBulkUpdate oder readingsSingleUpdate im FHEM-Modul auf die readings gesetzt.
Da wird dann FHEM-intern der System-Zeitstempel verwendet.
Ist ein FileLog oder DBLog auf dem Gerät eingehängt, signalisiert dieses den neuen reading-Wert und FileLog oder DBLog schreit diesen dann mit dem System-Zeitstempel weg.
Also keine Chance, den Zeitstempel irgendwie zu setzen.

Ich denke auch, dass das LogFile (und die Datenbank von DBLog auch) zeitlich aufsteigend - also keine älteren Messwerte nach neueren - organisiert sein muss.
Der Plot holt sich dann die Messwerte mit Start- und End-Zeitstempel über folgende Abfragen aus FileLog/DBLog:


get logproxy CURRENT INT 2021-11-01_00:00:00 2021-11-30_23:59:59 FileLog:FileLog_KG_Heizraum_Sense,postFn='GroheOndusSmartDevice_PostFn':4:KG_Heizraum_Sense.MeasurementTemperature\x3a::


oder


get FileLog_KG_Heizraum_Sense CURRENT - 2021-11-01_00:00:00 2021-11-30_23:59:59 4:KG_Heizraum_Sense.MeasurementTemperature\x3a::


Die Abfragen kannst Du übrigens "Show preprocessed input" des Ploteditors entnehmen und INT durch - ersetzen und in die Kommando-Zeile von FHEM eingeben.

Und ich vermute, dass sobald ein Zeitstempel nach dem End-Zeitstempel der Abfrage im LogFile auftaucht, diese beendet wird, da ja davon ausgegangen wird, dass nur noch neuere Zeitstempel folgen (-> müsste man prüfen).

Die einzige Möglichkeit, die ich aktuell sehe, ist, selbst eine Datei im LogFile-Format zu schreiben und die wiederum über ein readonly FileLog an den Plot anzubinden...

ZitatWo kann man denn in Deinem Modul die eingelesenen Daten finden?

Die Schleife, die die Messungen auswertet, ist in der sub GroheOndusSmartDevice_Sense_GetData bei Zeile 2797.

foreach my $currentData ( @{ $decode_json->{data}->{measurement} } )
{
  # is this the correct dataset?
  if ( defined( $currentData->{timestamp} ) and
    defined( $currentData->{humidity} ) and
    defined( $currentData->{temperature} ) )
  {
    my $currentDataTimestamp   = $currentData->{timestamp};
    my $currentDataHumidity    = $currentData->{humidity};
    my $currentDataTemperature = $currentData->{temperature};
   
    if($currentDataTimestamp gt $lastProcessedMeasurementTimestamp)
    {
      # force the timestamp-seconds-string to have a well known length
      # fill with leading zeros
      my $dataTimestamp_s = sprintf ("%0${ForcedTimeStampLength}d", time_str2num(substr($currentDataTimestamp, 0, 18)) );
     
      readingsBeginUpdate($hash);

      readingsBulkUpdateIfChanged( $hash, "MeasurementDataTimestamp", $CurrentMeasurementFormatVersion . $dataTimestamp_s . " " . $currentDataTimestamp )
        if ( defined($currentDataTimestamp) );
      readingsBulkUpdateIfChanged( $hash, "MeasurementHumidity", $CurrentMeasurementFormatVersion . $dataTimestamp_s . $currentDataHumidity )
        if ( defined($currentDataHumidity) );
      readingsBulkUpdateIfChanged( $hash, "MeasurementTemperature", $CurrentMeasurementFormatVersion . $dataTimestamp_s . $currentDataTemperature )
        if ( defined($currentDataTemperature) );

      readingsEndUpdate( $hash, 1 );
    }
   ...
   ...
}


Beste Grüße
JOEK3R

McShire

#149
Zitat von: J0EK3R am 28 November 2021, 06:23:38

Ich denke auch, dass das LogFile (und die Datenbank von DBLog auch) zeitlich aufsteigend - also keine älteren Messwerte nach neueren - organisiert sein muss.
...
...

Und ich vermute, dass sobald ein Zeitstempel nach dem End-Zeitstempel der Abfrage im LogFile auftaucht, diese beendet wird, da ja davon ausgegangen wird, dass nur noch neuere Zeitstempel folgen (-> müsste man prüfen).


Stimmt. Ich habe mal mit einem Editor die Zeitstempel auf verschiedene Weise geändert.
Sobald die zeitliche Reihenfolge nicht mehr gegeben ist, wird der Plot nicht mehr ausgeführt.

Ich habe mal die Zeitstempel links = Zeit des Eintrags in das Logfile durch die Messzeit ersetzt und alle anderen Log-Einträge wie LastTemperature usw entfernt,
dann sind alle in der richtigen Reihenfolge, dann bekommt man wunderschöne Plots. siehe Anlage.
Aber da es im Modul keine Möglichkeit gibt, den Zeitstempel für den Eintragszeitpunkt zu ändern, ist das wohl nur graue Theorie.

Viele Grüße
Werner