IP-Symcon - Wie kann ich... 2.0

<?
$DreamboxIP = "192.168.2.20";  // Hier die IP eurer Dreambox eintragen
$Nachricht = "Ich bin ein Test!";   // Text der Nachricht die angezeigt werden soll
$Anzeigedauer = 5;                         // X Sekunden - so lange wird die Nachricht auf TV/Beamer angezeigt


DreamboxNachricht($DreamboxIP, $Nachricht, $Anzeigedauer);


function DreamboxNachricht($DreamboxIP, $Nachricht, $Anzeigedauer) {
	$message = utf8_encode($Nachricht);
	$message = urlencode($message);
	$result = @SYS_GetURLContent("http://".$DreamboxIP."/web/message?text=".$message."&type=1&timeout=$Anzeigedauer");
	if ($result == true) {
	   echo "Nachricht wurde gesendet!
";
	}
	else {
	   echo "Nachricht wurde nicht gesendet!
";
	}
}
?>

>> Modul verfügbar >> Enigma2BY - Modul für Receiver mit Enigma2 >> ab IPS 4.0

Variable „Aktiv (true/false)“ und Event-Trigger werden automatisch angelegt. Dazu muss das Skript einmal von Hand ausgeführt werden, danach läuft alles automatisch.

Dazu muss der Grenzwert herausgefunden werden, dazu am besten einen Wasch-/Trockenvorgang loggen und die Werte, besonders am Ende, beobachten. Dazu auf Pausen während dem Vorgang achten und gegebenenfalls den Timer noch anpassen.

Um dieses Skript verwenden zu können, muss die Waschmaschine/der Wäschetrockner an einem Leistungsmesser angeschlossen sein.

<?
$MaschinenPower = 12345;  // Hier die Variable mit Leitungsmessung eintragen (WATT, AMPERE)
$Power_Grenzwert = 3;     // Hier den Grenzwert eintragen, bei dem bei Über-/Unterschreitung das Skript ausgeführt werden soll
$PushSenden = true;       // TRUE = Push-Nachricht wird gesendet, FALSE = Push-Nachricht wird nicht gesendet (gültige IPS-Subscription notwendig!!)
$PushNachrichtTitel = "WASCHMASCHINE";     // Hier den Titel eintragen, der per Push versendet wird
$PushNachrichtMessage = "...ist FERTIG!";  // Hier den Text eintragen, der per Push versendet wird
$WF_ID = 11111;           // ID vom WebFront zum Push-Versand
$TimerDauer = 120;       // X Sekunden nach Grenzunterschreitung, wenn dazwischen keine Grenzüberschreitung war, wird das Ende vom Wasch-/Trockenvorgang gemeldet



/****** AB HIER NICHTS MEHR ÄNDERN ******/
$MaschineAktiv = CreateVariableByName($_IPS['SELF'], "Aktiv", 0, "", "");  // Bool-Variable (TRUE = Maschine AKTIV, FALSE = Maschine INAKTIV)


if ((GetValueFloat($MaschinenPower) < $Power_Grenzwert) AND (GetValue($MaschineAktiv) == true))  {
   IPS_SetScriptTimer($_IPS['SELF'], $TimerDauer);
}

if (GetValueFloat($MaschinenPower) > $Power_Grenzwert)  {
	SetValue($MaschineAktiv, true);
	IPS_SetScriptTimer($_IPS['SELF'], 0);
}


// Timer-Event
if($IPS_SENDER == "TimerEvent") {
	if (GetValueFloat($MaschinenPower) < $Power_Grenzwert)  {
	   IPS_SetScriptTimer($_IPS['SELF'], 0);
		//PUSH-Nachricht senden
		if ($PushSenden == true) {
			WFC_PushNotification($WF_ID, $PushNachrichtTitel, $PushNachrichtMessage, "", 0);
		}
	  	// Maschine auf inaktiv setzen
	  	SetValue($MaschineAktiv, false);
	}
}


if($_IPS['SENDER'] == "Execute")  {
	$Event1_ID = CreateEventTrigger("EVENT_Power_Grenzueberschreitung", $MaschinenPower, $_IPS['SELF'], 2);
	$Event2_ID = CreateEventTrigger("EVENT_Power_Grenzunterschreitung", $MaschinenPower, $_IPS['SELF'], 3);
	IPS_Sleep(1000);
	IPS_SetEventTriggerSubsequentExecution($Event1_ID, false);
	IPS_SetEventTriggerSubsequentExecution($Event2_ID, false);
}


