IP-Symcon - Wie kann ich... 2.0

Quelle: Fehlerhafte Objekte / Skripte auflisten (by Horst)

<?php
// -----------------------------------------------------------------------------
// WebFront-freundliche HTML-Ausgabe aller defekten Instanzen, Skripte und Links
// -----------------------------------------------------------------------------

$ContentVariableID = 12345;    // Variablen-ID zur Speicherung der Meldung.
                               // Wert 0 führt zur direkten Ausgabe.

// -----------------------------------------------------------------------------

$content = '';

$instanceStatusCodes = array(
    100 => 'module base status',
    101 => 'module is being created',
    102 => 'module created and running',
    103 => 'module is being deleted',
    104 => 'module is not beeing used',
    200 => 'instance error',
    201 => 'instance could not be created'
);

$errorCount = 0;

$ids = IPS_GetInstanceList();
foreach ($ids as $id)
{
    $instance = IPS_GetInstance($id);
    if ($instance['InstanceStatus'] > 103)
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Instanzen:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: '.($instance['InstanceStatus'] >= 200 ? 'red' : 'grey').';">#'.$id.': '.IPS_GetLocation($id).': '.$instanceStatusCodes[$instance['InstanceStatus']].'</span><br />'."
";
    }
}

if ($errorCount > 0)
{
    $content .= '<br />'."
";
    $errorCount = 0;
}
$ids = IPS_GetScriptList();
foreach ($ids as $id)
{
    $script = IPS_GetScript($id);
    if ($script['IsBroken'])
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Skripte:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: red;">#'.$id.': '.IPS_GetLocation($id).'</span><br />'."
";
    }
}

if ($errorCount > 0)
{
    $content .= '<br />'."
";
    $errorCount = 0;
}
$ids = IPS_GetLinkList();
foreach ($ids as $id)
{
    $link = IPS_GetLink($id);
    if (!IPS_ObjectExists($link['LinkChildID']))
    {
        if ($errorCount == 0)
        {
            $content .= '<b>Defekte Links:</b><br />'."
";
        }
        $errorCount++;
        $content .= '<span style="color: red;">#'.$id.': '.IPS_GetLocation($id).'</span><br />'."
";
    }
}

$printContent = true;

if (IPS_VariableExists((int)$ContentVariableID))
{
    $variable = IPS_GetVariable($ContentVariableID);
    if ($variable['VariableValue']['ValueType'] === 3)
    {
        $printContent = false;
        SetValueString($ContentVariableID, $content);
    }
}

if ($printContent)
{
    echo $content;
}
?>

Quelle: Min Max Temperaturen mit Zeit Angabe (by PR-Homesystem)

<?
/* Min Max Temperatur Werte mit Zeitangabe
 erstellt von Patrick Ramm
 Nur für den privaten Gebrauch */
 
$AktuellNR = 51908 /*[Terrasse\Außenfühler\Temperatur Außen]*/; //ID vom Temperaturfühler

/* Ab hier nichts mehr verändern */

$kategorie=IPS_GetParent($_IPS['SELF']);
$ObjektID = @IPS_GetObjectIDByName("Max Temp", $kategorie);
if ($ObjektID === false)
{

$eid = IPS_CreateEvent(1);      //Timer erstellen
IPS_SetParent($eid, $_IPS['SELF']);
IPS_SetEventCyclic($eid, 0 /* Keine Datumsüberprüfung */, 0, 0, 2, 2 /* Minütlich */ , 1 /* Alle 1 Minuten */);
IPS_SetEventActive($eid, true);

$Variabel = array();
$Variabel[] = array("Typ" => 2,
                       "Name"=>"Max Temp",
                       "Info"=>"",
                       "Profil"=>"~Temperature");

$Variabel[] = array("Typ"=>3,
                       "Name"=>"Max Time",
                       "Info"=>"",
                       "Profil"=>"~String");

$Variabel[] = array("Typ"=>2,
                       "Name"=>"Min Temp",
                       "Info"=>"",
                       "Profil"=>"~Temperature");

$Variabel[] = array("Typ"=>3,
                       "Name"=>"Min Time",
                       "Info"=>"",
                       "Profil"=>"~String");



for($i=0; $i < count($Variabel); $i++)
   {
  /* echo $Variabel[$i]["Typ"];
   echo $Variabel[$i]["Name"];
   echo $Variabel[$i]["Info"];
   echo $Variabel[$i]["Profil"]; */

$kategorie=IPS_GetParent($_IPS['SELF']);

echo $Variabel[$i]["Typ"];

$vid = IPS_CreateVariable($Variabel[$i]["Typ"]);
IPS_SetParent($vid, $kategorie);
IPS_SetName($vid, $Variabel[$i]["Name"]);
IPS_SetInfo($vid, $Variabel[$i]["Info"]);
IPS_SetVariableCustomProfile($vid, $Variabel[$i]["Profil"]);

$Reset = @IPS_GetObjectIDByName("Reset", $kategorie);
IPS_RunScript($Reset);
    }}

