/*******************************************************************************
Verwaltung einer Warteschlange zur Ausführung von Befehlen von PC Oldie (Hans)
V 1.00 Stand: 15.9.2017
V 1.01 Stand: 18.9.2017
Sortierung absteigend war fehlerhaft
Dieses Skrpit besteht aus 4 Teilen deren Ausführung von der Variablen
$IPS_Sender abhängt.
$_IPS['SENDER'] =='Execute' : Generierung des Skriptes "Befehlsbearbeitung
Init" und Anlage aller Variablen
$_IPS['SENDER'] =='RunScript' : Initialisierung der Werte durch Aufruf in
IPSView
$_IPS['SENDER'] =='TimerEvent' : Abarbeitung der Warteschlange und Aus-
führung der anstehenden Befehle
$_IPS['SENDER'] =='WebFront' : Eingabe der Daten über IPSView
Datenstruktur des Arrays mit den Befehlen:
==========================================
$BefehlArray[] = Status,Objekt Typ,Objekt Nr,Ausführungszeitpunkt,Ausführungsart,
Status = 0: Datensatz verarbeitet
= 1: Datensatz noch nicht verarbeitet
Objekt Typ = 1: Instanzen von Aktoren (Schalter und Dimmer)
= 2: Boolesche Variablen
= 3: Ausführung von Scripten
= 4: Aktivieren bzw. Deaktivieren von Ereignissen
= 6: Ausführen von Links
Objekt Nr = Nr des Objektes in IP-Symcon
Ausführungszeitpunkt = Unix TimeS Stamp für den Ausführungszeitpunkt
Ausführungsart = 0: ausschalten
Ausführungsart = 1: einschalten
Notation:
alle mit $IdVariable beginnenden Variablen enthalten die Id der entsprechenden
Variable im Objektbaum. Der Wert der Variablen steht dann in $Variable.
Die beiden nachfolgenden Variablen können ohne Skriptänderung angepasst werden.
$DimmerLevel ist die Helligkeit die bei Dimmern gesetzt wird, wenn diese ein-
geschaltet werden. Die Helligkeit kann beliebig gesetzt werden.
$AnzahlTage generiert soviele Datumsfelder in der Kategorie Wochendaten, wie
man in IPSView auf einmal angezeigt haben möchte.
$HTMLVariante = 1: ursprüngliche Variante der HTML Generierung für iPad
$HTMLVariante = 2: Variante für iPad und Windows mit kleinerer Schrift
==============================================================================*/
$DimmerLevel = 0.6;
$AnzahlTage = 14;
$HTMLVariante = 2;
/*==============================================================================
$IdDetailseite ist die in der View hinterlegte Id für die Fernsteuerung zum
Client. Sie MUSS entsprechend angepasst werden.
$NameDetailseite ist der Name der Inline Seite in IPSView und MUSS angepasst
werden, falls die Seite nicht Befehlsverwaltung lautet.
==============================================================================*/
$IdDetailseite = "34309 /*[Zeit-Scripte\IPSView\Tablet Detailseite zum Client]*/";
$NameDetailseite = "Befehlsverwaltung";
// Die Meldungen können beliebig angepasst werden.
$MeldungArray = array(
'Ausschaltzeitpunkt' => 'Ausschaltzeitpunkt liegt in der Vergangenheit',
'Einschaltzeitpunkt' => 'Einschaltzeitpunkt liegt in der Vergangenheit',
'Einausschaltzeitpunkt' => 'Ausschaltzeitpunkt ist gleich dem Einschaltzeitpunkt',
'Speichern' => 'Der Befehl wurde gespeichert',
'Zeit' => 'Falsche Zeitangabe',
'ObjektEx' => 'Objekt existiert nicht',
'Objekttyp' => 'Objekttyp ist ungültig',
'Objektkategorie' => 'Objekttyp Kategorie ist ungültig',
'Objektmedia' => 'Objekttyp Media ist ungültig',
'Objektvariable' => 'Variablentyp ist ungültig, nur Boolesche zulässig',
'Objektlink' => 'Linkverweis auf ein ungültiges Objekt',
'Objektinstanz' => 'Instanz hat keinen Schaltpunkt STATE oder LEVEL',
'ObjektId' => 'Objekt Id ist 0 oder größer 65535',
);
/*==============================================================================
Diese beiden Variablen werden zur Prüfung der Zeiteingabe und der Ermittlung
der Zeitstempel herangezogen. Wenn diese geändert werden, dann sind diverse
Anpassungen im Skript vorzunehmen.
==============================================================================*/
$KeinZeitpunkt = "--:--";
$NullZeitpunkt = "00:00";
$parent = IPS_GetParent($_IPS['SELF']);
$IdZeiteingabe = CreateVariableByIdent($parent, "Zeiteingabe", 1, "", "Zeiteingabe", 0, $_IPS['SELF']);
$IdBefehlArray = CreateVariableByIdent($parent, "Befehl Array", 3, "", "BefehlArray", 0, "");
$IdBefehlArrayHTML = CreateVariableByIdent($parent, "Befehl Array HTML", 3, "~HTMLBox", "BefehlArrayHTML", 0, "");
$IdBefehlArraySpeichern = CreateVariableByIdent($parent, "Befehl Array Speichern", 1, "", "BefehlArraySpeichern", 0, $_IPS['SELF']);
$IdMeldung = CreateVariableByIdent($parent, "Meldung", 3, "", "Meldung", 0, $_IPS['SELF']);
$IdMeldungVerstecken = CreateVariableByIdent($parent, "Meldung Verstecken", 0, "", "MeldungVerstecken", 0, "");
$IdMeldungFarbe = CreateVariableByIdent($parent, "Meldung Farbe", 3, "", "MeldungFarbe", 0, "");
$IdZeitstempelAn = CreateVariableByIdent($parent, "Zeitstempel An", 1, "", "ZeitstempelAn", 0, "");
$IdZeitstempelAus = CreateVariableByIdent($parent, "Zeitstempel Aus", 1, "", "ZeitstempelAus", 0, "");
$IdZeitstringAn = CreateVariableByIdent($parent, "Zeitstring An", 3, "", "ZeitstringAn", 0, "");
$IdZeitstringAnFarbe = CreateVariableByIdent($parent, "Zeitstring An Farbe", 3, "", "ZeitstringAnFarbe", 0, "");
$IdZeitstringAus = CreateVariableByIdent($parent, "Zeitstring Aus", 3, "", "ZeitstringAus", 0, "");
$IdZeitstringAusFarbe = CreateVariableByIdent($parent, "Zeitstring Aus Farbe", 3, "", "ZeitstringAusFarbe", 0, "");
$IdZifferZaehler = CreateVariableByIdent($parent, "Ziffer Zaehler", 1, "", "ZifferZaehler", 0, "");
$IdAnzahlWdh = CreateVariableByIdent($parent, "Anzahl Wiederholungen", 1, "", "AnzahlWiederholungen", 0, $_IPS['SELF']);
$IdSortierung = CreateVariableByIdent($parent, "Sortierung", 1, "", "Sortierung", 0, $_IPS['SELF']);
$IdObjekt = CreateVariableByIdent($parent, "Objekt", 1, "", "Objekt", 0, $_IPS['SELF']);
$IdZiffer = CreateVariableByIdent($parent, "Ziffer", 1, "", "Ziffer", 0, $_IPS['SELF']);
$IdIndexTag = CreateVariableByIdent($parent, "Index Tag", 1, "", "IndexTag", 0, $_IPS['SELF']);
$IdShiftWochen = CreateVariableByIdent($parent, "Shift Wochen", 1, "", "ShiftWochen", 0, $_IPS['SELF']);
$IdSlot = CreateVariableByIdent($parent, "Slot", 1, "", "Slot", 0, $_IPS['SELF']);
$IdSlotBis = CreateVariableByIdent($parent, "Slot Bis", 1, "", "SlotBis", 0, $_IPS['SELF']);
$IdSlotLoeschen = CreateVariableByIdent($parent, "Slot Loeschen", 1, "", "SlotLoeschen", 0, $_IPS['SELF']);
$IdSlotVerstecken = CreateVariableByIdent($parent, "Slot Verstecken", 0, "", "SlotVerstecken", 0, "");
/*******************************************************************************
Anlage aller Variablen und des Skriptes "Befehlsbearbeitung Init".
*******************************************************************************/
if ($_IPS['SENDER'] =='Execute')
{
$IdBefehlsbearbeitung = $_IPS['SELF'];
if (@IPS_GetObjectIDByIdent("BefehlsbearbeitungInit", $parent) === false)
{
$IdSkript = IPS_CreateScript(0);
IPS_SetParent($IdSkript, $parent);
IPS_SetName($IdSkript, "Befehlsbearbeitung Init");
IPS_SetIdent($IdSkript, "BefehlsbearbeitungInit");
IPS_SetPosition($IdSkript, 2);
}
else
{
$IdSkript = IPS_GetObjectIDByIdent("BefehlsbearbeitungInit", $parent);
}
IPS_SetScriptContent($IdSkript, "
/*******************************************************************************
Das Startscript dient lediglich dazu, dass der Sender RunScript für das
Bearbeitungsskript zur Verfügung gestellt wird.
*******************************************************************************/
IPS_RunScript($IdBefehlsbearbeitung);
?>");
echo "==================================================================\n\n";
echo "Es wurde das Skript Befehlsbearbeitung Init angelegt. \n";
echo "Das Skript hat die ID $IdSkript. \n";
echo "Diese ID muss in IPSView dem Image Button zugewiesen werden. \n\n";
echo "==================================================================\n";
SetValueInteger($IdZeiteingabe, 0);
SetValueInteger($IdSlot, 0);
SetValueInteger($IdSlotBis, 0);
SetValueBoolean($IdSlotVerstecken, true);
SetValueInteger($IdShiftWochen, 0);
SetzeDatum($parent, $IdShiftWochen, $AnzahlTage);
SetValueInteger($IdZifferZaehler, 0);
SetValueInteger($IdAnzahlWdh, 0);
SetValueString($IdZeitstringAn, $KeinZeitpunkt);
SetValueString($IdZeitstringAnFarbe, "00FF00");
SetValueString($IdZeitstringAus, $KeinZeitpunkt);
SetValueString($IdZeitstringAusFarbe, "");
SetValueInteger($IdZeitstempelAn, 0);
SetValueInteger($IdZeitstempelAus, 0);
SetValueInteger($IdBefehlArraySpeichern, 0);
SetValueInteger($IdObjekt, 0);
SetValueInteger($IdIndexTag, 0);
SetValueString($IdMeldung, "");
SetValueBoolean($IdMeldungVerstecken, true);
if (count(IPS_GetChildrenIDs($_IPS['SELF'])) == 0)
{
// Zyklisches Ereignis mit Abruf jede Minute - aber nicht aktiviert - anlegen
$IdEreignis = IPS_CreateEvent(1);
IPS_SetEventCyclic($IdEreignis, 0, 0, 0, 0, 2, 1);
IPS_SetParent($IdEreignis, $_IPS['SELF']);
echo "==================================================================\n\n";
echo "Es wurde das Ereignis zum minütlichen Aufruf des Skriptes angelegt. \n";
echo "Dieses muss noch aktiviert werden. \n\n";
echo "==================================================================\n";
}
}
/*******************************************************************************
Initialisierung der Daten beim Aufruf des Skriptes Befehlsbearbeitung Init.
Dabei werden alle in der Warteschlange abgearbeiteten Befehle entfernt. Sollte
es nicht abgearbeitete Befehle geben deren Zeitstempel kleiner oder gleich der
aktuellen Zeit ist so werden deren Slot Id gelb angezeigt. Hierbei handelt es
sich um einen Fall der nur dann eingetreten sein kann, wenn IPS inaktiv oder
der Aufruf des Skriptes per TimerEvent jede Minute nicht erfolgt ist. Mit dem
Start des TimerEvent werden diese Befehle dann ausgeführt. Will man dies
nicht, so sind diese vor dem Start des Timers zu manuell löschen.
*******************************************************************************/
if ($_IPS['SENDER'] =='RunScript')
{
SetValueString($IdDetailseite, "");
sleep(1);
SetValueString($IdDetailseite, $NameDetailseite);
SetValueInteger($IdZeiteingabe, 0);
SetValueInteger($IdSlot, 0);
SetValueInteger($IdSlotBis, 0);
SetValueBoolean($IdSlotVerstecken, true);
SetValueInteger($IdShiftWochen, 0);
SetzeDatum($parent, $IdShiftWochen, $AnzahlTage);
ErzeugeHTML(0, 0, true);
SetValueInteger($IdZifferZaehler, 0);
SetValueInteger($IdAnzahlWdh, 0);
SetValueString($IdZeitstringAn, $KeinZeitpunkt);
SetValueString($IdZeitstringAnFarbe, "00FF00");
SetValueString($IdZeitstringAus, $KeinZeitpunkt);
SetValueString($IdZeitstringAusFarbe, "");
SetValueInteger($IdZeitstempelAn, 0);
SetValueInteger($IdZeitstempelAus, 0);
SetValueInteger($IdBefehlArraySpeichern, 0);
SetValueInteger($IdObjekt, 0);
SetValueInteger($IdIndexTag, 0);
SetValueString($IdMeldung, "");
SetValueBoolean($IdMeldungVerstecken, true);
}
/*******************************************************************************
Das Skript ruft sich selbst jede Minute auf. Es erfolgt die Ausführung der
Befehle die zum Zeitpunkt des Befehls ausgeführt werden sollen. Danach wird
der Status auf 0 gesetzt.
*******************************************************************************/
if ($_IPS['SENDER'] =='TimerEvent')
{
if ($BefehlArray = @unserialize(GetValueString($IdBefehlArray)) === false)
{
return;
}
$BefehlArray = unserialize(GetValueString($IdBefehlArray));
$AnzahlBefehle = count($BefehlArray);
$Aenderung = false;
for ($i = 1; $i <= $AnzahlBefehle; $i++)
{
$Daten = explode(",", $BefehlArray[$i-1]);
if ($Daten[0] == 1)
{
$ObjektTyp = $Daten[1];
$Objekt = $Daten[2];
$Zeitpunkt = date("d.m.y - H:i", $Daten[3]);
$Level = $DimmerLevel;
$Status = true;
if ($Daten[4] == 1)
{
$Level = 0.0;
$Status = false;
}
if (!IPS_ObjectExists($Objekt))
{
continue;
}
// Es werden alle Befehle ausgeführt die älter oder gleich dem
// Zeitstempel des Befehls in der Warteschlange sind.
if ($Daten[3] <= time())
{
$ObjektArray = IPS_GetObject($Objekt);
if ($ObjektArray['ObjectType'] == $ObjektTyp)
{
// Bei Link TargetID holen
if ($ObjektTyp == 6)
{
$Objekt = IPS_GetLink($Objekt)['TargetID'];
if (IPS_ObjectExists($Objekt))
{
$ObjektTyp = IPS_GetObject($Objekt)['ObjectType'];
}
else
{
// toter Link
continue;
}
}
switch ($ObjektTyp) {
// Schalten von Aktoren
case 1:
if (@IPS_GetObjectIDByIdent("STATE", $Objekt))
{
HM_WriteValueBoolean($Objekt, "STATE", $Status);
}
else
{
if (@IPS_GetObjectIDByIdent("LEVEL", $Objekt))
{
HM_WriteValueFloat($Objekt, "LEVEL", $Level);
}
}
break;
// Schalten von Boolean Variablen
case 2:
SetValueBoolean($Objekt, $Status);
break;
// Ausführen von Scripten
case 3:
IPS_RunScript($Objekt);
break;
// Aktivieren bzw. Deaktivieren von Ereignissen
case 4:
IPS_SetEventActive($Objekt, $Status);
break;
}
}
$Daten[0] = 0;
$BefehlString = $Daten[0] . "," . $Daten[1] . "," . $Daten[2] . "," . $Daten[3] . "," . $Daten[4];
If ($BefehlString != $BefehlArray[$i-1])
{
$Aenderung = true;
$BefehlArray[$i-1] = $BefehlString;
SetValueString($IdBefehlArray, serialize($BefehlArray));
}
}
}
}
// Aktualisierung der Anzeige
if ($Aenderung)
{
ErzeugeHTML(0, 0, false);
}
}
/*******************************************************************************
Dieser Part dient der Eingabe, Prüfung und Löschung der Daten in IPSView.
*******************************************************************************/
if ($_IPS['SENDER']=='WebFront')
{
SetValueString($IdMeldung, "");
SetValueBoolean($IdMeldungVerstecken, true);
switch ($_IPS['VARIABLE'])
{
case $IdBefehlArraySpeichern:
Objektkontrolle(GetValueInteger($IdObjekt));
if (GetValueInteger($IdBefehlArraySpeichern) == 1)
{
Datenkontrolle();
if (GetValueString($IdMeldung) == "")
{
$AlterIndex = GetValueInteger($IdIndexTag);
$BefehlArray = @unserialize(GetValueString($IdBefehlArray));
for ($i = 0; $i <= GetValueInteger($IdAnzahlWdh); $i++)
{
$ObjektTyp = IPS_GetObject(GetValueInteger($IdObjekt))['ObjectType'];
if (GetValueString($IdZeitstringAn) != $KeinZeitpunkt)
{
$BefehlArray[] = "1," . $ObjektTyp . "," . GetValueInteger($IdObjekt) . "," . GetValueInteger($IdZeitstempelAn) . ",0";
}
if (GetValueString($IdZeitstringAus) != $KeinZeitpunkt)
{
$BefehlArray[] = "1," . $ObjektTyp . "," . GetValueInteger($IdObjekt) . "," . GetValueInteger($IdZeitstempelAus) . ",1";
}
if ($i != GetValueInteger($IdAnzahlWdh))
{
SetValueInteger($IdIndexTag, GetValueInteger($IdIndexTag) + 1);
if (GetValueString($IdZeitstringAn) != $KeinZeitpunkt)
{
SetValueInteger($IdZeitstempelAn, mktime(substr(GetValueString($IdZeitstringAn), 0, 2), substr(GetValueString($IdZeitstringAn), 3, 2), 0,
date("m"), date("d") + GetValueInteger($IdIndexTag) + GetValueInteger($IdShiftWochen), date("Y")));
}
if (GetValueString($IdZeitstringAus) != $KeinZeitpunkt)
{
SetValueInteger($IdZeitstempelAus, mktime(substr(GetValueString($IdZeitstringAus), 0, 2), substr(GetValueString($IdZeitstringAus), 3, 2), 0,
date("m"), date("d") + GetValueInteger($IdIndexTag) + GetValueInteger($IdShiftWochen), date("Y")));
}
}
}
SetValueInteger($IdIndexTag, $AlterIndex);
// nach dem Entfernen der doppelten Einträge, muss das Array neu sortiert werden, da die Schlüssel durch unique nicht verändert werden
$BefehlArray = array_unique($BefehlArray);
sort($BefehlArray);
SetValueString($IdBefehlArray, serialize($BefehlArray));
SortiereArray();
ErzeugeHTML(0, 0, false);
SetValueBoolean($IdMeldungVerstecken, false);
SetValueString($IdMeldungFarbe, "006400");
SetValueString($IdMeldung, $MeldungArray['Speichern']);
}
SetValueInteger($IdBefehlArraySpeichern, 0);
}
break;
case $IdSlotLoeschen:
if (GetValueInteger($IdSlot) == 9999)
{
$BefehlArray = array();
}
else
{
$BefehlArray = unserialize(GetValueString($IdBefehlArray));
array_splice($BefehlArray, GetValueInteger($IdSlot)-1, GetValueInteger($IdSlotBis) - GetValueInteger($IdSlot) + 1);
}
SetValueInteger($IdSlot, 0);
SetValueInteger($IdSlotBis, 0);
SetValueBoolean($IdSlotVerstecken, true);
SetValueString($IdBefehlArray, serialize($BefehlArray));
ErzeugeHTML(0, 0, false);
break;
default:
SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);
//echo $_IPS['VARIABLE'],$_IPS['VALUE'];
}
// Abfragen, welche Tasten betätigt worden sind
switch ($_IPS['VARIABLE'])
{
case $IdSortierung:
SortiereArray();
ErzeugeHTML(0, 0, false);
break;
case $IdObjekt:
Objektkontrolle(GetValueInteger($IdObjekt));
break;
case $IdShiftWochen:
SetzeDatum($parent, $IdShiftWochen, $AnzahlTage);
break;
case $IdZiffer:
if ($_IPS['VALUE'] == 99)
{
SetValueInteger($IdZifferZaehler, 0);
if (GetValueInteger($IdZeiteingabe) == 0)
{
SetValueString($IdZeitstringAn, $KeinZeitpunkt);
SetValueInteger($IdZeitstempelAn, 0);
}
else
{
SetValueString($IdZeitstringAus, $KeinZeitpunkt);
SetValueInteger($IdZeitstempelAus, 0);
}
}
else
{
$Zaehler = GetValueInteger($IdZifferZaehler);
if ($Zaehler == 0)
{
if (GetValueInteger($IdZeiteingabe) == 0)
{
SetValueString($IdZeitstringAn, $NullZeitpunkt);
}
else
{
SetValueString($IdZeitstringAus, $NullZeitpunkt);
}
}
if (GetValueInteger($IdZeiteingabe) == 0)
{
SetValueString($IdZeitstringAn, substr_replace(GetValueString($IdZeitstringAn), $_IPS['VALUE'], $Zaehler, 1));
}
else
{
SetValueString($IdZeitstringAus, substr_replace(GetValueString($IdZeitstringAus), $_IPS['VALUE'], $Zaehler, 1));
}
if ($Zaehler == 1)
{
$Zaehler ++;
}
$Zaehler ++;
if ($Zaehler == 5)
{
$Zaehler = 0;
}
SetValueInteger($IdZifferZaehler, $Zaehler);
}
break;
case $IdZeiteingabe:
SetValueInteger($IdZifferZaehler, 0);
if (GetValueInteger($IdZeiteingabe) == 0)
{
SetValueString($IdZeitstringAnFarbe, "00FF00");
SetValueString($IdZeitstringAusFarbe, "");
}
else
{
SetValueString($IdZeitstringAusFarbe, "FF0000");
SetValueString($IdZeitstringAnFarbe, "");
}
break;
case $IdSlot:
ErzeugeHTML(GetValueInteger($IdSlot), GetValueInteger($IdSlotBis), false);
if ((GetValueInteger($IdSlot) == 0) or
((GetValueInteger($IdSlot) > $AnzahlBefehle) and (GetValueInteger($IdSlot)!= 9999)))
{
SetValueInteger($IdSlot, 0);
SetValueInteger($IdSlotBis, 0);
SetValueBoolean($IdSlotVerstecken, true);
}
else
{
if (GetValueInteger($IdSlotBis) < GetValueInteger($IdSlot))
{
SetValueInteger($IdSlotBis, GetValueInteger($IdSlot));
ErzeugeHTML(GetValueInteger($IdSlot), GetValueInteger($IdSlotBis), false);
}
SetValueBoolean($IdSlotVerstecken, false);
SetValueInteger($IdBefehlArraySpeichern, 0);
}
break;
case $IdSlotBis:
ErzeugeHTML(GetValueInteger($IdSlot), GetValueInteger($IdSlotBis), false);
switch (GetValueInteger($IdSlotBis)) {
case 0:
SetValueInteger($IdSlot, GetValueInteger($IdSlotBis));
SetValueBoolean($IdSlotVerstecken, true);
break;
case 9999:
SetValueInteger($IdSlot, GetValueInteger($IdSlotBis));
SetValueBoolean($IdSlotVerstecken, false);
break;
default:
if ((GetValueInteger($IdSlotBis) > $AnzahlBefehle) or
(GetValueInteger($IdSlotBis) < GetValueInteger($IdSlot)))
{
SetValueInteger($IdSlotBis, GetValueInteger($IdSlot));
}
else
{
if (GetValueInteger($IdSlot) == 0)
{
SetValueInteger($IdSlot, 1);
SetValueBoolean($IdSlotVerstecken, false);
SetValueInteger($IdBefehlArraySpeichern, 0);
}
}
}
ErzeugeHTML(GetValueInteger($IdSlot), GetValueInteger($IdSlotBis), false);
break;
}
// De- bzw. Aktivierung des Speicher Button
if ((GetValueInteger($IdObjekt) == 0) or
(GetValueString($IdMeldung) != "") or
(GetValueInteger($IdSlot) > 0) or
((GetValueString($IdZeitstringAn) == $KeinZeitpunkt) and
(GetValueString($IdZeitstringAus) == $KeinZeitpunkt)))
{
SetValueInteger($IdBefehlArraySpeichern, 0);
}
else
{
SetValueInteger($IdBefehlArraySpeichern, 1);
}
}
/*******************************************************************************
Diese Funktion kontrolliert das ausgewählte Objekt Typ auf Zulässigkeit. Die
zulässigen Daten sind am Anfang des Skriptes aufgeführt. Im Fehlerfall wird der
Speicher Button wieder deaktiviert und die Meldung im Klartext angezeigt.
*******************************************************************************/
function Objektkontrolle($Objekt)
{
global $IdBefehlArraySpeichern, $IdMeldung, $MeldungArray, $IdMeldungFarbe, $IdMeldungVerstecken;
if (($Objekt == 0) or ($Objekt > 65535))
{
SetValueString($IdMeldung, $MeldungArray['ObjektId']);
}
else
{
if (IPS_ObjectExists($Objekt))
{
// Bei Link TargetID holen
$ObjektArray = IPS_GetObject($Objekt);
if ($ObjektArray['ObjectType'] == 6)
{
$Objekt = IPS_GetLink($Objekt)['TargetID'];
// toter Link
if (!IPS_ObjectExists($Objekt))
{
SetValueString($IdMeldung, $MeldungArray['Objektlink']);
}
}
}
else
{
SetValueString($IdMeldung, $MeldungArray['ObjektEx']);
}
}
if (GetValueString($IdMeldung) == "")
{
$ObjektArray = IPS_GetObject($Objekt);
switch ($ObjektArray['ObjectType']) {
case 0:
SetValueString($IdMeldung, $MeldungArray['Objektkategorie']);
break;
case 1:
if ((!@IPS_GetObjectIDByIdent("STATE", $Objekt)) and
(!@IPS_GetObjectIDByIdent("LEVEL", $Objekt)))
{
SetValueString($IdMeldung, $MeldungArray['Objektinstanz']);
}
break;
case 2:
$VarArray = IPS_GetVariable($Objekt);
if ($VarArray['VariableType'] > 0)
{
SetValueString($IdMeldung, $MeldungArray['Objektvariable']);
}
break;
case 5:
SetValueString($IdMeldung, $MeldungArray['Objektmedia']);
break;
}
}
if (GetValueString($IdMeldung) != "")
{
SetValueBoolean($IdMeldungVerstecken, false);
SetValueString($IdMeldungFarbe, "FF0000");
SetValueInteger($IdBefehlArraySpeichern, 0);
}
}
/*******************************************************************************
Diese Funktion sortiert das Array gemäss gewählter Sortierfolge.
*******************************************************************************/
function SortiereArray()
{
global $IdBefehlArray, $IdSortierung, $IdSlot, $IdSlotBis, $IdSlotVerstecken;
if ($BefehlArray = @unserialize(GetValueString($IdBefehlArray)) === false)
{
$BefehlArray = array();
$AnzahlBefehle = 0;
}
else
{
$BefehlArray = unserialize(GetValueString($IdBefehlArray));
$AnzahlBefehle = count($BefehlArray);
}
If ($AnzahlBefehle == 0)
{
return;
}
// Zerlegung des Arrays in 7 getrennte Arrays die per multisort sortiert werden
foreach ($BefehlArray as $key => $Datenstring)
{
$Daten = explode(",", $Datenstring);
$StatusArray[] = $Daten[0];
$ObjektTypArray[] = $Daten[1];
switch ($Daten[1]) {
case 1:
$ObjektTypTxtArray[] = "Instanz";
break;
case 2:
$ObjektTypTxtArray[] = "Variable";
break;
case 3:
$ObjektTypTxtArray[] = "Skript";
break;
case 4:
$ObjektTypTxtArray[] = "Ereignis";
break;
case 6:
$ObjektTypTxtArray[] = "Link";
break;
}
$ObjektArray[] = $Daten[2];
$ZeitstempelArray[] = $Daten[3];
$ArtArray[] = $Daten[4];
$NameArray[] = @IPS_GetName($Daten[2]);
}
// Multisort je nach Eingabe
$Sort = GetValueInteger($IdSortierung);
if ($Sort > 9)
{
$Sort = $Sort - 10;
}
switch ($Sort) {
case 0:
// Sortierung Standard gemäss Datenstruktur
array_multisort($StatusArray, $ObjektTypTxtArray, $ObjektArray, $ZeitstempelArray, $ArtArray, $NameArray, $ObjektTypArray);
break;
case 1:
// Sortierung nach Zeit, Name, Art
array_multisort($StatusArray, $ZeitstempelArray, $NameArray, $ArtArray, $ObjektTypTxtArray, $ObjektArray, $ObjektTypArray);
break;
case 2:
// Sortierung nach Name, Zeit, Art
array_multisort($StatusArray, $NameArray, $ZeitstempelArray, $ArtArray, $ObjektTypTxtArray, $ObjektArray, $ObjektTypArray);
break;
case 3:
// Sortierung nach Art, Zeit, Name
array_multisort($StatusArray, $ArtArray, $ZeitstempelArray, $NameArray, $ObjektTypTxtArray, $ObjektArray, $ObjektTypArray);
break;
case 4:
// Sortierung nach Art, Name, Zeit
array_multisort($StatusArray, $ArtArray, $NameArray, $ZeitstempelArray, $ObjektTypTxtArray, $ObjektArray, $ObjektTypArray);
break;
case 5:
// Sortierung nach Art, Typ, Name
array_multisort($StatusArray, $ArtArray, $ObjektTypTxtArray, $NameArray, $ZeitstempelArray, $ObjektArray, $ObjektTypArray);
break;
case 6:
// Sortierung nach Art, Typ, Zeit
array_multisort($StatusArray, $ArtArray, $ObjektTypTxtArray, $ZeitstempelArray, $NameArray, $ObjektArray, $ObjektTypArray);
break;
}
// Neuausgabe Befehlarray
$BefehlArray = array();
foreach ($StatusArray as $key => $Datenstring)
{
$BefehlArray[] = $StatusArray[$key] ."," . $ObjektTypArray[$key] . "," . $ObjektArray[$key] . "," . $ZeitstempelArray[$key] . "," . $ArtArray[$key];
}
// Array absteigend sortieren
if (GetValueInteger($IdSortierung) > 9)
{
$ReverseArray = array_reverse($BefehlArray);
SetValueString($IdBefehlArray, serialize($ReverseArray));
}
else
{
SetValueString($IdBefehlArray, serialize($BefehlArray));
}
SetValueInteger($IdSlot, 0);
SetValueInteger($IdSlotBis, 0);
SetValueBoolean($IdSlotVerstecken, true);
}
/*******************************************************************************
Diese Funktion kontrolliert die Daten auf Plausibiliät vor dem Speichern des
Datensatzes. Im Fehlerfall wird der Speicher Button wieder deaktiviert und
die Meldung im Klartext angezeigt.
*******************************************************************************/
function Datenkontrolle()
{
global $IdObjekt, $IdBefehlArraySpeichern, $IdZeitstempelAn, $IdZeitstempelAus, $IdZeitstringAn, $IdZeitstringAus, $KeinZeitpunkt,
$IdMeldung, $MeldungArray, $IdMeldungFarbe, $IdMeldungVerstecken, $IdIndexTag, $IdShiftWochen;
if ((GetValueString($IdZeitstringAn) == GetValueString($IdZeitstringAus)) and
(GetValueString($IdZeitstringAn) != $KeinZeitpunkt))
{
SetValueString($IdMeldung, $MeldungArray['Einausschaltzeitpunkt']);
}
if (GetValueString($IdZeitstringAn) != $KeinZeitpunkt)
{
if ((substr(GetValueString($IdZeitstringAn),0, 2) > 23) or
(substr(GetValueString($IdZeitstringAn),3, 2) > 59))
{
SetValueString($IdMeldung, $MeldungArray['Zeit']);
}
else
{
SetValueInteger($IdZeitstempelAn, mktime(substr(GetValueString($IdZeitstringAn), 0, 2), substr(GetValueString($IdZeitstringAn), 3, 2), 0,
date("m"), date("d") + GetValueInteger($IdIndexTag) + GetValueInteger($IdShiftWochen), date("Y")));
if (GetValueInteger($IdZeitstempelAn) <= time())
{
SetValueString($IdMeldung, $MeldungArray['Einschaltzeitpunkt']);
}
}
}
if (GetValueString($IdZeitstringAus) != $KeinZeitpunkt)
{
if ((substr(GetValueString($IdZeitstringAus),0, 2) > 23) or
(substr(GetValueString($IdZeitstringAus),3, 2) > 59))
{
SetValueString($IdMeldung, $MeldungArray['Zeit']);
}
else
{
SetValueInteger($IdZeitstempelAus, mktime(substr(GetValueString($IdZeitstringAus), 0, 2), substr(GetValueString($IdZeitstringAus), 3, 2), 0,
date("m"), date("d") + GetValueInteger($IdIndexTag) + GetValueInteger($IdShiftWochen), date("Y")));
if (GetValueInteger($IdZeitstempelAus) <= time())
{
SetValueString($IdMeldung, $MeldungArray['Ausschaltzeitpunkt']);
}
}
}
if (!IPS_ObjectExists(GetValueInteger($IdObjekt)))
{
SetValueString($IdMeldung, $MeldungArray['ObjektEx']);
}
if (GetValueString($IdMeldung) != "")
{
SetValueBoolean($IdMeldungVerstecken, false);
SetValueString($IdMeldungFarbe, "FF0000");
SetValueInteger($IdBefehlArraySpeichern, 0);
}
}
/*******************************************************************************
Diese Funktion erzeugt den String für die HTML Box in IPSView und ist für die
Anzeige auf einem iPad geeignet. Dabei werden die Slots, die im Bereich $SLot
bis $SlotBis liegen markiert dargestellt, da diese zum Löschen ausgewählt worden
sind. Der Aufruf kann wie folgt erfolgen:
$Slot = 0 : es wurde kein Slot zum Löschen ausgewählt
$Slot = 9999 : es wurden alle Slots zum Löschen ausgewählt
$Slot = 1-9998 : es wurde ein Slot zum Löschen ausgewählt
$SlotBis = 0 : es wurde kein Slot zum Löschen ausgewählt
$SlotBis = 9999 : es wurden alle Slots zum Löschen ausgewählt
$SlotBis = 1-9998 : es wurde ein Slot zum Löschen ausgewählt
$Steuerung = true : die ausgeführten Befehle werden aus der Anzeige entfernt
$Steuerung = false : die ausgeführten Befehle werden nicht aus der Anzeige
entfernt
*******************************************************************************/
function ErzeugeHTML($Slot, $SlotBis, $Steuerung)
{
global $IdBefehlArray, $IdBefehlArrayHTML, $AnzahlBefehle, $MeldungArray, $HTMLVariante;
if ($BefehlArray = @unserialize(GetValueString($IdBefehlArray)) === false)
{
$BefehlArray = array();
$AnzahlBefehle = 0;
}
else
{
$BefehlArray = unserialize(GetValueString($IdBefehlArray));
$AnzahlBefehle = count($BefehlArray);
}
// Entfernen der Befehle die bereits ausgeführt worden sind
if ($Steuerung)
{
$AusgabeArray = array();
for ($i = 1; $i <= $AnzahlBefehle; $i++)
{
$Daten = explode(",", $BefehlArray[$i-1]);
$Status = $Daten[0];
If ($Status == 1)
{
$AusgabeArray[] = $BefehlArray[$i-1];
}
}
if ($AusgabeArray != $BefehlArray)
{
SetValueString($IdBefehlArray, serialize($AusgabeArray));
if ($BefehlArray = @unserialize(GetValueString($IdBefehlArray)) === false)
{
$BefehlArray = array();
$AnzahlBefehle = 0;
}
else
{
$BefehlArray = unserialize(GetValueString($IdBefehlArray));
$AnzahlBefehle = count($BefehlArray);
}
}
}
switch ($HTMLVariante) {
case 1:
$StrHTML = "
Slot | Zeitpunkt | Typ | Objekt | Name des Objektes |
";
break;
case 2:
$StrHTML = "
Slot | Zeitpunkt |
Typ | Objekt | Name des Objektes |
";
break;
}
for ($i = 1; $i <= $AnzahlBefehle; $i++)
{
$Daten = explode(",", $BefehlArray[$i-1]);
$Status = $Daten[0];
if ($Status == 0)
{
$FarbeSlot = "red";
}
else
{
$FarbeSlot = "white";
if ($Daten[3] <= time())
{
$FarbeSlot = "yellow";
}
}
$ObjektTypTxt = "";
switch ($Daten[1]) {
case 1:
$ObjektTypTxt = "Instanz";
break;
case 2:
$ObjektTypTxt = "Variable";
break;
case 3:
$ObjektTypTxt = "Skript";
break;
case 4:
$ObjektTypTxt = "Ereignis";
break;
case 6:
$ObjektTypTxt = "Link";
break;
}
$Objekt = $Daten[2];
$Zeitpunkt = date("d.m.y - H:i", $Daten[3]);
if ($Daten[4] == 0)
{
$FarbeAnAus = "green";
}
else
{
$FarbeAnAus = "red";
}
if (IPS_ObjectExists($Objekt))
{
$Name = IPS_GetName($Objekt);
}
else
{
$Name = $MeldungArray['ObjektEx'];
}
If ((($i < $Slot) or ($i > $SlotBis)) and ($Slot != 9999))
{
switch ($HTMLVariante) {
case 1:
$StrHTML .= " Slot " . ($i) . " | $Zeitpunkt | $ObjektTypTxt | $Objekt | $Name |
";
break;
case 2:
$StrHTML .= "Slot $i | $Zeitpunkt | $ObjektTypTxt |
$Objekt | $Name |
";
break;
}
}
else
{
switch ($HTMLVariante) {
case 1:
$StrHTML .= " Slot " . ($i) . " | $Zeitpunkt | $ObjektTypTxt | $Objekt | $Name |
";
break;
case 2:
$StrHTML .= "Slot $i | $Zeitpunkt | $ObjektTypTxt |
$Objekt | $Name |
";
break;
}
}
}
switch ($HTMLVariante) {
case 1:
$StrHTML .= "
";
break;
case 2:
$StrHTML .= "
";
break;
}
SetValueString($IdBefehlArrayHTML, $StrHTML);
}
/*******************************************************************************
Die Generierung der Datumsfelder beruht auf einem Wochenrhythmus ausgehend vom
Tagesdatum.
*******************************************************************************/
function SetzeDatum($parent, $IdShiftWochen, $AnzahlTage)
{
$DayArray = array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
$TagArray = array("Mo","Di","Mi","Do","Fr","Sa","So","Mo","Di","Mi","Do","Fr","Sa","So");
$IdKategorie = CreateCategoryByIdent($parent, "Wochendaten", "Wochendaten", 1);
for ($k = 0; $k <= 6; $k++)
{
if ($DayArray[$k] == date("D", time()))
{
$Index = $k;
}
}
// Füllen der 7 Tagesvariablen und der Anzahl Tage für die Datumsvariablen
for ($i = 0; $i <= $AnzahlTage-1; $i++)
{
if ($i < 9)
{
if ($i < 7)
{
SetValueString(CreateVariableByIdent($IdKategorie, "Tag_0" . ($i+1), 3, "", "Tag_0" . ($i+1), 1, ""), $TagArray[$i+$Index]);
}
SetValueInteger(CreateVariableByIdent($IdKategorie, "Datum_0" . ($i+1), 1, "", "Datum_0" . ($i+1), 1, ""), mktime(0, 0, 0, date("m"), date("d") + $i+ GetValueInteger($IdShiftWochen), date("Y")));
}
else
{
SetValueInteger(CreateVariableByIdent($IdKategorie, "Datum_" . ($i+1), 1, "", "Datum_" . ($i+1), 1, ""), mktime(0, 0, 0, date("m"), date("d") + $i + GetValueInteger($IdShiftWochen), date("Y")));
}
}
}
/*******************************************************************************
Variable über ein Ident anlegen, soweit noch nicht vorhanden
$parent = Id der Instanz unter der die Variable angelegt werden soll
$name = Name der Variablen
$type = Typ der Variablen
0 = Boolean
1 = Integer
2 = Float
3 = String
$profile = Profil erzeugen
$ident = Ident anlegen zur eindeutigen Identifizierung
$position = Position der Variablen im Objektbaum
$aktion = Verweis auf ein Skript (Aktionsskript anlegen)
Es wird die Id der Variablen zurückgegeben.
*******************************************************************************/
function CreateVariableByIdent($parent, $name, $type, $profile, $ident, $position, $aktion="")
{
$IdVar = @IPS_GetObjectIDByIdent($ident, $parent);
if($IdVar === false)
{
$IdVar = IPS_CreateVariable($type);
IPS_SetParent($IdVar, $parent);
IPS_SetName($IdVar, $name);
IPS_SetPosition ($IdVar, $position);
IPS_SetInfo($IdVar, "this variable was created by script #". $_IPS['SELF']);
if($profile !== "") {IPS_SetVariableCustomProfile($IdVar, $profile);}
if($ident !=="") {IPS_SetIdent ($IdVar , $ident);}
if($aktion !=="") {IPS_SetVariableCustomAction($IdVar, $_IPS['SELF']);}
}
return $IdVar;
}
/*******************************************************************************
Kategorie über ein Ident anlegen, soweit noch nicht vorhanden
$parent = Id der Instanz unter der die Kategorie angelegt werden soll
$name = Name der Kategorie
$ident = Ident anlegen zur eindeutigen Identifizierung
$position = Position der Kategorie im Objektbaum
Es wird die Id der Kategorie zurückgegeben.
*******************************************************************************/
function CreateCategoryByIdent($parent, $name, $ident, $position)
{
$IdCat = @IPS_GetObjectIDByIdent ($ident, $parent);
if($IdCat === false)
{
$IdCat = IPS_CreateCategory ( ); //Kategorie anlegen
IPS_SetName($IdCat, $name); //Kategorie benennen
IPS_SetParent($IdCat, $parent);
IPS_SetPosition ($IdCat, $position);
if($ident !=="") {IPS_SetIdent ($IdCat, $ident);}
}
return $IdCat;
}
?>