FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Paul Guijt am 20 September 2019, 12:57:57

Titel: SmartmeterP1 in DbLog
Beitrag von: Paul Guijt am 20 September 2019, 12:57:57
Hallo Heiko,

Die Readings aus mein Modul Smartmeter (Typ SMARTMETERP1) werden in DbLog notiert wie


TIMESTAMP DEVICE TYPE EVENT READING VALUE UNIT
  2019-09-20 12:05:19 SmartMeter SMARTMETERP1 ElectricityPowerDelivered: 0.00 kW ElectricityPowerDelivered 0.00 kW
  2019-09-20 12:40:39 SmartMeter SMARTMETERP1 ElectricityPowerProduced: 0.95 kW ElectricityPowerProduced 0.95 kW


Habe ich gut verstanden, dass du DbLog so anpassen kannst, dass die Einheit aus der Spalte Wert nun in der Spalte Einheit aufgeführt ist?

Vielen Dank im Voraus!
Paul
Titel: Antw:SmartmeterP1 in DbLog
Beitrag von: DS_Starter am 20 September 2019, 22:40:07
Hallo Paul,

ZitatHabe ich gut verstanden, dass du DbLog so anpassen kannst, dass die Einheit aus der Spalte Wert nun in der Spalte Einheit aufgeführt ist?

Im Prinzip ja, aber ich möchte es eigentlich weitestgehend vermeiden solche Modul-spezifischen Anpassungen im DbLog zu machen, möglichst nur im Notfall.
Das ist eher ein Relikt aus der Vergangenheit.
Besser wäre es wenn du ( ich nehme an du bist der Entwickler des Moduls ? steht nämlich nicht in der Maintainer.txt) in deinem Modul die Funktion DbLog_splitFn implementierst.

Beschreibung im Wiki: https://wiki.fhem.de/wiki/DevelopmentModuleIntro#X_DbLog_split

Hier mal ein Beispiel:



sub Initialize {

  $hash->{DbLog_splitFn} = "Modul_DbLog_split";
}

.......

###############################################################
#               DbLog_splitFn
###############################################################
sub Modul_DbLog_split($$) {
  my ($event, $device) = @_;
  my $devhash = $defs{$device};
  my ($reading, $value, $unit);

  if($event =~ m/[_\-fd]Consumption|Quote/) {
      $event =~ /^L(.*):\s(.*)\s(.*)/;
      if($1) {
          $reading = "L".$1;
          $value   = $2;
          $unit    = $3;
      }
  }
  if($event =~ m/Power|PV|FeedIn|SelfSupply|Temperature|Total|Energy|Hour:|Hour(\d\d):/) {
      $event   =~ /^L(.*):\s(.*)\s(.*)/;
      if($1) {
          $reading = "L".$1;
          $value   = $2;
          $unit    = $3;
      }
  }   
  if($event =~ m/Next04Hours-IsConsumption|RestOfDay-IsConsumption|Tomorrow-IsConsumption|Battery/) {
      $event =~ /^L(.*):\s(.*)\s(.*)/;
      if($1) {
          $reading = "L".$1;
          $value   = $2;
          $unit    = $3;
      }
  }   
 
return ($reading, $value, $unit);
}


Ich versuche jeden Maintainer dazu zu bewegen. Damit hat der Entwickler es selbst in der Hand dass die Werte wie benötigt an das Log-Modul geliefert werden.
Wenn du der Entwickler bist, müsstest du bitte noch einen EIntrag in der Maintainer.txt für dein Modul vornehmen.

LG,
Heiko
Titel: Antw:SmartmeterP1 in DbLog
Beitrag von: Paul Guijt am 21 September 2019, 18:06:36
Hallo Heiko,

Zitatich nehme an du bist der Entwickler des Moduls ?
Das bin ich nicht.

Ich versuche es schon zu erledigen mit
attr SmartMeter DbLogValueFn { if($READING eq "ElectricityPowerDelivered") { $VALUE=1000*(0-substr($VALUE,0,-3)) ;; }  else { $VALUE=1000*substr($VALUE,0,-3)) ;; } }

Grüß,
Paul
Titel: Antw:SmartmeterP1 in DbLog
Beitrag von: Wzut am 21 September 2019, 18:23:15
Hast dir mal überlegt nicht beim DBLog einzugreifen sondern direkt am Device das die doofen Einheiten an die Readings hängt ?
Ich ärge mich auch jedesmal über sowas.
Weg 1 : einfach im Modul den Störenfried weg editieren (schlecht für zukünftige Updates)
Weg 2 : ein userReading anlegen das mittels ReadingsNum den Wert des Readings umkopiert. Die org Readings kannst dann auch gleich vom Logging exkluden und die userReadings inkluden. 
Titel: Antw:SmartmeterP1 in DbLog
Beitrag von: Paul Guijt am 21 September 2019, 20:12:44
Ich habe Wzut's zweiten Weg schon (angepasst) getan, mit der attr DbLogValueFn.

Im Modul editieren: wegen Heiko's Beispiel habe ich die code des Moduls angeschaut, und hoffnungslos niedergelegt.  :-\
Titel: Antw:SmartmeterP1 in DbLog
Beitrag von: DS_Starter am 21 September 2019, 21:13:13
Hallo Paul,


Im Modul editieren: wegen Heiko's Beispiel habe ich die code des Moduls angeschaut, und hoffnungslos niedergelegt. 


Das war auch nur als Anregung für den Modulautor gedacht für den ich dich hielt.  ;)
Für den Endanwender ist das kein gangbarer Weg.
Wenn du wissen solltest wer das Modul pflegt, wäre es sicherlich gut wenn du ihm die Info bezüglich der DbLog_splitFn geben könntest.

liebe Grüße,
Heiko
Titel: Antw:SmartmeterP1 in DbLog
Beitrag von: Paul Guijt am 21 September 2019, 21:27:52
Danke, Heiko,

Wenn ich es wisse, werde ich es ihm sagen...

Und danke. Ich halte mich an meine Problemumgehung:
attr SmartMeter DbLogInclude ElectricityPowerDelivered,ElectricityPowerDelivered
attr SmartMeter DbLogValueFn { if ($READING eq "ElectricityPowerDelivered") { $VALUE = -1000*( substr($VALUE,0,-3) ) ;; }  else { $VALUE = 1000*substr( $VALUE,0,-3) ) ;; } }


Damit mache ich auch von kW Werte Watts, den ich vergleichen kann mit sonstige Werte.

Freundliche Grüße,
Paul