Else
{
$Aktuell = GetValue($AktuellNR);
$MaxNR = @IPS_GetObjectIDByName("Max Temp", $kategorie);
$MinNR = @IPS_GetObjectIDByName("Min Temp", $kategorie);
$MaxTimeNR = @IPS_GetObjectIDByName("Max Time", $kategorie);
$MinTimeNR = @IPS_GetObjectIDByName("Min Time", $kategorie);
$Max = GetValue($MaxNR);
$Min = GetValue($MinNR);

//Zeit für min und max Werte
$TimerWertMax = IPS_GetVariable($MaxNR);
$tempMax = $TimerWertMax["VariableChanged"];
$timeMax = date("d.m.Y H:i", $tempMax);

SetValueString($MaxTimeNR,$timeMax);

$TimerWertMin = IPS_GetVariable($MinNR);
$tempMin = $TimerWertMin["VariableChanged"];
$timeMin = date("d.m.Y H:i", $tempMin);

SetValueString($MinTimeNR,$timeMin);
//Ende Zeit

If ($Aktuell > $Max)
{
SetValue($MaxNR,$Aktuell);
}
Else if ($Aktuell < $Min)
{SetValue($MinNR,$Aktuell);
}}
?>

Zugehöriges RESET-Skript:

<?
/* Min Max Temperatur Werte mit Zeitangabe
 erstellt von Patrick Ramm
 Nur für den privaten Gebrauch */

$AktuellNR = 51908 /*[Terrasse\Außenfühler\Temperatur Außen]*/; //ID vom Temperaturfühler

/* Ab hier nichts mehr verändern */

$kategorie=IPS_GetParent($_IPS['SELF']);

$Aktuell = GetValue($AktuellNR);
$MaxNR = @IPS_GetObjectIDByName("Max Temp", $kategorie);
$MinNR = @IPS_GetObjectIDByName("Min Temp", $kategorie);
$MaxTimeNR = @IPS_GetObjectIDByName("Max Time", $kategorie);
$MinTimeNR = @IPS_GetObjectIDByName("Min Time", $kategorie);
$Max = GetValue($MaxNR);
$Min = GetValue($MinNR);

SetValue($MaxNR,$Aktuell);

SetValue($MinNR,$Aktuell);

$TimerWertMax = IPS_GetVariable($MaxNR);
$tempMax = $TimerWertMax["VariableChanged"];
$timeMax = date("d.m.Y H:i", $tempMax);

$TimerWertMin = IPS_GetVariable($MinNR);
$tempMin = $TimerWertMin["VariableChanged"];
$timeMin = date("d.m.Y H:i", $tempMin);


SetValueString($MaxTimeNR,$timeMax);
SetValueString($MinTimeNR,$timeMin);
?>

Weitere Varianten sind hier zu finden:

Quelle: TCP/UDP Portcheck (by RWN)

<?
##################################################################################
# Zum überprüfen ob der entsprechende TCP-Port erreichbar ist oder geblockt wird #
# Für einen UDP Check muss ein udp// vor die IP-Adresse gesetzt werden.          #
##################################################################################

//$port = array(1012,49000); // Fritzbox
//$port = array(2000,2001,2002,5544); // Homematic. Für den Lanadapter muss nur Port 2001 und 5544 erreichbar sein

for($i=0; $i<count($port); $i++)
{
    $socket = fsockopen("xxx.xxx.xxx.xxx", $port[$i], $errno, $errstr); // IP Adresse anpassen
    if(!$socket)
    {
        echo "ERROR: $errno - $errstr
";
    }
    else
    {
        echo "Port: ".$port[$i]." ist erreichbar.
";
    }
}
?>

Quelle: Wochenschaltuhr (by agotthold)

<? 

