IP-Symcon - Wie kann ich... 2.0

Quelle: settings.xml - „LastUpdated/LastChanged-Value“ manuell editieren (by Horst und nancilla)

<? 
// Datum und Zeit 

$tag = 13; 
$monat = 8; 
$jahr = 2003; 

$stunden = 15; 
$minuten = 04; 
$sekunden = 00; 


// Unix-Timestamp 
$time = mktime($stunden,$minuten,$sekunden,$monat,$tag,$jahr); 
if (!date("I",$time)){$gmtplus = 3600;}else{$gmtplus = 7200;}  // Sommerzeit ? 

// Delphi-Timestamp (DateTime) 
$ergebnis = round((($time + $gmtplus)/ 86400) + 25569,5); 

// Überprüfung mit Funktion Horst 
function delphiTStoUnix ($ts) 
{ 
    if (!date("I")){$gmtplus = 3600;}else{$gmtplus = 7200;} 
    $result = round(($ts - 25569) * 86400)-$gmtplus; 
    $result = strtotime(gmdate("Y-m-d\\TH:i:s".date("P", time()), $result)); 
    return $result; 
} 
$ergebnis_horst = date("H:i:s d.m.Y", delphiTStoUnix(str_replace(",", ".", $ergebnis))); 

echo "$ergebnis_horst

"; 
echo "$ergebnis
"; 
?>

by Bayaro:

<?
$TestDatum = "11.01.2010 12:00";

$test1 = strtotime($TestDatum);
echo $test1.PHP_EOL;
$test2 = date("d.m.Y H:i", $test1);
echo $test2.PHP_EOL;

$test3 = UnixToDelphiTime($TestDatum);
echo $test3;



function UnixToDelphiTime($unixtime) {
	$unixtime = strtotime($unixtime);
	$delphitime = ($unixtime / 86400) + 25569;
	return $delphitime;
}
?>

Quelle: Gleitenden Mittelwert oder gleitenden Median berechnen (by bbernhard)

<?
$IDArchiveHandler = 22801 /*your Archive Handler ID*/;
$varId = 37190 /*Var Id you want to examine*/;
$interval = 50; /*Timespan in seconds for Mean/Median Calculation*/;
$default = 0; /* default value in case no data capturd */

echo "Mean: ".getMean ($IDArchiveHandler,$varId,$interval,$default);
echo chr (13). chr (10);
echo "Median: ".getMedian ($IDArchiveHandler,$varId,$interval,$default);



function getMean ($IDArchivehandler,$varId,$log_interval,$default) {
$logData = AC_GetLoggedValues ($IDArchivehandler, $varId, time()- $log_interval,time(),-1);
if (count($logData) <1) return $default;
foreach ($logData as $key => $data)
{
    $value[$key] = $data['Value'];
}
return array_sum($value)/count($value);
}

function getMedian ($IDArchivehandler,$varId,$log_interval,$default) {
$logData = AC_GetLoggedValues ($IDArchivehandler, $varId, time()-$log_interval,time(),-1);
if (count($logData) <1) return $default;
foreach ($logData as $key => $data)
{
    $value[$key] = $data['Value'];
}
asort($value);
return $value[count($value)/2];
}
?>

Quelle: HomeMatic Funk-Schaltaktor 1fach mit Leistungsmessung - Seite 15 (by Frauenhofer)

<?
$archiveID = 24522 /*[Archiv]*/;
$objectID = DEINE ID ;  // hier deine Steckdose rein der Wert der die Watt oder was auch immer loggt, muss aber ein geloggter wert sein
$endtime = time(); // time() for "now"
$starttime = time()-(5*60); // n für minuten zurück
$limit = 0; // kein Limit

//print_r(AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit));
$buffer = AC_GetLoggedValues($archiveID, $objectID, $starttime, $endtime, $limit);
$anzahl = 0;
$summe = 0;
foreach ($buffer as $werte){
    $wert = $werte["Value"];
    $anzahl = $anzahl +1;
    $summe = $summe + $wert;
}
echo "N-Werte: ".$anzahl. "
";
$mittelw = $summe / $anzahl;
echo "Mittelwert: " . $mittelw . "
";
SetValue(10810 /*Steckdose Wama]*/ ,$mittelw);  // in eine Variable speichern wenn du willst
if ($mittelw < 10)
{
//tu dies
echo "test" ;
}
?>

Quelle: PHP Dateinamen für neueste Datei in einem Verzeichnis auslesen (by 1007)

    $dir = IPS_GetKernelDir() . "logs\\";
   $lastfile = '';

    $handle = opendir( $dir );

   if( !$handle )
       return false;
    
    while ( ( $file = readdir( $handle ) ) !== false )
        {
        if( $file != '.' && $file != '..' && is_file ( $dir.$file ) )
            {
         if( filemtime( $dir.$file ) >= filemtime( $dir.$lastfile ) )
                {
            $lastfile = $file;
                }
        }

    }

    closedir( $handle );

    echo "
Neueste Datei:" . $lastfile;

Quelle: Skript-Ausführung (by steiner)

<?
// ID von diesem Skript ermitteln
$event = IPS_GetObject($_IPS['SELF']);
$id = $event['ObjectID'];  
echo "Skript-ID: $id
";

$data = IPS_GetScript($id);
// Unix Timestamp des letzten Aufrufs
// siehe auch:http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/skriptverwaltung/ips-getscript/
$last_up = $data[LastExecute];   
echo "Letzte Ausführung Unix: $last_up
";
// zur Kontrolle
// siehe auch: http://de.php.net/manual/de/function.date.php
echo "Letzte Ausführung (His): ".date("H:i:s", $last_up)."
";

$deltaT = time() - $last_up;
echo "Letzte Ausführung in sec. : $deltaT
";

if ($deltaT > 60){

    // hier folgt ein tolles Skript
    // das nur alle 60 Sekunden ausgeführt werden darf

}
?>

Quelle: Skript-Ausführung (by HJH)

<?
define ("SPERRZEIT", 60);                           // Wartezeit (Sekunden) in der das Skript nicht abgearbeitet werden darf 

switch ($_IPS['SENDER']) 
{ 
    case "Variable":                                // Trigger durch Variable 
       if (IPS_GetScriptTimer($_IPS['SELF']) == 0) 
        {                                           // Timer läuft nicht, Skript darf ausgeführt werden 
          IPS_SetScriptTimer($_IPS['SELF'], SPERRZEIT); // Timer aufziehen und 
            // weitere Anweisungen                  // Skript ausführen 
        } 
        else                                        // Sperrzeit läuft bereits, daher 
            return;                                 // Abarbeitung abbrechen 
    break; 
     
    case "TimerEvent":                              // Trigger durch Timer 
        IPS_SetScriptTimer($_IPS['SELF'], 0);           // Timer wieder löschen 
    break; 
}
?>

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;
}
?>