Aktuelle Aktion im Wochenplan herausfinden

Hallo an alle,

gibt es eine einfache Möglichkeit zu ermitteln welche Aktion gerade aktiv wäre wenn ich den Wochenplan z.B. 14.00 aktiv setze und
eine Aktion 13:00 bis 17:00 eingestellt ist. Dann ist diese ja gerade nicht ausgelöst worden da 13:00 schon vorbei ist aber normalerweise müsste sie laufen. Wie bekomme ich das einfach raus? …oder muss ich alle Wochentage einzeln mit php abfragen.

Keiner eine Idee?

Hat ein wenig länger gedauert. Hier ein Beispiel zum Berechnen. Es berücksichtigt nicht den Fall, dass der letzte, korrekte Schaltpunkt an einem vorherigen Tag hätte sein können. (Was der Wochenplan aber, wenn er über das WebFront konfiguriert wird, nie macht)


$e = IPS_GetEvent($id);
$actionID = false;
//Durch alle Gruppen gehen
foreach($e['ScheduleGroups'] as $g) {
    //Überprüfen ob die Gruppe für heute zuständig ist
    if($g['Days'] & (2 ** (date('N') - 1)) > 0) {
        //Aktuellen Schaltpunkt suchen. Wir nutzen die Eigenschaft, dass die Schaltpunkte immer aufsteigend sortiert sind.
        foreach($g['Points'] as $p) {
           if(date("H") * 3600 + date("i") * 60 + date("s") >= $p['Start']['Hour'] * 3600 + $p['Start']['Minute'] * 60 + $p['Start']['Second']) {
              $actionID = $p['ActionID'];
           } else {
              break; //Sobald wir drüber sind, können wir abbrechen.
           }
       }
        break; //Sobald wir unseren Tag gefunden haben, können wir die Schleife abbrechen. Jeder Tag darf nur in genau einer Gruppe sein.
    }
}

$action = false;
// Durch alle Aktionen gehen
foreach($e['ScheduleActions'] as $a) {
    if ($a["ID"] === $actionID) {
        $action = $a;
    }
}

var_dump($actionID);
var_dump($action);

paresy

Danke!! Teste ich morgen.

Hallo,
hab mal eine Funktion geschrieben mit der man die Eventzeitpunkte für eine Wochenplanereigniss bekommt


<?
$test = GetWeekplanState(15405 /*[TEST\WOCHENPLAN\]*/);
echo  $test['ActionName'] . " bis " . date("H:i", $test['EndSysTime']) . "
" ;

//                                      -- Stunde
//                                      |   -- Minuten
//                                      |   |   -- Sekunden
//                                      |   |   |   -- Monat
//                                      |   |   |   |   -- Tag
//                                      |   |   |   |   |     -- Jahr
//                                      |   |   |   |   |     |
$test = GetWeekplanState(15405 /*[TEST\SCHICHTPLAN\]*/, mktime(13, 00, 25, 02, 15, 2015));
print_r($test);

/****************************************************************************
GetWeekplanState,
  liest den Zustand eines gewünschten Wochenplanereignisses aus

  GetWeekplanStateGetWeekplanState(WochenplanID,[Abfragezeitpunkt_als_Systemzeit])
  
Example: $Zustand = GetWeekplanState(1234);
         oder
         $Zustand = GetWeekplanStateGetWeekplanState(1234,time()-24*3600)
    
[ActionID] => 4                          ==> Aktiver Zustand zum Abfragezeitpunkt
[ActionName] => FREI                     ==> Zustandsbezeichnung zum Abfragezeitpunkt
[CheckSysTime] => 1423986592             ==> Zeitpunkt fuer den die Ueberprufung gestartet wurde
[CheckTime] => 15.02.2015 08:49:52       ==> Formatierter Ueberpruefungszeitpunkt
[StartSysTime] => 1423861200             ==> Schaltpunkt wo der AKTIVE ZUSTAND aktiv wurde
[StartTime] => 13.02.2015 22:00:00       ==> Formatierter Startpunkt
[EndSysTime] => 1424034000               ==> Schaltpunkt wo der AKTIVE ZUSTAND verlassen wird
[EndTime] => 15.02.2015 22:00:00         ==> Formatierter Endpunkt
[Periode] => 172800                      ==> Zeitdauer des aktiven Zustand ins Sekunden
[PeriodeHours] => 48                     ==> Formatierte Zeitdauer STUNDEN
[PeriodeMinutes] => 0                    ==> Formatierte Zeitdauer MINUTEN
[PeriodeSeconds] => 0                    ==> Formatierte Zeitdauer SEKUNDEN
[PreviousActionID] => 2                  ==> Zustand der VOR dem aktuellen Zustand
[PreviousActionName] => 2-Mittelschicht  ==> Zustandsbezeichung vorherigen Zustand
[NextActionID] => 3                      ==> Zustand der den aktuellen Zustand beloest wird
[NextActionName] => 3-Nachtschicht       ==> Zustandsbezeichung zukuenftiges Zustandes
[WeekPlanID] => 15405                    ==> ID des Wochenplans
[WeekPlanName] => SCHICHTPLANTEST        ==> Name des Wochenplans
[WeekPlanActiv] => 1                     ==> Zustand ob der Wochenplan aktiv ist oder nicht 
    
ReleaseNotes:
15.02.2015 tgusi74
 + Function erstellt und geprüft
14.05.2015 tgusi74 #1
 + Fehler beseitigt mit Schaltpunkt um 00:00:00 am aktuellen Tag
15.05.2015 tgusi74 #2
 + Fehler beseitigt mit Schaltpunkt um 00:00:00 am Folgetag
28.12.2015 tgusi74 #3
 + Variablen frueher initialisiert
 + Wenn kein Tagesevent vorhanden, dann default 0
31.12.2015 tgusi74 #4
 + Diverse Aenderungen wegen ID=0 im Wochenplan
 + WeekPlanName, WeekPlanID, WeekPlanName hinzugefuegt
02.01.2016 tgusi74 #5
 + Komplettumbau der Funktion wegen diverser Fehler mit ID=0
06.01.2015 tgusi74 #6
 + Ausgeblendete Tage (Luecken) haben nicht funktioniert, 
   daher jetzt gesondert geprueft ==> DayFound
*****************************************************************************/

function GetWeekplanState($ID, $SysTimePoint=NULL, $CheckOnlySlot=false)
 {
   if($SysTimePoint == NULL)
     {
      $SysTimePoint = time();
     }

   $State = array();
   $State['ActionID']           = 0;
   $State['ActionName']         = "";
   $State['CheckSysTime']       = $SysTimePoint;
   $State['CheckTime']          = "01.01.1970 00:00:00";
   $State['StartSysTime']       = $SysTimePoint-86400*7;
   $State['StartTime']          = "01.01.1970 00:00:00";
   $State['EndSysTime']         = $SysTimePoint+86400*7;
   $State['EndTime']            = "01.01.1970 00:00:00";
   $State['Periode']            = 0;
   $State['PeriodeHours']       = 0;
   $State['PeriodeMinutes']     = 0;
   $State['PeriodeSeconds']     = 0;
   $State['PreviousActionID']   = 0;
   $State['PreviousActionName'] = "";
   $State['NextActionID']       = 0;
   $State['NextActionName']     = "";
   $State['WeekPlanID']         = $ID;
   $State['WeekPlanName']       = IPS_GetName($ID);
   $State['WeekPlanActiv']      = 0;

   $e = IPS_GetEvent($ID);
   if ($e['EventType'] != 2)
      {
       echo ("Bei der ID= " . $ID . " handelt es sich um keinen Wochenplan !! ==> ABBRUCH !!" . "
");
       return($State);
      }

   if ($e['EventActive'] == 1)
      {
       //#4 - Aktivstatus mitausgeben
       $State['WeekPlanActiv'] = 1;
      }

   //#3 Variablen vorinitialisieren
   $StartPointFound = false;
   $EndPointFound   = false;
   $DayEventFound   = false;
   $DayFound        = false;

   //Durch alle Gruppen gehen
   foreach($e['ScheduleGroups'] as $g)
     {
      //pruefen ob Gruppe fuer Zeitpunkt zustaendig
      if(($g['Days'] & pow(2,date("N",$SysTimePoint)-1)) > 0)
        {
         $DayFound        = true;
         $StartPointFound = false;
         $ActualSlotFound = false;
         $EndPointFound   = false;
         $State['StartSysTime'] = mktime(0,0,0,date("m",$SysTimePoint),date("d",$SysTimePoint),date("Y",$SysTimePoint));
         $SearchTimeActDay      = date("H",$SysTimePoint) * 3600 + date("i",$SysTimePoint) * 60 + date("s",$SysTimePoint);

         //Aktuellen Schaltpunkt suchen --> Wir nutzen die Eigenschaft, dass die Schaltpunkte immer aufsteigend sortiert sind.
         foreach($g['Points'] as $p)
           {
            $StartTimeActDaySlot  = $p['Start']['Hour'] * 3600 + $p['Start']['Minute'] * 60 + $p['Start']['Second'];
            $DayEventFound = true;

            if($SearchTimeActDay >= $StartTimeActDaySlot)
              {
               if($ActualSlotFound == false)
                 {
                  $ActualSlotFound = true;
                  $State['ActionID']     = $p['ActionID'];
                  $State['StartSysTime'] = mktime($p['Start']['Hour'],$p['Start']['Minute'],$p['Start']['Second'],date("m",$SysTimePoint),date("d",$SysTimePoint),date("Y",$SysTimePoint));
                 }
               else
                 {
                  $StartPointFound = true;
                  $State['PreviousActionID']  = $State['ActionID'];
                  $State['ActionID']          = $p['ActionID'];
                  $State['StartSysTime'] = mktime($p['Start']['Hour'],$p['Start']['Minute'],$p['Start']['Second'],date("m",$SysTimePoint),date("d",$SysTimePoint),date("Y",$SysTimePoint));
                 }
              }
            else
              {
               if($EndPointFound == false)
                 {
                  $EndPointFound   = true;
                  $State['NextActionID']     = $p['ActionID'];
                  $State['EndSysTime'] = mktime($p['Start']['Hour'],$p['Start']['Minute'],$p['Start']['Second'],date("m",$SysTimePoint),date("d",$SysTimePoint),date("Y",$SysTimePoint));
                 }
               else
                 {
                  break;
                 }
              }
           }
         break; //Sobald wir unseren Tag gefunden haben, können wir die Schleife abbrechen.
                //Jeder Tag darf nur in genau einer Gruppe sein.
        }
     }

     //wenn kein Tag gefunden wird ==> Tag ist ausgeblendet !!
     if($DayFound == false)
       {
        if($CheckOnlySlot == false)
          {
           for($i=0;$i<=7;$i++)
              {
               foreach($e['ScheduleGroups'] as $g)
                  {
                   //pruefen ob Gruppe fuer Zeitpunkt zustaendig
                   if(($g['Days'] & pow(2,date("N",$SysTimePoint)-1-$i)) > 0)
                     {
                      $DayFound=true;
                      break 2;
                     }
                  }
              }

           $State['StartSysTime'] = mktime(00,00,00,date("m",$SysTimePoint),date("d",$SysTimePoint)+1-$i,date("Y",$SysTimePoint));
          }

        for($i=0;$i<=6;$i++)
           {
            foreach($e['ScheduleGroups'] as $g)
               {
                //pruefen ob Gruppe fuer Zeitpunkt zustaendig
                if(($g['Days'] & pow(2,date("N",$SysTimePoint)-1+$i)) > 0)
                  {
                   $DayFound=true;
                   break 2;
                  }
               }
           }

        if($State['StartSysTime'] <= $SysTimePoint) 
          {
           $State['StartSysTime']=$SysTimePoint;
          }

        $State['CheckSysTime']   = mktime(00,00,00,date("m",$SysTimePoint),date("d",$SysTimePoint)-1+$i,date("Y",$SysTimePoint));
        $State['EndSysTime']     = mktime(00,00,00,date("m",$SysTimePoint),date("d",$SysTimePoint)-1+$i,date("Y",$SysTimePoint));
        $EndPointFound = false;
       }

  if($CheckOnlySlot == false)
    {

     //Startpunkt wurde zwar gefunden aber die ActionID ist 0 --> vorigen Schaltpunkt suchen
     if( ($StartPointFound == true) && ($State['ActionID'] == 0) )
       {
        do{
           $prevevent1 = GetWeekplanState($ID, $State['StartSysTime']-1 ,true);

           $State['StartSysTime']     = $prevevent1['StartSysTime'];
           $State['PreviousActionID'] = $prevevent1['ActionID'];

           if ( ($State['ActionID'] == 0) && ($prevevent1['ActionID'] != 0) )
              {
               $State['StartSysTime']     = $prevevent1['StartSysTime'];
               $State['ActionID']         = $prevevent1['ActionID'];
               $State['PreviousActionID'] = $prevevent1['PreviousActionID'];
               $DayEventFound = true;
              }
          } while(  ($State['ActionID'] == 0) && ($prevevent1['StartSysTime'] >= ($State['CheckSysTime']-86400*7)) );

        //Jetzt auch nochmals checken ob sich nicht auch der vorherige zu 0 veraendert hat
        if($State['PreviousActionID'] == 0)
          {
           $CheckTime1 = $State['StartSysTime'];

           do{
              $prevevent1 = GetWeekplanState($ID, $CheckTime1-1 ,true);

              $CheckTime1  = $prevevent1['StartSysTime'];

              if( ($State['PreviousActionID'] == 0) && ($prevevent1['ActionID'] != 0) )
                {
                 $State['PreviousActionID'] = $prevevent1['ActionID'];
                 $DayEventFound = true;
                }
             } while(  ($State['PreviousActionID'] == 0) && ($prevevent1['StartSysTime'] >= ($State['CheckSysTime']-86400*14)) ); //hier geht auch 7

           }
    }

    //Startpunkt liegt an einen der Vortage !!
    if($StartPointFound == false)
      {
       do{
          $prevevent1 = GetWeekplanState($ID, $State['StartSysTime']-1 ,true);

          if ( ($prevevent1['ActionID'] == 0) && ($prevevent1['PreviousActionID'] == 0) && ($prevevent1['NextActionID'] == 0) )
             {
              $State['StartSysTime'] = mktime(00,00,00,date("m",$prevevent1['StartSysTime']),date("d",$prevevent1['StartSysTime']),date("Y",$prevevent1['StartSysTime']));
             }
          elseif ( ($prevevent1['NextActionID'] == 0) && ($prevevent1['PreviousActionID'] == 0) && ($State['ActionID'] == $prevevent1['ActionID']) )
             {
              $State['StartSysTime'] = mktime(00,00,00,date("m",$prevevent1['StartSysTime']),date("d",$prevevent1['StartSysTime']),date("Y",$prevevent1['StartSysTime']));
             }
          else
             {
              $State['StartSysTime']     = $prevevent1['StartSysTime'];
              $State['PreviousActionID'] = $prevevent1['ActionID'];

              if( ($State['ActionID'] == 0) && ($prevevent1['ActionID'] != 0) )
                {
                 $State['StartSysTime']     = $prevevent1['EndSysTime']; //??
                 $State['ActionID']         = $prevevent1['ActionID'];
                 $State['PreviousActionID'] = $prevevent1['PreviousActionID'];
                 if($prevevent1['NextActionID'] == 0)
                   {
                    $State['StartSysTime'] = $prevevent1['StartSysTime'];
                   }

                 $DayEventFound = true;
                }
             }
          } while( ( ($State['ActionID'] == 0) || ($State['ActionID'] == $prevevent1['PreviousActionID']) )&& ($prevevent1['StartSysTime'] >= ($State['CheckSysTime']-86400*14)) );


          //Checken ob nicht doch der vorherige Schaltpunkt jetzt 0 ist
          if($State['PreviousActionID'] == 0)
            {
             $CheckTime1 = $State['StartSysTime'];

             do{
                $prevevent1 = GetWeekplanState($ID, $CheckTime1-1 ,true);
                if ( ($prevevent1['ActionID'] == 0) && ($prevevent1['PreviousActionID'] == 0) && ($prevevent1['NextActionID'] == 0) )
                   {
                    $CheckTime1 = mktime(00,00,00,date("m",$prevevent1['StartSysTime']),date("d",$prevevent1['StartSysTime']),date("Y",$prevevent1['StartSysTime']));
                   }
                else
                   {
                    $CheckTime1  = $prevevent1['StartSysTime'];
                   }

                if ( ($State['PreviousActionID'] == 0) && ($prevevent1['ActionID'] != 0) )
                   {
                    $State['PreviousActionID'] = $prevevent1['ActionID'];
                    $DayEventFound = true;
                   }
               } while(  ($State['PreviousActionID'] == 0) && ($prevevent1['StartSysTime'] >= ($State['CheckSysTime']-86400*14)) );
            }
      }

    //Vorheriger Schaltpunkt hat selben Status wie ActionID --> somit vorherigen Schaltpunkt fuer VORGAENGER suchen
    if ($State['ActionID'] == $State['PreviousActionID'])
       {
        $CheckTime1 = $State['StartSysTime'];

        do{
           $prevevent1 = GetWeekplanState($ID, $CheckTime1-1 ,true);

           if( ($prevevent1['ActionID'] == 0) && ($prevevent1['PreviousActionID'] == 0) && ($prevevent1['NextActionID'] == 0) )
             {
              $CheckTime1 = mktime(00,00,00,date("m",$prevevent1['StartSysTime']),date("d",$prevevent1['StartSysTime']),date("Y",$prevevent1['StartSysTime']));
             }
           elseif( ($prevevent1['NextActionID'] == 0) && ($prevevent1['PreviousActionID'] == 0) )
             {
              $CheckTime1 = mktime(00,00,00,date("m",$prevevent1['StartSysTime']),date("d",$prevevent1['StartSysTime']),date("Y",$prevevent1['StartSysTime']));
             }
           else
             {
              $CheckTime1 = $prevevent1['StartSysTime'];

              if( ($State['PreviousActionID'] != $prevevent1['ActionID']) && ($prevevent1['ActionID'] != 0) )
                {
                 $State['PreviousActionID'] = $prevevent1['ActionID'];
                 $State['StartSysTime']     = $prevevent1['EndSysTime'];
                 $DayEventFound = true;
                }
             }
           } while(  ($State['PreviousActionID'] == $State['ActionID']) && ($prevevent1['StartSysTime'] >= ($State['CheckSysTime']-86400*7)) );
       }


    //Endpunkt wurde zwar gefunden aber der naechste Schaltpunkt ist 0
    if( ($EndPointFound==true) && ($State['NextActionID'] == 0) )
      {
       $CheckTime1 = $State['EndSysTime'];

       do{
          $nextevent1 = GetWeekplanState($ID, $CheckTime1,true);

          if( ($nextevent1['ActionID'] == 0) && ($nextevent1['PreviousActionID'] == 0) && ($nextevent1['NextActionID'] == 0) )
            {
             $CheckTime1 = mktime(0,0,0,date("m",$nextevent1['StartSysTime']),date("d",$nextevent1['StartSysTime'])+1,date("Y",$nextevent1['StartSysTime']));
            }
         elseif( ($nextevent1['NextActionID'] == 0) && ($nextevent1['PreviousActionID'] == 0) )
            {
             $CheckTime1 = mktime(0,0,0,date("m",$nextevent1['StartSysTime']),date("d",$nextevent1['StartSysTime'])+1,date("Y",$nextevent1['StartSysTime']));
            }
         else
            {
             $CheckTime1 = $nextevent1['EndSysTime'];

             if( ($State['NextActionID'] != $nextevent1['ActionID']) || ($nextevent1['ActionID'] != 0) )
               {
                $State['NextActionID']  = $nextevent1['ActionID'];
                $State['EndSysTime']    = $nextevent1['StartSysTime'];
                $DayEventFound = true;
               }
            }
         } while( ($State['NextActionID'] == 0) && ($State['EndSysTime'] <= ($State['CheckSysTime']+86400*7)) );
      }



    //Endpunkt liegt an einen der Folgetage !!
    if($EndPointFound==false)
      {
       if(($State['StartSysTime']+86400*6) < $State['CheckSysTime'])
         {
          $State['CheckSysTime'] = ($State['StartSysTime']+86400*6);
         }

       $State['EndSysTime'] = mktime(0,0,0,date("m",$State['CheckSysTime']),date("d",$State['CheckSysTime'])+1,date("Y",$State['CheckSysTime']));

       do{
          $nextevent1 = GetWeekplanState($ID, $State['EndSysTime'],true);

          if( ($nextevent1['ActionID'] == 0) && ($nextevent1['PreviousActionID'] == 0) && ($nextevent1['NextActionID'] == 0) )
            {
             $State['EndSysTime'] = mktime(0,0,0,date("m",$nextevent1['StartSysTime']),date("d",$nextevent1['StartSysTime'])+1,date("Y",$nextevent1['StartSysTime']));
            }
          elseif( ($nextevent1['NextActionID'] == 0) && ($nextevent1['PreviousActionID'] == 0) )
            {
             $State['EndSysTime'] = mktime(0,0,0,date("m",$nextevent1['StartSysTime']),date("d",$nextevent1['StartSysTime'])+1,date("Y",$nextevent1['StartSysTime']));
            }
          else
            {
             $State['EndSysTime']   = $nextevent1['StartSysTime'];
             $State['NextActionID'] = $nextevent1['ActionID'];

             if( ($State['NextActionID'] == 0) || ($State['ActionID'] == $nextevent1['ActionID']) )
               {
                $State['EndSysTime']     = $nextevent1['EndSysTime'];
                $DayEventFound = true;
               }
            }
          } while( ( ($State['ActionID'] == $nextevent1['ActionID']) || ($State['NextActionID']  == $nextevent1['NextActionID']) )&& ($State['EndSysTime'] <= ($State['CheckSysTime']+86400*7)) );


       //Wenn es kein Abloesezeitpunkt (nur ein Event im Wochenplan) gibt !!
       if( ($State['EndSysTime'] >= ($State['CheckSysTime']+86400*7)) && ($State['NextActionID']== 0) )
         {
          $State['NextActionID'] = $State['ActionID'];
         }


       //Wenn naechster Schaltpunkt = 0 ist --> Folgeevent suchen !!
       if( ($State['NextActionID'] == 0) && ($State['ActionID'] != 0) && ($State['PreviousActionID'] != 0) )
         {
          $CheckTime1 = mktime(0,0,0,date("m",$State['CheckSysTime']),date("d",$State['CheckSysTime'])+1,date("Y",$State['CheckSysTime']));

          do{
             $nextevent1 = GetWeekplanState($ID, $CheckTime1,true);

             if( ($nextevent1['ActionID'] == 0) && ($nextevent1['PreviousActionID'] == 0) && ($nextevent1['NextActionID'] == 0) )
               {
                $CheckTime1 = mktime(0,0,0,date("m",$nextevent1['StartSysTime']),date("d",$nextevent1['StartSysTime'])+1,date("Y",$nextevent1['StartSysTime']));
               }
             elseif( ($nextevent1['NextActionID'] == 0) && ($nextevent1['PreviousActionID'] == 0) )
               {
                $CheckTime1 = mktime(0,0,0,date("m",$nextevent1['StartSysTime']),date("d",$nextevent1['StartSysTime'])+1,date("Y",$nextevent1['StartSysTime']));
               }
             else
               {
                $CheckTime1     = $nextevent1['EndSysTime'];

                if( ($State['NextActionID'] != $nextevent1['ActionID']) || ($nextevent1['ActionID'] != 0) )
                  {
                   $State['NextActionID']  = $nextevent1['ActionID'];
                   $State['EndSysTime']    = $nextevent1['StartSysTime'];
                   $DayEventFound = true;
                  }
               }
            } while( ($State['NextActionID'] == 0) && ($State['EndSysTime'] <= ($State['CheckSysTime']+86400*7)) );
         }


       //Wenn alle 3 Schaltpunkte gleich sind, dann Ueberpruefungszeitpunkt zurueckliefern (Kein oder nur EIN Event im Wochenplan)
       if( ($State['ActionID'] == $State['PreviousActionID']) && ($State['ActionID'] == $State['NextActionID']) )
         {
          $State['StartSysTime'] = $SysTimePoint;
          $State['EndSysTime']   = $SysTimePoint;
         }


      }
    }



  $State['CheckSysTime']   = $SysTimePoint;
  $State['CheckTime']      = date("d.m.Y H:i:s",$State['CheckSysTime']);
  $State['StartTime']      = date("d.m.Y H:i:s",$State['StartSysTime']);
  $State['EndTime']        = date("d.m.Y H:i:s",$State['EndSysTime']);

  $State['Periode']        = $State['EndSysTime'] - $State['StartSysTime'];
  $State['PeriodeHours']   = floor($State['Periode'] / 3600);
  $State['PeriodeMinutes'] = $State['Periode']       / 60   % 60;
  $State['PeriodeSeconds'] = $State['Periode']              % 60;

  foreach($e['ScheduleActions'] as $n)
    {
     if ($n['ID'] == $State['ActionID'])
        {
         $State['ActionName'] = $n['Name'];
        }

     if($n['ID'] == $State['PreviousActionID'])
       {
        $State['PreviousActionName'] = $n['Name'];
       }

     if($n['ID'] == $State['NextActionID'])
       {
        $State['NextActionName'] = $n['Name'];
       }
    }

   return($State);
 }


?>

tgusi74

WOCHENPLANTESTs_GetWeekplanState_20160102.pdf (391 KB)

Function_GetWeekplanState_V6_20160106.zip (3.68 KB)

Danke für das Skript! Ist wirklich sehr nützlich.
Ich wollte mich heute schon selbst dran setzen und eins schreiben. Gut, dass ich vorher die Foren-Suche bemüht habe. :slight_smile:

Gruß
Slummi

Ich habe das o.g. Skript aktualisiert, sodass es kein Problem mehr mit Zeitzonen hat.

paresy

Ein tolles Script von tgusi74. Ganz verstanden habe ich es noch nicht.
Ich benötige, in einem Script, den letzten Schaltvorgang von heute und den ersten von morgen. Wie müsste da der(die) GetWeekplanState Aufruf(e) aussehen?

Hallo,
wenn ich dich richtig verstanden habe, würde ich zum Zeitpunkt 23:59:59 suchen (letztmöglicher Schaltpunkt von heute)

$test = GetWeekplanState($ID  , mktime(23, 59, 59, date("m"), date("d"), date("Y")));
print_r($test);

Array
(
    [ActionID] => 3
    [ActionName] => 3-Nachtschicht
    [CheckSysTime] => 1431467999
    [CheckTime] => 12.05.2015 23:59:59
    [StartSysTime] => 1431460800
    [StartTime] => 12.05.2015 22:00:00
    [EndSysTime] => 1431489600
    [EndTime] => 13.05.2015 06:00:00
    [Periode] => 28800
    [PeriodeHours] => 8
    [PeriodeMinutes] => 0
    [PeriodeSeconds] => 0
    [PreviousActionID] => 2
    [PreviousActionName] => 2-Mittelschicht
    [NextActionID] => 1
    [NextActionName] => 1-Fruehschicht
)

Bei Fragen einfach melden,
tgusi74

Ja danke.
Als ich abends ins Bett wollte viel es mir auch ein. Mit 23:59:59 habe ich was ich will. Manchmal hat man einen Knoten im Hirn. :slight_smile:

Einen hab ich noch.

Wie bekommt man die Zeiten von einem bestimmten Wochentag?

Aus gegebenen Anlass benötige ich ‚heute‘ die Schaltzeiten ‚von Sonntag‘. Da heute Feiertag ist (BoolVariable vorhanden) möchte ich die Wochenplan - Daten von Sonntag nutzen.

PS: Schönen Feiertag!

Hallo,
den ersten Schaltpunkt für SONNTAG kann man so ermitteln

    $test = GetWeekplanState($ID  , mktime(00, 00, 00, date("m"), date("d")+ 7 - date("N"), date("Y")));
    print_r($test);

… aber das ist ja nur die halbe Wahrheit,
den es stimmen ja die „Timerauslösungen für den Sonntag“ nicht (Wochenplan weis ja nichts von Feiertage) bzw. heist es ja noch lange nicht das die Zustandübergänge (Wochentag / Sonntag / Wochentag) dann stimmt ==> das musst Du dir dann selbst überlegen wie Du das in die Scripte gebacken bekommst !!

… eine Liste der Schaltpunkte auch so

   $e = IPS_GetEvent(15405);
   //Durch alle Gruppen gehen
   foreach($e['ScheduleGroups'] as $g)
     {
      //pruefen ob Gruppe fuer Zeitpunkt zustaendig ==> 2 hoch 6 = 64 ==> SONNTAG
      if(($g['Days'] & pow(2,6)) > 0)
        {
         foreach($g['Points'] as $p)
           {
             print(date("d.m.Y H:i:s",mktime($p['Start']['Hour'], $p['Start']['Minute'], $p['Start']['Second'], date("m"), date("d")+ 7 - date("N"), date("Y")))). " - ActionID = " . $p['ActionID'] . "
";
           }
        }
     }

Zum gegeben Anlass „FEIERTAG“ gleich noch eine Funktion zum ermittelen eines Feiertages

if (CheckIsHoliday() == true)
   {
    print("FEIERTAG" . "
");
    }
else
   {
    print("KEIN FEIERTAG" . "
");
    }



/****************************************************************************
CheckIsHoliday,
  prueft ob heute eine Feiertag ist
  
Example: if (CheckIsHoliday(mktime(0, 0, 0, 5, 15, 2015)) == true)
                {
                print("DES CHECKZEITPUNKT LIEGT AUF EINEN FEIERTAG");
                }

ReleaseNotes:
15.05.2015 tgusi74 
 + Funktion von JAVA-Script des DATE-TIME-PICKER uebernommen und angepasst
*****************************************************************************/
function CheckIsHoliday($SysTimePoint=NULL)
 {
  if($SysTimePoint == NULL)
    {
     $SysTimePoint = time();
    }

  $ActDay   = date("j",$SysTimePoint);
  $ActMonth = date("n",$SysTimePoint);
  $Holiday = false;

  //Variable Feiertage
  $Aschermittwoch       = GetEasterOffset(date("Y",$SysTimePoint),-46);
  $Palmsonntag          = GetEasterOffset(date("Y",$SysTimePoint),-7);
  $Karfreitag           = GetEasterOffset(date("Y",$SysTimePoint),-2);
  $Ostersonntag         = GetEasterOffset(date("Y",$SysTimePoint),0);
  $Ostermontag          = GetEasterOffset(date("Y",$SysTimePoint),1);
  $Christihimmelfahrt   = GetEasterOffset(date("Y",$SysTimePoint),39);
  $Pfingstsonntag       = GetEasterOffset(date("Y",$SysTimePoint),49);
  $Pfingstmontag        = GetEasterOffset(date("Y",$SysTimePoint),50);
  $Fronleihnam          = GetEasterOffset(date("Y",$SysTimePoint),60);
  if ( ($ActDay == $Palmsonntag['Day'])        && ($ActMonth == $Palmsonntag['Month']) )          $Holiday = true;
  if ( ($ActDay == $Ostersonntag['Day'])       && ($ActMonth == $Ostersonntag['Month']) )         $Holiday = true;
  if ( ($ActDay == $Ostermontag['Day'])        && ($ActMonth == $Ostermontag['Month']) )           $Holiday = true;
  if ( ($ActDay == $Christihimmelfahrt['Day']) && ($ActMonth == $Christihimmelfahrt['Month']) )   $Holiday = true;
  if ( ($ActDay == $Pfingstsonntag['Day'])     && ($ActMonth == $Pfingstsonntag['Month']) )       $Holiday = true;
  if ( ($ActDay == $Pfingstmontag['Day'])      && ($ActMonth == $Pfingstmontag['Month']) )        $Holiday = true;
  if ( ($ActDay == $Fronleihnam['Day'])        && ($ActMonth == $Fronleihnam['Month']) )          $Holiday = true;

  //Fixe Feiertage --> OESTERREICH
  if ( ($ActDay ==  1) && ($ActMonth ==  1) ) $Holiday = true;
  if ( ($ActDay ==  6) && ($ActMonth ==  1) ) $Holiday = true;
  if ( ($ActDay ==  1) && ($ActMonth ==  5) ) $Holiday = true;
  if ( ($ActDay == 15) && ($ActMonth ==  8) ) $Holiday = true;
  if ( ($ActDay == 26) && ($ActMonth == 10) ) $Holiday = true;
  if ( ($ActDay ==  1) && ($ActMonth == 11) ) $Holiday = true;
  if ( ($ActDay ==  8) && ($ActMonth == 12) ) $Holiday = true;
  if ( ($ActDay == 24) && ($ActMonth == 12) ) $Holiday = true;
  if ( ($ActDay == 25) && ($ActMonth == 12) ) $Holiday = true;
  if ( ($ActDay == 26) && ($ActMonth == 12) ) $Holiday = true;
  if ( ($ActDay == 31) && ($ActMonth == 12) ) $Holiday = true;

  return ($Holiday);
 }




/****************************************************************************
GetEasterOffset,
  berechnet das Datum aufgrund des Offsets zum Ostersonntag

  ==> Ostern ist seit dem Jahr 325 als der erste Sonntag nach dem ersten Vollmond
      des Frühlings definiert.

  ==> Carl Friedrich Gauss hat 1800 eine Osterformel entwickelt,
      die die Hinzuziehung von astronomischen Tafeln überflüssig macht

  ==> Wichtige Feiertage:
      $Aschermittwoch       = getEasterOffset(date("Y"),-46);
      $Palmsonntag          = getEasterOffset(date("Y"),-7);
      $Karfreitag           = getEasterOffset(date("Y"),-2);
      $Ostersonntag         = getEasterOffset(date("Y"),0);
      $Ostermontag          = getEasterOffset(date("Y"),1);
      $Christihimmelfahrt   = getEasterOffset(date("Y"),39);
      $Pfingstsonntag       = getEasterOffset(date("Y"),49);
      $Pfingstmontag        = getEasterOffset(date("Y"),50);
      $Fronleihnam          = getEasterOffset(date("Y"),60);


GetEasterOffset([JAHRESZAHL FUER WELCHES JAHR BERECHNET WERDEN SOLL],[OFFSET ZUM OSTERSONNTAG]);

Example: $datum = GetEasterOffset(2015,39);

[Day] => 14               ==> Tag
[Month] => 5              ==> Monat
[Year] => 2015            ==> Jahr


ReleaseNotes:
14.05.2015 tgusi74
 + Funktion von JAVA-Script des DATE-TIME-PICKER uebernommen
*****************************************************************************/
function GetEasterOffset($Year, $OffsetDays)
{
 $OffsetDate = array();
 $OffsetDate['Day']   = 1;
 $OffsetDate['Month'] = 1;
 $OffsetDate['Year']  = 1970;

 $a=$Year%19;
 $b=floor($Year/100);
 $c=$Year%100;
 $d=floor($b/4);
 $e=$b%4;
 $f=floor(($b+8)/25);
 $g=floor(($b-$f+1)/3);
 $h=(19*$a+$b-$d-$g+15)%30;
 $i=floor($c/4);
 $k=$c%4;
 $l=(32+2*$e+2*$i-$h-$k)%7;
 $m=floor(($a+11*$h+22*$l)/451);
 $n=$h+$l-7*$m+114;

 $EasterMonth = floor($n/31);
 $EasterDay   = $n%31+1;
 $Offset = mktime(0,0,0,$EasterMonth,$EasterDay+$OffsetDays,$Year);

 $OffsetDate['Day']   = date("j",$Offset);  //Day   1-31
 $OffsetDate['Month'] = date("n",$Offset);  //Month 1-12
 $OffsetDate['Year']  = date("Y",$Offset);

 return ($OffsetDate);
}

Viel Spass,
tgusi74

An alle die den Script / Funktion „GetWeekplanState“ benutzen

Habe hier einen BUG ausgebessert,
wenn ein „REALER SCHALTPUNKT“ auf 00:00:00 gelegen ist wurde der Startzeitpunkt falsch ermittelt

Bitte Script austauschen ==> Script liegt im Beitrag 5 !!

[b]

[EDIT 15.05.2015] ==> BITTE NOCHMALS KOPIEREN !!![/b]

tgusi74

Ich habe das Script eingebaut. Offenbar wird aber nicht berücksichtigt, dass es unterschiedliche Gruppen geben kann. Bei mir jedenfalls kommt immer die ActionID vom Wochentag, obwohl ich zwei Gruppen habe und heute Sonntag ist.
Ich werde mal sehen, ob ich das hinbekomme, da ich die Struktur nicht so genau kenne.

An Hand des anderen Scriptes weiter unten habe ich dann die Lösung gefunden.


      //Überprüfen ob die Gruppe für heute zuständig ist
      //date("N")= numerischer Wochentag 1=Montag.. 7=Sonntag
//      if($g['Days'] & date("N") > 0)
      $SysTimePoint = time();
      if(($g['Days'] & pow(2, date("N",$SysTimePoint)-1)) > 0)

Hallo,
voerst mal an alle ein „GUTES NEUES JAHR 2016 bleibt Gesund und habt Spass mit IPS“

An alle die den Script / Funktion „GetWeekplanState“ benutzen

Bitte Script austauschen ==> Script liegt im Beitrag 5 !! (Aktuelle Aktion im Wochenplan herausfinden - GetWeekplanState ==> Zum Abfragen eines Zustandes zu einen beliebigen Zeitpunkt)

Der BUG-Fix soll nun auch zuverlässig mit „augeblendeten Tagen“, „nur ein Event eingetragen“, „kein Event eingetragen“ umgehen können

tgusi74

Danke für die Verbesserungen.
Ich werde das gleich bei mir austauschen.
Eine kleine Anmerkung.
Wir haben das Jahr 2016 beim Änderungseintrag #5. Man muss sich erst einmal dran gewöhnen.

Danke für den Hinweis,
ist jetzt ausgebessert

Bitte gib auch Feedback von deinen Test’s ==> jetzt ist das bei mir noch firsch und ein weiterer Bugfix würde schneller gehen hoffe aber das Du keinen findest :slight_smile:

tgusi74

An alle die den Script / Funktion „GetWeekplanState“ benutzen

Bitte Script austauschen ==> Script liegt im Beitrag #5 !! (Aktuelle Aktion im Wochenplan herausfinden - GetWeekplanState ==> Zum Abfragen eines Zustandes zu einen beliebigen Zeitpunkt)

Der BUG-Fix soll nun wirklich zuverlässig mit „augeblendeten Tagen“ umgehen können

tgusi74

Herzlichen Dank tgusi74 für das tolle Script.
Es hilft mir bei meinem aktuellen Vorhaben wirklich sehr.

Viele Grüße.

Hallo, ich habe jetzt schon eine ganze Zeit mehrere
Wochenpläne im einsatz, allerdings nur welche von Montag bis Sonntag.
Ich lese mit dem Get_Weekplan_State_V6 den aktuelle Verplanung aus.
Jetzt Habe ich vor einigen Wochen auf Wochenpläne umgestellt
die das Wochenende seperat verplanen lassen. Und ich bekomme
einfach nicht den Aktionname der Wochenpläne am Wochenende aus.
Immer nur von den Wochentagen.

wer weiß was ich falsch mache.