function Schaltzeit ($Tag, $Beginn, $Ende) 
    { 
   $Beginn = mktime(substr ($Beginn,0,2), substr ($Beginn,3,5), 0, 0, 0, 0, -1); 
   $jetzt = mktime(date("H"), date("i"), 0, 0, 0, 0, -1); 
   $Ende = mktime(substr ($Ende,0,2), substr ($Ende,3,5), 0, 0, 0, 0, -1); 
   $heute = date ("N"); 
   $Tag = explode("-" ,$Tag); 
   $cntTag = count($Tag); 
    
   for ($a = 0; $a < $cntTag; $a++) 
       { 
            if ($Tag[$a] == $heute) 
              { 
          if ($Beginn < $Ende) 
               { 
               if ($Beginn <= $jetzt && $jetzt <= $Ende) 
                       { 
                          return true; 
                       } 
                  else 
                       { 
                       return false; 
                       } 
            } 
            else 
                    { 
                    if ($Beginn <= $jetzt || $jetzt <= $Ende) 
                     { 
                      return true; 
                      } 
                  else 
                       { 
                       return false; 
                      } 
               } 
           } 
       } 
   } 

//======================================================================================== 

if (Schaltzeit ("1-2-3-4-5", "20:00", "23:50")) 
    { 
    echo "Jetzt schalten wir Montag-Freitag von 20:00 - 23:50"; 
    } 
elseif (Schaltzeit ("6-7", "19:00", "20:00")) 
    { 
    echo "Jetzt schalten wir Samstag und Sonntag von 19:00 - 20:00"; 
    } 
elseif (Schaltzeit ("1-3-5", "19:00", "20:00")) 
    { 
    echo "Jetzt schalten wir Montag, Mittwoch und Freitag von 19:00 - 20:00"; 
    } 
?>

Über IPS_GetScriptThreads() erhält man Informationen über gerade laufende Scripte.

Hier ein Beispiel wie man die Laufzeit überwachen kann

Define ('MAX_RUNTIME', 300); // maximale Laufzeit in s 

//sleep (MAX_RUNTIME + 1); //zu Testzwecken 

//print_r (IPS_GetScriptThreads(IPS_GetScriptThreadList())); 
foreach (IPS_GetScriptThreads(IPS_GetScriptThreadList()) as $Thread){ 
    $ScriptID = $Thread['ScriptID']; 
    if ($ScriptID > 0){ 
        if ((time()-$Thread['StartTime']) > MAX_RUNTIME) { 
            // ..... hier kann man reagieren (Info, Reboot, ...) 
        } 
    } 
}  

<?
// Anzahl der Threads ausgeben
$Threads = IPS_GetScriptThreadList();
//print_r($Threads);


// Threads ausgeben
for($i=1;$i<=count($Threads);$i++) {
	//print_r(IPS_GetScriptThread($i));
	$ThreadArray[$i] = IPS_GetScriptThread($i);
	if ($ThreadArray[$i]['ScriptID'] != 0) {
		echo $ThreadArray[$i]['ScriptID'].PHP_EOL;
	}
}
?>

Alles mögliche zum Thema Datum, Uhrzeit, Wochentage, Monate, …

<?
// http://php.net/manual/de/function.date.php

$Uhrzeit = date("H:i:s");  // Stunde:Minute:Sekunde
echo "Aktuelle Uhrzeit = ".$Uhrzeit."
";

$Datum_Heute = date("d.m.Y");  // Tag.Monat.Jahr
echo "Das heutige Datum = ".$Datum_Heute."

";




// Befehle nur zu bestimmten Zeiten ausführen

if ((date("H") >= 12) AND (date("H") < 23)) {
	echo "Es ist zwischen 12.00 Uhr und 22.59 Uhr
";
}
else {
   echo "Es ist zwischen 23.00 Uhr und 11.59 Uhr
";
}

if ((date("d") >= 1) AND (date("d") <= 15)) {
	echo "Der heutige Tag liegt zwischen dem 1. und 15. des Monats
";
}
else {
	echo "Der heutige Tag liegt zwischen dem 16. und letzten Tag des Monats

";
}




// Mit Uhrzeiten/Tagen "rechnen"

$time = time();  // http://www.unixtimestamp.de/
echo "Der aktuelle Timestamp ist: ".$time."
";

