Wie Laufzeit in Stunden Aufzeichnen?

na, dann versuch’s mal hiermit:

?

//hiermit wird ermittelt, welche Laufzeiten binnen eines bestimmten Zeitraums im Modus true (AN) gelaufen sind
//Hier: aktueller Tag

//nur hier ändern:
$archiveID = 31701;   // Archive-Handler-ID eintragen
$objectID=58346; //ID geloggte an/aus Variable  
$StdOderMin=2;  //hier gewünschte Ausgabe: in Minuten=1 oder in Stunden=2
$Ausgabe=51825;    //hier VariablenID eintragen, in der ermittelte Zeit abgespeichert werden soll

//ab hier nichts mehr ändern
$ende = time(); // JETZT
$start_aktTag = strtotime(date("d.m.Y")." 00:00:01");//Aktueller Tag von 0:00:01 bis jetzt
$buffer = AC_GetLoggedValues($archiveID, $objectID, $start_aktTag, $ende, 0);
$anzahl = count($buffer);
$Laufzeit=0;
$LaufzeitSumme=0;
$letzterTS=0;
if ($anzahl>0){
for ($y=0;$y<$anzahl;$y++)
{
$wert = $buffer[$anzahl-1-$y];
$TS = $wert["TimeStamp"];
$value = $wert["Value"];

If($value==1){           //wenn Wert=true
$TStrue=$TS;             //setzt timestamp des true-Wertes auf $TStrue
}

If($value!=1 AND $y>0){  //wenn Wert=false und false nicht erster Tageswert
$Laufzeit=$TS-$TStrue;   //errechnet Laufzeit zwischen letztem true und aktuellem false
$LaufzeitSumme=intval($LaufzeitSumme) + intval($Laufzeit);  //addiert alle true-Laufzeiten 
}

}
}

//wennn letzer geloggter Wert =true dann minuten noch zählen bis jetzt()
If($value==1){
$letzterTS=time()-$TS;
}

//Ausgabe der ermittelten Zeit in $Ausgabe
if ($StdOderMin==2){
setvalue($Ausgabe /*[Messwerte\Strom\rohe Zählerdaten\Heizungszähler\Laufzeit heute]*/,(round($LaufzeitSumme/60/60,1)+round($letzterTS/60/60,0)));
}
else {
setvalue($Ausgabe /*[Messwerte\Strom\rohe Zählerdaten\Heizungszähler\Laufzeit heute]*/,(round($LaufzeitSumme/60,1)+round($letzterTS/60,0)));
}

?>

Habe mit ein paar Kommentaren versucht, die paar Codezeilen etwas verständlich zu machen.

Voraussetzungen:
dein an/aus Wert sollte natürlich zunächst geloggt sein :rolleyes: also Boolean true/false
die Variable, wohin die Ausgabe des ermittelten Wertes erfolgt, logischerweise auch vorher anlegen und ID oben rein.

Ich hoffe, es klappt bei Dir, bei mir läuft’s jedenfalls :wink:
Probiers halt mal aus und melde Dich kurz.

Gruß
Marc

Hallo Marc,

perfekt :slight_smile:
Hab gerade dein Script getestet und muss sagen das es funktioniert - tolle Arbeit!!!

Mit diesem Script werden die Tagesstunden der Boolean Variable errechnet, sprich wenn ich die Jahresstunden errechnen möchte müsste ich dies im Script von Tag auf Jahr ändern?

Habe es auch mal installiert, bei mir kommt aber nach 7 min. " 1Jahr " ??

…auch wenn es im Gegensatz dazu, was andere hier programmiertechnisch auf die Beine stellen, eher in der in der Kategorie Kinderkram einzuordnen ist :smiley: freut es mich, dass es bei Dir läuft :slight_smile:

wenn Du einen Monat auswerten willst:


$start_aktTag = strtotime("01.01.2017 00:00:01");
$ende = strtotime("31.01.2017 23:59:59")

Zeiträume kannst Du ja danach beliebig anpassen.

Ergänzung: unten den Teil


//wennn letzer geloggter Wert =true dann minuten noch zählen bis jetzt()
If($value==1){
$letzterTS=time()-$TS;
}

müsstest Du in diesem Fall ausklammern, sonst kommt garantiert Unsinn raus :slight_smile:

Gruß
Marc

…in Deiner Ausgabevariable?
Kann’s grad nicht nachvollziehen, schickst mal ein kleines Bildschirmfoto?

Ja genau. in der Variable steht 1Jahr obwohl es nur 7min true war.

in Minuten? Stunden? Wie kommst du auf ein Jahr?
hast Du ein Profil bei der Variable ausgewählt?
gib mir mal bitte einen Auszug deiner geloggten Variablen.
Gib mir da mal bitte noch ein paar Infos, versuche es dann mal nachzustellen.

Marc

Ok, Profil könnte die Lösung sein. teste es gleich nochmal.

Ja hatte ausversehen ein Profil, jetzt geht es.

Ich zähle die Betriebsstunden jedes mal, wenn der Wert sich ändert, also wenn der Kompressor ausschaltet, schreibe ich die Zeit in eine Variable, die ich dann auch logge als Zähler:


<?

$Betriebstunden=34423 /*[Zeiterfassung\Stunden]*/;


$SkriptInfo = IPS_GetScript($_IPS['SELF']);
$laufzeit = time()-$SkriptInfo['ScriptExecuted'];


if ($_IPS['SENDER'] == 'Variable')      																  //Auslöser Variablenänderung
		{
		if ( $_IPS['VALUE']==false && $_IPS['OLDVALUE']==true )
		   {
		   $alter_wert=getvalue($Betriebstunden);
		   setvalue($Betriebstunden,$alter_wert+$laufzeit/3600);
			}
		}


?>

Das Skript wird bei Variablenänderung gestartet.

gruß garfi