function CreateVariableByName($ParentID, $VarName, $VarTyp, $VarProfile = "", $VarActionScript = "") {
   $VarID = @IPS_GetVariableIDByName($VarName, $ParentID);
   if($VarID === false) {
      $VarID = IPS_CreateVariable($VarTyp);
      IPS_SetParent($VarID, $ParentID);
      IPS_SetName($VarID, $VarName);
      IPS_SetInfo($VarID, "This variable was created by script #".$_IPS["SELF"]);
      if($VarProfile !== "") {
            IPS_SetVariableCustomProfile($VarID, $VarProfile);
        }
        if($VarActionScript !== "") {
            IPS_SetVariableCustomAction($VarID, $VarActionScript);
        }
   }
   return $VarID;
}


function CreateEventTrigger($EventName, $VarID, $ParentID, $EventTyp) {
	 Global $Power_Grenzwert;
    $eid = @IPS_GetEventIDByName($EventName, $ParentID);
    if (is_numeric($eid) == false) {
        $eid = IPS_CreateEvent(0);
        IPS_SetEventTrigger($eid, $EventTyp, $VarID);
        IPS_SetEventTriggerValue($eid, $Power_Grenzwert);
        IPS_SetParent($eid, $ParentID);
        IPS_SetName($eid, $EventName);
        IPS_SetEventActive($eid, true);
    }
	 return $eid;
}
?>

Beispiel am Auslesen der aktuellen Beiträge im IPS Forum, Bereich „Neuigkeiten & Ankündigungen“. Am einfachsten findet man den XPath mit dem Chrome Browser heraus. Einfach rechte Maustaste auf ein Element und dann auf „Element untersuchen“. Unten auf den markierten Teil erneut mit der rechten Maustaste klicken und dann auf „Copy XPath“.
Gibt aber auch ein AddOn für den Firefox und allgemein für Browser weitere AddOns.

<?
//error_reporting(E_ERROR | E_WARNING | E_PARSE);

