Hauptmenü

Berechnungsproblem

Begonnen von Kaspi, 29 Januar 2020, 06:37:11

Vorheriges Thema - Nächstes Thema

DS_Starter

#15
Dann hätte ich noch einen Lösungsvorschlag mit dem Attribut DbLogValueFn. Das setzt du in deinem Strommesser.
Etwa so als Beispiel mit Device SMA_Energymeter :

attr SMA_Energymeter DbLogValueFn
{
  if ($READING eq "0_VIF_ELECTRIC_POWER_value") {
      if $READING =~ /^\s-(\d+|\d+\.\d+)$/ {
          $READING = "ELECTRIC_POWER_value_neg";
          $VALUE = $1;
      } else  {
           $READING = "ELECTRIC_POWER_value_pos";
      }
  }
}

Das bedeutet wenn Readingwert  0_VIF_ELECTRIC_POWER_value negativ, wird dieser Wert als positiver Wert im Reading ELECTRIC_POWER_value_neg in die DB geschrieben.
Ist das Reading 0_VIF_ELECTRIC_POWER_value positiv, wird dieser Wert als ELECTRIC_POWER_value_pos in die DB geschrieben.
Neg und pos könnte man besser als Einspeisung bzw Bezug benennen.

Hat den Vorteil, du hast beide Richtungen für Lieferung und Bezug gleich getrennt in der DB und kannst nach Bedarf umfassend auswerten wie als Beispiel im Wiki erwähnt.

Edit: Hatte noch " vergessen.

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

Kaspi

Das ist mir zu hoch  :-\

Im Moment sieht es so aus:

BEZUG:0_VIF_ELECTRIC_POWER_value:.\d+(\.\d+)? { ReadingsVal($name,'0_VIF_ELECTRIC_POWER_value',0) },

EINSPEISUNG:0_VIF_ELECTRIC_POWER_value:.-\d+(\.\d+)? { ReadingsVal($name,'0_VIF_ELECTRIC_POWER_value',0)*-1 },

EIGENVERBRAUCH_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("E_ZAEHLER_HAUS","EINSPEISUNG",0))/
ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)*100;;},

AUTARKIE_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("E_ZAEHLER_HAUS","EINSPEISUNG",0))/
(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("E_ZAEHLER_HAUS","EINSPEISUNG",0)+ReadingsVal("E_ZAEHLER_HAUS","BEZUG",0))*100;;}



ch.eick

Moin.
Kannst Du bei dem Zähler nicht durch eine PIN den erweiterten Infomodus aktivieren?
Bei mir werden für Bezug und Lieferung jeweils eigenen Register bereitgestellt.

Gesendet von meinem SM-G930F mit Tapatalk

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Kaspi


Kaspi

N'abend

define BEZUG_0 DOIF ([E_ZAEHLER_HAUS:EINSPEISUNG] >0) (setreading E_ZAEHLER_HAUS BEZUG 0)
define EINSPEISUNG_0 DOIF([E_ZAEHLER_HAUS:BEZUG] >0) (setreading E_ZAEHLER_HAUS EINSPEISUNG 0)

löst das Problem


bleibt noch das Division by Zero Problem bei der Berechnung des Eigenverbrauchs, wenn die Erzeugung "0" ist.
Wie umgehe ich das?

KASPI  :)

Kaspi

hab immer noch das "Division by Zero Problem"  :-\

EIGENVERBRAUCH_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("EINSPEISUNG","*",0))/
ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)*100;;},

AUTARKIE_AKTUELL {(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("EINSPEISUNG","*",0))/
(ReadingsVal("SMA_STP_6","SPOT_PACTOT",0)-ReadingsVal("EINSPEISUNG","*",0)+ReadingsVal("BEZUG","*",0))*100;;}


Kaspi

ch.eick

Im DOIF müsstest Du vorher noch auf ungleich Null prüfen.

Gesendet von meinem SM-G930F mit Tapatalk

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick