cbeham
26. Oktober 2022 um 13:10
1
Tag zusammen,
ein Problem und wie so oft keine Lösung
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?
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
cbeham
27. Oktober 2022 um 06:14
3
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“
steppe
27. Oktober 2022 um 07:04
5
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
steppe
27. Oktober 2022 um 07:09
6
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“
cbeham
27. Oktober 2022 um 07:16
7
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;
}
cbeham
27. Oktober 2022 um 07:23
8
Danke HarmonyFan und Danke steppe!
Dein Skript gibt genau das aus was ich oben, wohl nicht so elegant programmiert habe
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