$curl = curl_init('https://www.symcon.de/forum/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$page = curl_exec($curl);
//print_r($page);


if(curl_errno($curl)) // Error-Check
{
    echo 'Scraper error: ' . curl_error($curl);
    exit;
}
curl_close($curl);

$DOM = new DOMDocument;
//print_r($DOM);


libxml_use_internal_errors(true);

if (!$DOM->loadHTML($page))
    {
        $errors="";
        foreach (libxml_get_errors() as $error)  {
            $errors.=$error->message."<br/>";
        }
        libxml_clear_errors();
        print "libxml errors:<br>$errors";
        return;
    }
$xpath = new DOMXPath($DOM);


// Anzahl der Themen im IPS Forum unter "Neugikeiten & Ankündigungen"
$content = $xpath->query('.//*[@id="forum2"]/div/ul[2]/li[1]');
foreach ($content as $entry1) {
    $output[] = $entry1->nodeValue;
}
//print_r($output);

// Wegschneiden von unnötigen Zeichen
preg_match_all('!\d+!', $entry1->nodeValue, $matches);


// Ausgabe
$output_final = $matches[0][0];
echo "Anzahl der Themen: $output_final";
?>
  • In der IP-Symcon-Verwaltungskonsole Ansicht ‚Objektbaum‘ auswählen
  • das betreffende IP-S Objekt anklicken
  • rechte Maustaste -> ‚ObjektID kopieren‘
  • in Zeile 3 des folgenden Skriptes mit ‚CTRL-V‘ einkopieren (bzw. vorhandenen Nr. überschreiben)
  • Skript ‚Ausführen‘
<?php
// Analysiert das IP-S Objekt mit folgender ObjektID:
$ObjID = 37671  /*[Skripte\Konfiguration\ObjectAnalyse]*/;


$Objekt = IPS_GetObject ($ObjID);
$ObjektTyp = array ('Kategorie', 'Instanz', 'Variable', 'Skript', 'Ereignis', 'Media', 'Link');
print( "Object:   $ObjID " . @IPS_GetLocation ($ObjID) . " (ist " . $ObjektTyp[$Objekt['ObjectType']] . ')');
print( "
Parent:   " . $Objekt['ParentID'] . ' ' . IPS_GetLocation ($Objekt['ParentID']));
if ($Objekt['HasChildren']) {
    print( "
Children: ");
    foreach ($Objekt['ChildrenIDs'] as $i => $ChID) {
        print( "
          $ChID " . IPS_GetLocation ($ChID));
    }
}
print("

1. ObjectInfo:    ");
print_r ($Objekt);

switch ($Objekt['ObjectType']) {
    case 0:
        break;
    case 1:
        $ModuleType = array ('Kern', 'I/O', 'Splitter', 'Gerät', 'Konfigurator');
        print("
2. InstanceInfo (" . $ModuleType[IPS_GetInstance ($ObjID)['ModuleInfo']['ModuleType']] . '):     ');
        print_r (IPS_GetInstance ($ObjID));
        break;
    case 2:
        $VariablenTyp = array ('Boolean', 'Integer', 'Float', 'String');
        print("
2. VariableInfo (" . $VariablenTyp[IPS_GetVariable ($ObjID)['VariableValue']['ValueType']] . '):     ');
        print_r (IPS_GetVariable ($ObjID));
        $Prof = IPS_GetVariable ($ObjID)['VariableCustomProfile'];
        if ($Prof) {
            print("
3. CustomProfile '" . $Prof . "':     ");
            print_r (IPS_GetVariableProfile ($Prof));
        }
        $Prof = IPS_GetVariable ($ObjID)['VariableProfile'];
        if ($Prof) {
            print("
3. VariableProfile '" . $Prof . "':     ");
            print_r (IPS_GetVariableProfile ($Prof));
        }
        print("
4. Changed:     " . strftime ("%d.%m.%y-%X", IPS_GetVariable ($ObjID)['VariableChanged']));
        print("
5. Updated:     " . strftime ("%d.%m.%y-%X", IPS_GetVariable ($ObjID)['VariableUpdated']));
        break;
    case 3:
        print("
2. SkriptInfo:      ");
        print_r (IPS_GetScript ($ObjID));
        print("
3. SkriptName:      " . IPS_GetScriptFile ($ObjID));
        if (IPS_GetScript ($ObjID)['LastExecute'])
            print("
4. LastExecute:     " . strftime ("%d.%m.%y-%X", IPS_GetScript ($ObjID)['LastExecute']));
        break;
    case 4:
        $EventTyp = array ('getriggert', 'zyklisch', 'Wochenplan');
        print("
2. EventInfo (" . $EventTyp[IPS_GetEvent ($ObjID)['EventType']] . '):     ');
        print_r (IPS_GetEvent ($ObjID));
        print("
3. LastRun:         " . strftime ("%d.%m.%y-%X", IPS_GetEvent ($ObjID)['LastRun']));
        print("
4. NextRun:         " . strftime ("%d.%m.%y-%X", IPS_GetEvent ($ObjID)['NextRun']));
        break;
    case 5:
        $MedienTyp = array ('Formular', 'Bild', 'Ton', 'Stream', 'Chart');
        print("
2. MedienobjektInfo (" . $MedienTyp[IPS_GetMedia ($ObjID)['MediaType']] . '):     ');
        print_r (IPS_GetMedia ($ObjID));
        if (IPS_GetMedia ($ObjID)['LastUpdate'])
            print("
3. LastUpdate:     " . strftime ("%d.%m.%y-%X", IPS_GetMedia ($ObjID)['LastUpdate']));
        break;
    case 6:
        print("
2. LinkInfo:         ");
        print_r (IPS_GetLink ($ObjID));
        print( "
3. Target:   " . IPS_GetLink ($ObjID)['TargetID'] . ' ' . IPS_GetLocation (IPS_GetLink ($ObjID)['TargetID']));
        break;
    default:
}
?>


Ergibt z.B.:

Object:   37671 Skripte\Konfiguration\ObjectAnalyse (ist Skript)
Parent:   45470 Skripte\Konfiguration

1. ObjectInfo:    Array
(
    [ChildrenIDs] => Array
        (
        )

    [HasChildren] => 
    [ObjectIcon] => 
    [ObjectID] => 37671
    [ObjectIdent] => 
    [ObjectInfo] => 
    [ObjectIsHidden] => 
    [ObjectIsReadOnly] => 
    [ObjectName] => ObjectAnalyse
    [ObjectPosition] => 2
    [ObjectSummary] => 
    [ObjectType] => 3
    [ParentID] => 45470
)

2. SkriptInfo:      Array
(
    [IsBroken] => 
    [LastExecute] => 1438422139
    [ScriptFile] => ObjectAnalyse.ips.php
    [ScriptID] => 37671
    [ScriptType] => 0
)

3. SkriptName:      ObjectAnalyse.ips.php
4. LastExecute:     01.08.15-11:42:19

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

?>