AdapterRequests icon indicating copy to clipboard operation
AdapterRequests copied to clipboard

Kalenderadapter, der über CalDAV mit Aufgaben (bzw. Tasks/Erinnerungen) umgehen kann

Open Sigi74 opened this issue 2 years ago • 5 comments

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

Sigi74 avatar Apr 27 '22 07:04 Sigi74

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 avatar Jan 02 '23 13:01 Sigi74

@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

mcm1957 avatar Jan 02 '23 14:01 mcm1957

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.

MecMax avatar Jan 01 '24 12:01 MecMax

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.

aruttkamp avatar Jan 01 '24 12:01 aruttkamp

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);
}

schdief06 avatar Jan 02 '24 09:01 schdief06