$Datum1 = strtotime("01.01.2015");
$SekundenSeitDatum1 = $time - $Datum1;
echo "Seit dem 01.01.2015 sind $SekundenSeitDatum1 Sekunden vergangen
";
$MinutenSeitDatum1 = ($time - $Datum1) / 60;
echo "Seit dem 01.01.2015 sind ".(int)$MinutenSeitDatum1." Minuten vergangen
";
$StundenSeitDatum1 = ($time - $Datum1) / 60 / 60;
echo "Seit dem 01.01.2015 sind ".(int)$StundenSeitDatum1." Stunden vergangen
";
$TageSeitDatum1 = ($time - $Datum1) / 60 / 60 / 24;
echo "Seit dem 01.01.2015 sind ".(int)$TageSeitDatum1." Tage vergangen

";

if ($SekundenSeitDatum1 > 60) {
	echo "Seit dem 01.01.2015 sind mehr als 60 Sekunden vergangen

";
}





// Wochentage/Monate ausgeben

$Wochentage_Array = array(1=>"Montag",2=>"Dienstag",3=>"Mittwoch",4=>"Donnerstag",5=>"Freitag",6=>"Samstag",7=>"Sonntag");
$Wochentag_Heute = date("w");
$Wochentag = $Wochentage_Array[$Wochentag_Heute];
echo "Heute ist $Wochentag
";

$MonateArray = array(1=>"Januar",2=>"Februar",3=>"März",4=>"April",5=>"Mai",6=>"Juni",7=>"Juli",8=>"August",9=>"September",10=>"Oktober",11=>"November",12=>"Dezember");
$Monat_Heute = date("n");
$Monat = $MonateArray[$Monat_Heute];
echo "Wir haben den Monat $Monat
";
echo "Heute ist ".$Wochentag." der ".date("d").". ".$Monat;
?>

Basierend auf einem Skript von Raketenschnecke.

<?
// Skript einmal von Hand ausführen
$Check_Intervall = 60;  // Prüf-Intervall in Sekunden

if ($_IPS['SENDER'] == "Execute") {
    IPS_SetScriptTimer($_IPS['SELF'], $Check_Intervall);
}


$Threads = IPS_GetScriptThreadList();
$count = 0;

for($i=0;$i<count($Threads);$i++) {
    if (@IPS_GetScriptThread($i)['StartTime'] != 0) {
        $count++;
    }
}

$Auslastung = round(($count/count($Threads)), 1)*100;
echo "Die PHP-Threads haben eine Auslastung von $Auslastung%";

if ($Auslastung >= 80) {
   echo "!!!ACHTUNG!!! PHP-Threads haben eine Auslastung von $Auslastung%";
}
?>

Beispiel für LCN SKH :


<?
// SKH von Modul 7 auswerten.
// LCNPRO-Taste in M7 = 57 ff 01 (Byte 2 = $hb , Byte3 = $lb)
// $lb -  01 =kurz, 02=lang,03=los
// Skript wir bei Var Änderung von 58383  /*[LCN-Module\007\Befehl (0, 7)\Befehl]*/ aufgerufen.

$s_steuer = GetValue(58383 /*[LCN-Module\007\Befehl (0, 7)\Befehl]*/ );
       $hb = substr($s_steuer, 0, 3);
       $lb = substr($s_steuer, 3, 3);
	if ($hb  == 255)
	{
		if ($lb  == 1)
		{
			ZW_SwitchMode(14360  /*[zwave-Module\Z-Wave Switch (NodeID 006)Merten- Play3]*/,1);
		}
		if ($lb  == 2)
			{
			ZW_SwitchMode(14360  /*[zwave-Module\Z-Wave Switch (NodeID 006)Merten- Play3]*/,0);
			}

		if ($lb  == 4)
		{
			ZW_SwitchMode(22914  /*[zwave-Module\Z-Wave Switch (NodeID 005) Dbox]*/,1);
		}
		if ($lb  == 5)
			{
			ZW_SwitchMode(22914  /*[zwave-Module\Z-Wave Switch (NodeID 005) Dbox]*/,0);
			}
	 }
?>


<?
// Beispiel Messwerte ins LCN Display Zeile2 ("DT2")
$temp_aussen= GetValueFloat (34928  /*[LCN-Module\155-ix Gartenhütte\Values (90, 155)\01 HYT Temp.]*/   );
$feuchte_aussen = GetValueFloat (19873  /*[LCN-Module\155-ix Gartenhütte\Values (90, 155)\02 HYT Feuchte]*/);
$tau = GetValueFloat (30794  /*[LCN-Module\155-ix Gartenhütte\Values (90, 155)\03 HYT Taupunkt]*/);

$zeile='A'.$temp_aussen.'° '.' F'.$feuchte_aussen.'%  T'.$tau.'°';

$text=substr($zeile,0,12);
LCN_SendCommand(27686  /*[OG 140C|UPP GT4D (000,007)]*/ ,'GT','DT21'.$text);
$text=substr($zeile,12,12);
LCN_SendCommand(27686  /*[OG 140C|UPP GT4D (000,007)]*/ ,'GT','DT22'.$text);
$text=substr($zeile,24,12);
LCN_SendCommand(27686  /*[OG 140C|UPP GT4D (000,007)]*/ ,'GT','DT23'.$text);
$text=substr($zeile,36,12);
LCN_SendCommand(27686  /*[OG 140C|UPP GT4D (000,007)]*/ ,'GT','DT24'.$text);

//Anzeige ist : A11.7° F99.9% T11.7°
?>


<?
$StringVarID = 12345;  // ID deiner String Variable mit Variablenprofil "~TextBox" eintragen
$Zeilen = 50; // Anzahl der letzten X Zeilen die ausgelesen werden sollen


$filename="logfile.log";
$path=IPS_GetKernelDir()."logs\\"; // Windows
//$path = "/var/log/symcon/";   // Raspberry,UNIX,...
$LogFile = $path.$filename;


// Letzten X Zeilen vom Log auslesen und in Variable speichern
$LetztenXZeilen = readLastLinesOfFile($LogFile, $Zeilen);
$LetztenXZeilenString = implode("
",$LetztenXZeilen);  // für Ausgabe in HTMLBox muss "
" in "<br>" geändert werden
SetValueString($StringVarID, $LetztenXZeilenString);
echo $LetztenXZeilenString; // auskommentieren für Live-Betrieb


// Anzahl der Zeilen vom Log ausgeben lassen
$ZeilenAnzahl = countLines($LogFile);
echo "

Das Log hat aktuell $ZeilenAnzahl Zeilen.".PHP_EOL; // auskommentieren für Live-Betrieb



function readLastLinesOfFile($filePath, $lines) {
    $handle = fopen($filePath, "r");
    if (!$handle) {
        return array();
    }
    $linecounter = $lines;
    $pos = -2;
    $beginning = false;
    $text = array();
    while ($linecounter > 0) {
        $t = " ";
        while ($t != "
") {
            if(fseek($handle, $pos, SEEK_END) == -1) {
                $beginning = true;
                break;
            }
            $t = fgetc($handle);
            $pos--;
        }
        $linecounter--;
        if ($beginning) {
            rewind($handle);
        }
        $text[$lines-$linecounter-1] = str_replace(array("\r", "
", "	"), '', fgets($handle));
        if ($beginning) break;
    }
    fclose($handle);
    return array_reverse($text);
}


function countLines($file) {
	$lines = 0;
   $fh = fopen($file, 'r');
   while(fgets($fh)) {
   	$lines++;
   }
   return $lines;
}
?>

<?
$id1 = CreateVariableByName($_IPS['SELF'], "Temperatur", 2);
$id2 = CreateVariableByName($_IPS['SELF'], "Volts", 2);
$id3 = CreateVariableByName($_IPS['SELF'], "Clock", 2);

SetValue($id1 ,(exec("cat /sys/class/thermal/thermal_zone0/temp "))/1000);
SetValue($id2 ,(float)(substr(exec("vcgencmd measure_volts"),5)));
SetValue($id3 ,(int)((exec("cat  /sys/devices/system/cpu/cpu0//cpufreq/scaling_cur_freq")) / 1000));


function CreateVariableByName($id, $name, $type)
{
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
   }
   return $vid;
}

function CreateEventIDByName($id, $name, $type)
{
   $eid = @IPS_GetEventIDByName($name, $id);
   if($eid===false) {
      $eid = IPS_CreateEvent($type);
      IPS_SetParent($eid, $id);
      IPS_SetName($eid, $name);
   }
   return $eid;
}

?>

Beispiel mit einem Bewegungsmelder:

<?
// Geloggte Daten eines Bewegungsmelder aus dem Archiv auswerten
//
// Beispiel:
// Bewegungen vom 11.09.2015 (00:00:00 bis 23:59:59) auswerten
//
// !!ACHTUNG!! Da "Rohdaten" verwendet werden, kann die Auswahl eines größeren Zeitraumes eine erhöhte CPU-Auslastung verursachen!


$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen
$State_VarID_Bewegungsmelder = 12345 /*[Hardware\HomeMatic\Bewegungsmelder\B04 (Wohnzimmer vorne)\Sensor\MOTION]*/;  // Hier die Variablen ID (z.B. bei HomeMatic die "STATE" Variable eintragen
// Zeitraum bei AC_GetLoggedValues wird wie folgt angegeben (Stunde, Minute, Sekunde, Monat, Tag, Jahr)
$ZeitraumVON = mktime(0, 0, 0, 9, 11, 2015);     // Es kann auch date oder strtotime oder sonstiges verwendet werden
$ZeitraumBIS = mktime(23, 59, 59, 9, 11, 2015);  // Es kann auch date oder strtotime oder sonstiges verwendet werden
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $State_VarID_Bewegungsmelder, $ZeitraumVON, $ZeitraumBIS, 0);
//print_r($LogDatenAR);

$Count = 0;
$Duration = 0;
foreach ($LogDatenAR as $LogWert) {
	if ($LogWert['Value'] == 1) {
	   $Count++;
	   $Duration = $Duration + $LogWert['Duration'];
	}
}

$DurationSek = $Duration;
$DurationMin = intval($Duration / 60);
$DurationStd = round($DurationMin / 60, 2);

echo "Es wurden $Count Bewegungs-Phasen erkannt.
Die Bewegungs-Phasen hatten eine Gesamtdauer von $DurationMin Minuten (= $DurationSek Sekunden = $DurationStd Stunden).";
?>

Beispiel mit einer Haustür:

<?
// Geloggte Daten einer Tür/eines Fenster aus dem Archiv auswerten
//
// Beispiel:
// Bewegungen vom 11.09.2015 (00:00:00 bis 23:59:59) auswerten
//
// !!ACHTUNG!! Da "Rohdaten" verwendet werden, kann die Auswahl eines größeren Zeitraumes eine erhöhte CPU-Auslastung verursachen!

$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen
$State_VarID_TuerFenster = 12345 /*[Hardware\HomeMatic\Tür-Fenster-Kontakt\KONTAKT03 (Haustür)\Kontakt\STATE]*/;  // Hier die Variablen ID (z.B. bei HomeMatic die "STATE" Variable eintragen
// Zeitraum bei AC_GetLoggedValues wird wie folgt angegeben (Stunde, Minute, Sekunde, Monat, Tag, Jahr)
$ZeitraumVON = mktime(0, 0, 0, 9, 11, 2015);     // Es kann auch date oder strtotime oder sonstiges verwendet werden
$ZeitraumBIS = mktime(23, 59, 59, 9, 11, 2015);  // Es kann auch date oder strtotime oder sonstiges verwendet werden
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $State_VarID_TuerFenster, $ZeitraumVON, $ZeitraumBIS, 0);
//print_r($LogDatenAR);

