Ich habe eine Variable Restkapazität vom E-Auto. Die kann steigen (laden) und fallen (fahren). Das Modul Verbrauchsmessung nach Datum brauch dafür eine Zählervariable für das Archiv. Das passt aber nicht, da ich dann den Anstieg nicht sehe.
Gibt es eine andere schöne Möglichkeit, den Verbrauch aus dem Archiv zu berechnen? Ich könnte die alle Werte (für die erste Berechnung) hernehmen und die Differenz bilden, wenn der nächste Wert kleiner als der aktuelle Wert ist.
Oder kenn jemand eine schönere Möglichkeit?
ich habe nicht verstanden, was genau du berechnen willst. Ich berechne den Verbrauch meiner E-Autos ab Start und ab Laden wie folgt
#=====================================================================================
# Variablen
#=====================================================================================
$ArchivID = 12210;
$kmID = 14723;
$SocID = 16775;
$vStartID = 23707;
$vLadenID = 29206;
$capacity = 47; # kWh
#=====================================================================================
# Berechnung
#=====================================================================================
$kmArray = AC_GetAggregatedValues($ArchivID, $kmID, 0, 0, time(), 10000);
$SocArray = AC_GetAggregatedValues($ArchivID, $SocID, 0, 0, time(), 10000);
if($kmArray[0]['Max'] == $kmArray[0]['Min'])return;
$kmEnde = 0;
for($i = 0; $i < count($kmArray); $i++){
if($kmEnde == 0){
if($kmArray[$i]['Max'] > $kmArray[$i]['Min']){
$kmEnde = $kmArray[$i]['Max'];
$SocEnde = $SocArray[$i]['Min'];
}
}else{
if($kmArray[$i]['Max'] == $kmArray[$i]['Min']){
$kmStart = $kmArray[$i]['Min'];
$SocStart = $SocArray[$i]['Max'];
break;
}
}
}
if(($kmEnde - $kmStart > 0)&&($SocStart - $SocEnde > 0))SetValue($vStartID, round(($SocStart - $SocEnde) * $capacity /($kmEnde - $kmStart),1));
$kmEnde = 0;
$kmStart = 0;
for($i = 0; $i < count($kmArray); $i++){
if($kmEnde == 0){
if($kmArray[$i]['Max'] > $kmArray[$i]['Min']){
$kmEnde = $kmArray[$i]['Max'];
$SocEnde = $SocArray[$i]['Min'];
#echo json_encode($kmArray[$i]).chr(10);
}
}else{
if($SocArray[$i]['MinTime'] < $SocArray[$i]['MaxTime']){
$kmStart = $kmArray[$i]['Min'];
$SocStart = $SocArray[$i]['Max'];
break;
}
}
}
if($kmStart == 0){
$kmStart = $kmArray[$i-1]['Max'];
$SocStart = $SocArray[$i-1]['Min'];
}
if(($kmEnde - $kmStart > 0)&&($SocStart - $SocEnde > 0))SetValue($vLadenID, round(($SocStart - $SocEnde) * $capacity /($kmEnde - $kmStart),1));
Das funktioniert bei mir sehr gut.
Grüße
Jürgen
Ich denke wir sprechen vom selben.
Mein erster Ansatz, dürfte aber stimmen.
$archiv_id=46307;
$rest_id=32946;
$werte=AC_GetLoggedValues($archiv_id,$rest_id,strtotime("26.02.2025 0:0:0"),0,0);
$anzahl=count($werte);
$verbrauch=0;
for ($i=$anzahl-1;$i>=0;$i--)
{
//echo date("d.m.Y H:i:s",$werte[$i]["TimeStamp"])." ".$werte[$i]["Value"].PHP_EOL;
if ($i>0) if ($werte[$i-1]["Value"] <$werte[$i]["Value"]) $verbrauch=$verbrauch+$werte[$i]["Value"]-$werte[$i-1]["Value"];
echo $verbrauch.PHP_EOL;
}
Der 26.2.2025 ist absichtlich gewählt, da ab diesem Datum der Neue gekommen ist. Alles davor interessiert mich nicht.
Im Grunde wird der aktuelle mit dem nächsten Wert (zeitlich gesehen) verglichen. Ist der spätere Wert kleiner, wird die Differenz zum Verbrauch addiert. Ist er größer (weil geladen wird), dann wird das ignoriert.
hmmm, dann habe ich die Frage tatsächlich nicht verstanden. Ich dachte, Du brauchst eine Lösung, aber du hast ja eine…
Zum Zeitpunkt der Frage hatte ich noch nichts, darum hab ich gefragt, ob das schon mal jemand hat.
Da ich aber nicht untätig sein wollte, hab ich mir parallel etwas überlegt. Vielleicht gehts auch einfacher oder ich hab einen Denkfehler.
Ich bin noch immer am überlegen und rechnen. Noch trau ich dem Frieden nicht. Für das normale Update, wird jetzt einfach die Restkapazität mit dem vorigen Wert verglichen. Ist das fallend, dann wird die Differenz in eine Gesamtverbrauchsvariable geschrieben. Diese wird auch gelogged. Aus diesen und dem Kilometerstand wird der Verbrauch auf 100km berechnet.
alles klar. Dann habe ich es jetzt auch.
Wenn du wie ich den Verbrauch über den SOC berechnest und der SOC eine Integer ist, dann kann der Berechnungsfehler bei kurzen Strecken schon sehr groß werden. Ich gucke mir deshalb immer die Gesamtstrecke ab Start oder ab Laden an. Der Wert macht dann auch Sinn. Die Werte unterhalb von 5km sind typischerweise wenig aussagekräftig. Aber das ist ja auch von der Anzeige im Auto bekannt.