+ Antworten
Ergebnis 1 bis 9 von 9
  1. #1
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,326

    Standard Wochenplan auslesen

    Hallo Leute,

    es gibt bereits mehrere Einträge zu diesem Thema, gleichwohl ist mir nicht klar welche Version aktuell die Beste ist...
    - Wie lese ich den aktuellen Zustand im Wochenplan aus?
    - Gibt es eine Nachricht die ich "abonieren" kann wenn ein eingetragenes Ereignis beginnt oder endet? Oder muss das zyklisch eingelesen werden?

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  2. #2
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,326

    ...da es offensichtlich hier keine Innovationsprünge gab, verwende ich jetzt dieses: LINK
    - Nachrichten werden dazu offenbar auch nicht versandt wenn ein Wechsel der Aktivität stattfindet, so dass hier dann in der Konsequenz ein minütliches Pollen angesagt ist?

    - Wie kann ich bei der Erstellung des Modules alle Zeiträume z.B. mit ID 0 "vorbefüllen"? (Ohne das die Bestandsdaten die ggf. vorhanden sind überschrieben werden, jedoch "unbestimmte" Zeiträume nicht vorkommen können?

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  3. #3
    Registriert seit
    Feb 2005
    Ort
    Lübeck
    Beiträge
    20,427

    Was möchtest du denn erreichen? Der Wochenplan (wenn er unter einem Skript hänge) ruft diese ja bei jedem Wechsel auf. Somit kannst du sehr wohl darauf reagieren. Falls du von "außerhalb" dies mitbekommen willst, geht es über die MessageSink und PHP-Modul. Nall-Chan hat da eins im Angebot, wenn ich mich recht entsinne.

    Für deine zweite Frage gibt es nichts "fertiges". Da musst du dich selber drum' kümmern.

    paresy

  4. #4
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,326

    Hallo Paresy,

    zunächst einmal war die Idee für ein PHP-Modul einen Wochenplan (Mo, Di, Mi, Do, Fr, Sa, So) zu erstellen in dem nur tägliche eine Sperrzeit" definiert wird. Ich stellte dann fest, dass im Webfront dann immer der ganze Tag - unabhängig von der Eingabe - gesetzt wurde...
    Also habe ich nun zwei Möglichkeiten definiert: Sperrzeiten und Freigabe.
    So weit, so gut...
    Jetzt geht es darum festzustellen, in welcher Phase (Sperrzeit, Freigabe oder undefiniert (wenn der Wochenplan noch gar nicht gefüllt wurde)) ich mich befinde. Dazu benutzt ich Dein Skript aus dem oben verlinktem Thread.
    Jedoch sind die Ergebnisse die ich nun testweise alle 60 Sekunden ausführe, nicht so richtig nachvollziehbar.
    Obwohl für den jetzigen Zeitpunkt etwas definiert ist, ist das Ergebnis des Skriptes offenbar "0", vergeben wurden für Freigabe ID 1 und für die Sperrzeit die ID 2.
    Möglicherweise ist mein Ansatz hier zum Umgang mit dem Wochenplan nicht ganz korrekt...

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  5. #5
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,326

    ---was mache ich:
    Im ApplyChanges:
    PHP-Code:
    $this->RegisterEvent("Wochenplan""IPS2Watering_Event_".$this->InstanceID2$this->InstanceID30);
            
    // Anlegen der Daten für den Wochenplan
            
    for ($i 0$i <= 6$i++) {
                
    IPS_SetEventScheduleGroup($this->GetIDForIdent("IPS2Watering_Event_".$this->InstanceID), $ipow(2$i));
            }
    IPS_SetEventScheduleAction($this->GetIDForIdent("IPS2Watering_Event_".$this->InstanceID), 1"Freigabe"0x40FF00"IPS2Watering_SetState(\$_IPS['TARGET'], 1);");    
            
    IPS_SetEventScheduleAction($this->GetIDForIdent("IPS2Watering_Event_".$this->InstanceID), 2"Sperrzeit"0xFF0040"IPS2Watering_SetState(\$_IPS['TARGET'], 1);"); 
    Wobei RegisterEvent ist:
    PHP-Code:
        private function RegisterEvent($Name$Ident$Typ$Parent$Position)
        {
            
    $eid = @$this->GetIDForIdent($Ident);
            if(
    $eid === false) {
                    
    $eid 0;
            } elseif(
    IPS_GetEvent($eid)['EventType'] <> $Typ) {
                    
    IPS_DeleteEvent($eid);
                    
    $eid 0;
            }
            
    //we need to create one
            
    if ($eid == 0) {
                
    $EventID IPS_CreateEvent($Typ);
                    
    IPS_SetParent($EventID$Parent);
                    
    IPS_SetIdent($EventID$Ident);
                    
    IPS_SetName($EventID$Name);
                    
    IPS_SetPosition($EventID$Position);
                    
    IPS_SetEventActive($EventIDtrue);  
            }
        } 
    Das Auslesen mit dem Skript:
    PHP-Code:
        public function GetWeekplanState()
        {
            
    $this->SendDebug("GetWeekplanState""Wochenplan Status einlesen"0);
            
    $e IPS_GetEvent($this->GetIDForIdent("IPS2Watering_Event_".$this->InstanceID));
            
    $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'] & date("N") > 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.
                
    }
            }
            
    SetValueInteger($this->GetIDForIdent("WeekplanState"),  intval($actionID));
        } 
    - Das Ergebnis ist leider nicht das Erwartet (also das was im Wochenplan im Webfront eingetragen wurde)
    - Der Wochenplan stellt die Tage nicht in der erwarteten Reihenfolge dar (die Tage sind durcheinander)

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  6. #6
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,326

    ...ich habe herausgefunden, dass jeweils nur das Tagesprogramm im Wochenplan für Monatg geprüft wird - und eben leider nicht für Mittwoch...
    Noch mal die Vorlage von Paresy in Gänze:
    PHP-Code:
    public function GetWeekplanState()
        {
            
    $this->SendDebug("GetWeekplanState""Wochenplan Status einlesen"0);
            
    $e IPS_GetEvent($this->GetIDForIdent("IPS2Watering_Event_".$this->InstanceID));
            
    $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'] & date("N") > 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.
                
    }
            }
            
    $this->SendDebug("GetWeekplanState""Ergebnis: ".intval($actionID), 0);
            
    SetValueInteger($this->GetIDForIdent("WeekplanState"),  intval($actionID));
        } 
    Ich vermute den Fehler hier in dieser Zeile:
    PHP-Code:
      if($g['Days'] & date("N") > 0) { 
    Jemand eine Idee?

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  7. #7
    Registriert seit
    Mar 2009
    Ort
    Bad Zell / Austria
    Beiträge
    262

    Lightbulb ... alte Beiträge zu diesen Thema

    Hallo,
    ja das ist das Problem versuch mal ..
    PHP-Code:
     if(($g['Days'] & pow(2,date("N",time())-1)) > 0

    ... wenn Du Dir die Beitrage anschauen würdest, hier ist die Problematik gelöst

    Link zu GetWeekplanState

    Link zu SaveWeekplanToFile


    ... hier sieht Du dann wie man einer Group (Tagen) die Zeiten setzen kann ==> man muss leider immer von 00:00 aufsetzen, eine Funktion für "umdefinieren" fehlt
    PHP-Code:
    //RESTORE ScheduleGroups + + + + + + + + + + + + + + + + + + + + + + + +

    //Group 0
    IPS_SetEventScheduleGroup($ID,0,124);

    IPS_SetEventScheduleGroupPoint($ID,0,0,3,15,0,1);
    IPS_SetEventScheduleGroupPoint($ID,0,1,7,4,30,3);
    IPS_SetEventScheduleGroupPoint($ID,0,2,14,20,30,2);
    IPS_SetEventScheduleGroupPoint($ID,0,6,19,30,0,0); 

    tgusi74

    (Wochenplan, WeekplanState, SaveWeekplan, SaveWeekplanToFile)
    Geändert von tgusi74 (16.05.19 um 03:03 Uhr)

  8. #8
    Registriert seit
    Apr 2007
    Ort
    Lüneburg
    Beiträge
    3,326

    Hallo tgusi74,

    vielen Dank für Deinen Beitrag. Das sieht schon mal deutlich besser aus als vorher!

    Joachim
    IP-Symcon seit 12/2009, iPhoneApp seit 01/2011, IPSView seit 12/2014!
    3xSiemensLOGO0BA7+DM16, 1xInstar 3010PoE, 1xInstar 2905PoE, 1x1-WireHub mit DS2450 von Eservice-online, 15xDS1820, 1xDS2423, 1xDS2408

  9. #9
    Registriert seit
    Aug 2016
    Beiträge
    2,336

    Ich hab den Thream mal ins richtige Forum verschoben.

    Grüße,
    Kai
    IPS 5.1 Ninja, auf Tinkerboard und RPI, piVCCU, Homematic & Homematic IP, diverse Tasmota Geräte, Shelly, GHoma, LG HomBot, Sonos, Tvheadend, HomeKit, AppleTV

Ähnliche Themen

  1. Wochenplan - programmatisch erstellen / auslesen
    Von habre im Forum Allgemeine Diskussion
    Antworten: 0
    Letzter Beitrag: 30.04.19, 06:29
  2. Wochenplan
    Von jagu im Forum Allgemeine Diskussion
    Antworten: 4
    Letzter Beitrag: 16.11.18, 14:23
  3. Antworten: 134
    Letzter Beitrag: 03.09.18, 09:56
  4. Wochenplan Name
    Von Slummi im Forum Mobile (iOS/Android)
    Antworten: 3
    Letzter Beitrag: 21.08.17, 10:30
  5. Antworten: 2
    Letzter Beitrag: 28.09.16, 12:24