Öl Verbrauch berechnen

Hallo Leute

Da ich eher wenig Ahnung von PHP habe könnt ihr mir vielleicht weiterhelfen, habe meine Heizungssteuerung auf eine UVR1611 umgestellt.

Bekomme die Daten auch im Minuten Takt an IPS gesendet, jetzt würd ich ein Skript benötigen das mir die Laufzeit des Öl-Brenners mit logt und dabei denn Öl- Verbrauch berechnet.

Laut Datenblatt braucht mein Öl-Brenner 1,72lt/h.

Da ich 2 Batterie Tanks (je 2000 Liter) habe und auch hier nie genau feststellen kann, wieviel noch drinnen ist oder verbraucht wird dachte ich das es mit Zeit und Liter am einfachsten geht?

Oder gibts noch eine andere Lösung?

Danke für eure Hilfe
Alex :slight_smile:

gleiches Prinzip läuft seit 7J bei mir fehlerfrei. Abweichung im Jahr bis 20 liter (kann man im Tag kaum sehen)
nutze allerdings eine s0-schnittstelle an der Heizung. bei mir 2,1l/h
das sieht dann in etwa so aus:

require_once("variablen_EKM.ips.php");

	//ermittlung verbrauch
	$takt       =	($tcount_oel + $startwert);
	$stunden 	=	round ($takt / $faktor ,2 );		# betriebsstunden gesamt	
		  setvalue($betrieb,$stunden); 
             
	$verbrauch  =	round ($stunden * $literStd,0);		# verbrauch in liter
		setvalue(53398 /*[GERÄTE\EKM-868\EKM 1 Heizung\variablen berechnungen\ölverbrauch\Verbrauch]*/,$verbrauch);
	
	//tankmenge
	$leistung   =	round(($verbrauch * 10),0);			# erzeugte waermeleistung in kwh
	$tankist    =	round($tankvoll-$verbrauch);		# tankrestmenge
		setvalue(30405 /*[GERÄTE\EKM-868\EKM 1 Heizung\variablen berechnungen\ölverbrauch\Tankvorat]*/,$tankist);
	
	//bisher gelaufene tage seit tankung
    $start1  	=	strtotime($messbeginn);
	$delta      =	round (($stop - $start1)/60/60/24) ; # gesamtlaufzeit in tagen
	$wert       =	$verbrauch/$delta;                
	$delta      =	round (($stop - $start1)/60/60/24) ; # gesamtlaufzeit in tagen
		setvalue(58211 /*[GERÄTE\EKM-868\EKM 1 Heizung\variablen berechnungen\ölverbrauch\ Tage seit Tankung]*/,$delta);
	
	//prognose jahresölverbrauch und CO2 Ausstoss
	$wert       =	$verbrauch/$delta;
	$jahr_oel   =	round($wert * (365.25),0);
		setvalue ($prognose,$jahr_oel);
	$co2value   =	round($verbrauch * 3.119,2);
		setvalue ($co2,$co2value);
		
	// Tagesverbrauch heute aus DB
	$AH			=	IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID angeben
    $varID		= 	21430 /*[GERÄTE\EKM-868\EKM 1 Heizung\Counter]*/;

    $ts			= mktime(0,0,0, date("m", time()),  date("d", time()), date("Y", time())); 		//Startzeit heute
    $te			= mktime(23,59,59, date("m", time()),  date("d", time()), date("Y", time())) ; 	//Endzeit heute
    $RawData	= AC_GetAggregatedValues($AH, $varID, 1, $ts, $te, 10);
	$takte		= round($RawData[0]['Avg'], 2);
	$verbrauchheute	=	round($takte/$faktor,2);
		setvalue(33224 /*[GERÄTE\EKM-868\EKM 1 Heizung\variablen berechnungen\Tagesverbrauch\TagesVerbrauch]*/,$verbrauchheute);

Super :slight_smile:

Aber da ich keine S0 habe sondern nur die Einschalt und Ausschaltzeit des Ölbrenners und zuwennig von PHP verstehe kann ich damit wennig anfangen :confused:

Wenn ich wüsste wie ih dein Script umändern muss gings einfacher :wink:

danke Alex

im prinzip brauchst du nur die schaltzeiten in eine/zwei vari schreiben, Differenz berechnen, schon hast du deine Betriebszeiten.

:smiley: ja wenn alles so einfach ist.

Ich Google mal wie ich was in eine Variable schreibe vielleicht bekomm ich das irgend wie hin.

