'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, ""); 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 = ""; break; case 2: $StrHTML = "
SlotZeitpunktTypObjektName 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 .= ""; break; case 2: $StrHTML .= ""; break; } } else { switch ($HTMLVariante) { case 1: $StrHTML .= ""; break; case 2: $StrHTML .= ""; break; } } } switch ($HTMLVariante) { case 1: $StrHTML .= "
SlotZeitpunkt TypObjektName des Objektes
Slot " . ($i) . "$Zeitpunkt$ObjektTypTxt$Objekt$Name
Slot $i$Zeitpunkt$ObjektTypTxt $Objekt$Name
Slot " . ($i) . "$Zeitpunkt$ObjektTypTxt$Objekt$Name
Slot $i$Zeitpunkt$ObjektTypTxt $Objekt$Name
"; 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; } ?>