IPS_SetProperty Items Calendar funktioniert nicht

Ich bekomme einfach keinen Kalender-Eintrag mit IPS_SetProperty hinzugefügt und kann keinen Fehler erkennen.
Auch mit IPS_SetConfiguration komme ich nicht ans Ziel.
Kann jemand helfen?

geteste mit symcon 4.1 auf Raspberry

<?
$InstanzID = @IPS_GetObjectIDByName(„Calendar“, 0);
echo „GET:
„.IPS_GetProperty($InstanzID, „Items“).“
„;
$NewCalendar=“[{„DateFrom“:{„Day“:6,„Month“:1,„Year“:2017},„DateTo“:{„Day“:6,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:“",„TimeFrom“:{„Minute“:59,„Second“:59,„Hour"16},„TimeTo“:{„Minute“:59,„Second“:59,„Hour"16},„Name“:„Arbeit“},{„DateFrom“:{„Day“:25,„Month“:1,„Year“:2017},„DateTo“:{„Day“:25,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:““,„TimeFrom“:{„Minute“:59,„Second“:59,„Hour"23},„TimeTo“:{„Minute“:59,„Second“:59,„Hour"23},„Name“:„Test“},{„DateFrom“:{„Day“:17,„Month“:1,„Year“:2017},„DateTo“:{„Day“:20,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:““,„TimeFrom“:{„Minute“:59,„Second“:59,„Hour"10},„TimeTo“:{„Minute“:59,„Second“:59,„Hour"10},„Name“:„xxxxx“},{„DateFrom“:{„Day“:28,„Month“:1,„Year“:2017},„DateTo“:{„Day“:28,„Month“:1,„Year“:2018},„Ident“:„PlannedAbsence“,„Group“:““,„TimeFrom“:{„Minute“:5,„Second“:32,„Hour"10},„TimeTo“:{„Minute“:5,„Second“:32,„Hour"10},„Name“:„Test1“}]“;
echo „SET:
„.$NewCalendar.“
„;
IPS_SetProperty($InstanzID, „Items“, $NewCalendar);
IPS_ApplyChanges($InstanzID); // Neue Konfiguration übernehmen
/*
echo:
GET:
[{„DateFrom“:{„Day“:6,„Month“:1,„Year“:2017},„DateTo“:{„Day“:6,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:““,„TimeFrom“:{„Minute“:10,„Second“:0,„Hour“:6},„TimeTo“:{„Minute“:59,„Second“:59,„Hour“:16},„Name“:„Arbeit“},{„DateFrom“:{„Day“:25,„Month“:1,„Year“:2017},„DateTo“:{„Day“:25,„Month“:1,„Year“:2017},„Ident“:„PlannedPresence“,„Group“:“",„TimeFrom“:{„Minute“:0,„Second“:0,„Hour“:0},„TimeTo“:{„Minute“:59,„Second“:59,„Hour“:23},„Name“:„Test“},{„DateFrom“:{„Day“:17,„Month“:1,„Year“:2017},„DateTo“:{„Day“:20,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:"",„TimeFrom“:{„Minute“:0,„Second“:0,„Hour“:0},„TimeTo“:{„Minute“:0,„Second“:0,„Hour“:11},„Name“:„xxxxx“}]
SET:
[{„DateFrom“:{„Day“:6,„Month“:1,„Year“:2017},„DateTo“:{„Day“:6,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:"",„TimeFrom“:{„Minute“:59,„Second“:59,„Hour"16},„TimeTo“:{„Minute“:59,„Second“:59,„Hour"16},„Name“:„Arbeit“},{„DateFrom“:{„Day“:25,„Month“:1,„Year“:2017},„DateTo“:{„Day“:25,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:““,„TimeFrom“:{„Minute“:59,„Second“:59,„Hour"23},„TimeTo“:{„Minute“:59,„Second“:59,„Hour"23},„Name“:„Test“},{„DateFrom“:{„Day“:17,„Month“:1,„Year“:2017},„DateTo“:{„Day“:20,„Month“:1,„Year“:2017},„Ident“:„PlannedAbsence“,„Group“:““,„TimeFrom“:{„Minute“:59,„Second“:59,„Hour"10},„TimeTo“:{„Minute“:59,„Second“:59,„Hour"10},„Name“:„xxxxx“},{„DateFrom“:{„Day“:28,„Month“:1,„Year“:2017},„DateTo“:{„Day“:28,„Month“:1,„Year“:2018},„Ident“:„PlannedAbsence“,„Group“:““,„TimeFrom“:{„Minute“:5,„Second“:32,"Hour"10},„TimeTo“:{„Minute“:5,„Second“:32,"Hour"10},„Name“:„Test1“}]
*/
?>

Ich kann dir leider nicht helfen, habe aber wegen der besseren Lesbarkeit das Script in PHP-Tags gesetzt.


<?
$InstanzID = @IPS_GetObjectIDByName("Calendar", 0);
echo "GET:
".IPS_GetProperty($InstanzID, "Items")."
";
$NewCalendar="[{"DateFrom":{"Day":6,"Month":1,"Year":2017},"DateT   o":{"Day":6,"Month":1,"Year":2017},"Ident":"Planne   dAbsence","Group":"","TimeFrom":{"Minute":59,"Seco   nd":59,"Hour"16},"TimeTo":{"Minute":59,"Second":59   ,"Hour"16},"Name":"Arbeit"},{"DateFrom":{"Day":25,   "Month":1,"Year":2017},"DateTo":{"Day":25,"Month":   1,"Year":2017},"Ident":"PlannedAbsence","Group":""   ,"TimeFrom":{"Minute":59,"Second":59,"Hour"23},"Ti   meTo":{"Minute":59,"Second":59,"Hour"23},"Name":"T   est"},{"DateFrom":{"Day":17,"Month":1,"Year":2017}   ,"DateTo":{"Day":20,"Month":1,"Year":2017},"Ident"   :"PlannedAbsence","Group":"","TimeFrom":{"Minute":   59,"Second":59,"Hour"10},"TimeTo":{"Minute":59,"Se   cond":59,"Hour"10},"Name":"xxxxx"},{"DateFrom":{"D   ay":28,"Month":1,"Year":2017},"DateTo":{"Day":28,"   Month":1,"Year":2018},"Ident":"PlannedAbsence","Gr   oup":"","TimeFrom":{"Minute":5,"Second":32,"Hour"1   0},"TimeTo":{"Minute":5,"Second":32,"Hour"10},"Nam  e":"Test1"}]";
echo "SET:
".$NewCalendar."
";
IPS_SetProperty($InstanzID, "Items", $NewCalendar);
IPS_ApplyChanges($InstanzID); // Neue Konfiguration übernehmen
/*
echo:
GET:
[{"DateFrom":{"Day":6,"Month":1,"Year":2017},"DateT   o":{"Day":6,"Month":1,"Year":2017},"Ident":"Planne   dAbsence","Group":"","TimeFrom":{"Minute":10,"Seco   nd":0,"Hour":6},"TimeTo":{"Minute":59,"Second":59,   "Hour":16},"Name":"Arbeit"},{"DateFrom":{"Day":25,   "Month":1,"Year":2017},"DateTo":{"Day":25,"Month":   1,"Year":2017},"Ident":"PlannedPresence","Group":"   ","TimeFrom":{"Minute":0,"Second":0,"Hour":0},"Tim   eTo":{"Minute":59,"Second":59,"Hour":23},"Name":"T   est"},{"DateFrom":{"Day":17,"Month":1,"Year":2017}   ,"DateTo":{"Day":20,"Month":1,"Year":2017},"Ident"   :"PlannedAbsence","Group":"","TimeFrom":{"Minute":   0,"Second":0,"Hour":0},"TimeTo":{"Minute":0,"Secon   d":0,"Hour":11},"Name":"xxxxx"}]
SET:
[{"DateFrom":{"Day":6,"Month":1,"Year":2017},"DateT   o":{"Day":6,"Month":1,"Year":2017},"Ident":"Planne   dAbsence","Group":"","TimeFrom":{"Minute":59,"Seco   nd":59,"Hour"16},"TimeTo":{"Minute":59,"Second":59   ,"Hour"16},"Name":"Arbeit"},{"DateFrom":{"Day":25,   "Month":1,"Year":2017},"DateTo":{"Day":25,"Month":   1,"Year":2017},"Ident":"PlannedAbsence","Group":""   ,"TimeFrom":{"Minute":59,"Second":59,"Hour"23},"Ti   meTo":{"Minute":59,"Second":59,"Hour"23},"Name":"T   est"},{"DateFrom":{"Day":17,"Month":1,"Year":2017}   ,"DateTo":{"Day":20,"Month":1,"Year":2017},"Ident"   :"PlannedAbsence","Group":"","TimeFrom":{"Minute":   59,"Second":59,"Hour"10},"TimeTo":{"Minute":59,"Se   cond":59,"Hour"10},"Name":"xxxxx"},{"DateFrom":{"D   ay":28,"Month":1,"Year":2017},"DateTo":{"Day":28,"   Month":1,"Year":2018},"Ident":"PlannedAbsence","Gr   oup":"","TimeFrom":{"Minute":5,"Second":32,"Hour"1   0},"TimeTo":{"Minute":5,"Second":32,"Hour"10},"Nam  e":"Test1"}]
*/
?>

Also deine NewCalender Variable müsste so wie oben Dargestellte einen Syntax Error produzieren. Magst du mal ein kleines Beispiel für das Problem bauen?

paresy

Da sind diverse Fehler in deinem String.

Wenn du Einträge dort ändern / löschen / hinzufügen willst, empfehle ich dir das JSON in ein Array zu konvertieren und Dieses dann zu modifizieren.

$string = '[{"DateFrom":{"Day":6,"Month":1,"Year":2017},"DateTo":{"Day":6,"Month":1,"Year":2017},"Ident":"PlannedAbsence","Group":"","TimeFrom":{"Minute":10,"Second":0,"Hour":6},"TimeTo":{"Minute":59,"Second":59, "Hour":16},"Name":"Arbeit"},{"DateFrom":{"Day":25, "Month":1,"Year":2017},"DateTo":{"Day":25,"Month": 1,"Year":2017},"Ident":"PlannedPresence","Group":" ","TimeFrom":{"Minute":0,"Second":0,"Hour":0},"TimeTo":{"Minute":59,"Second":59,"Hour":23},"Name":"Test"},{"DateFrom":{"Day":17,"Month":1,"Year":2017} ,"DateTo":{"Day":20,"Month":1,"Year":2017},"Ident" :"PlannedAbsence","Group":"","TimeFrom":{"Minute": 0,"Second":0,"Hour":0},"TimeTo":{"Minute":0,"Second":0,"Hour":11},"Name":"xxxxx"}]';
$array = json_decode($string,true);
var_dump($array);

Dort kommt dann so etwas:

array(3) {
  [0]=>
  array(7) {
    ["DateFrom"]=>
    array(3) {
      ["Day"]=>
      int(6)
      ["Month"]=>
      int(1)
      ["Year"]=>
      int(2017)
    }
    ["DateTo"]=>
    array(3) {
      ["Day"]=>
      int(6)
      ["Month"]=>
      int(1)
      ["Year"]=>
      int(2017)
    }
    ["Ident"]=>
    string(14) "PlannedAbsence"
    ["Group"]=>
    string(0) ""
    ["TimeFrom"]=>
    array(3) {
      ["Minute"]=>
      int(10)
      ["Second"]=>
      int(0)
      ["Hour"]=>
      int(6)
    }
    ["TimeTo"]=>
    array(3) {
      ["Minute"]=>
      int(59)
      ["Second"]=>
      int(59)
      ["Hour"]=>
      int(16)
    }
    ["Name"]=>
    string(6) "Arbeit"
  }
  [1]=>
  array(7) {
    ["DateFrom"]=>
    array(3) {
      ["Day"]=>
      int(25)
      ["Month"]=>
      int(1)
      ["Year"]=>
      int(2017)
    }
    ["DateTo"]=>
    array(3) {
      ["Day"]=>
      int(25)
      ["Month"]=>
      int(1)
      ["Year"]=>
      int(2017)
    }
    ["Ident"]=>
    string(15) "PlannedPresence"
    ["Group"]=>
    string(1) " "
    ["TimeFrom"]=>
    array(3) {
      ["Minute"]=>
      int(0)
      ["Second"]=>
      int(0)
      ["Hour"]=>
      int(0)
    }
    ["TimeTo"]=>
    array(3) {
      ["Minute"]=>
      int(59)
      ["Second"]=>
      int(59)
      ["Hour"]=>
      int(23)
    }
    ["Name"]=>
    string(4) "Test"
  }
  [2]=>
  array(7) {
    ["DateFrom"]=>
    array(3) {
      ["Day"]=>
      int(17)
      ["Month"]=>
      int(1)
      ["Year"]=>
      int(2017)
    }
    ["DateTo"]=>
    array(3) {
      ["Day"]=>
      int(20)
      ["Month"]=>
      int(1)
      ["Year"]=>
      int(2017)
    }
    ["Ident"]=>
    string(14) "PlannedAbsence"
    ["Group"]=>
    string(0) ""
    ["TimeFrom"]=>
    array(3) {
      ["Minute"]=>
      int(0)
      ["Second"]=>
      int(0)
      ["Hour"]=>
      int(0)
    }
    ["TimeTo"]=>
    array(3) {
      ["Minute"]=>
      int(0)
      ["Second"]=>
      int(0)
      ["Hour"]=>
      int(11)
    }
    ["Name"]=>
    string(5) "xxxxx"
  }
}

Das veränderte Array wieder mit json_encode zurück konvertieren und fertig.


$string = json_encode($array);
var_dump($string);
string(686) "[{"DateFrom":{"Day":6,"Month":1,"Year":2017},"DateTo":{"Day":6,"Month":1,"Year":2017},"Ident":"PlannedAbsence","Group":"","TimeFrom":{"Minute":10,"Second":0,"Hour":6},"TimeTo":{"Minute":59,"Second":59,"Hour":16},"Name":"Arbeit"},{"DateFrom":{"Day":25,"Month":1,"Year":2017},"DateTo":{"Day":25,"Month":1,"Year":2017},"Ident":"PlannedPresence","Group":" ","TimeFrom":{"Minute":0,"Second":0,"Hour":0},"TimeTo":{"Minute":59,"Second":59,"Hour":23},"Name":"Test"},{"DateFrom":{"Day":17,"Month":1,"Year":2017},"DateTo":{"Day":20,"Month":1,"Year":2017},"Ident":"PlannedAbsence","Group":"","TimeFrom":{"Minute":0,"Second":0,"Hour":0},"TimeTo":{"Minute":0,"Second":0,"Hour":11},"Name":"xxxxx"}]"

Michael

Hallo Michael,
besten Dank für Deinen Tip. Habe mit den Code einen Eintag hinzufügen können.
Besten Dank

<?
$InstanzID = @IPS_GetObjectIDByName("Calendar", 0);
$array = json_decode(IPS_GetProperty($InstanzID, "Items"),true);

# Hinzufügen Termin
$i = count($array);
$array[$i]["DateFrom"]["Day"]=30;
$array[$i]["DateFrom"]["Month"]=1;
$array[$i]["DateFrom"]["Year"]=2017;
$array[$i]["DateTo"]["Day"]=30;
$array[$i]["DateTo"]["Month"]=1;
$array[$i]["DateTo"]["Year"]=2017;
$array[$i]["Ident"]="PlannedAbsence";
$array[$i]["Group"]="";
$array[$i]["TimeFrom"]["Minute"]=0;
$array[$i]["TimeFrom"]["Second"]=0;
$array[$i]["TimeFrom"]["Hour"]=10;
$array[$i]["TimeTo"]["Minute"]=0;
$array[$i]["TimeTo"]["Second"]=0;
$array[$i]["TimeTo"]["Hour"]=11;
$array[$i]["Name"]="Test neuer Eintrag";
$kalender = json_encode($array);
var_dump($kalender);
#  Setzen Kalender
IPS_SetProperty($InstanzID, "Items", $kalender);
IPS_ApplyChanges($InstanzID); // Neue Konfiguration übernehmen
?>

Vielleicht sollte dieses Beispiel in der Dokumentation enthalten sein, auf json_decode / json_encode wäre ich in diesem Zusammenhang nicht gekommen.
Also nochmals vielen Dank.

Äh… Man sollte schon sehen dass dies JSON ist, die ganze IPS Config besteht nur daraus. Darum heißt die Datei auch so :smiley:
Und genug Beispiele um JSON zu verarbeiten sind sowohl hier im Forum als auch mit der Suchmaschine deiner Wahl zu finden.
Michael

Es sieht so aus, das sich die Struktur des array vom Kaleder in IP-Symcon 5.0 geändert hat.
Kann jemand helfen?

Hi,

ja, die hat sich geändert, damit die Steuerelemente der webbasierten Konsole damit kompatibel sind.

Zieh dir mal mit IPS_GetProperty die aktuelle Konfiguration raus. Dann siehst du recht schnell was sich geändert hat.

paresy

Danke für den Hinweis, das Array sieht so aus:
Array
(
[0] => Array
(
[Ident] => PlannedPresence
[Group] =>
[To] => {„day“:18,„month“:9,„second“:59,„year“:2018,„hour“:23,„minute“:59}
[Name] => xxxxx
[From] => {„day“:18,„month“:9,„second“:0,„year“:2018,„hour“:0,„minute“:0}
)

)
Mit den Datumsformat stehe ich auf dem Schlauch, sieht doch nicht wie ein normaler String aus.
Gibt es vielleicht eine Funktion/Skript dafür?

Das ist wieder ein JSON String…
Michael

Danke, das hilft mir weiter