Hilfe: Zeit der letzten Präsenz aus Archiv auslesen!?

Tag zusammen,
ein Problem und wie so oft keine Lösung :slight_smile:

Ich habe ein Skript das durch die Abwesenheit (Bool Variable) getriggert wird (Strom sparen, Steckdosen aus, usw…)

Wie kann ich aus dem Archiv auslesen wie lange die letzte Präsenz war?

Das habe ich zusammen gebracht:

$letzter_Wert = AC_GetLoggedValues(14492, 22261, 0, 0, 1)[0]['Value'];
$letzter_Wert1 = AC_GetLoggedValues(14492, 22261, 0, 0, 1)[0]['Duration'];
$letzte_zeit = $letzter_Wert1 / 60;
var_dump ($letzter_Wert);
var_dump ($letzte_zeit);

wobei mit $letzte_zeit die Differenz von Jetzt zum letzten Eintrag ausgibt.
Ich möchte aber die Dauer des letzten „True“ haben?

Unbenannt

Also Zeit X (bool true) ist gefragt und Zeit y (bool false) habe ich mit dem Code oben

Ich möchte also die Zeit des letzten true haben aus dem Archiv

Danke und lg

Hi,
schon mal versucht count von 1 auf 4 zu stellen? Wenn ich es richtig verstehe müssten dann die 4 zuletzt geloggten Werte kommen und dann einfach
wenn 1=true dann Zeit = 3-1
sonst Zeit = 4-2

Ralf

Morgen,

wenn ich die 1 in eine 2,3,4 ändere kommt immer false.

AC_GetLoggedValues(14492, 22261, 0, 0, 4)[0][‚Value‘];

Hi,
was soll das[0][„Value“] am Ende?

<?php
$test = AC_GetLoggedValues(32968, 28491, 0, 0, 4);
var_dump($test);
?>

liefert

array(4) {
  [0]=>
  array(3) {
    ["TimeStamp"]=>
    int(1666848441)
    ["Value"]=>
    float(0)
    ["Duration"]=>
    int(3917)
  }
  [1]=>
  array(3) {
    ["TimeStamp"]=>
    int(1666848317)
    ["Value"]=>
    float(16,66)
    ["Duration"]=>
    int(124)
  }
  [2]=>
  array(3) {
    ["TimeStamp"]=>
    int(1666848194)
    ["Value"]=>
    float(18,16)
    ["Duration"]=>
    int(123)
  }
  [3]=>
  array(3) {
    ["TimeStamp"]=>
    int(1666848071)
    ["Value"]=>
    float(16,02)
    ["Duration"]=>
    int(123)
  }
}

In deinem Beispiel brauchst Du nur 2 Werte. Ist der erste True nimmst Du da Duration sonst vom Zweiten. Mit Timestamp könnte man auch noch arbeiten.

Ralf

1 „Gefällt mir“

Hab hier mal die letzte Laufzeit meiner Klimaanlage gemacht:

$debug = FALSE;
$SourceID = IPS_GetParent($_IPS['SELF']) ; 
$ArchiveList = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archivinstanzen abrufen
$ArchiveID = $ArchiveList[0]; // !!! Es wird die erste gefundene Archivinstanz verwendet

$Values = AC_GetLoggedValues ($ArchiveID, $SourceID, 0, 0, 3) ;
if($debug){print_r($Values);}

if ($Values[0]['Value']=== FALSE){
    if($debug){echo "ist aus".PHP_EOL;}
    $endzeit = $Values[0]['TimeStamp'];
    if($debug){echo date('Y-m-d H:i:s',$endzeit).PHP_EOL;}
    $startzeit = $Values[1]['TimeStamp'];
    if($debug){echo date('Y-m-d H:i:s',$startzeit).PHP_EOL;}
    $laufzeit = round(($endzeit - $startzeit)/60,0);
    echo "Laufzeit: ".$laufzeit."min";
}
if($Values[0]['Value']=== TRUE){
    echo "ist an";
}

Das Skript liegt unterhalb der Variable und verwendet somit „Parent“ als Quelle.

Grüße
Stefan

Ok… Habe „Duration“ noch nie verwendet… Ist ja simpel:

$debug = FALSE;
$SourceID = IPS_GetParent($_IPS['SELF']) ; 
$ArchiveList = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archivinstanzen abrufen
$ArchiveID = $ArchiveList[0]; // !!! Es wird die erste gefundene Archivinstanz verwendet

$Values = AC_GetLoggedValues ($ArchiveID, $SourceID, 0, 0, 3) ;
if($debug){print_r($Values);}

if ($Values[0]['Value']=== FALSE){
$zeit = round($Values[1]['Duration']/60,0);
echo "Laufzeit: ".$zeit.PHP_EOL;
}
if($Values[0]['Value']=== TRUE){
    echo "ist an";
}

1 „Gefällt mir“

Danke an Euch, habs jetzt so gelöst. Ob es optimal ist weiß ich nicht:

<?        
/////////////////////////////////////////////////////////////////////////////////////////////////////////

$timestamp = time();
$uhrzeit = date("H:i:s", $timestamp);
$datum = date("d.m.Y", $timestamp);

$zeit_fenster = time() - 36000; // letzte Stunde

$werte = AC_GetLoggedValues(14492, 22261, $zeit_fenster, time(), 0);
// $werte = AC_GetLoggedValues(14492, 22261, strtotime("today 00:00"), time(), 0);


if ((count($werte) < 1) == 1)
{
 echo" Keine Daten";
}
else
{
    $i = 0;

    //Dieser Teil erstellt eine Ausgabe im Skriptfenster mit den abgefragten Werten        
    foreach ($werte as $wert) 
    {   
        echo "\n";
        // echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Value'] . PHP_EOL;

        if ($wert['Value'] == 0)
        {
            $zeit[$i] = $wert['TimeStamp'];
        }
        if ($wert['Value'] == 1)
        {
            $zeit[$i] = $wert['TimeStamp'];
        }   
    $i++;

    }

$zeit_diff = round ((($zeit[0] - $zeit[1]) / 60),0);
echo "Zeit letzte Anwesenheit: ".$zeit_diff. PHP_EOL;

//Den letzten Wert, der in der Datenbank gespeichert wurde, holen
$letzter_Wert = AC_GetLoggedValues(14492, 22261, 0, 0, 1)[0]['Duration'];
$letzter_Wert = round (($letzter_Wert / 60),0);
echo "Zeit seit letzter Anwesenheit: ".$letzter_Wert. PHP_EOL;

}

Danke HarmonyFan und Danke steppe!

Dein Skript gibt genau das aus was ich oben, wohl nicht so elegant programmiert habe :slight_smile:

Nun habe ich die Dauer der letzten Anwesenheit und die Zeit seit der letzten Anwesenheit und kann eine „Fehlauslösung eines PM“ rausfiltern, damit mein Anwesenheitsskript nicht gleich wieder alles einschaltet bei Kurzzeitpräsenz!!!

DANKE