Wochenplan aus Modul erstellen

Ich möchte aus einem Modul einen Wochenplan erstellen um damit dann Einstellungen vornehmen zu können.

Leider scheitere ich schon bei der ersten Zeile.


$eid = IPS_CreateEvent(3);                  // Wochenplan 3
var_dump($eid);

Kommt als Antwort


Warning:  EventType must be between 0 and 2 
bool(false)

Wie erstelle ich denn nun einen Wochenplan per Skript? Laut Dokumentation ist doch 3 der Typ für Wochenplan.

Laut Doku ist Typ 2 fuer Wochenplan

:eek:, danke das erklärt die Fehlermeldung.

Weist Du zufällig auch noch welche Befehle ich dann nutzten muss um den Wochenplan weiter zu konfigurieren mit einem Skript?

Leider nein.

Es gibt doch schon einige Module wo dies genutzt wird, wie z.b. Bumas BlindControl.
Warum schaust du dir nicht das an?
Michael

Anscheinend muss man ja mit IPS_SetEventScheduleAction die Werte setzten.

Ein Beispiel das ich ausgelesen habe sieht so aus:


// Template ID: {FCE37F48-DA3F-45DD-AC77-71343792CC2D}
// Template Name: Auf Wert schalten
$ident = "SetPosition";
$value = 0;
$target = $_IPS['TARGET'];
if (IPS_InstanceExists($target)) {
  $target = IPS_GetObjectIDByIdent($ident, $target);
}
RequestAction($target, $value);

Mir ist nur unklar ob die AktionsID eine zufällig GUID ist? Auf der anderen Seite steht da ja aber die Sortierung erfolgt anhand der AktionsID. Wie stelle ich also sicher das die Sortierungsreihenfolge stimmt aber die GUID dennoch eindeutig generiert worden ist?

Wo wird dort eine GUID benutzt…? Gar nicht :slight_smile:

Warum testet du nicht erstmal mit einem ganz normalen Script in der Konsole wie man einen Wochenplan anlegt und konfiguriert.
Das Thema ist zu komplex um es hier ‚einfach‘ zu erklären.
Die Doku liefert doch alle Befehle und Erklärungen der Parameter.
Michael

Mach ich ja durchaus nur die Dokumentation lässt aus meiner Sicht viele Frage offen sonst würde ich hier nicht fragen.

Ja nur wenn ich z.B.


//Anlegen von Aktionen 
IPS_SetEventScheduleAction($EreignisID, 0, "Warm", 0xFF0000, "FHT_SetTemperature(\$_IPS['TARGET'], 22.5);");

wie in der Dokumentation beschrieben ausführe wird zwar etwas ergänzt aber im Ereignis steht dennoch unter Aktion undefined, was mache ich da also falsch bzw. wie lässt sich denn nun die Aktion auch zuweisen nachdem der Eintrag ergänzt worden ist? Da werde ich selber nicht schlau aus der Dokumentation bzw. diese ist aus meiner Sicht für mich nicht nachvollziehbar oder lückenhaft.

Womit kontrollierst du?
Eventuell ist es auch nur ein falsche Darstellung der Konsole.
Michael

Mit der Webconsole.

Das glaube ich nicht. Der Unterschied liegt wohl darin wie das erkannt wird. Wenn das als Skript erkannt wird (führe PHP Code aus)
steht in der Webconsole undefined, wenn hingegen das als Schalte Instanz erkannt wird steht auch kein undefined da.

Ich finde aber keinerlei Beispiel wie das so zu setzten ist, dass dies als Schalte Instanz und nicht als Skript interpretiert wird.

Weil das genauso funktioniert wie bei allen Ereignissen!
Liegt das Ereignis unterhalb einer Instanz und es steht ein zur Instanz passender Befehlen im Code, sollte die Console es erkennen und entsprechend darstellen.
Michael

Das passiert aber eben nicht, kannst Du gerne ausprobieren. Ich wüste nur zu gerne wo hier der Fehler zu suchen ist, bzw. was anders zu machen ist, aber dazu gibt die Dokumentation leider nichts her.


$parent_id = 13352;

CreateWeekplan($parent_id);