Danke mal für deinen Ansatz

Alex

Wie kann ich die Schaltzeiten einer Integer Variable in eine Variable Schreiben?
Kann zwar mit IPS_GetVariable einige werte Rausfinden aber das sind Unix-Timestamp Werte:confused: stehe auf der Leitung.

Hat wer eine Info

Danke
Alex:)

Da musst Du schon mehr Infos geben so kann man Dir glaube ich nicht ganz folgen. Was willst Du denn dann genau mit dem Wert machen?
Wenn Du damit rechnen willst ist der Unix Timestamp schon richtig. Wenn Du das irgendwo lesbar hinterlegen willst liest Du die Variable mit GetValueFormatted aus.


$timestamp = GetValue(12345); // Unix Timestamp
$timeformated = GetValueFormatted(12345); // Uhrzeit Anzeige	

Wenn Du die zeitliche Differenz zwischen zwei Zeitwerten ermitteln willst musst Du nur den Unix Timestamp auslesen und dann die Differenz der beiden Werte nehmen.

Wie sehen denn die Variablen genau aus die Du hast und was steht da genau drinnen?

Will als erster nur die Laufzeit des Öl-Brenner ermitteln eben mit Ein und Ausschaltzeit dann mit dem Verbrauch Multiplizieren damit ich den ÖL-Verbrauch habe.

Aber als absoluter PHP Neuling nicht so einfach.

Danke
Alex

Ja nur was hast Du denn nun genau in IP-Symcon vorliegen, eine Boolean Variable, die von On nach Off wechselt, oder zwei Integer Variablen, in die jede Minute eine neue Zeit geschrieben wird? Wie stellst Du denn zur Zeit in IP-Symcon fest ob der Öl-Brenner an oder aus ist?

Eine Integer Variable die bei 0 Aus ist und bei 30 An ist.( kommt so von TA UVR1611)
Wobei ich eben ein Profil angelegt habe mit An und Aus.

IPS_GetVariable gibt dir diverse Parameter der Variablen zurück wie den Typ, die letzte Änderung, … Allerdings gibt die Funktion nicht den Wert zurück. Hierfür müsstest du die Funktion GetValue benutzen. Schau dir am besten dazu einmal die Dokumentation zur Variablenverwaltung und Variablenzugriff an, da werden die ganzen Funktionen erklärt.

Ich würde das am ehesten so lösen gibt aber bestimmt auch andere Möglichkeiten.

[ul]
[li]Booelan Variable erstellen für Schaltzustand mit Profile ~Switch
[/li][li]Integer Variable erstellen zum Abspeichern der Gesamtlaufzeit
[/li][li]Float Variable erstellen zum Abspeichern des Verbrauchs
[/li][/ul]

Dann erstellst Du ein Skript das Dir die Schaltzustand Variable aktualisiert


$state = GetValue(22222 /*[Dateneingang]*/); // Integer Variable die die Werte 0 oder 30 enthält
$switchstate = GetValue(33333 /*[Schaltzustand]*/); // Neu angelegte Boolean Variable mit Type ~Switch
 if($state == 0 && $switchstate == true)
 {
 	SetValue(33333 /*[Schaltzustand]*/, false);
 }
 elseif($state == 30 && $switchstate == false)
{
SetValue(33333 /*[Schaltzustand]*/, true);
}

Auf das Skript legst Du ein Ereignis bei Variablenaktualisierung der Integer Variable (Dateneingang).
Jetzt aktivierst Du bei der Boolean Variable Logging ( Alle Variablenänderungen aufzeichnen) dann wird jedes An / Aus aufgezeichnet.

Wenn Du jetzt wissen willst wieviel Öl verbraucht wurde musst Du nur schauen wie lange die Boolean Variable im Einschaltzustand war.

z.B. mit


<?
$starttime = strtotime("today 00:00"); // Startzeit der Auswertung in dem Fall heute 0 Uhr muss angepasst werden.
$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen 
$State_VarID = 33333 /*[Schaltzustand]*/; // Objekt ID der geloggten Boolean Schaltvariable
 //Alle heutigen Datensätze abfragen
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $State_VarID, $starttime, time(), 0);

