NEWS
Täglich den Kalender auf einen bestimmten Eintrag durchsuchen
-
Mehrere Dinge:
-
du durchsuchst gar nichts sondern setzt die Variable kalendereintrag gleich dem state des icals
-
es fehlt der Trigger. Den würde ich über einen schedule regeln: schedule("0 2 * * *", function(){ xyz()});
-
suchen kannst du mit "indexOf". Sofern nichts gefunden wird, wird dir indexOf -1 ausgeben. Sofern was gefunden wird, erhälst du die Fundstelle (z.B. 89).
Wenn dir das reicht, wüsstest du:
sofern indexOf -1 dann nichts im Kalender, sonst vorhanden
Die Frage, die sich anschließt ist: wie weit reicht denn dien Kalender? Wenn du z.B. (so entnehme ich es) Tagdienst suchst und dein Kalender sagen wir 4 Wochen nach vorne schaut weißt du nur, dass innerhalb dieses Zeitraums Tagdienst auftritt. Brauchst du denn auch das wann?
-
-
Hallo!
Ich habe im Kalender die Einträge TD für Tagdienst und ND für Nachtdienst.
So, jetzt möchte ich täglich in der Nacht, irgendwann zwischen 0 und 4 Uhr Früh, den Kalender auslesen ob für heute der Eintrag TD (also Tagdienst) eingetragen ist, damit ich dann um 5 Uhr in der Früh bestimmte Scenarien ausführen kann.
Daher hab ich mir das ical.0 Objekt angesehen und da steht im "ical.0.data.html" dieser Eintrag drinnen.
Die Farge ist nur, wie krieg ich den da raus.
Das mit schedule sagt mir jetzt momentan gar nichts.
Kannst mir das erklären, oder gibt's da wo was zum nachlesen.
-
Javascript funktioniert über Trigger/Auslöser.
Diese können entweder über Aktionen (z.B. Statuswechsel eines Objekts) getriggered werden, auf die du subscribst (````
on(XYZ)Das letztere willst du und dafür dient der Schedule. Dieser gibt im Cron Format an, wann etwas getan werden soll
schedule("0 2 * * *", function(){ xyz()
{hier der Function Code }
});
führt täglich um 2.00h nachts den gewünschten Code aus [https://www.npmjs.com/package/iobroker. … t#schedule](https://www.npmjs.com/package/iobroker.javascript#schedule)
-
OK Danke das hab ich verstanden.
Jetzt fragt sich nur wie ich den Kalendereintrag wirklich auslesen kann denn,
kalendereintrag = {ip: "ical.0.data.html"};
gibt nicht den html String zurück so wie er im Objekt angezeigt wird. :?:
-
Dafür gibts eine recht einfache Lösung:
Du kannst im ical Events definieren. Direkt in der Adapter Instanz. Ließ dir mal die Beschreibung des Adapters durch.
Wenn du also z.B. TD und ND jeweils einzeln definierst, sucht der iCal dir das ganz von selbst raus und schreibt es in den entsprechend "event" state rein.
Den könntest du dann jeden Tag auswerten. Sofern event state > 0 für TD –> Tagdienst, sonst Nachtdienst.
Wochenenden oder sonstige freie Tage hättest du auf die Art auch gleich mit erschlagen
Als Beispiel mein Ferienkalender, mit dem ich auch einiges steuere. Als Event ist in der ical Instanz Ferien eingetragen und mit diesem Skript prüfe ich dann auf Ferien
function fFerien(){ if( getState("ical.3.events.ferien"/*ferien*/).val === true) { // Ferienkalender wird nach Stichwort "ferien" durchsucht setState(idFerien, 1) ; } else { setState(idFerien, 0) ; } if(debug) log("Ferien ist "+getState(idFerien).val); }
-
Ja das mit dem Event hab ich bereits herausgefunden.
Hab den Code jetzt so umgeschrieben.
Zum Testen frage ich jetzt alle Minute ab.
var tagdienst; var debug = true; // zum debuggen) /** Täglich um 2 Uhr früh den Kalendereintrag auslesen **/ schedule("*/1 * * * *", function() { if( getState("ical.0.events.TD").val === true) { setState(tagdienst, 1) ; } else { setState(tagdienst, 0) ; } }); if(debug) log("Tagdienst: "+ getState(tagdienst).val);
funktioniert nur leider nicht.
Und ich hab keine Ahnung warum.
Fehlermeldung gibts keine.
Diese JS Syntax die bringt mich noch um den Verstand. :oops:
-
Was geht denn nicht?
Die States sind noch nicht definiert.
Du müsstest z.B. davor schreiben
createState("NAME DES STATES", 0);
und dann
var tagdienst = [hier auf den oben kreierten state zeigen]
wenn du erstmal nur mit der Variable spielen willst dann brauchst du setState nicht sondern es reicht wenn du
var tagdienst; var debug = true; // zum debuggen) /** Täglich um 2 Uhr früh den Kalendereintrag auslesen **/ schedule("*/1 * * * *", function() { if( getState("ical.0.events.TD").val === true) { tagdienst = 1 ; else tagdienst = 0; } }); if(debug) log("Tagdienst: "+ tagdienst);
-
wenn du erstmal nur mit der Variable spielen willst dann brauchst du setState nicht sondern es reicht wenn du
var tagdienst; var debug = true; // zum debuggen) /** Täglich um 2 Uhr früh den Kalendereintrag auslesen **/ schedule("*/1 * * * *", function() { if( getState("ical.0.events.TD").val === true) { tagdienst = 1 ; else tagdienst = 0; } }); if(debug) log("Tagdienst: "+ tagdienst); ```` `
So hab ichs ganz am Anfang gehabt.
Weils nicht funktioniert hat hab ich das dann mit dem Status gemacht.
-
Was sagt denn das log, was steht in den Objekten (Reiter, Screenshot?)
-
OK Habs jetzt hinbekommen.
Der fehler war
Falscher Code
var tagdienst; var debug = true; // zum debuggen) /** Täglich um 2 Uhr früh den Kalendereintrag auslesen **/ schedule("*/1 * * * *", function() { if( getState("ical.0.events.TD").val === true) { tagdienst = 1 ; else tagdienst = 0; } }); if(debug) log("Tagdienst: "+ tagdienst);
Richtiger Code
var tagdienst; var debug = true; // zum debuggen) /** Täglich um 2 Uhr früh den Kalendereintrag auslesen **/ schedule("*/1 * * * *", function() { if( getState("ical.0.events.TD").val === true) { tagdienst = 1 ; } else { tagdienst = 0; } if(debug) log("Tagdienst: "+ tagdienst); });
Ich hab die Variable ausserhalb der funktion debuggt und dann war sie immer leer.