iobroker.ical 1.12.2 → 1.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -233
- package/admin/i18n/de/translations.json +34 -0
- package/admin/i18n/en/translations.json +34 -0
- package/admin/i18n/es/translations.json +34 -0
- package/admin/i18n/fr/translations.json +34 -0
- package/admin/i18n/it/translations.json +34 -0
- package/admin/i18n/nl/translations.json +34 -0
- package/admin/i18n/pl/translations.json +34 -0
- package/admin/i18n/pt/translations.json +34 -0
- package/admin/i18n/ru/translations.json +34 -0
- package/admin/i18n/zh-cn/translations.json +34 -0
- package/admin/index_m.html +15 -16
- package/admin/jsonConfig.json +496 -0
- package/admin/words.js +38 -29
- package/io-package.json +194 -73
- package/lib/adapter-config.d.ts +19 -0
- package/main.js +63 -46
- package/package.json +38 -12
- package/.mocharc.json +0 -5
- package/.releaseconfig.json +0 -3
- package/.tern-project +0 -16
- package/docs/de/README.md +0 -197
- package/docs/de/google-de1.png +0 -0
- package/docs/de/google-de2.png +0 -0
- package/docs/de/google1.png +0 -0
- package/docs/de/google2.png +0 -0
- package/docs/de/ical.png +0 -0
- package/docs/en/README.md +0 -198
- package/docs/en/google-de1.png +0 -0
- package/docs/en/google-de2.png +0 -0
- package/docs/en/google1.png +0 -0
- package/docs/en/google2.png +0 -0
- package/docs/en/ical.png +0 -0
- package/docs/google-de1.png +0 -0
- package/docs/google-de2.png +0 -0
- package/docs/google1.png +0 -0
- package/docs/google2.png +0 -0
package/main.js
CHANGED
|
@@ -22,7 +22,9 @@ const crypto = require('crypto');
|
|
|
22
22
|
const fs = require('fs');
|
|
23
23
|
const path = require('path');
|
|
24
24
|
const adapterName = require('./package.json').name.split('.').pop();
|
|
25
|
-
const
|
|
25
|
+
const axios = require('axios').default;
|
|
26
|
+
const https = require('https');
|
|
27
|
+
|
|
26
28
|
let adapter;
|
|
27
29
|
let stopped = false;
|
|
28
30
|
let killTimeout = null;
|
|
@@ -172,59 +174,73 @@ function getICal(urlOrFile, user, pass, sslignore, calName, cb) {
|
|
|
172
174
|
} else {
|
|
173
175
|
// Find out whether SSL certificate errors shall be ignored
|
|
174
176
|
const options = {
|
|
175
|
-
|
|
177
|
+
method: 'get',
|
|
178
|
+
url: urlOrFile
|
|
176
179
|
};
|
|
177
180
|
|
|
178
181
|
if (sslignore === 'ignore' || sslignore === 'true' || sslignore === true) {
|
|
179
|
-
options.
|
|
182
|
+
options.httpsAgent = new https.Agent({
|
|
183
|
+
rejectUnauthorized: false
|
|
184
|
+
});
|
|
180
185
|
}
|
|
181
186
|
|
|
182
187
|
if (user) {
|
|
183
188
|
options.auth = {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
sendImmediately: true
|
|
189
|
+
username: user,
|
|
190
|
+
password: pass
|
|
187
191
|
};
|
|
188
192
|
}
|
|
189
193
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
if (
|
|
195
|
-
let cachedContent;
|
|
196
|
-
let cachedDate;
|
|
197
|
-
try {
|
|
198
|
-
if (fs.existsSync(cachedFilename)) {
|
|
199
|
-
cachedContent = fs.readFileSync(cachedFilename, 'utf-8');
|
|
200
|
-
const stat = fs.statSync(cachedFilename);
|
|
201
|
-
cachedDate = stat.mtime;
|
|
202
|
-
}
|
|
203
|
-
} catch (err) {
|
|
204
|
-
adapter.log.info(`Cannot read cached calendar file for "${urlOrFile}": ${err.message}`);
|
|
205
|
-
}
|
|
206
|
-
if (err) {
|
|
207
|
-
adapter.log.warn(`Error reading from URL "${urlOrFile}": ${(err && err.code === 'ENOTFOUND') ? 'address not found!' : err}`);
|
|
208
|
-
if (!cachedContent) {
|
|
209
|
-
return cb && cb(err || `Cannot read URL: "${urlOrFile}"`);
|
|
210
|
-
}
|
|
211
|
-
} else if (r) {
|
|
212
|
-
adapter.log.warn(`Error reading from URL "${urlOrFile}": Server responded HTTP-Statuscode=${r.statusCode}: ${_data}`);
|
|
213
|
-
if (!cachedContent) {
|
|
214
|
-
return cb && cb(`Cannot read URL: "${urlOrFile}" HTTP-Status ${r.statusCode}`);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
adapter.log.info(`Use cached File content for for "${urlOrFile}" from ${cachedDate}`);
|
|
218
|
-
cb && cb(null, cachedContent);
|
|
219
|
-
} else {
|
|
194
|
+
const calHash = crypto.createHash('md5').update(user + pass + urlOrFile).digest('hex');
|
|
195
|
+
const cachedFilename = path.join(__dirname, calHash);
|
|
196
|
+
|
|
197
|
+
axios(options).then(function (response) {
|
|
198
|
+
if (response.data) {
|
|
220
199
|
try {
|
|
221
|
-
fs.writeFileSync(cachedFilename,
|
|
200
|
+
fs.writeFileSync(cachedFilename, response.data, 'utf-8');
|
|
222
201
|
adapter.log.debug(`Successfully cached content for calendar "${urlOrFile}" as ${cachedFilename}`);
|
|
223
202
|
} catch (err) {
|
|
224
203
|
// Ignore
|
|
225
204
|
}
|
|
226
|
-
|
|
205
|
+
|
|
206
|
+
cb && cb(null, response.data);
|
|
207
|
+
} else {
|
|
208
|
+
cb && cb(`Error reading from URL "${urlOrFile}": Received no data`);
|
|
227
209
|
}
|
|
210
|
+
}).catch(error => {
|
|
211
|
+
let cachedContent;
|
|
212
|
+
let cachedDate;
|
|
213
|
+
|
|
214
|
+
if (error.response) {
|
|
215
|
+
// The request was made and the server responded with a status code
|
|
216
|
+
// that falls out of the range of 2xx
|
|
217
|
+
adapter.log.warn(`Error reading from URL "${urlOrFile}": ${error.response.status}`);
|
|
218
|
+
} else if (error.request) {
|
|
219
|
+
// The request was made but no response was received
|
|
220
|
+
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
|
|
221
|
+
// http.ClientRequest in node.js
|
|
222
|
+
adapter.log.warn(`Error reading from URL "${urlOrFile}"`);
|
|
223
|
+
} else {
|
|
224
|
+
// Something happened in setting up the request that triggered an Error
|
|
225
|
+
adapter.log.warn(`Error reading from URL "${urlOrFile}": ${error.message}`);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
if (fs.existsSync(cachedFilename)) {
|
|
230
|
+
cachedContent = fs.readFileSync(cachedFilename, 'utf-8');
|
|
231
|
+
const stat = fs.statSync(cachedFilename);
|
|
232
|
+
cachedDate = stat.mtime;
|
|
233
|
+
}
|
|
234
|
+
} catch (err) {
|
|
235
|
+
adapter.log.info(`Cannot read cached calendar file for "${urlOrFile}": ${err.message}`);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (!cachedContent) {
|
|
239
|
+
return cb && cb(`Cannot read URL: "${urlOrFile}"`);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
adapter.log.info(`Use cached File content for "${urlOrFile}" from ${cachedDate}`);
|
|
243
|
+
cb && cb(null, cachedContent);
|
|
228
244
|
});
|
|
229
245
|
}
|
|
230
246
|
}
|
|
@@ -464,11 +480,10 @@ async function checkDates(ev, endpreview, startpreview, realnow, rule, calName,
|
|
|
464
480
|
reason = ev.summary || '';
|
|
465
481
|
}
|
|
466
482
|
|
|
467
|
-
|
|
468
483
|
const location = ev.location || '';
|
|
469
484
|
|
|
470
485
|
// check if sub parameter 'class' exists and contains PRIVATE
|
|
471
|
-
isPrivate = Object.prototype.hasOwnProperty.call(ev, 'class') && ev.class ===
|
|
486
|
+
isPrivate = Object.prototype.hasOwnProperty.call(ev, 'class') && ev.class === 'PRIVATE';
|
|
472
487
|
|
|
473
488
|
// If not start point => ignore it
|
|
474
489
|
if (!ev.start || !ev.start instanceof Date) {
|
|
@@ -549,7 +564,7 @@ LOCATION:${location}`;
|
|
|
549
564
|
// add additional Objects, so iobroker.occ can use it
|
|
550
565
|
_calName: calName,
|
|
551
566
|
_calColor: adapter.config.calendars.find(x => x.name === calName).color,
|
|
552
|
-
|
|
567
|
+
_object: ev
|
|
553
568
|
});
|
|
554
569
|
|
|
555
570
|
adapter.log.debug(`Event (full day) added : ${JSON.stringify(rule)} ${reason} at ${date.text}`);
|
|
@@ -587,7 +602,7 @@ LOCATION:${location}`;
|
|
|
587
602
|
// add additional Objects, so iobroker.occ can use it
|
|
588
603
|
_calName: calName,
|
|
589
604
|
_calColor: adapter.config.calendars.find(x => x.name === calName).color,
|
|
590
|
-
|
|
605
|
+
_object: ev
|
|
591
606
|
});
|
|
592
607
|
|
|
593
608
|
adapter.log.debug(`Event with time added: ${JSON.stringify(rule)} ${reason} at ${date.text}`);
|
|
@@ -758,7 +773,7 @@ function initEvent(name, display, day, type, id, on, off, ack, callback) {
|
|
|
758
773
|
obj.state = false;
|
|
759
774
|
await adapter.setStateAsync(stateName, {val: false, ack: true});
|
|
760
775
|
await setState(id, off, ack);
|
|
761
|
-
callback && callback(name)
|
|
776
|
+
callback && callback(name);
|
|
762
777
|
} else {
|
|
763
778
|
obj.state = state.val;
|
|
764
779
|
callback && callback(name);
|
|
@@ -1294,9 +1309,9 @@ function formatDate(_date, _end, withTime, fullDay) {
|
|
|
1294
1309
|
}
|
|
1295
1310
|
} else {
|
|
1296
1311
|
//if (adapter.config.language === 'ru') {
|
|
1297
|
-
|
|
1312
|
+
// Todo: Russian
|
|
1298
1313
|
//} else {
|
|
1299
|
-
|
|
1314
|
+
text = `${_('still') !== ' ' ? _('still') : ''} ${minutesleft} ${minutesleft === 1 ? _('minute') : _('minutes')}${_left}`;
|
|
1300
1315
|
//}
|
|
1301
1316
|
}
|
|
1302
1317
|
} else {
|
|
@@ -1431,6 +1446,8 @@ async function displayDates() {
|
|
|
1431
1446
|
}
|
|
1432
1447
|
}
|
|
1433
1448
|
|
|
1449
|
+
adapter.log.debug(`Dates array (data.table): ${JSON.stringify(datesArray)}`);
|
|
1450
|
+
|
|
1434
1451
|
await adapter.setStateAsync('data.table', {val: JSON.stringify(datesArray), ack: true});
|
|
1435
1452
|
await adapter.setStateAsync('data.html', {val: brSeparatedList(datesArray), ack: true});
|
|
1436
1453
|
await adapter.setStateAsync('data.text', {val: crlfSeparatedList(datesArray), ack: true});
|
|
@@ -1514,7 +1531,7 @@ function brSeparatedList(datesArray) {
|
|
|
1514
1531
|
}
|
|
1515
1532
|
}
|
|
1516
1533
|
|
|
1517
|
-
|
|
1534
|
+
let apptmBlock = '';
|
|
1518
1535
|
let apptmColor = color;
|
|
1519
1536
|
|
|
1520
1537
|
if (datesArray[i]._object && datesArray[i]._object['color'] !== undefined) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.ical",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.2",
|
|
4
4
|
"description": "Allows read information from google calender and from iCal.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "bluefox",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
{
|
|
19
19
|
"name": "jens-maus",
|
|
20
20
|
"email": "mail@jens-maus.de"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Matthias Kleine",
|
|
24
|
+
"email": "info@haus-automatisierung.com"
|
|
21
25
|
}
|
|
22
26
|
],
|
|
23
27
|
"homepage": "https://github.com/iobroker-community-adapters/ioBroker.ical",
|
|
@@ -33,38 +37,60 @@
|
|
|
33
37
|
},
|
|
34
38
|
"dependencies": {
|
|
35
39
|
"@iobroker/adapter-core": "^2.6.0",
|
|
36
|
-
"
|
|
40
|
+
"axios": "^0.27.2",
|
|
37
41
|
"cloneextend": "^0.0.3",
|
|
38
|
-
"request": "^2.88.2",
|
|
39
42
|
"json-schema": "^0.4.0",
|
|
40
|
-
"
|
|
43
|
+
"node-ical": "^0.15.1",
|
|
44
|
+
"rrule": "2.6.4"
|
|
41
45
|
},
|
|
42
46
|
"devDependencies": {
|
|
43
47
|
"@alcalzone/release-script": "^3.5.9",
|
|
44
48
|
"@alcalzone/release-script-plugin-iobroker": "^3.5.9",
|
|
45
49
|
"@alcalzone/release-script-plugin-license": "^3.5.9",
|
|
46
|
-
"@iobroker/
|
|
47
|
-
"@iobroker/
|
|
50
|
+
"@iobroker/adapter-dev": "^1.0.1",
|
|
51
|
+
"@iobroker/testing": "^4.0.0",
|
|
52
|
+
"@types/chai": "^4.3.3",
|
|
53
|
+
"@types/chai-as-promised": "^7.1.5",
|
|
54
|
+
"@types/mocha": "^9.1.1",
|
|
55
|
+
"@types/node": "^18.7.13",
|
|
56
|
+
"@types/proxyquire": "^1.3.28",
|
|
57
|
+
"@types/sinon": "^10.0.13",
|
|
58
|
+
"@types/sinon-chai": "^3.2.8",
|
|
48
59
|
"chai": "^4.3.6",
|
|
60
|
+
"chai-as-promised": "^7.1.1",
|
|
49
61
|
"chai-string": "^1.5.0",
|
|
50
|
-
"eslint": "^8.
|
|
62
|
+
"eslint": "^8.23.0",
|
|
63
|
+
"luxon": "^2.5.0",
|
|
51
64
|
"mocha": "^10.0.0",
|
|
52
|
-
"
|
|
53
|
-
"
|
|
65
|
+
"proxyquire": "^2.1.3",
|
|
66
|
+
"sinon": "^14.0.0",
|
|
67
|
+
"sinon-chai": "^3.7.0",
|
|
68
|
+
"typescript": "~4.8.2"
|
|
54
69
|
},
|
|
55
70
|
"bugs": {
|
|
56
71
|
"url": "https://github.com/iobroker-community-adapters/ioBroker.ical/issues"
|
|
57
72
|
},
|
|
58
73
|
"main": "main.js",
|
|
74
|
+
"files": [
|
|
75
|
+
"admin{,/!(src)/**}/!(tsconfig|tsconfig.*).json",
|
|
76
|
+
"admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}",
|
|
77
|
+
"lib/",
|
|
78
|
+
"www/",
|
|
79
|
+
"io-package.json",
|
|
80
|
+
"LICENSE",
|
|
81
|
+
"main.js"
|
|
82
|
+
],
|
|
59
83
|
"scripts": {
|
|
60
|
-
"test:js": "mocha --
|
|
84
|
+
"test:js": "mocha --config test/mocharc.custom.json \"{!(node_modules|test)/**/*.test.js,*.test.js,test/**/test!(PackageFiles|Startup).js}\"",
|
|
61
85
|
"test:package": "mocha test/package --exit",
|
|
62
|
-
"test:unit": "mocha test/unit --exit",
|
|
63
86
|
"test:integration": "mocha test/integration --exit",
|
|
64
87
|
"test": "npm run test:js && npm run test:package",
|
|
65
88
|
"lint": "eslint",
|
|
89
|
+
"translate": "translate-adapter",
|
|
66
90
|
"release": "release-script",
|
|
67
|
-
"
|
|
91
|
+
"release-patch": "release-script patch --yes",
|
|
92
|
+
"release-minor": "release-script minor --yes",
|
|
93
|
+
"release-major": "release-script major --yes"
|
|
68
94
|
},
|
|
69
95
|
"license": "MIT"
|
|
70
96
|
}
|
package/.mocharc.json
DELETED
package/.releaseconfig.json
DELETED
package/.tern-project
DELETED
package/docs/de/README.md
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-

