AdapterRequests
AdapterRequests copied to clipboard
Kalenderadapter, der über CalDAV mit Aufgaben (bzw. Tasks/Erinnerungen) umgehen kann
Ich wünsche mir einen Adapter der mit dem CalDAV-Protokoll die Daten (Kalender und die darin enthaltenen Aufgaben/Erinnerungen) aus einem CalDAV-Server (Google/Nextcloud/iCloud) mit ioBroker synchronisieren kann.
Am PC und am Handy synchronisiere ich meine Nextcloud mit https://www.davx5.com/ bwz https://caldavsynchronizer.org/de/ wenn das von Interesse ist.
Am Handy benutzte ich um zu Lesen Opentask/Aufgaben https://play.google.com/store/apps/details?id=org.dmfs.tasks&hl=de&gl=US
Schade, dass für eine selbst gehostete Aufgabenlösung (Nextcloud usw.) für die ioBroker-gemeinde wohl kaum Interesse besteht. Mochte nicht auf eine Lösung wie TODIST umsteigen, die proprietär ist
@Sigi74 Keine Ahnung woher du die Ansicht nimmst, dass selbst gehostete Aufgabenlösungen uninteressant sind. Wenn du dir die Liste der gewünschten Adapter ansiehst wirst du sehen, dass viele Dinge jemand suchen der sie umsetzen kann. Nur leider ist die Zeit bei allen FREIWILLIGEN die dies im Allgemeinen in ihrer Freizeit und unentgeltlich tun meist recht knapp. Also bitte hab noch Geduld und / oder sprich doch Freunde od. Bekannte in deinem Umfeld die ein wenige Programmierkenntnisse haben an ob sie nicht Lust haben mitzumachen.
McM
Ich suche gerade ebenfalls eine Möglichkeit, meine Aufgaben im ioBroker darzustellen. Habe die exakt gleicht Anforderung wie @Sigi74 . Wir sind, denke ich, alle OpenSource getrieben. Wäre halt super, wenn jemand noch den Tasksync integrieren könnte. Vielleicht auch in einem aktuellen Kalenderadapter wie ICAL oder WEBCAL.
Grundsätzlich ist das ein spannendes Thema. Das Interesse scheint sich aber stark in Grenzen zu halten. Gibt es denn wirklich so viele für die das interessant ist ? 9x Thumb Up ist jetzt nicht so die Welt.
Ich habe mir mal ein globales Script geschrieben, um Tasks in meinen Nextcloud Kalendern einzufügen. Sicher noch ausbaufähig, aber funktioniert soweit gut:
var XMLHttpRequest = require('xhr2');
var Base64 = require('base-64');
var xml2js = require('xml2js');
var uuid = require('uuid');
const url = "LINK TO YOUR CALDAV INTERFACE e.g. https://mydomain.com/remote.php/dav/calendars/username/" + calendar + "/";
const auth = "USERNAME:PASSWORD";
//formattedDate in format 20220520T170000
async function createTask(calendar, todoname, formattedDate = '', description = ''){
var todoexists = false;
//newlines in description
description = description.replace(new RegExp('\n', 'g'), "\\n");
//if not set: date = today
if(formattedDate == ''){
formattedDate = formatDate(new Date(), "JJJJ-MM-TT")
formattedDate = formattedDate.replace(new RegExp('-', 'g'), '') + 'T170000'
}
//Body: Get all VTODOS
var data = '<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">'+
'<d:prop>'+
'<d:getetag />'+
'<c:calendar-data />'+
'</d:prop>'+
'<c:filter>'+
'<c:comp-filter name="VCALENDAR">'+
'<c:comp-filter name="VTODO" />'+
'</c:comp-filter>'+
'</c:filter>'+
'</c:calendar-query>';
//Send REPORT-Request
var calurl = url + calendar + "/";
var objHTTP = new XMLHttpRequest();
objHTTP.open('REPORT', calurl, true);
objHTTP.setRequestHeader("OCS-APIRequest","true");
objHTTP.setRequestHeader("Authorization", "Basic " + Base64.encode(auth));
objHTTP.setRequestHeader("Depth", "1");
objHTTP.onreadystatechange = function() {
if (objHTTP.readyState == XMLHttpRequest.DONE) {
//Parse XML-Response
var response = "" + objHTTP.responseText;
response = response.replace(new RegExp('<d:', 'g'), '<')
response = response.replace(new RegExp('</d:', 'g'), '</')
response = response.replace(new RegExp('<cal:', 'g'), '<')
response = response.replace(new RegExp('</cal:', 'g'), '</')
response = response.replace(new RegExp('calendar-data', 'g'), 'calendardata')
//console.log(response);
var parser = new xml2js.Parser();
parser.parseString(response, function(err,result){
if(err != null){
log("XML-Parse-Error: " + err);
}
result.multistatus.response.forEach(function (element) {
element.propstat.forEach(function (element) {
element.prop.forEach(function (element) {
//Check: Existiert todo schon?
var calendardata = ""+element.calendardata
if(!calendardata.includes("STATUS:COMPLETED") && calendardata.includes("SUMMARY:" + todoname + "\n")){
log("Todo already exists: " + calendardata, 'debug');
todoexists = true;
}
});
});
});
if(!todoexists){
//create task
var datestring = formatDate(new Date(), "JJJJ-MM-TT")
datestring = datestring.replace(new RegExp('-', 'g'), '')
var data = 'BEGIN:VCALENDAR\n'+
'BEGIN:VTODO\n'+
'SUMMARY:' + todoname + '\n'+
'STATUS:NEEDS-ACTION\n'+
'DUE;TZID=Europe/Berlin:'+formattedDate + '\n';
//add Description
if(description != ''){
data += 'DESCRIPTION:'+description + '\n';
}
//end of vcal
data += 'END:VTODO\n' +
'END:VCALENDAR\n';
var filename = 'iob-'+uuid.v4()+'.ics';
log("Filename: " + filename, 'debug');
var objHTTP = new XMLHttpRequest();
objHTTP.open('PUT', calurl + filename, true);
objHTTP.setRequestHeader("OCS-APIRequest","true");
objHTTP.setRequestHeader("Authorization", "Basic " + Base64.encode(auth));
objHTTP.onreadystatechange = function() {
if (objHTTP.readyState == XMLHttpRequest.DONE && objHTTP.responseText == '') {
log("New Task: \"" + todoname + "\" created", 'info');
}else if(objHTTP.readyState == XMLHttpRequest.DONE){
log("Error creating Task: \"" + todoname + "\"\n" + objHTTP.responseText, 'error');
}
}
objHTTP.send(data);
}else{
log("Task: \"" + todoname + "\" not created, because it already exists", 'info');
}
});
}
}
objHTTP.send(data);
}