iobroker.ical 1.15.0 → 1.16.1

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 CHANGED
@@ -23,7 +23,6 @@ Sentry reporting, starting with js-controller 3.0, means that this adapter can u
23
23
 
24
24
  <!--
25
25
  ## Todo
26
- * `data.trigger` doesn't support `check` option
27
26
  * fix timezone stuff in tests
28
27
  -->
29
28
 
@@ -32,6 +31,17 @@ Sentry reporting, starting with js-controller 3.0, means that this adapter can u
32
31
  Placeholder for the next version (at the beginning of the line):
33
32
  ### **WORK IN PROGRESS**
34
33
  -->
34
+ ### 1.16.1 (2024-11-01)
35
+ * (jens-maus) fix issue with handling rrule timezones incorrect with latest node-ical (#708).
36
+ * (jens-maus) update node-ical to latest 0.20.1
37
+ * (jens-maus) save cached files to os tmpdir instead.
38
+
39
+ ### 1.16.0 (2024-10-29)
40
+ * (cvoelkel76) add checkbox to allow to exactly match a calender event.
41
+ * (jens-maus) update node-ical to latest 0.20.0
42
+ * (klein0r) Breaking change: Removed trigger state (subscribe is deprecated in js-controller 6.x)
43
+ * (simatec) Responsive design added
44
+
35
45
  ### 1.15.0 (2024-04-30)
36
46
  * (mcm1957) Adapter requires node.js >= 18 and js-controller >= 5 now
37
47
  * (mcm1957) Dependencies have been updated
@@ -42,14 +52,6 @@ Sentry reporting, starting with js-controller 3.0, means that this adapter can u
42
52
  ### 1.14.2 (2024-01-29)
43
53
  * (jens-maus) update node-ical to latest 0.17.2
44
54
 
45
- ### 1.14.1 (2024-01-29)
46
- * (klein0r) Create dummy file in files tab
47
- * (klein0r) Fixed recurring events
48
-
49
- ### 1.14.0 (2024-01-07)
50
- * (klein0r) Allow to set custom http user agent
51
- * (klein0r) Added option to use files tab for calendar files
52
-
53
55
  ## License
54
56
 
55
57
  The MIT License (MIT)
@@ -11,6 +11,7 @@
11
11
  "Hide Year": "Jahr verbergen",
12
12
  "Ignore Certificate errors": "Zertifikatfehler ignorieren",
13
13
  "Ignore case for event-search": "Groß-/Kleinschreibung bei Ereignis-Suche ignorieren",
14
+ "Exact Match for event-search": "Exakte Übereinstimmung für die Ereignissuche",
14
15
  "Language": "Sprache",
15
16
  "Padding date with '0'": "Datumsangaben mit führender '0'",
16
17
  "Past days": "Vergangene Tage",
@@ -11,6 +11,7 @@
11
11
  "Hide Year": "Hide Year",
12
12
  "Ignore Certificate errors": "Ignore Certificate errors",
13
13
  "Ignore case for event-search": "Ignore case for event-search",
14
+ "Exact Match for event-search": "Exact Match for event-search",
14
15
  "Language": "Language",
15
16
  "Padding date with '0'": "Padding date with '0'",
16
17
  "Past days": "Past days",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Color predeterminado para HTML",
7
7
  "Events": "Eventos",
8
8
  "Every calendar has own color": "Cada calendario tiene su propio color",
9
+ "Exact Match for event-search": "Exact Match for event-search",
9
10
  "HTML settings": "Configuración HTML",
10
11
  "Hide Start-End of events": "Ocultar inicio-fin de eventos",
11
12
  "Hide Year": "Ocultar año",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Couleur par défaut pour HTML",
7
7
  "Events": "Événements",
8
8
  "Every calendar has own color": "Chaque calendrier a sa propre couleur",
9
+ "Exact Match for event-search": "Correspondance exacte pour la recherche d'événements",
9
10
  "HTML settings": "Paramètres HTML",
10
11
  "Hide Start-End of events": "Masquer le début et la fin des événements",
11
12
  "Hide Year": "Masquer l'année",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Colore predefinito per HTML",
7
7
  "Events": "eventi",
8
8
  "Every calendar has own color": "Ogni calendario ha il proprio colore",
9
+ "Exact Match for event-search": "Corrispondenza esatta per la ricerca di eventi",
9
10
  "HTML settings": "Impostazioni HTML",
10
11
  "Hide Start-End of events": "Nascondi inizio-fine degli eventi",
11
12
  "Hide Year": "Nascondi anno",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Standaard-kleur voor HTML",
7
7
  "Events": "Gebeurtenissen",
8
8
  "Every calendar has own color": "Elke agenda heeft zijn eigen kleur",
9
+ "Exact Match for event-search": "Exacte match voor zoeken naar evenementen",
9
10
  "HTML settings": "HTML-instellingen",
10
11
  "Hide Start-End of events": "Verberg begin-einde van evenementen",
11
12
  "Hide Year": "Jaar verbergen",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Domyślny kolor dla HTML",
7
7
  "Events": "Wydarzenia",
8
8
  "Every calendar has own color": "Każdy kalendarz ma własny kolor",
9
+ "Exact Match for event-search": "Dokładne dopasowanie do wyszukiwania zdarzeń",
9
10
  "HTML settings": "Ustawienia HTML",
10
11
  "Hide Start-End of events": "Ukryj Start-Koniec wydarzeń",
11
12
  "Hide Year": "Ukryj rok",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Cor padrão para HTML",
7
7
  "Events": "Eventos",
8
8
  "Every calendar has own color": "Cada calendário tem cor própria",
9
+ "Exact Match for event-search": "Correspondência exata para pesquisa de eventos",
9
10
  "HTML settings": "Configurações de HTML",
10
11
  "Hide Start-End of events": "Ocultar início e fim dos eventos",
11
12
  "Hide Year": "Ocultar Ano",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Цвет по умолчанию для HTML",
7
7
  "Events": "События",
8
8
  "Every calendar has own color": "Каждый календарь в свой цвет",
9
+ "Exact Match for event-search": "Точное совпадение для поиска событий",
9
10
  "HTML settings": "Настройки HTML",
10
11
  "Hide Start-End of events": "Скрывать начало и конец события",
11
12
  "Hide Year": "Скрывать год",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "Колір за замовчуванням для HTML",
7
7
  "Events": "Події",
8
8
  "Every calendar has own color": "Кожен календар має свій колір",
9
+ "Exact Match for event-search": "Точна відповідність для пошуку подій",
9
10
  "HTML settings": "Налаштування HTML",
10
11
  "Hide Start-End of events": "Приховати початок-кінець подій",
11
12
  "Hide Year": "Приховати рік",
@@ -6,6 +6,7 @@
6
6
  "Default color for HTML": "HTML 的默认颜色",
7
7
  "Events": "活动",
8
8
  "Every calendar has own color": "每个日历都有自己的颜色",
9
+ "Exact Match for event-search": "事件搜索的精确匹配",
9
10
  "HTML settings": "HTML 设置",
10
11
  "Hide Start-End of events": "隐藏事件的开始 - 结束",
11
12
  "Hide Year": "隐藏年份",
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "i18n": true,
3
3
  "type": "tabs",
4
+ "tabsStyle": {
5
+ "width": "calc(100% - 100px)"
6
+ },
4
7
  "items": {
5
8
  "_options": {
6
9
  "type": "panel",
@@ -11,6 +14,7 @@
11
14
  "type": "number",
12
15
  "min": 0,
13
16
  "step": 1,
17
+ "xs": 12,
14
18
  "sm": 12,
15
19
  "md": 4,
16
20
  "lg": 4,
@@ -20,6 +24,7 @@
20
24
  "type": "number",
21
25
  "min": 0,
22
26
  "step": 1,
27
+ "xs": 12,
23
28
  "sm": 12,
24
29
  "md": 4,
25
30
  "lg": 4,
@@ -28,10 +33,19 @@
28
33
  "ignoreCaseInEventname": {
29
34
  "type": "checkbox",
30
35
  "newLine": true,
36
+ "xs": 12,
31
37
  "sm": 12,
32
38
  "md": 4,
33
39
  "lg": 4,
34
40
  "label": "Ignore case for event-search"
41
+ },
42
+ "exactMatchInEventname": {
43
+ "type": "checkbox",
44
+ "newLine": true,
45
+ "sm": 12,
46
+ "md": 4,
47
+ "lg": 4,
48
+ "label": "Exact Match for event-search"
35
49
  }
36
50
  }
37
51
  },
@@ -41,6 +55,7 @@
41
55
  "items": {
42
56
  "language": {
43
57
  "type": "select",
58
+ "xs": 12,
44
59
  "sm": 12,
45
60
  "md": 4,
46
61
  "lg": 4,
@@ -84,6 +99,7 @@
84
99
  "fulltime": {
85
100
  "type": "text",
86
101
  "newLine": true,
102
+ "xs": 12,
87
103
  "sm": 12,
88
104
  "md": 4,
89
105
  "lg": 4,
@@ -91,6 +107,7 @@
91
107
  },
92
108
  "defColor": {
93
109
  "type": "color",
110
+ "xs": 12,
94
111
  "sm": 12,
95
112
  "md": 4,
96
113
  "lg": 4,
@@ -99,6 +116,7 @@
99
116
  "dataPaddingWithZeros": {
100
117
  "type": "checkbox",
101
118
  "newLine": true,
119
+ "xs": 12,
102
120
  "sm": 12,
103
121
  "md": 4,
104
122
  "lg": 4,
@@ -106,6 +124,7 @@
106
124
  },
107
125
  "replaceDates": {
108
126
  "type": "checkbox",
127
+ "xs": 12,
109
128
  "sm": 12,
110
129
  "md": 4,
111
130
  "lg": 4,
@@ -114,6 +133,7 @@
114
133
  "everyCalOneColor": {
115
134
  "type": "checkbox",
116
135
  "newLine": true,
136
+ "xs": 12,
117
137
  "sm": 12,
118
138
  "md": 4,
119
139
  "lg": 4,
@@ -121,6 +141,7 @@
121
141
  },
122
142
  "colorize": {
123
143
  "type": "checkbox",
144
+ "xs": 12,
124
145
  "sm": 12,
125
146
  "md": 4,
126
147
  "lg": 4,
@@ -129,6 +150,7 @@
129
150
  "forceFullday": {
130
151
  "type": "checkbox",
131
152
  "newLine": true,
153
+ "xs": 12,
132
154
  "sm": 12,
133
155
  "md": 4,
134
156
  "lg": 4,
@@ -136,6 +158,7 @@
136
158
  },
137
159
  "hideYear": {
138
160
  "type": "checkbox",
161
+ "xs": 12,
139
162
  "sm": 12,
140
163
  "md": 4,
141
164
  "lg": 4,
@@ -144,6 +167,7 @@
144
167
  "arrowAlreadyStarted": {
145
168
  "type": "checkbox",
146
169
  "newLine": true,
170
+ "xs": 12,
147
171
  "sm": 12,
148
172
  "md": 4,
149
173
  "lg": 4,
@@ -151,6 +175,7 @@
151
175
  },
152
176
  "addColorBox": {
153
177
  "type": "checkbox",
178
+ "xs": 12,
154
179
  "sm": 12,
155
180
  "md": 4,
156
181
  "lg": 4,
@@ -164,6 +189,7 @@
164
189
  "items": {
165
190
  "calendars": {
166
191
  "type": "table",
192
+ "xs": 12,
167
193
  "sm": 12,
168
194
  "md": 12,
169
195
  "lg": 12,
@@ -344,6 +370,7 @@
344
370
  "customUserAgentEnabled": {
345
371
  "type": "checkbox",
346
372
  "newLine": true,
373
+ "xs": 12,
347
374
  "sm": 12,
348
375
  "md": 4,
349
376
  "lg": 4,
@@ -352,6 +379,7 @@
352
379
  "customUserAgent": {
353
380
  "hidden": "!data.customUserAgentEnabled",
354
381
  "type": "text",
382
+ "xs": 12,
355
383
  "sm": 12,
356
384
  "md": 8,
357
385
  "lg": 8,
@@ -365,6 +393,7 @@
365
393
  "items": {
366
394
  "events": {
367
395
  "type": "table",
396
+ "xs": 12,
368
397
  "sm": 12,
369
398
  "md": 12,
370
399
  "lg": 12,
package/admin/words.js CHANGED
@@ -15,6 +15,7 @@ systemDictionary = {
15
15
  "Default color for HTML": { "en": "Default color for HTML", "de": "Standardfarben für HTML", "ru": "Цвет по умолчанию для HTML", "pt": "Cor padrão para HTML", "nl": "Standaard-kleur voor HTML", "fr": "Couleur par défaut pour HTML", "it": "Colore predefinito per HTML", "es": "Color predeterminado para HTML", "pl": "Domyślny kolor dla HTML", "uk": "Колір за замовчуванням для HTML", "zh-cn": "HTML 的默认颜色"},
16
16
  "Events": { "en": "Events", "de": "Ereignisse", "ru": "События", "pt": "Eventos", "nl": "Gebeurtenissen", "fr": "Événements", "it": "eventi", "es": "Eventos", "pl": "Wydarzenia", "uk": "Події", "zh-cn": "活动"},
17
17
  "Every calendar has own color": { "en": "Every calendar has own color", "de": "Jeder Kalender hat eine eigene Farbe", "ru": "Каждый календарь в свой цвет", "pt": "Cada calendário tem cor própria", "nl": "Elke agenda heeft zijn eigen kleur", "fr": "Chaque calendrier a sa propre couleur", "it": "Ogni calendario ha il proprio colore", "es": "Cada calendario tiene su propio color", "pl": "Każdy kalendarz ma własny kolor", "uk": "Кожен календар має свій колір", "zh-cn": "每个日历都有自己的颜色"},
18
+ "Exact Match for event-search": { "en": "Exact Match for event-search", "de": "Exakte Übereinstimmung für die Ereignissuche", "ru": "Точное совпадение для поиска событий", "pt": "Correspondência exata para pesquisa de eventos", "nl": "Exacte match voor zoeken naar evenementen", "fr": "Correspondance exacte pour la recherche d'événements", "it": "Corrispondenza esatta per la ricerca di eventi", "es": "Exact Match for event-search", "pl": "Dokładne dopasowanie do wyszukiwania zdarzeń", "uk": "Точна відповідність для пошуку подій", "zh-cn": "事件搜索的精确匹配"},
18
19
  "HTML settings": { "en": "HTML settings", "de": "HTML Einstellungen", "ru": "Настройки HTML", "pt": "Configurações de HTML", "nl": "HTML-instellingen", "fr": "Paramètres HTML", "it": "Impostazioni HTML", "es": "Configuración HTML", "pl": "Ustawienia HTML", "uk": "Налаштування HTML", "zh-cn": "HTML 设置"},
19
20
  "Hide Start-End of events": { "en": "Hide Start-End of events", "de": "Start- und Endzeit verbergen", "ru": "Скрывать начало и конец события", "pt": "Ocultar início e fim dos eventos", "nl": "Verberg begin-einde van evenementen", "fr": "Masquer le début et la fin des événements", "it": "Nascondi inizio-fine degli eventi", "es": "Ocultar inicio-fin de eventos", "pl": "Ukryj Start-Koniec wydarzeń", "uk": "Приховати початок-кінець подій", "zh-cn": "隐藏事件的开始 - 结束"},
20
21
  "Hide Year": { "en": "Hide Year", "de": "Jahr verbergen", "ru": "Скрывать год", "pt": "Ocultar Ano", "nl": "Jaar verbergen", "fr": "Masquer l'année", "it": "Nascondi anno", "es": "Ocultar año", "pl": "Ukryj rok", "uk": "Приховати рік", "zh-cn": "隐藏年份"},
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "ical",
4
- "version": "1.15.0",
4
+ "version": "1.16.1",
5
5
  "news": {
6
+ "1.16.1": {
7
+ "en": "fix issue with handling rrule timezones incorrect with latest node-ical (#708).\nupdate node-ical to latest 0.20.1\nsave cached files to os tmpdir instead.",
8
+ "de": "problem mit dem umgang mit rrule zeitzonen falsch mit neusten node-ical (#708).\nupdate node-ical bis neueste 0.20.1\nspeichern sie cache-dateien auf os tmpdir statt.",
9
+ "ru": "исправить проблему с обработкой часовых поясов правила некорректно с последними узлами (#708).\nобновление узла к последним 0.20.1\nвместо этого сохранить кэшированные файлы в os tmpdir.",
10
+ "pt": "corrigir problema com manipulação rrule fusos horários incorreta com o mais recente node-ical (#708).\natualização node-ical para mais recente 0.20.1\nsalvar arquivos em cache para os tmpdir em vez disso.",
11
+ "nl": "fix probleem met de behandeling rrule tijdzones incorrect met de laatste node-ical (#708).\nnode-ical updaten naar de laatste 0.20.1\nbewaar gecachede bestanden in plaats daarvan in os tmpdir.",
12
+ "fr": "corriger le problème avec la manipulation des fuseaux horaires rrule incorrecte avec le dernier nœud (#708).\nmettre à jour node-ical au dernier 0.20.1\nenregistrer les fichiers mis en cache dans os tmpdir à la place.",
13
+ "it": "risolvere il problema con la gestione di fusi orari non corretto con ultimo nodo-ical (#708).\naggiornamento nodo-ical al più recente 0.20.1\nsalvare i file memorizzati in cache a os tmpdir invece.",
14
+ "es": "solucionar problema con el manejo rrule timezones incorrecto con el último node-ical (#708).\nactualización node-ical al último 0.20.1\nguardar archivos en caché a os tmpdir en su lugar.",
15
+ "pl": "problem z obsługą rrule strefy czasu nieprawidłowy z najnowszym nodeical (# 708).\nupdate node- ical do najnowszej wersji 0.20.1\nzapisać pliki cached do os tmpdir zamiast.",
16
+ "uk": "виправлено проблему з використанням rrule timezones, некоректних з найновішою вершиною (#708).\nоновлення вершини-ical до останньої 0.20.1\nзберегти кешовані файли на os tmpdir замість.",
17
+ "zh-cn": "将处理rrule时区的问题与最新节点错误(# 708).\n将节点更新为最新的0.20.1\n将缓存的文件保存到 os tmpdir ."
18
+ },
19
+ "1.16.0": {
20
+ "en": "add checkbox to allow to exactly match a calender event.\nupdate node-ical to latest 0.20.0\nBreaking change: Removed trigger state (subscribe is deprecated in js-controller 6.x)\nResponsive design added",
21
+ "de": "fügen sie checkbox hinzu, um ein kalenderereignis genau zu vereinbaren.\nupdate node-ical bis neueste 0.20.0\nBruchänderung: Entfernter Triggerzustand (Abonnent wird in js-Controller 6.x abgeschrieben)\nResponsive Design hinzugefügt",
22
+ "ru": "добавьте флажок, чтобы позволить точно соответствовать событиям календера.\nобновление узла к последнему 0.20.0\nПерерыв: Удаленное состояние триггера (подписано в js-controller 6.x)\nДобавлен ответный дизайн",
23
+ "pt": "adicionar caixa de seleção para permitir exatamente combinar um evento de calandragem.\natualizar node-ical para o mais recente 0.20.0\nMudança de ruptura: Estado do gatilho removido (a assinatura é deprecated no js-controller 6.x)\nDesign responsivo adicionado",
24
+ "nl": "voeg het selectievakje toe om een agenda-evenement exact te laten overeenkomen.\nupdate node-ical naar de laatste 0.20.0\nVerandering: Verwijderde trigger status (abonneren wordt verouderd in js-controller 6.x)\nResponsief ontwerp toegevoegd",
25
+ "fr": "ajouter une case à cocher pour permettre de correspondre exactement à un événement de calandre.\nmettre à jour node-ical au dernier 0.20.0\nBriser le changement : État de déclenchement supprimé (subscription est obsolète dans js-controller 6.x)\nConception sensible ajoutée",
26
+ "it": "aggiungere la casella di controllo per consentire di abbinare esattamente un evento di calender.\naggiornamento nodo-ical al più recente 0.20.0\nCambiamento di rottura: Stato di attivazione rimosso (l'iscrizione è deprecata in js-controller 6.x)\nDesign reattivo aggiunto",
27
+ "es": "agregue la casilla de verificación para permitir exactamente igualar un evento calender.\nactualización nodo-ical a más tardar 0.20.0\nCambio de ruptura: Estado de activación eliminado (suscripción se deprecata en js-controller 6.x)\nDiseño responsable añadido",
28
+ "pl": "dodaj pole wyboru, aby umożliwić dokładne dopasowanie zdarzenia kalendarza.\naktualizacja node- ical do najnowszej wersji 0.20.0\nŁamanie zmian: Usunięty stan wyzwalania (prenumerata w sterowniku js- 6.x)\nDodano projekt odpowiadający",
29
+ "uk": "додайте прапорець, щоб точно відповідати події.\nоновлення вершини-ical до останньої 0.20.0\nЗміна розривів: Вилучений пусковий стан (приписується в js-controller 6.x)\nДодано адаптивний дизайн",
30
+ "zh-cn": "添加复选框,以便精确匹配一个计数器事件.\n将节点更新为最近0.2.0\n中断更改 : 删除触发状态( 订阅在 js- controller 6. x 中已贬值)\n增加了反应设计"
31
+ },
6
32
  "1.15.0": {
7
33
  "en": "Adapter requires node.js >= 18 and js-controller >= 5 now\nDependencies have been updated",
8
34
  "de": "Adapter benötigt node.js >= 18 und js-controller >= 5 jetzt\nAbhängigkeiten wurden aktualisiert",
@@ -67,32 +93,6 @@
67
93
  "pl": "Zezwalaj na ustawianie niestandardowych użytkowników http\nDodano opcję użycia zakładki plików do plików kalendarza",
68
94
  "uk": "Дозвольте встановити користувальницький агент\nДодана можливість використовувати вкладку файлів для календарних файлів",
69
95
  "zh-cn": "允许设置自定义 http 用户代理\n为日历文件使用文件标签添加了选项"
70
- },
71
- "1.13.6": {
72
- "en": "Incorrect jsonConfig has been fixed [#602]\nDependencies have been updated",
73
- "de": "Fehler in jsonConfig wurde behoben [#602]\nAbhängigkeiten wurden aktualisiert",
74
- "ru": "Неправильный jsonConfig был исправлен [#602]\nВ зависимости были обновлены",
75
- "pt": "JsonConfig incorreto foi corrigido [#602]\nAs dependências foram atualizadas",
76
- "nl": "Incorrect JsonConfig is gerepareerd\nAfhankelijkheid",
77
- "fr": "Incorrect jsonConfig a été corrigé [#602]\nLes dépendances ont été mises à jour",
78
- "it": "JsonConfig non corretto è stato fissato [#602]\nLe dipendenze sono state aggiornate",
79
- "es": "JsonConfig incorrecto ha sido fijado [#602]\nSe han actualizado las dependencias",
80
- "pl": "Incorrect jsonConfig został ustalony jako #602\nZależności zostały zaktualizowane",
81
- "uk": "[#602]\nОновлено залежність",
82
- "zh-cn": "错误的 json Config已确定[第602号]\n已更新了属地"
83
- },
84
- "1.13.5": {
85
- "en": "updated node-ical to latest 0.17.1",
86
- "de": "aktualisiert kinematisch auf neuste 0,17.1",
87
- "ru": "обновленный node-ical до последней 0.17.1",
88
- "pt": "atualizado node-ical para mais recente 0.17.1",
89
- "nl": "vertaling: 0.17.1",
90
- "fr": "mise à jour node-ical to latest 0.17.1",
91
- "it": "aggiornato nodo-ical al più recente 0,15",
92
- "es": "actualizado nodo-ical a último 0.17.1",
93
- "pl": "uaktualnianie węzła 0,17.1",
94
- "uk": "оновлений вузол-ical в останні роки 0 товар(ов) - 0.00 р",
95
- "zh-cn": "最新资料 0.17.1"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -152,7 +152,6 @@
152
152
  "config": "json"
153
153
  },
154
154
  "allowInit": true,
155
- "subscribe": "ical.<INSTANCE>.trigger",
156
155
  "extIcon": "https://raw.githubusercontent.com/iobroker-community-adapters/ioBroker.ical/master/admin/ical.png",
157
156
  "type": "date-and-time",
158
157
  "connectionType": "local",
@@ -188,6 +187,7 @@
188
187
  "hideYear": false,
189
188
  "arrowAlreadyStarted": true,
190
189
  "ignoreCaseInEventname": false,
190
+ "exactMatchInEventname": false,
191
191
  "addColorBox": false,
192
192
  "calendars": [
193
193
  {
@@ -337,31 +337,6 @@
337
337
  },
338
338
  "native": {}
339
339
  },
340
- {
341
- "_id": "trigger",
342
- "type": "state",
343
- "common": {
344
- "name": {
345
- "en": "Command",
346
- "de": "Befehl",
347
- "ru": "Команда",
348
- "pt": "Comando",
349
- "nl": "Commando",
350
- "fr": "Commandant",
351
- "it": "Comando",
352
- "es": "Comando",
353
- "pl": "Dowództwo",
354
- "uk": "Про компанію",
355
- "zh-cn": "指挥"
356
- },
357
- "desc": "Commands: read [url], check [reason]",
358
- "type": "string",
359
- "read": true,
360
- "write": true,
361
- "role": "value"
362
- },
363
- "native": {}
364
- },
365
340
  {
366
341
  "_id": "data.count",
367
342
  "type": "state",
package/main.js CHANGED
@@ -5,6 +5,7 @@ const crypto = require('node:crypto');
5
5
  const fs = require('node:fs');
6
6
  const path = require('node:path');
7
7
  const https = require('node:https');
8
+ const os = require('node:os');
8
9
 
9
10
  const utils = require('@iobroker/adapter-core');
10
11
  const adapterName = require('./package.json').name.split('.').pop();
@@ -22,43 +23,6 @@ function startAdapter(options) {
22
23
 
23
24
  Object.assign(options,{
24
25
  name: adapterName,
25
- stateChange: async function (id, state) {
26
- if (!id || !state || state.ack || !state.val) {
27
- return;
28
- }
29
-
30
- if (id === `${adapter.namespace}.trigger`) {
31
- const content = state.val.split(' ');
32
- // One time read all calendars
33
- switch (content[0]) {
34
- case 'read':
35
- if (content[1]) {
36
- adapter.log.info(`reading iCal from URL: "${content[1]}"`);
37
- readOne(content[1]);
38
- } else {
39
- adapter.log.info('reading one time from all calendars');
40
- readAll();
41
- }
42
- break;
43
-
44
- // FIXME: checkForEvents not supporting call with only 1 parameter
45
- case 'check':
46
- if (content[1]) {
47
- adapter.log.info(`checking "${content[1]}"`);
48
- await checkForEvents(content[1]);
49
- } else {
50
- adapter.log.warn('check all events');
51
- for (let i = 0; i < adapter.config.events.length; i++) {
52
- await checkForEvents(adapter.config.events[i].name);
53
- }
54
- }
55
- break;
56
-
57
- default:
58
- adapter.log.warn(`Unknown command in trigger: "${state.val}"`);
59
- }
60
- }
61
- },
62
26
  unload: function (callback) {
63
27
  stopped = true;
64
28
  callback();
@@ -194,7 +158,7 @@ async function getICal(urlOrFile, user, pass, sslignore, calName, cb) {
194
158
  }
195
159
 
196
160
  const calHash = crypto.createHash('md5').update(user + pass + urlOrFile).digest('hex');
197
- const cachedFilename = path.join(__dirname, calHash);
161
+ const cachedFilename = path.join(os.tmpdir(), 'iob-' + calHash + '.ics');
198
162
 
199
163
  axios(options).then(function (response) {
200
164
  if (response.data) {
@@ -320,7 +284,7 @@ async function processData(data, realnow, startpreview, endpreview, now2, calNam
320
284
 
321
285
  // only events with summary and a start date are interesting
322
286
  if ((ev.summary !== undefined) && (ev.type === 'VEVENT') && ev.start && ev.start instanceof Date) {
323
- adapter.log.debug(`ev: ${JSON.stringify(ev)}`);
287
+ adapter.log.debug(`ev[${k}]: ${JSON.stringify(ev)}`);
324
288
  if (!ev.end || !(ev.end instanceof Date)) {
325
289
  ev.end = new Date(ev.start.getTime());
326
290
  if (ev.start.getHours() === 0 && ev.start.getMinutes() === 0 && ev.start.getSeconds() === 0) {
@@ -400,11 +364,11 @@ options: ${JSON.stringify(options)}`
400
364
  // this event will be recognized as a date event
401
365
  ev2.start.setHours(0,0,0,0);
402
366
  } else if (ev.datetype === 'date-time') {
403
- // add a time offset which is relative between
404
- // ev2 and ev because rrule seems to return dates in
405
- // local time only. And if not correctly the exdate
406
- // check later will not work correctly.
407
- ev2.start = addOffset(ev2.start, ev2.start.getTimezoneOffset() - ev.start.getTimezoneOffset());
367
+ // rrule only knows about local time but stores the
368
+ // datetime in zulu (Z) UTC time strings. Thus we need
369
+ // to convert it to local time carrying objects, thus
370
+ // add the ev2.start tz offset
371
+ ev2.start = addOffset(ev2.start, ev2.start.getTimezoneOffset());
408
372
  }
409
373
 
410
374
  // Set end date based on length in ms
@@ -690,6 +654,7 @@ function colorizeDates(date, today, tomorrow, dayafter, col, calName) {
690
654
 
691
655
  async function checkForEvents(reason, event, realnow) {
692
656
  const ignoreCaseInEventname = adapter.config.ignoreCaseInEventname;
657
+ const exactMatchInEventname = adapter.config.exactMatchInEventname;
693
658
  // show unknown events
694
659
  let result = true;
695
660
  let today = new Date(realnow.getTime());
@@ -700,7 +665,19 @@ async function checkForEvents(reason, event, realnow) {
700
665
  // check if event exists in table
701
666
  for (let i = 0; i < events.length; i++) {
702
667
  const ev = events[i];
703
- if ((reason.includes(ev.name)) || (ignoreCaseInEventname && (reason.toLowerCase().includes(ev.name.toLowerCase())))) {
668
+ let evFound = false;
669
+ if (exactMatchInEventname) {
670
+ // calendar entry must be exactly the same as the event
671
+ if ((reason === ev.name) || (ignoreCaseInEventname && (reason.toLowerCase() === ev.name.toLowerCase()))) {
672
+ evFound = true;
673
+ }
674
+ } else {
675
+ // event is included in the calendar entry
676
+ if ((reason.includes(ev.name)) || (ignoreCaseInEventname && (reason.toLowerCase().includes(ev.name.toLowerCase())))) {
677
+ evFound = true;
678
+ }
679
+ }
680
+ if (evFound) {
704
681
  // check if event should shown
705
682
  result = ev.display;
706
683
  adapter.log.debug(`found event in table: ${ev.name}, day=${ev.day}`);
@@ -1600,6 +1577,8 @@ function main() {
1600
1577
  }
1601
1578
  });
1602
1579
 
1580
+ adapter.delObjectAsync('trigger'); // removed deprecated subscribe state (created in previous versions)
1581
+
1603
1582
  syncUserEvents(readAll);
1604
1583
  }
1605
1584
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.ical",
3
- "version": "1.15.0",
3
+ "version": "1.16.1",
4
4
  "description": "Allows read information from google calender and from iCal.",
5
5
  "author": {
6
6
  "name": "bluefox",
@@ -39,37 +39,37 @@
39
39
  "node": ">=18"
40
40
  },
41
41
  "dependencies": {
42
- "@iobroker/adapter-core": "^3.1.4",
43
- "axios": "1.6.8",
42
+ "@iobroker/adapter-core": "^3.2.1",
43
+ "axios": "^1.7.7",
44
44
  "cloneextend": "^0.0.3",
45
45
  "json-schema": "^0.4.0",
46
- "node-ical": "^0.18.0",
46
+ "node-ical": "^0.20.1",
47
47
  "rrule": "2.8.1"
48
48
  },
49
49
  "devDependencies": {
50
- "@alcalzone/release-script": "^3.7.0",
51
- "@alcalzone/release-script-plugin-iobroker": "^3.7.0",
50
+ "@alcalzone/release-script": "^3.8.0",
51
+ "@alcalzone/release-script-plugin-iobroker": "^3.7.2",
52
52
  "@alcalzone/release-script-plugin-license": "^3.7.0",
53
53
  "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
54
- "@iobroker/adapter-dev": "^1.2.0",
55
- "@iobroker/testing": "^4.1.3",
56
- "@types/chai": "^4.3.11",
54
+ "@iobroker/adapter-dev": "^1.3.0",
55
+ "@iobroker/testing": "^5.0.0",
56
+ "@types/chai": "^4.3.19",
57
57
  "@types/chai-as-promised": "^7.1.8",
58
- "@types/mocha": "^10.0.6",
59
- "@types/node": "^20.12.7",
58
+ "@types/mocha": "^10.0.8",
59
+ "@types/node": "^22.8.6",
60
60
  "@types/proxyquire": "^1.3.31",
61
61
  "@types/sinon": "^17.0.3",
62
62
  "@types/sinon-chai": "^3.2.12",
63
- "chai": "^4.4.1",
64
- "chai-as-promised": "^7.1.1",
63
+ "chai": "^4.5.0",
64
+ "chai-as-promised": "^7.1.2",
65
65
  "chai-string": "^1.5.0",
66
66
  "eslint": "^8.56.0",
67
- "luxon": "^3.4.4",
68
- "mocha": "^10.4.0",
67
+ "luxon": "^3.5.0",
68
+ "mocha": "^10.8.2",
69
69
  "proxyquire": "^2.1.3",
70
- "sinon": "^17.0.1",
70
+ "sinon": "^19.0.2",
71
71
  "sinon-chai": "^3.7.0",
72
- "typescript": "~5.4.5"
72
+ "typescript": "~5.6.2"
73
73
  },
74
74
  "bugs": {
75
75
  "url": "https://github.com/iobroker-community-adapters/ioBroker.ical/issues"