|
|
2
|
-
# ioBroker iCal adapter
|
|
3
|
-
Mit diesem Adapter können .ics-Dateien von einer bestimmten URL gelesen und analysiert werden (Google Kalender oder iCal).
|
|
4
|
-
Alternativ ist es möglich, eine lokale ".ics" -Datei zu verwenden (verwenden Sie den absoluten Pfad zur Datei anstelle der URL)
|
|
5
|
-
## Verwendung
|
|
6
|
-
Basierend auf iCal Adapter für (CCU.IO) [https://github.com/hobbyquaker/ccu.io/tree/master/adapter/ical] von vader722
|
|
7
|
-
|
|
8
|
-
### Adapter iCal
|
|
9
|
-
Der iCal-Adapter für ioBroker liest Kalenderdateien im ".ics" -Format von der angegebenen URL und schreibt Ereignisse, die sich im vordefinierten Zeitintervall befinden, in die ioBroker-Variable. Alternativ ist es möglich, eine lokale .ics-Datei zu verwenden (verwenden Sie den absoluten Pfad zur Datei anstelle der URL).
|
|
10
|
-
Sie können in VIS mit dem Widget `basic html - String (unescaped)` angezeigt werden.
|
|
11
|
-
|
|
12
|
-
Es werden 2 Variablen angelegt:
|
|
13
|
-
- `iCalReadTrigger`
|
|
14
|
-
- `iCalEvents`
|
|
15
|
-
|
|
16
|
-
Die Variable `iCalReadTrigger` dient zum Triggern des Einlesevorgangs.
|
|
17
|
-
In den Settings können mehrere URLs hinterlegt werden, von welchen der Kalender eingelesen wird.
|
|
18
|
-
Die Kalender werden dann nacheinander eingelesen und das Ergebnis zusammengefasst.
|
|
19
|
-
Alternativ kann dem Lesebefehl auch eine URL mitgegeben werden, um z.B. zeitweilig einen anderen Kalender einzulesen.
|
|
20
|
-
|
|
21
|
-
Zum Einlesen von den `defaultURLs` muss der String `read` in die Variable `iCalReadTrigger` geschrieben werden.
|
|
22
|
-
|
|
23
|
-
Zum Einlesen von einer beliebigen URL muss der String `read https://...` in die Variable `iCalReadTrigger` geschrieben werden.
|
|
24
|
-
|
|
25
|
-
Das Ergebnis liefert der iCal Adapter in die Variable `iCalEvents`.
|
|
26
|
-
|
|
27
|
-
Durch schreiben von `check` in `iCalReadTrigger` wird der Check-Vorgang auf Events auf die gelesenen Daten ohne erneutes einlesen der Daten ausgelöst.
|
|
28
|
-
|
|
29
|
-
Alternativ kann der Adapter auch automatisch in einem definierbaren Intervall die Kalender abfragen (nur mit der `defaultURL`).
|
|
30
|
-
Dazu in den Settings mit der Variablen runEveryMinutes das Abfrageintervall (in Minuten) einstellen.
|
|
31
|
-
|
|
32
|
-
Bedeutung der Optionen im Konfigfile:
|
|
33
|
-
|
|
34
|
-
- `preview`: 7 heisst, dass Termine 7 Tage im voraus angezeigt werden
|
|
35
|
-
- `runEveryMinutes`: 30 bedeutet dass der Adapter automatisch alle 30min den Kalender neu einliesst. Bei 0 wird nicht automatisch eingelesen
|
|
36
|
-
- `colorize`: true Termine am heutigen Tag sowie aktuell laufende Termine werden rot gefärbt, Termine am morgigen Tag orange, diese Option überstimmt die Option everyCalOneColor
|
|
37
|
-
- `debug`: false bei true werden erweiterte Ausgaben ins CCU.IO Log geschrieben
|
|
38
|
-
- `defColor`: `white` legt die Standardfarbe der Kalendereinträge fest
|
|
39
|
-
- `fulltime`: ` ` legt fest durch welchen String bei ganztägigen Terminen die Uhrzeit 00:00 ersetzt wird. Bei Leerzeichen (zwischen den Hochkommas) wird dir Uhrzeit bei ganztägigen Terminen weggelassen
|
|
40
|
-
- `replaceDates`: true Bei true wird bei heutigen Terminen das heutige Datum durch den String todayString ersetzt (z.B. "Heute"). Bei morgigen Terminen durch den String tomorrowString
|
|
41
|
-
- `everyCalOneColor`: false Bei true wird bei mehreren Kalendern jeder Kalender in einer festzulegenden Farbe eingefärbt. Ist die Option colorize gesetzt, funktioniert dies nicht!
|
|
42
|
-
- `Calendar1`:
|
|
43
|
-
- "calURL": "http://11111.ics", URL des Kalenders
|
|
44
|
-
- "calColor": "white" Farbe des Kalenders, wenn die Option "everyCalOneColor" gesetzt ist.
|
|
45
|
-
|
|
46
|
-
Es können beliebig viele Kalender eingetragen werden. Im Standard Konfigfile sind 2 Kalender eingetragen.
|
|
47
|
-
- `Events`:
|
|
48
|
-
- `name`: "Urlaub":
|
|
49
|
-
- `enabled`: true # legt fest, ob das Event bearbeitet wird
|
|
50
|
-
- `Set ID`: Hier kann ein zusätzlicher State eingetragen werden, welcher aktualisiert wird, wenn das Event aktiv ist
|
|
51
|
-
- `On / Off`: Hier kann ein alternativer Wert in den bei 'Set ID' hinterlegten State geschrieben werden
|
|
52
|
-
- `display`: false # legt fest, ob das Event auch in dem iCalEvents angezeigt wird, oder nur ausgewertet wird
|
|
53
|
-
- `Set Ack`: false # Ack "aus" steuert den State um z.B. etwas zu schalten. #true Ack "an" aktualisiert den Wert
|
|
54
|
-
|
|
55
|
-
Durch setzen eines Events (in diesem Beispiel „Urlaub“), werden die Kalender nach dem String „Urlaub“ durchsucht.
|
|
56
|
-
Sollte ein Termin mit dem Stichwort „Urlaub“ in einem Kalender stehen, so wird automatisch eine State mit dem
|
|
57
|
-
Namen Urlaub auf True gesetzt. Ist der Termin vorbei, wird der State wieder auf false gesetzt.
|
|
58
|
-
Es wird für jeden Tag des preview Zeitraums ein Status angelegt. Achtung!
|
|
59
|
-
Es wird nach einem Substring gesucht, d.h. ein Eintrag im Kalender „Urlaub“ wird genauso erkannt wie ein
|
|
60
|
-
Eintrag „Urlaub Eltern“. Dies ist beim festlegen der Ereignisse zu berücksichtigen.
|
|
61
|
-
|
|
62
|
-
- Erklärung zu den States unter ical.0.events.0
|
|
63
|
-
- Das Event im Pfad ical.0.events.0.later wird auf true gesetzt, wenn es heute noch stattfindet aber noch nicht begonnen ist
|
|
64
|
-
- Das Event im Pfad ical.0.events.0.now wird auf true gesetzt, wenn es aktuell aktiv ist
|
|
65
|
-
- Das Event im Pfad ical.0.events.0.today wird auf true gesetzt, wenn das Event am heutigen Tag aktiv ist
|
|
66
|
-
- Hinweis: Termine der Vortage werden nicht angezeigt
|
|
67
|
-
|
|
68
|
-
Durch Anpassen der CSS im VIS können die Styles von heutigen (Standard rot) und morgigen Terminen (Standard Orange) festegelegt werden:
|
|
69
|
-
- `iCalWarn` - Zeilenanfang Kalendereintrag heute
|
|
70
|
-
- `iCalPreWarn` - Zeilenanfang Kalendereintrag morgen
|
|
71
|
-
- `iCalNormal` - Zeilenende von heute
|
|
72
|
-
- `iCalNormal2` - Zeilenende von morgen
|
|
73
|
-
|
|
74
|
-
### Kalender
|
|
75
|
-
#### Apple iCloud Kalender
|
|
76
|
-
Apple iCloud Kalender können angezeigt werden, wenn sie vorher freigegeben werden. Am besten einen eigenen Kalender für die Homematic anlegen, da der Kalender fuer alle freigegeben wird.
|
|
77
|
-
Dazu mit der rechten Maustaste auf dem Kalender in der Kalender App klicken und Freigabeeinstellungen auswählen. Jetzt einen Haken bei "Öffentlicher Kalender" setzen und die angezeigte URL kopieren. WICHTIG: die Url beginnt mit webcal://p0X-cale.....
|
|
78
|
-
`webcal` muss durch `http` ersetzt werden. Diese URL dann entweder in den Settings bei defaultURL eintragen, oder sie bei `read URL` angeben, also z.B. `readURL http://p-03-calendarws.icloud.com/xxxxxxxxx`
|
|
79
|
-
|
|
80
|
-
#### Google Kalender
|
|
81
|
-
Zum Einbinden eines Google Kalenders muss die Kalendereinstellung des Google Kalenders aufgerufen werden (mit der Maus auf "runter Pfeil" neben dem Kalender klicken). Die URL des Kalenders bekommt man durch klicken auf das `ICAL` Symbol neben dem Feld "Privatadresse". Diese URL dann entweder in den Settings bei defaultURL eintragen, oder sie bei `read URL` angeben, also z.B. `readURL https://www.google.com/calendar/ical/xxxxxxxx/basic.ics`.
|
|
82
|
-
|
|
83
|
-
#### OwnCloud Kalender
|
|
84
|
-
Zum Einbinden von geteilten Kalendern einer OwnCloud muss man dort in der Kalenderansicht in OwnCloud diesen Kalender als geteilten Kalender freigeben und dort den Link zum Kalender anzeigen lassen und diese URL (https://<DOMAIN>/remote.php/dav/calendars/USER/xxxxxxx_shared_by_xxxxxx?export) entsprechend in den ioBroker.ical Adapter mit Nutzername und Passwort angeben.
|
|
85
|
-
|
|
86
|
-
#### NextCloud Kalender
|
|
87
|
-
Zum Einbinden eines NextCloud Kalenders muss in der Kalenderansicht in NextCloud der Herunterladen-Link des einzelnen gewünschte Kalender eines Anwenders kopiert werden.
|
|
88
|
-
Dazu als Anwender in Nextcloud einloggen und zum 'Kalender' wechseln. In der linken Spalte den gewünschten Kalender bei dem Kreis mit den drei Punkten anklicken.
|
|
89
|
-
Im Menu mit der Maus über 'Herunterladen' schweben und mittels Rechtsklick den Link kopieren.
|
|
90
|
-
Bsp.: https://<DOMAIN>/remote.php/dav/calendars/MEINCALENDER/personal/?export (wichtig ist, dass hier "?export" im Link enthalten ist).
|
|
91
|
-
|
|
92
|
-
Diese URL in den ioBroker.ical Adapter mit Nutzername und Passwort angeben. Dieses muss für alle gewünschten Kalender aller User einzeln erfolgen.
|
|
93
|
-
|
|
94
|
-
#### Baikal CalDAV+CardDAV Server
|
|
95
|
-
Der Baikal-Server bringt das "ics-export"-Plugin mit welches den Export eines Kalenders in eine gesammelte ICal-Datei erlaubt. Dieses Plugin wird direkt über die URL ausgewählt und erlaubt eine problemlose Zusammenarbeit mit dem vorliegenden ioBroker-Adapter. Wichtig ist der Exportfilter, welcher einfach an die Kalender-URL angehangen zu werden braucht (`https://SERVER/baikal/cal.php/calendars/path/to/calendar?export&accept=ical`). Bei Anmeldeproblemen bitte in den Admin-Einstellungen der Web-UI des Baikal-Servers unter `Settings` den `WebDAV authentication type` von `DIGEST` auf `BASIC` stellen.
|
|
96
|
-
|
|
97
|
-
### CSS
|
|
98
|
-
In dem generierten HTML sind zwei Arten von CSS-Klassen enthalten, um Gestaltungsfreiheit zu ermöglichen.
|
|
99
|
-
|
|
100
|
-
#### Zeitbasierte CSS-Klassen
|
|
101
|
-
* _iCalNormal _ / _ iCalNormal2_: Das Ereignis wurde vor dem heutigen Tag gestartet (und wird noch ausgeführt) oder später, wie in 3 Tagen. Standardfarbe ohne CSS und ohne Kalenderfarbe ist die konfigurierte Adapterfarbe
|
|
102
|
-
* _iCalWarn _ / _ iCalWarn2_: Das Event startet heute, Standardfarbe ohne CSS und ohne Kalenderfarbe ist `rot`
|
|
103
|
-
* _iCalPreWarn _ / _ iCalPreWarn2_: Das Event startet morgen, Standardfarbe ohne CSS und ohne Kalenderfarbe ist `orange`
|
|
104
|
-
* _iCalPrePreWarn _ / _ iCalPrePreWarn2_: Das Event startet übermorgen, Standardfarbe ohne CSS und ohne Kalenderfarbe ist `gelb`
|
|
105
|
-
Die erste CSS-Klasse (z. B. iCalNormal) wird für Datum und Uhrzeit des HTML-Codes verwendet, und die zweite CSS-Klasse (z. B. iCalNormal2) wird für den Ereignisnamen verwendet.
|
|
106
|
-
|
|
107
|
-
CSS-Beispiel für diese CSS-Klassen, um die Ausgabe etwas anders zu formatieren (z. B. Datum / Uhrzeit links + fett und Ereignisname rechts ...):
|
|
108
|
-
```
|
|
109
|
-
.icalWarn{
|
|
110
|
-
color:red;
|
|
111
|
-
float:left;
|
|
112
|
-
font-size:12px;
|
|
113
|
-
font-weight:bold;
|
|
114
|
-
}
|
|
115
|
-
.icalWarn2{
|
|
116
|
-
color:white;
|
|
117
|
-
float:right;
|
|
118
|
-
font-size:12px;
|
|
119
|
-
font-weight:normal;
|
|
120
|
-
}
|
|
121
|
-
.icalPreWarn{
|
|
122
|
-
color:yellow;
|
|
123
|
-
float:left;
|
|
124
|
-
font-size:12px;
|
|
125
|
-
font-weight:bold;
|
|
126
|
-
}
|
|
127
|
-
.icalPreWarn2{
|
|
128
|
-
color:white;
|
|
129
|
-
float:right;
|
|
130
|
-
font-size:12px;
|
|
131
|
-
font-weight:normal;
|
|
132
|
-
}
|
|
133
|
-
.icalPrePreWarn{
|
|
134
|
-
color:white;
|
|
135
|
-
float:left;
|
|
136
|
-
font-size:12px;
|
|
137
|
-
font-weight:bold;
|
|
138
|
-
}
|
|
139
|
-
.icalPrePreWarn2{
|
|
140
|
-
color:white;
|
|
141
|
-
float:right;
|
|
142
|
-
font-size:12px;
|
|
143
|
-
font-weight:normal;
|
|
144
|
-
}
|
|
145
|
-
.icalNormal{
|
|
146
|
-
color:green;
|
|
147
|
-
float:left;
|
|
148
|
-
font-size:12px;
|
|
149
|
-
font-weight:bold;
|
|
150
|
-
}
|
|
151
|
-
.icalNormal2{
|
|
152
|
-
color:white;
|
|
153
|
-
float:right;
|
|
154
|
-
font-size:12px;
|
|
155
|
-
font-weight:normal;
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
#### Kalenderbasierte CSS-Klassen
|
|
160
|
-
Jeder Bereich hat auch eine CSS-Klasse, die auf dem Namen des Kalenders basiert, in dem sich das Ereignis befindet. Der in der Adapterkonfiguration definierte "Kalendername" wird dafür verwendet (Leerzeichen werden durch Unterstriche ersetzt).
|
|
161
|
-
|
|
162
|
-
* _iCal- <Kalendername> _: Diese Klasse wird für Datum und Uhrzeit des HTML-Codes verwendet
|
|
163
|
-
* _iCal-> calendername2> _: Diese Klasse wird für den Ereignisnamen verwendet
|
|
164
|
-
|
|
165
|
-
Um diese CSS-Klassen festzulegen, müssen Sie auch die zeitbasierte CSS-Klasse verwenden, z. _.icalNormal2.iCal- <Kalendername> 2_:
|
|
166
|
-
```
|
|
167
|
-
.icalNormal2.iCal-Google2{
|
|
168
|
-
color:white;
|
|
169
|
-
float:right;
|
|
170
|
-
font-size:12px;
|
|
171
|
-
font-weight:normal;
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
#### Beispiel für generiertes HTML
|
|
176
|
-
|
|
177
|
-
```
|
|
178
|
-
<span style="font-weight: bold; color:white"><span class="icalNormal iCal-calendar-today">→ 3.1.2018 2:00</span></span><span style="font-weight: normal; color:white"><span class='icalNormal2 iCal-calendar-today2'> TestEvent</span></span><br/>
|
|
179
|
-
<span style="font-weight: bold; color: red"><span class="icalWarn iCal-calendar-today">1.1.2018 ganzer Tag</span></span><span style="font-weight:normal;color:red"><span class='icalWarn2 iCal-calendar-today2'> Today Event</span></span><br/>
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## Filter
|
|
183
|
-
In Instanzoptionen ist es möglich, einen Filter pro Kalender zu verwalten. Es muss eine durch Semikolons getrennte Liste sein.
|
|
184
|
-
Wenn Sie die Option "Als regulären Ausdruck filtern" aktivieren,
|
|
185
|
-
wird der Filter als regulärer Ausdruck interpretiert.
|
|
186
|
-
Während der Kalenderaktualisierung werden alle Ereignisse ausgeschlossen,
|
|
187
|
-
die nach Beschreibung, Ort oder Zusammenfassung übereinstimmen.
|
|
188
|
-
|
|
189
|
-
Das Suchmuster ist:
|
|
190
|
-
```
|
|
191
|
-
SUMMARY:MySummary
|
|
192
|
-
DESCRIPTION:MyDescription
|
|
193
|
-
LOCATION:Mein Standort
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
Blacklist: Wenn Sie alle Ereignisse eines bestimmten Ortes ausschließen möchten, verwenden Sie `LOCATION: MyLocation` oder `MyLocation` oder 2 Orte `LOCATION:MyLocation;LOCATION:SomewhereElse`.
|
|
197
|
-
Whitelist: Wenn Sie nur Ereignisse einer bestimmten Position einschließen möchten, verwenden Sie reguläre Ausdrücke wie `/^(SUMMARY:.*)\s*(DESCRIPTION:.*)\s*(LOCATION:(?!MyLocation).*)$/` oder für 2 Standorte `/^(SUMMARY:.*)\s*(DESCRIPTION:.*)\s*(LOCATION:(?!((MyHomeLocation)|(MyWorkLocation))).*)$/`
|
package/docs/de/google-de1.png
DELETED
|
Binary file
|
package/docs/de/google-de2.png
DELETED
|
Binary file
|
package/docs/de/google1.png
DELETED
|
Binary file
|
package/docs/de/google2.png
DELETED
|
Binary file
|
package/docs/de/ical.png
DELETED
|
Binary file
|