$Count = 0; 
$duration = 0;
$timestampon = 0;
$timestampoff = 0;
foreach ($LogDatenAR as $LogWert)
 { 
    	$timestampcurrent = $LogWert['TimeStamp'];
	
	if ($LogWert['Value'] == 1)
	{    
	   $timestampon = $timestampcurrent;
	   if ($duration == 0 && $timestampoff == 0)
	   {
	   		$timestampoff = time();
	   }
	   $intervall = abs($timestampoff - $timestampon);
	   $duration = $duration + $intervall;
	   $Count++;
	   $timestampon = 0;
	   $timestampoff = 0;  
    }
	elseif ($LogWert['Value'] == 0 && $timestampon != 0)
	{
	   $intervall = abs($timestampcurrent - $timestampon);
	   $duration = $duration + $intervall;
	}
	elseif ($LogWert['Value'] == 0 && $timestampon == 0)
	{
	   $timestampoff = $timestampcurrent;
	}
} 

function intervall($sek) {
    $i = sprintf('%d Tag%s, %d Stunde%s,'.
            ' %d Minute%s und %d Sekunde%s',
            $sek / 86400,
            floor($sek / 86400) != 1 ? 'e':'',
            $sek / 3600 % 24,
            floor($sek / 3600 % 24) != 1 ? 'n':'',
            $sek / 60 % 60,
            floor($sek / 60 % 60) != 1 ? 'n':'',
            $sek % 60,
            floor($sek % 60) != 1 ? 'n':''
         );
    return $i;
}

$formattedduration = intervall($duration);

echo "Es wurden ".$Count." Schaltvorgänge registriert.
 Die Anschaltzeit hatte eine Gesamtdauer von ".$formattedduration." (= ".$duration." Sekunden).
"; 

// Verbrauch 1,72l/h.

$consumption = $duration * (1.72 / 3600);

echo "Es wurden ".round($consumption, 2)." Liter Öl verbraucht."; 

SetValue(28065 /*[Verbrauch]*/, $consumption);
SetValue(11011 /*[Gesamtlaufzeit]*/, $duration);

?>

Musst Du mal ausprobieren ob da was Sinnvolles rauskommt.

Super Danke es kommt schon was Raus :slight_smile: muss ich nur noch im Auge behalten ob es auch Stimmt aber ich denke schon:D

Das hätte ich nie zusammengebraucht ist ja wie ein Aufsatz für mich die Ganzen PHP befehle :o

aber Danke dir für die tolle Hilfe :slight_smile:
eines Tages werd ich das PHP auch noch verstehen :rolleyes:

Alex:)

Hallo Fonzo

Habe das Script nun einige Tage laufen es passt soweit auch nur starten die Werte alle 24h neu?
Kann ich das irgendwie ändern bzw um eine Variable erweitern um den Monat und Jahresverbrauch zu sehen?

Oder geht das nur über den Graph „Öl-Verbrauch“ und muss es dann zusammenzählen?

Danke
Alex:)

Das liegt an der Startzeit diese kannst du individuell setzten. Im Skript ist diese s.o. Heute 0 Uhr. Wenn Du Verbrauch von einem längeren Zeitraum berechnen willst dann must Du die Startzeit anpassen. Das geht aber natürlich auch nur wenn dazu überhaupt Datenpunkte geloggt wurden zu dem Zeitpunkt.

Du kannst Dir ja beliebige Variablen anlegen, das ist Dir überlassen. Du könntest z.B. eine Tagesverbrauch, Monatsverbrauch, Jahresverbrauchs Variable anlegen. Du musst dann halt nur jeweils ein Ereignis aufrufen, das dir den alten Wert aus der Variable ausliest zu zudem aktuellen Wert dazu addiert. Ist halt die Frage wie aktuell Du das haben willst. Ist vielleicht sinnvoll das täglich auszuwerten und in eine Variable zu schreiben, diese kannst Du dann ja auch wiederum loggen dann siehst Du ob der Verbrauch über die Tage schwankt.

Must Du halt mehrere Ereignisse anlegen. Am besten eines das den wert Täglich nue beschreibt. dann ein Ereignis das dir täglich den alten Wert zu dem Monatswert dazu addiert. Ein Ereignis das dir den Monatswert zum Monatsende wieder auf 0 setzt, und ein Ereignis zu Monatsende das Dir den Jahreswert aus den Monatswerten addiert.

Da bist Du frei was du brauchst.

Der Graph ist ja nichts anderes als die visuelle Darstellung der Datenpunkte. Die kannst Du wie gesagt mit dem Archiv Handler auslesen.

Super Danke :slight_smile:

mfg
Alex:)