[Gelöst] Statistik ohne Totalwert bzw. Absolut Wert

Begonnen von kask, 27 März 2023, 19:09:30

Vorheriges Thema - Nächstes Thema

RalfRog

#15
Zitat von: kask am 29 März 2023, 12:53:08Eigentlich ist es ja nicht ein Geräte bezogenes Problem hier jetzt an der Stelle.
Wie kann ich mir einen Zähler selber bauen ist da gefragt. Ob genau oder nicht ist erst einmal zweit rangig.

Es gibt Leute die haben das selbe Problem und so ist es bei mir auch. Es stehen keine Werte drin nur "NULL".
https://community.victronenergy.com/questions/186091/mqtt-battery-history-energy-values.html

Deshalb selber bauen.

Aber frag doch im FHEM-Forenbereich Solaranlagen unter der genauen Angabe deines Victron Wechselrichters und dass er per MQTT angebunden ist sowie einem list des MQTT devices ob und wie eventuell schon jemand die Energie erfasst.

Dann kannst du hier im ersten Beitrag im Betreff ein gelöst hinschreiben und ggfs. für Mitleser auf den neuen Beitrag verweisen.
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

Damian

Ich konnte anfangs meinen Wechselrichter auch nicht direkt auslesen, da habe ich mir einfach einen digitalen Zwischenzähler installiert, den ich auslesen konnte.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kask

#17
ich habe es jetzt wie folgt mit einer notify gelöst:
MQTT2_venus:BAT_Current_value:.*
{
 my $p_now = (ReadingsNum("MQTT2_venus","BAT_Current_value",0) * ReadingsNum("MQTT2_venus","BAT_Voltage_value",0));;
 ##my $p_now = (ReadingsNum("MQTT2_venus","BAT_Power_value",0));;

 $p_now=sprintf("%.5f", $p_now);;

 my $t_diff = 0;;
 my $Wh = 0;;

 if ($p_now < 0) {

  $p_now=abs($p_now);;

  $t_diff=(time() - time_str2num(ReadingsTimestamp("MQTT2_venus","BAT_Power_dischg",time())));;
  $Wh=($p_now / 3600.0 * $t_diff);;
  $Wh=sprintf("%.5f", $Wh);;

  fhem ("setreading MQTT2_venus BAT_Power_dischg " . int($p_now));;
  fhem ("setreading MQTT2_venus BAT_Energie_dischg $Wh");;
 
  if (ReadingsNum("MQTT2_venus","BAT_Energie_chg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Energie_chg 0");; }
  if (ReadingsNum("MQTT2_venus","BAT_Power_chg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Power_chg 0");; }


 } elsif ($p_now > 0) {
 
  $t_diff=(time() - time_str2num(ReadingsTimestamp("MQTT2_venus","BAT_Power_chg",time())));;
  $Wh=($p_now / 3600.0 * $t_diff);;
  $Wh=sprintf("%.5f", $Wh);;

 
  fhem ("setreading MQTT2_venus BAT_Power_chg " .int($p_now));;
  fhem ("setreading MQTT2_venus BAT_Energie_chg $Wh");;
  if (ReadingsNum("MQTT2_venus","BAT_Energie_dischg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Energie_dischg 0");; }
  if (ReadingsNum("MQTT2_venus","BAT_Power_dischg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Power_dischg 0");; }

 } else {

  if (ReadingsNum("MQTT2_venus","BAT_Energie_dischg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Energie_dischg 0");; }
  if (ReadingsNum("MQTT2_venus","BAT_Power_dischg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Power_dischg 0");; }
  if (ReadingsNum("MQTT2_venus","BAT_Energie_chg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Energie_chg 0");; }
  if (ReadingsNum("MQTT2_venus","BAT_Power_chg",0) > 0) { fhem ("setreading MQTT2_venus BAT_Power_chg 0");; }
   
 }
}

Dazu noch userreadings für den Zähler:
BAT_Energie_chg_total:BAT_Energie_chg:.* monotonic {ReadingsNum("$name","BAT_Energie_chg",0)},
BAT_Energie_dischg_total:BAT_Energie_dischg:.* monotonic {ReadingsNum("$name","BAT_Energie_dischg",0)},


..jetzt mal schauen wie ungenau das ganze wird

Damian

Zitat von: kask am 29 März 2023, 15:57:03..jetzt mal schauen wie ungenau das ganze wird

Da bin ich auch drauf gespannt!
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kask

ich habe das ganze umstrukturiert und es sieht erst einmal relativ plausibel aus. Was rein geht geht auch raus.

Allerdings hatte der monotonic zähler nicht funktioniert. Wieso weiß ich nicht. Die event timinigs waren gleich aber es wurde nicht alles gezählt ;(

Habe deshalb die Userreadings mit den monotonic zählern entfernt und die zähler selber in die notify gebaut.

MQTT2_venus:BAT_Current_value:.*
{
 
 my $p_now = (ReadingsNum("MQTT2_venus","BAT_Current_value",0) * ReadingsNum("MQTT2_venus","BAT_Voltage_value",0));;
 my $Wh = 0;;
 my $total = 0;;

 if ($p_now < 0) { ##discharge

  $p_now = abs($p_now);;

  $Wh = ($p_now / 3600.0 * (time()- time_str2num(ReadingsTimestamp("MQTT2_venus","BAT_Energie_dischg_total",0))) );;
  $total = (ReadingsNum("MQTT2_venus","BAT_Energie_dischg_total",0));;

  fhem ("setreading MQTT2_venus BAT_Power_dischg " . int($p_now));;
  fhem ("setreading MQTT2_venus BAT_Energie_dischg_total " . ($total + $Wh));;
 
  if (ReadingsNum("MQTT2_venus","BAT_Power_chg",0) != 0) { fhem ("setreading MQTT2_venus BAT_Power_chg 0");; }

 } elsif ($p_now > 0) { ##charge
 
  $Wh = ($p_now / 3600.0 * (time() - time_str2num(ReadingsTimestamp("MQTT2_venus","BAT_Energie_chg_total",0))) );;
  $total = (ReadingsNum("MQTT2_venus","BAT_Energie_chg_total",0));;
 
  fhem ("setreading MQTT2_venus BAT_Power_chg " .int($p_now));;
  fhem ("setreading MQTT2_venus BAT_Energie_chg_total " . ($total + $Wh));;

  if (ReadingsNum("MQTT2_venus","BAT_Power_dischg",0) != 0) { fhem ("setreading MQTT2_venus BAT_Power_dischg 0");; }

 } else { ##no load

  if (ReadingsNum("MQTT2_venus","BAT_Power_dischg",0) != 0) { fhem ("setreading MQTT2_venus BAT_Power_dischg 0");; }
  if (ReadingsNum("MQTT2_venus","BAT_Power_chg",0) != 0) { fhem ("setreading MQTT2_venus BAT_Power_chg 0");; }
   
 }
}

jetzt mal weiter und länger beobachten.