function CreateWeekplan($parent_id)
{
$eid = IPS_CreateEvent(2);                  // Wochenplan Ereignis 2
IPS_SetParent($eid, $parent_id);         // set parent
IPS_SetIcon($eid, "Camera");
IPS_SetIdent($eid, "weekplan_position");
IPS_SetInfo($eid, "Wochenplan Preset Positions");
IPS_SetName($eid, "Wochenplan Preset Positions");
IPS_SetEventScheduleAction($eid, 1, 'test 1', 0xFF0000, '$ident = "SetPosition";
$value = 0;
$target = $_IPS[\'TARGET\'];
if (IPS_InstanceExists($target)) {
  $target = IPS_GetObjectIDByIdent($ident, $target);
}
RequestAction($target, $value);');
IPS_SetEventScheduleAction($eid, 2, 'test 2', 0x00EDE9, '$ident = "SetPosition";
$value = 1;
$target = $_IPS[\'TARGET\'];
if (IPS_InstanceExists($target)) {
  $target = IPS_GetObjectIDByIdent($ident, $target);
}
RequestAction($target, $value);');
IPS_SetEventActive($eid, true);             //Ereignis aktivieren
    return $eid;
}

Erster Absatz Anbindungsarten:
Ereignisse — IP-Symcon :: Automatisierungssoftware
Dein Beispiel ist ‚sonstiges‘.
Wenn die WebConsole dann da etwas nicht darstellen kann… Falsches Thema :slight_smile:
Michael

Wieso ist mein Beispiel sonstiges? Der Wochenplan liegt direkt unterhalb einer Instanz und Ziel ist die Instanz selber, also aus meiner Sicht der häufigste Fall An Instanz gebunden. Warum das jetzt nicht funktioniert bin ich also immer noch nicht schlauer, nach Deiner Theorie sollte das ja funktionieren wenn es unterhalb einer Instanz liegt und das Ziel die Instanz selber ist.

Ja stimmt, es wäre an Instanz gebunden, aber weil du dort viel mehr Code eingetragen hast als es für an Instanz gebunden erlaubt, kann die Console das nicht verarbeiten und zeigt undefiniert an.

Mach es anders herum.
Lege ihn in der Console an und lese den Code mit IPS_GetEvent aus.
Dann siehst du was dir Konsole dort anlegt und erwartet.
Michael

1 „Gefällt mir“

Ich glaube nicht das es an der Länge des Codes liegt denn IP-Symcon selber schreibt da auch keinen kürzeren Code rein, der Unterschied muss irgendwas anders sein.

Das habe ich bereits gemacht, da es ja keine Dokumentation gibt, schlau werde ich da dennoch nicht draus was IP Symcon anders macht, bis auf die GUID die ich nicht interpretieren kann.

Aber vielleicht findest Du ja einen Unterschied.


array (
  'EventID' => 20393,
  'EventType' => 2,
  'EventActive' => true,
  'EventLimit' => 0,
  'EventConditions' => 
  array (
  ),
  'TriggerType' => 0,
  'TriggerVariableID' => 0,
  'TriggerValue' => '',
  'TriggerSubsequentExecution' => true,
  'CyclicDateType' => 0,
  'CyclicDateValue' => 0,
  'CyclicDateDay' => 0,
  'CyclicDateDayValue' => 0,
  'CyclicDateFrom' => 
  array (
    'Day' => 0,
    'Month' => 0,
    'Year' => 0,
  ),
  'CyclicDateTo' => 
  array (
    'Day' => 0,
    'Month' => 0,
    'Year' => 0,
  ),
  'CyclicTimeType' => 0,
  'CyclicTimeValue' => 0,
  'CyclicTimeFrom' => 
  array (
    'Hour' => 0,
    'Minute' => 0,
    'Second' => 0,
  ),
  'CyclicTimeTo' => 
  array (
    'Hour' => 0,
    'Minute' => 0,
    'Second' => 0,
  ),
  'ScheduleActions' => 
  array (
    0 => 
    array (
      'ID' => 1,
      'Name' => 'Position 1',
      'Color' => 11068511,
      'ScriptText' => '// Template ID: {FCE37F48-DA3F-45DD-AC77-71343792CC2D}
// Template Name: Auf Wert schalten
$ident = "GotoPosition";
$value = 0;
$target = $_IPS[\'TARGET\'];
if (IPS_InstanceExists($target)) {
  $target = IPS_GetObjectIDByIdent($ident, $target);
}
RequestAction($target, $value);',
    ),
    1 => 
    array (
      'ID' => 2,
      'Name' => 'Position 2',
      'Color' => 7068772,
      'ScriptText' => '// Template ID: {FCE37F48-DA3F-45DD-AC77-71343792CC2D}
// Template Name: Auf Wert schalten
$ident = "GotoPosition";
$value = 1;
$target = $_IPS[\'TARGET\'];
if (IPS_InstanceExists($target)) {
  $target = IPS_GetObjectIDByIdent($ident, $target);
}
RequestAction($target, $value);',
    ),
  ),
  'ScheduleGroups' => 
  array (
    0 => 
    array (
      'ID' => 0,
      'Days' => 1,
      'Points' => 
      array (
        0 => 
        array (
          'ID' => 0,
          'Start' => 
          array (
            'Hour' => 0,
            'Minute' => 0,
            'Second' => 0,
          ),
          'ActionID' => 1,
        ),
      ),
    ),
    1 => 
    array (
      'ID' => 1,
      'Days' => 2,
      'Points' => 
      array (
        0 => 
        array (
          'ID' => 0,
          'Start' => 
          array (
            'Hour' => 0,
            'Minute' => 0,
            'Second' => 0,
          ),
          'ActionID' => 1,
        ),
      ),
    ),
    2 => 
    array (
      'ID' => 2,
      'Days' => 4,
      'Points' => 
      array (
        0 => 
        array (
          'ID' => 0,
          'Start' => 
          array (
            'Hour' => 0,
            'Minute' => 0,
            'Second' => 0,
          ),
          'ActionID' => 1,
        ),
      ),
    ),
    3 => 
    array (
      'ID' => 3,
      'Days' => 8,
      'Points' => 
      array (
        0 => 
        array (
          'ID' => 0,
          'Start' => 
          array (
            'Hour' => 0,
            'Minute' => 0,
            'Second' => 0,
          ),
          'ActionID' => 1,
        ),
      ),
    ),
    4 => 
    array (
      'ID' => 4,
      'Days' => 16,
      'Points' => 
      array (
        0 => 
        array (
          'ID' => 0,
          'Start' => 
          array (
            'Hour' => 0,
            'Minute' => 0,
            'Second' => 0,
          ),
          'ActionID' => 1,
        ),
      ),
    ),
    5 => 
    array (
      'ID' => 5,
      'Days' => 32,
      'Points' => 
      array (
        0 => 
        array (
          'ID' => 0,
          'Start' => 
          array (
            'Hour' => 0,
            'Minute' => 0,
            'Second' => 0,
          ),
          'ActionID' => 1,
        ),
      ),
    ),
    6 => 
    array (
      'ID' => 6,
      'Days' => 64,
      'Points' => 
      array (
        0 => 
        array (
          'ID' => 0,
          'Start' => 
          array (
            'Hour' => 0,
            'Minute' => 0,
            'Second' => 0,
          ),
          'ActionID' => 1,
        ),
      ),
    ),
  ),
  'EventScript' => '',
  'LastRun' => 0,
  'NextRun' => 0,
)

Wie Du siehst ist der Skriptext auch nicht kürzer


 'ScriptText' => '// Template ID: {FCE37F48-DA3F-45DD-AC77-71343792CC2D}
// Template Name: Auf Wert schalten
$ident = "GotoPosition";
$value = 1;
$target = $_IPS[\'TARGET\'];
if (IPS_InstanceExists($target)) {
  $target = IPS_GetObjectIDByIdent($ident, $target);
}
RequestAction($target, $value);',
    ),
  ),

Das ist ein Wert damit die Konsole weiß was dort enthalten ist, um es korrekt anzuzeigen.
Aber das ist doch alles egal, wenn du einen Wochenplan in ein Modul nutzt, hat da eh keiner User etwas zu ändern.
Michael

Grundsätzlich wäre es halt schön man könnte das logischerweise per Skript genauso anlegen wie wenn es sich verhält und man das Ereignis von Hand anlegt.

Ja da hast Du ja grundsätzlich recht, Hauptsache der Wochenplan funktioniert. Sieht dennoch etwas komisch aus wenn man den Wochenplan denn mal öffnet. Und so was wie die Farben kann man ja durchaus anpassen und dann stolpert man zwangsweise über undefined.

Das funktioniert hier nicht, weil diese Logik von der Konsole kommt.
Teste das anlegen und konfigurieren Mal mit IPS 5.1 stable und auch mit der legacy Konsole.
Da gibt es immer Unterschiede.
Michael

Hallo Zusammen

Leider muss ich dieses Thema nochmal aufgreifen :rolleyes:
Ich habe genau dasselbe Problem hier mit der neusten SymOS und IPS Version.

Man kann zwar Ereignisse anlegen, aber wenn man es dann in der Konsole öffnet, steht da nur das Skript bei der Aktion (Führe PHP Code aus).
Wenn ich das in der Konsole bearbeite und auf (Schalte Instanz) wechsle und das ausfülle, wird es dann auch wieder als solches erkannt.

Beim auslesen von IPS_GetEvent() und IPS_GetObject() gibt es allerdings keinen einzigen Unterschied zwischen den beiden Fällen.
Der Unterschied muss irgendwo ausserhalb der API liegen.
Es funktioniert zwar, aber es ist schon unschön dass es in der Pro-Konsole für Windows sowie in der Webkonsole nicht richtig erkannt wird.
Ich habe lange nach dem Fehler gesucht, bis ich gemerkt habe dass es keinen für mich ersichtlichen Unterschied gibt…
Währe schön wenn man da vielleicht mal was machen kann.

Gruss
Dario