$Count = 0;
$Duration = 0;
foreach ($LogDatenAR as $LogWert) {
	if ($LogWert['Value'] == 1) {
	   $Count++;
	   $Duration = $Duration + $LogWert['Duration'];
	}
}

$DurationSek = $Duration;
$DurationMin = intval($Duration / 60);
$DurationStd = round($DurationMin / 60, 2);

echo "Es wurden $Count Tür/Fenster-Öffnungen erkannt.
Die gesamte Öffnungsdauer beträgt $DurationSek Sekunden (= $DurationMin Minuten = $DurationStd Stunden).";
?>
	$location = IPS_GetLocation (IPS_GetParent ($_IPS['SELF']));
	$ALL_EVENTS = IPS_GetEventList ( );
   foreach ($ALL_EVENTS  as $key => $value)
   {
       $Pfad = " ".IPS_GetLocation ($value);
        if(strpos ($Pfad,$location) !=  0)
       {
			if(IPS_GetObject ($value)['ObjectType'] == 4)//Event
			{
				if(IPS_GetEvent ($value)['EventActive'])
				{
 					IPS_SetEventActive ($value,false);
				}
				else
				{
 					IPS_SetEventActive ($value,true);
				}
			}
			else
			{
			}
       }
       else
       {
       }
   }

<?
$TestTimestamp = strtotime("23.09.2015");

$Ausgabe = EN_DE_Date_Umwandler("D j. M Y", $TestTimestamp);
echo $Ausgabe;


function EN_DE_Date_Umwandler($DateSyntax, $Timestamp) {
	$trans = array(
		'Monday'    => 'Montag',
		'Tuesday'   => 'Dienstag',
		'Wednesday' => 'Mittwoch',
		'Thursday'  => 'Donnerstag',
		'Friday'    => 'Freitag',
		'Saturday'  => 'Samstag',
		'Sunday'    => 'Sonntag',
		'Mon'       => 'Mo',
		'Tue'       => 'Di',
		'Wed'       => 'Mi',
		'Thu'       => 'Do',
		'Fri'       => 'Fr',
		'Sat'       => 'Sa',
		'Sun'       => 'So',
		'January'   => 'Januar',
		'February'  => 'Februar',
		'March'     => 'März',
		'May'       => 'Mai',
		'June'      => 'Juni',
		'July'      => 'Juli',
		'October'   => 'Oktober',
		'December'  => 'Dezember'
	);
	$DEdate = strtr(date($DateSyntax, $Timestamp), $trans);
	return $DEdate;
}
?>
<?
// Beispiel um das Datum von jedem 2. Montag ausgeben lassen
$TagX = "Montag";  // Montag wird gesucht
$IntervallX = 2;   // Jeder 2.
$Jahr = 2015;      // Im Jahr 2015


$Counter = 1;
for ($MonatC = 1; $MonatC <= 12; $MonatC++) {
	$MonatTage = date("t", strtotime("01.$MonatC.$Jahr"));
	for ($TageC = 1; $TageC <= $MonatTage; $TageC++) {
	   $Wochentag = EN_DE_Date_Umwandler("l", strtotime("$TageC.$MonatC.$Jahr"));
	   if ($Wochentag == $TagX) {
			if ($Counter == $IntervallX) {
				$DatumAR[] = EN_DE_Date_Umwandler("d.m.Y", strtotime("$TageC.$MonatC.$Jahr"));
		      $Counter = 1;
	      }
	      else {
		      $Counter++;
		   }
	   }
	}
}

// AUSGABE DES ARRAY
print_r($DatumAR);

// AUSGABE EINZELN
foreach ($DatumAR as $DatumA) {
	echo $DatumA.PHP_EOL;
}



function EN_DE_Date_Umwandler($DateSyntax, $Timestamp) {
	$trans = array(
		'Monday'    => 'Montag',
		'Tuesday'   => 'Dienstag',
		'Wednesday' => 'Mittwoch',
		'Thursday'  => 'Donnerstag',
		'Friday'    => 'Freitag',
		'Saturday'  => 'Samstag',
		'Sunday'    => 'Sonntag',
		'Mon'       => 'Mo',
		'Tue'       => 'Di',
		'Wed'       => 'Mi',
		'Thu'       => 'Do',
		'Fri'       => 'Fr',
		'Sat'       => 'Sa',
		'Sun'       => 'So',
		'January'   => 'Januar',
		'February'  => 'Februar',
		'March'     => 'März',
		'May'       => 'Mai',
		'June'      => 'Juni',
		'July'      => 'Juli',
		'October'   => 'Oktober',
		'December'  => 'Dezember'
	);
	$DEdate = strtr(date($DateSyntax, $Timestamp), $trans);
	return $DEdate;
}
?>
<?
// Beispiel um das Datum von jedem 2. Montag PRO MONAT ausgeben lassen
$TagX = "Montag";  // Montag wird gesucht
$IntervallX = 2;   // Jeder 2.
$Jahr = 2015;      // Im Jahr 2015


$Counter = 1;
for ($MonatC = 1; $MonatC <= 12; $MonatC++) {
	$MonatTage = date("t", strtotime("01.$MonatC.$Jahr"));
	for ($TageC = 1; $TageC <= $MonatTage; $TageC++) {
	   $Wochentag = EN_DE_Date_Umwandler("l", strtotime("$TageC.$MonatC.$Jahr"));
	   if ($Wochentag == $TagX) {
			if ($Counter == $IntervallX) {
				$DatumAR[] = EN_DE_Date_Umwandler("d.m.Y", strtotime("$TageC.$MonatC.$Jahr"));
		      $Counter = 1;
	      }
	      else {
		      $Counter++;
		   }
	   }
	}
	$Counter = 1;
}

// AUSGABE DES ARRAY
print_r($DatumAR);

// AUSGABE EINZELN
foreach ($DatumAR as $DatumA) {
	echo $DatumA.PHP_EOL;
}



function EN_DE_Date_Umwandler($DateSyntax, $Timestamp) {
	$trans = array(
		'Monday'    => 'Montag',
		'Tuesday'   => 'Dienstag',
		'Wednesday' => 'Mittwoch',
		'Thursday'  => 'Donnerstag',
		'Friday'    => 'Freitag',
		'Saturday'  => 'Samstag',
		'Sunday'    => 'Sonntag',
		'Mon'       => 'Mo',
		'Tue'       => 'Di',
		'Wed'       => 'Mi',
		'Thu'       => 'Do',
		'Fri'       => 'Fr',
		'Sat'       => 'Sa',
		'Sun'       => 'So',
		'January'   => 'Januar',
		'February'  => 'Februar',
		'March'     => 'März',
		'May'       => 'Mai',
		'June'      => 'Juni',
		'July'      => 'Juli',
		'October'   => 'Oktober',
		'December'  => 'Dezember'
	);
	$DEdate = strtr(date($DateSyntax, $Timestamp), $trans);
	return $DEdate;
}
?>
<?
// Zeigt an, wann der Computer zuletzt gestartet wurde. Getestet unter Win7 und Win10
$uptime = IPS_Execute('cmd /c net statistics server | find /i "Statistik seit"', "", false, true);
preg_match('|seit(.*)|', $uptime, $matchuptime);
$uptime = substr($matchuptime[1], 1, -1);

echo "Server online seit: $uptime";
?>

Quelle: Archivkontrolle (by Nall chan)

Skript zum Löschen aller verwaisten Archiv-Einträge. Es werden alle Einträge aus dem Archiv gelöscht, wovon keine zugehörigen Variablen mehr existieren. Diese sind im Archiv meisten daran zu erkennen >> „Objekt #12345 existiert nicht“

Sollte die VariablenID in der Zwischenzeit neu vergeben worden sein, dann wird nichts gelöscht und man hat sich das Logging versaut :smiley: Wurde die ID an ein Skript oder ein anderes Objekt vergeben, dann wird dieser Name auch im Archiv angezeigt und fällt weniger auf, wird aber dann durch dieses entfernt.

Einfach das Skript unten einmal ausführen, dann wird einem angezeigt was gelöscht werden würden. Braucht man die alten Archiveinträge nicht mehr, dann kann man die Variable $Testlauf auf FALSE setzen und nach ein paar Sekunden/Minuten (je nach Anzahl) sind alle verwaisten Einträge weg :slight_smile:

<?
ini_set("max_execution_time", 600);

$Testlauf = true;  // Variable auf FALSE setzen, dann werden die Variablen wirklich aus dem Archiv gelöscht. Bei TRUE werden die Variablen-IDs nur angezeigt/ausgegeben, aber es wird nichts gelöscht!


$VarCount = 0;
$VarCountX = 0;
$AC_ID =  IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];
$LoggedVarIDs = AC_GetAggregationVariables($AC_ID, true);
foreach ($LoggedVarIDs as $VarID)
{
    if (!IPS_VariableExists($VarID['VariableID'])) {
       $VarCount++;
       if ($Testlauf == true) {
            echo "INFO - Variable mit ID ".$VarID['VariableID']." existiert nicht!".PHP_EOL;
        }
        else {
            $deleted = AC_DeleteVariableData($AC_ID,$VarID['VariableID'],$VarID['FirstTime'],$VarID['LastTime']);
            if ($deleted !== true) {
                echo "FEHLER - Konnte Variable mit ID ".$VarID['VariableID']." nicht löschen!".PHP_EOL;
                $VarCountX++;
            }
        }
    }
}

if ($Testlauf == true) {
    echo "Es wurden $VarCount Archiv-Einträge mit nicht existierenden Variablen gefunden!".PHP_EOL;
}
else {
   echo "Es wurden $VarCount Archiv-Einträge mit nicht existierenden Variablen gelöscht!".PHP_EOL;
   echo "Es konnten $VarCountX Archiv-Einträge nicht gelöscht werden!".PHP_EOL;
}
?>
<?
$Duration = "2:01:03";  // 2 Stunden & 1 Minute & 3 Sekunden

$DurationAR = explode(":", $Duration);
$DurationSTD = (int)$DurationAR[0];
$DurationMIN = (int)$DurationAR[1];
$DurationSEK = (int)$DurationAR[2];
$DurationGesamt = $DurationSEK + ($DurationMIN * 60) + ($DurationSTD * 3600);

echo "$Duration entspricht $DurationGesamt Sekunden";
?>