SmartmeterP1 in DbLog

Begonnen von Paul Guijt, 20 September 2019, 12:57:57

Vorheriges Thema - Nächstes Thema

Paul Guijt

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
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

DS_Starter

#1
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
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Paul Guijt

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
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

Wzut

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. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Paul Guijt

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.  :-\
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

DS_Starter

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
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Paul Guijt

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
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände