iobroker.parcelapp 0.1.5 → 0.2.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 +12 -10
- package/admin/i18n/de/translations.json +16 -19
- package/admin/i18n/en/translations.json +3 -6
- package/admin/i18n/es/translations.json +16 -19
- package/admin/i18n/fr/translations.json +16 -19
- package/admin/i18n/it/translations.json +16 -19
- package/admin/i18n/nl/translations.json +16 -19
- package/admin/i18n/pl/translations.json +16 -19
- package/admin/i18n/pt/translations.json +16 -19
- package/admin/i18n/ru/translations.json +16 -19
- package/admin/i18n/uk/translations.json +16 -19
- package/admin/i18n/zh-cn/translations.json +16 -19
- package/admin/jsonConfig.json +106 -121
- package/build/lib/parcel-client.d.ts.map +1 -1
- package/build/lib/parcel-client.js +9 -0
- package/build/lib/state-manager.d.ts.map +1 -1
- package/build/lib/state-manager.js +0 -1
- package/build/lib/types.d.ts +2 -2
- package/build/lib/types.d.ts.map +1 -1
- package/build/main.js +96 -11
- package/io-package.json +29 -16
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -19,10 +19,10 @@ ioBroker adapter that connects to the [parcel.app](https://parcelapp.net) API an
|
|
|
19
19
|
|
|
20
20
|
- **300+ carriers** — DHL, FedEx, UPS, Amazon, Hermes, GLS, DPD, and many more via parcel.app
|
|
21
21
|
- **Per-package ioBroker states** — carrier, status, tracking number, delivery window, last event, last location
|
|
22
|
-
- **Summary states** — active count, today count, combined delivery window
|
|
22
|
+
- **Summary states** — active count, today count, combined delivery window
|
|
23
23
|
- **Delivery time estimates** — today, tomorrow, in X days with combined time window
|
|
24
24
|
- **Automatic polling** with configurable interval (5–60 minutes)
|
|
25
|
-
- **
|
|
25
|
+
- **Configurable cleanup** — auto-remove delivered packages or keep them until deleted in parcel.app
|
|
26
26
|
- **Add deliveries** via sendTo message from scripts or other adapters
|
|
27
27
|
- **Admin UI** with connection test, polling settings, and status language selection
|
|
28
28
|
- **Multilingual status labels** (German/English)
|
|
@@ -44,7 +44,7 @@ ioBroker adapter that connects to the [parcel.app](https://parcelapp.net) API an
|
|
|
44
44
|
|--------|-------------|---------|
|
|
45
45
|
| **API Key** | Your parcel.app API key (get it at [web.parcelapp.net](https://web.parcelapp.net)) | — |
|
|
46
46
|
| **Poll Interval** | How often to fetch updates (minutes) | 10 |
|
|
47
|
-
| **
|
|
47
|
+
| **Auto-remove delivered** | Remove delivered packages from states automatically. When disabled, they stay until deleted in parcel.app. | Yes |
|
|
48
48
|
| **Status Language** | Language for status labels (German/English) | German |
|
|
49
49
|
|
|
50
50
|
---
|
|
@@ -57,8 +57,7 @@ parcelapp.0.
|
|
|
57
57
|
├── summary.
|
|
58
58
|
│ ├── activeCount — Number of active deliveries
|
|
59
59
|
│ ├── todayCount — Number of deliveries expected today
|
|
60
|
-
│
|
|
61
|
-
│ └── json — All active deliveries as JSON
|
|
60
|
+
│ └── deliveryWindow — Combined delivery window for today
|
|
62
61
|
└── deliveries.
|
|
63
62
|
└── {packageId}. — One device per package
|
|
64
63
|
├── carrier — Carrier name (e.g. DHL Express)
|
|
@@ -86,7 +85,6 @@ parcelapp.0.
|
|
|
86
85
|
### No deliveries shown
|
|
87
86
|
- The API returns cached data — new deliveries may take a few minutes to appear
|
|
88
87
|
- Check if you have active deliveries in the parcel.app
|
|
89
|
-
- Try changing the filter mode to "Recent" to see completed deliveries
|
|
90
88
|
|
|
91
89
|
### Rate limit
|
|
92
90
|
- The parcel.app API allows 20 requests per hour
|
|
@@ -96,6 +94,14 @@ parcelapp.0.
|
|
|
96
94
|
|
|
97
95
|
## Changelog
|
|
98
96
|
|
|
97
|
+
### 0.2.1 (2026-03-25)
|
|
98
|
+
- Robust error handling: rate limit detection, connection error deduplication, poll throttling
|
|
99
|
+
|
|
100
|
+
### 0.2.0 (2026-03-25)
|
|
101
|
+
- Added option to keep delivered packages in states
|
|
102
|
+
- Simplified admin UI to single page
|
|
103
|
+
- Removed redundant summary.json state
|
|
104
|
+
|
|
99
105
|
### 0.1.5 (2026-03-24)
|
|
100
106
|
- Added auto-merge config, weekly Dependabot schedule
|
|
101
107
|
|
|
@@ -110,10 +116,6 @@ parcelapp.0.
|
|
|
110
116
|
|
|
111
117
|
### 0.1.1 (2026-03-23)
|
|
112
118
|
- Redesigned adapter logo
|
|
113
|
-
- Fixed repochecker issues
|
|
114
|
-
|
|
115
|
-
### 0.1.0 (2026-03-23)
|
|
116
|
-
- Initial release
|
|
117
119
|
|
|
118
120
|
Older changelog: [CHANGELOG.md](CHANGELOG.md)
|
|
119
121
|
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Unterstütze diesen Adapter",
|
|
3
|
+
"aboutInfo": "Dieser Adapter ist kostenlos und Open Source. Wenn du ihn nützlich findest, unterstütze die Entwicklung gerne mit einer kleinen Spende.",
|
|
4
|
+
"aboutTab": "Info",
|
|
5
5
|
"apiKeyInfo": "Gib deinen parcel.app API-Schlüssel ein. Ein Premium-Abo wird benötigt. Den Schlüssel findest du unter web.parcelapp.net → API-Bereich.",
|
|
6
|
-
"label_apiKey": "API-Schlüssel",
|
|
7
6
|
"btn_checkConnection": "Verbindung testen",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Wie oft Lieferupdates abgefragt werden (5-60 Minuten, Standard: 10). Rate-Limit: 20 Anfragen/Stunde.",
|
|
13
|
-
"label_filterMode": "Filtermodus",
|
|
14
|
-
"tooltip_filterMode": "Aktiv: nur laufende Lieferungen. Kürzlich: inklusive kürzlich zugestellter.",
|
|
15
|
-
"filterMode_active": "Nur aktive Lieferungen",
|
|
16
|
-
"filterMode_recent": "Kürzliche Lieferungen",
|
|
7
|
+
"donateKofi": "Unterstützen auf Ko-fi",
|
|
8
|
+
"donatePaypal": "Spenden via PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Lieferungen",
|
|
17
11
|
"header_display": "Anzeige",
|
|
12
|
+
"header_polling": "Abfrage",
|
|
13
|
+
"label_apiKey": "API-Schlüssel",
|
|
14
|
+
"label_autoRemoveDelivered": "Zugestellte Pakete automatisch entfernen",
|
|
18
15
|
"label_language": "Status-Sprache",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Abfrageintervall (Minuten)",
|
|
20
17
|
"lang_de": "Deutsch",
|
|
21
18
|
"lang_en": "Englisch",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Verbindung fehlgeschlagen!",
|
|
20
|
+
"msg_connectionOk": "Verbindung erfolgreich!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Wenn aktiviert, werden zugestellte Pakete automatisch aus dem Objektbaum entfernt. Wenn deaktiviert, bleiben sie mit Status 'Zugestellt' bestehen, bis sie in parcel.app gelöscht werden.",
|
|
22
|
+
"tooltip_language": "Sprache für Statusmeldungen (z.B. 'Unterwegs' vs 'In Transit')",
|
|
23
|
+
"tooltip_pollInterval": "Wie oft Lieferupdates abgefragt werden (5-60 Minuten, Standard: 10). Rate-Limit: 20 Anfragen/Stunde."
|
|
27
24
|
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"tab_connection": "Connection",
|
|
3
|
-
"tab_settings": "Settings",
|
|
4
2
|
"header_connection": "parcel.app API",
|
|
5
3
|
"apiKeyInfo": "Enter your parcel.app API key. A Premium subscription is required. Get your key at web.parcelapp.net → API panel.",
|
|
6
4
|
"label_apiKey": "API Key",
|
|
@@ -10,10 +8,9 @@
|
|
|
10
8
|
"header_polling": "Polling",
|
|
11
9
|
"label_pollInterval": "Poll Interval (minutes)",
|
|
12
10
|
"tooltip_pollInterval": "How often to fetch delivery updates (5-60 minutes, default: 10). Rate limit: 20 requests/hour.",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"filterMode_recent": "Recent deliveries",
|
|
11
|
+
"header_delivery": "Delivery",
|
|
12
|
+
"label_autoRemoveDelivered": "Automatically remove delivered packages",
|
|
13
|
+
"tooltip_autoRemoveDelivered": "When enabled, delivered packages are automatically removed from the state tree. When disabled, they remain with status 'Delivered' until deleted in parcel.app.",
|
|
17
14
|
"header_display": "Display",
|
|
18
15
|
"label_language": "Status Language",
|
|
19
16
|
"tooltip_language": "Language for delivery status labels (e.g. 'In Transit' vs 'Unterwegs')",
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Apoya este adaptador",
|
|
3
|
+
"aboutInfo": "Este adaptador es gratuito y de código abierto. Si lo encuentras útil, considera apoyar el desarrollo con una pequeña donación.",
|
|
4
|
+
"aboutTab": "Acerca de",
|
|
5
5
|
"apiKeyInfo": "Introduce tu clave API de parcel.app. Se requiere una suscripción Premium. Obtén tu clave en web.parcelapp.net → panel API.",
|
|
6
|
-
"label_apiKey": "Clave API",
|
|
7
6
|
"btn_checkConnection": "Probar conexión",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Con qué frecuencia obtener actualizaciones de entrega (5-60 minutos, predeterminado: 10). Límite: 20 solicitudes/hora.",
|
|
13
|
-
"label_filterMode": "Modo de filtro",
|
|
14
|
-
"tooltip_filterMode": "Activo: solo entregas actuales. Reciente: incluye entregas recientemente completadas.",
|
|
15
|
-
"filterMode_active": "Solo entregas activas",
|
|
16
|
-
"filterMode_recent": "Entregas recientes",
|
|
7
|
+
"donateKofi": "Apoyar en Ko-fi",
|
|
8
|
+
"donatePaypal": "Donar vía PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Entregas",
|
|
17
11
|
"header_display": "Visualización",
|
|
12
|
+
"header_polling": "Consulta",
|
|
13
|
+
"label_apiKey": "Clave API",
|
|
14
|
+
"label_autoRemoveDelivered": "Eliminar automáticamente paquetes entregados",
|
|
18
15
|
"label_language": "Idioma de estados",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Intervalo de consulta (minutos)",
|
|
20
17
|
"lang_de": "Alemán",
|
|
21
18
|
"lang_en": "Inglés",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "¡Error de conexión!",
|
|
20
|
+
"msg_connectionOk": "¡Conexión exitosa!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Cuando está activado, los paquetes entregados se eliminan automáticamente del árbol de estados. Cuando está desactivado, permanecen con el estado 'Entregado' hasta ser eliminados en parcel.app.",
|
|
22
|
+
"tooltip_language": "Idioma para las etiquetas de estado de entrega",
|
|
23
|
+
"tooltip_pollInterval": "Con qué frecuencia obtener actualizaciones de entrega (5-60 minutos, predeterminado: 10). Límite: 20 solicitudes/hora."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Soutenez cet adaptateur",
|
|
3
|
+
"aboutInfo": "Cet adaptateur est gratuit et open source. Si vous le trouvez utile, pensez à soutenir son développement par un petit don.",
|
|
4
|
+
"aboutTab": "À propos",
|
|
5
5
|
"apiKeyInfo": "Entrez votre clé API parcel.app. Un abonnement Premium est requis. Obtenez votre clé sur web.parcelapp.net → panneau API.",
|
|
6
|
-
"label_apiKey": "Clé API",
|
|
7
6
|
"btn_checkConnection": "Tester la connexion",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Fréquence de récupération des mises à jour de livraison (5-60 minutes, défaut : 10). Limite : 20 requêtes/heure.",
|
|
13
|
-
"label_filterMode": "Mode de filtrage",
|
|
14
|
-
"tooltip_filterMode": "Actif : uniquement les livraisons en cours. Récent : inclut les livraisons récemment terminées.",
|
|
15
|
-
"filterMode_active": "Livraisons actives uniquement",
|
|
16
|
-
"filterMode_recent": "Livraisons récentes",
|
|
7
|
+
"donateKofi": "Soutenir sur Ko-fi",
|
|
8
|
+
"donatePaypal": "Faire un don via PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Livraisons",
|
|
17
11
|
"header_display": "Affichage",
|
|
12
|
+
"header_polling": "Interrogation",
|
|
13
|
+
"label_apiKey": "Clé API",
|
|
14
|
+
"label_autoRemoveDelivered": "Supprimer automatiquement les colis livrés",
|
|
18
15
|
"label_language": "Langue des statuts",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Intervalle d interrogation (minutes)",
|
|
20
17
|
"lang_de": "Allemand",
|
|
21
18
|
"lang_en": "Anglais",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Échec de la connexion !",
|
|
20
|
+
"msg_connectionOk": "Connexion réussie !",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Lorsque activé, les colis livrés sont automatiquement supprimés de l'arborescence d'états. Lorsque désactivé, ils restent avec le statut 'Livré' jusqu'à leur suppression dans parcel.app.",
|
|
22
|
+
"tooltip_language": "Langue pour les libellés de statut de livraison",
|
|
23
|
+
"tooltip_pollInterval": "Fréquence de récupération des mises à jour de livraison (5-60 minutes, défaut : 10). Limite : 20 requêtes/heure."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Supporta questo adattatore",
|
|
3
|
+
"aboutInfo": "Questo adattatore è gratuito e open source. Se lo trovi utile, considera di supportare lo sviluppo con una piccola donazione.",
|
|
4
|
+
"aboutTab": "Info",
|
|
5
5
|
"apiKeyInfo": "Inserisci la tua chiave API parcel.app. È necessario un abbonamento Premium. Ottieni la tua chiave su web.parcelapp.net → pannello API.",
|
|
6
|
-
"label_apiKey": "Chiave API",
|
|
7
6
|
"btn_checkConnection": "Testa connessione",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Frequenza di aggiornamento delle consegne (5-60 minuti, predefinito: 10). Limite: 20 richieste/ora.",
|
|
13
|
-
"label_filterMode": "Modalità filtro",
|
|
14
|
-
"tooltip_filterMode": "Attivo: solo consegne in corso. Recente: include consegne recentemente completate.",
|
|
15
|
-
"filterMode_active": "Solo consegne attive",
|
|
16
|
-
"filterMode_recent": "Consegne recenti",
|
|
7
|
+
"donateKofi": "Supporta su Ko-fi",
|
|
8
|
+
"donatePaypal": "Dona tramite PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Consegne",
|
|
17
11
|
"header_display": "Visualizzazione",
|
|
12
|
+
"header_polling": "Polling",
|
|
13
|
+
"label_apiKey": "Chiave API",
|
|
14
|
+
"label_autoRemoveDelivered": "Rimuovi automaticamente i pacchi consegnati",
|
|
18
15
|
"label_language": "Lingua degli stati",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Intervallo di polling (minuti)",
|
|
20
17
|
"lang_de": "Tedesco",
|
|
21
18
|
"lang_en": "Inglese",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Connessione fallita!",
|
|
20
|
+
"msg_connectionOk": "Connessione riuscita!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Se attivato, i pacchi consegnati vengono automaticamente rimossi dall'albero degli stati. Se disattivato, rimangono con lo stato 'Consegnato' fino alla cancellazione in parcel.app.",
|
|
22
|
+
"tooltip_language": "Lingua per le etichette di stato della consegna",
|
|
23
|
+
"tooltip_pollInterval": "Frequenza di aggiornamento delle consegne (5-60 minuti, predefinito: 10). Limite: 20 richieste/ora."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Steun deze adapter",
|
|
3
|
+
"aboutInfo": "Deze adapter is gratis en open source. Als je hem nuttig vindt, overweeg dan de ontwikkeling te steunen met een kleine donatie.",
|
|
4
|
+
"aboutTab": "Over",
|
|
5
5
|
"apiKeyInfo": "Voer je parcel.app API-sleutel in. Een Premium-abonnement is vereist. Haal je sleutel op via web.parcelapp.net → API-paneel.",
|
|
6
|
-
"label_apiKey": "API-sleutel",
|
|
7
6
|
"btn_checkConnection": "Verbinding testen",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Hoe vaak bezorgingsupdates ophalen (5-60 minuten, standaard: 10). Limiet: 20 verzoeken/uur.",
|
|
13
|
-
"label_filterMode": "Filtermodus",
|
|
14
|
-
"tooltip_filterMode": "Actief: alleen huidige bezorgingen. Recent: inclusief recent afgeleverde.",
|
|
15
|
-
"filterMode_active": "Alleen actieve bezorgingen",
|
|
16
|
-
"filterMode_recent": "Recente bezorgingen",
|
|
7
|
+
"donateKofi": "Steunen op Ko-fi",
|
|
8
|
+
"donatePaypal": "Doneren via PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Leveringen",
|
|
17
11
|
"header_display": "Weergave",
|
|
12
|
+
"header_polling": "Polling",
|
|
13
|
+
"label_apiKey": "API-sleutel",
|
|
14
|
+
"label_autoRemoveDelivered": "Afgeleverde pakketten automatisch verwijderen",
|
|
18
15
|
"label_language": "Statustaal",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Polling-interval (minuten)",
|
|
20
17
|
"lang_de": "Duits",
|
|
21
18
|
"lang_en": "Engels",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Verbinding mislukt!",
|
|
20
|
+
"msg_connectionOk": "Verbinding succesvol!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Indien ingeschakeld worden afgeleverde pakketten automatisch uit de objectboom verwijderd. Indien uitgeschakeld blijven ze met status 'Afgeleverd' bestaan tot ze in parcel.app worden verwijderd.",
|
|
22
|
+
"tooltip_language": "Taal voor bezorgingsstatussen",
|
|
23
|
+
"tooltip_pollInterval": "Hoe vaak bezorgingsupdates ophalen (5-60 minuten, standaard: 10). Limiet: 20 verzoeken/uur."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Wesprzyj ten adapter",
|
|
3
|
+
"aboutInfo": "Ten adapter jest darmowy i open source. Jeśli uważasz go za przydatny, rozważ wsparcie rozwoju niewielką darowizną.",
|
|
4
|
+
"aboutTab": "O programie",
|
|
5
5
|
"apiKeyInfo": "Wprowadź klucz API parcel.app. Wymagana subskrypcja Premium. Uzyskaj klucz na web.parcelapp.net → panel API.",
|
|
6
|
-
"label_apiKey": "Klucz API",
|
|
7
6
|
"btn_checkConnection": "Testuj połączenie",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Jak często pobierać aktualizacje dostaw (5-60 minut, domyślnie: 10). Limit: 20 zapytań/godzinę.",
|
|
13
|
-
"label_filterMode": "Tryb filtrowania",
|
|
14
|
-
"tooltip_filterMode": "Aktywne: tylko bieżące dostawy. Ostatnie: w tym niedawno ukończone.",
|
|
15
|
-
"filterMode_active": "Tylko aktywne dostawy",
|
|
16
|
-
"filterMode_recent": "Ostatnie dostawy",
|
|
7
|
+
"donateKofi": "Wesprzyj na Ko-fi",
|
|
8
|
+
"donatePaypal": "Przekaż darowiznę przez PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Dostawy",
|
|
17
11
|
"header_display": "Wyświetlanie",
|
|
12
|
+
"header_polling": "Odpytywanie",
|
|
13
|
+
"label_apiKey": "Klucz API",
|
|
14
|
+
"label_autoRemoveDelivered": "Automatycznie usuwaj dostarczone przesyłki",
|
|
18
15
|
"label_language": "Język statusów",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Interwał odpytywania (minuty)",
|
|
20
17
|
"lang_de": "Niemiecki",
|
|
21
18
|
"lang_en": "Angielski",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Połączenie nieudane!",
|
|
20
|
+
"msg_connectionOk": "Połączenie udane!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Po włączeniu dostarczone przesyłki są automatycznie usuwane z drzewa stanów. Po wyłączeniu pozostają ze statusem 'Dostarczono' do usunięcia w parcel.app.",
|
|
22
|
+
"tooltip_language": "Język dla etykiet statusu dostawy",
|
|
23
|
+
"tooltip_pollInterval": "Jak często pobierać aktualizacje dostaw (5-60 minut, domyślnie: 10). Limit: 20 zapytań/godzinę."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Apoie este adaptador",
|
|
3
|
+
"aboutInfo": "Este adaptador é gratuito e de código aberto. Se você o achar útil, considere apoiar o desenvolvimento com uma pequena doação.",
|
|
4
|
+
"aboutTab": "Sobre",
|
|
5
5
|
"apiKeyInfo": "Insira sua chave API do parcel.app. É necessária uma assinatura Premium. Obtenha sua chave em web.parcelapp.net → painel API.",
|
|
6
|
-
"label_apiKey": "Chave API",
|
|
7
6
|
"btn_checkConnection": "Testar Conexão",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Com que frequência buscar atualizações de entrega (5-60 minutos, padrão: 10). Limite: 20 solicitações/hora.",
|
|
13
|
-
"label_filterMode": "Modo de filtro",
|
|
14
|
-
"tooltip_filterMode": "Ativo: apenas entregas atuais. Recente: inclui entregas recentemente concluídas.",
|
|
15
|
-
"filterMode_active": "Apenas entregas ativas",
|
|
16
|
-
"filterMode_recent": "Entregas recentes",
|
|
7
|
+
"donateKofi": "Apoiar no Ko-fi",
|
|
8
|
+
"donatePaypal": "Doar via PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Entregas",
|
|
17
11
|
"header_display": "Exibição",
|
|
12
|
+
"header_polling": "Consulta",
|
|
13
|
+
"label_apiKey": "Chave API",
|
|
14
|
+
"label_autoRemoveDelivered": "Remover automaticamente pacotes entregues",
|
|
18
15
|
"label_language": "Idioma do status",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Intervalo de consulta (minutos)",
|
|
20
17
|
"lang_de": "Alemão",
|
|
21
18
|
"lang_en": "Inglês",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Falha na conexão!",
|
|
20
|
+
"msg_connectionOk": "Conexão bem-sucedida!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Quando ativado, os pacotes entregues são automaticamente removidos da árvore de estados. Quando desativado, permanecem com o estado 'Entregue' até serem eliminados no parcel.app.",
|
|
22
|
+
"tooltip_language": "Idioma para os rótulos de status de entrega",
|
|
23
|
+
"tooltip_pollInterval": "Com que frequência buscar atualizações de entrega (5-60 minutos, padrão: 10). Limite: 20 solicitações/hora."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Поддержите этот адаптер",
|
|
3
|
+
"aboutInfo": "Этот адаптер бесплатный и с открытым исходным кодом. Если он вам полезен, поддержите разработку небольшим пожертвованием.",
|
|
4
|
+
"aboutTab": "О программе",
|
|
5
5
|
"apiKeyInfo": "Введите API-ключ parcel.app. Требуется Premium-подписка. Получите ключ на web.parcelapp.net → раздел API.",
|
|
6
|
-
"label_apiKey": "API-ключ",
|
|
7
6
|
"btn_checkConnection": "Проверить соединение",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Как часто получать обновления доставки (5-60 минут, по умолчанию: 10). Лимит: 20 запросов/час.",
|
|
13
|
-
"label_filterMode": "Режим фильтра",
|
|
14
|
-
"tooltip_filterMode": "Активные: только текущие доставки. Недавние: включая недавно доставленные.",
|
|
15
|
-
"filterMode_active": "Только активные доставки",
|
|
16
|
-
"filterMode_recent": "Недавние доставки",
|
|
7
|
+
"donateKofi": "Поддержать на Ko-fi",
|
|
8
|
+
"donatePaypal": "Пожертвовать через PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Доставки",
|
|
17
11
|
"header_display": "Отображение",
|
|
12
|
+
"header_polling": "Опрос",
|
|
13
|
+
"label_apiKey": "API-ключ",
|
|
14
|
+
"label_autoRemoveDelivered": "Автоматически удалять доставленные посылки",
|
|
18
15
|
"label_language": "Язык статусов",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Интервал опроса (минуты)",
|
|
20
17
|
"lang_de": "Немецкий",
|
|
21
18
|
"lang_en": "Английский",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Ошибка соединения!",
|
|
20
|
+
"msg_connectionOk": "Соединение успешно!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Если включено, доставленные посылки автоматически удаляются из дерева состояний. Если выключено, они остаются со статусом 'Доставлено' до удаления в parcel.app.",
|
|
22
|
+
"tooltip_language": "Язык для статусов доставки",
|
|
23
|
+
"tooltip_pollInterval": "Как часто получать обновления доставки (5-60 минут, по умолчанию: 10). Лимит: 20 запросов/час."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "Підтримайте цей адаптер",
|
|
3
|
+
"aboutInfo": "Цей адаптер безкоштовний та з відкритим кодом. Якщо він вам корисний, підтримайте розробку невеликою пожертвою.",
|
|
4
|
+
"aboutTab": "Про програму",
|
|
5
5
|
"apiKeyInfo": "Введіть ваш API-ключ parcel.app. Потрібна Premium-підписка. Отримайте ключ на web.parcelapp.net → панель API.",
|
|
6
|
-
"label_apiKey": "API-ключ",
|
|
7
6
|
"btn_checkConnection": "Перевірити з'єднання",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "Як часто отримувати оновлення доставки (5-60 хвилин, за замовчуванням: 10). Ліміт: 20 запитів/годину.",
|
|
13
|
-
"label_filterMode": "Режим фільтрування",
|
|
14
|
-
"tooltip_filterMode": "Активні: лише поточні доставки. Нещодавні: включно з нещодавно завершеними.",
|
|
15
|
-
"filterMode_active": "Лише активні доставки",
|
|
16
|
-
"filterMode_recent": "Нещодавні доставки",
|
|
7
|
+
"donateKofi": "Підтримати на Ko-fi",
|
|
8
|
+
"donatePaypal": "Пожертвувати через PayPal",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "Доставки",
|
|
17
11
|
"header_display": "Відображення",
|
|
12
|
+
"header_polling": "Опитування",
|
|
13
|
+
"label_apiKey": "API-ключ",
|
|
14
|
+
"label_autoRemoveDelivered": "Автоматично видаляти доставлені посилки",
|
|
18
15
|
"label_language": "Мова статусів",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "Інтервал опитування (хвилини)",
|
|
20
17
|
"lang_de": "Німецька",
|
|
21
18
|
"lang_en": "Англійська",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "Помилка з'єднання!",
|
|
20
|
+
"msg_connectionOk": "З'єднання успішне!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "Якщо увімкнено, доставлені посилки автоматично видаляються з дерева станів. Якщо вимкнено, вони залишаються зі статусом 'Доставлено' до видалення в parcel.app.",
|
|
22
|
+
"tooltip_language": "Мова для міток статусу доставки",
|
|
23
|
+
"tooltip_pollInterval": "Як часто отримувати оновлення доставки (5-60 хвилин, за замовчуванням: 10). Ліміт: 20 запитів/годину."
|
|
27
24
|
}
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"aboutHeader": "支持此适配器",
|
|
3
|
+
"aboutInfo": "此适配器免费且开源。如果您觉得有用,请考虑通过小额捐赠支持开发。",
|
|
4
|
+
"aboutTab": "关于",
|
|
5
5
|
"apiKeyInfo": "输入你的 parcel.app API 密钥。需要 Premium 订阅。在 web.parcelapp.net → API 面板获取密钥。",
|
|
6
|
-
"label_apiKey": "API 密钥",
|
|
7
6
|
"btn_checkConnection": "测试连接",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"tooltip_pollInterval": "多久获取一次快递更新(5-60分钟,默认:10)。速率限制:20次请求/小时。",
|
|
13
|
-
"label_filterMode": "过滤模式",
|
|
14
|
-
"tooltip_filterMode": "活跃:仅当前快递。最近:包括最近完成的。",
|
|
15
|
-
"filterMode_active": "仅活跃快递",
|
|
16
|
-
"filterMode_recent": "最近的快递",
|
|
7
|
+
"donateKofi": "在 Ko-fi 上支持",
|
|
8
|
+
"donatePaypal": "通过 PayPal 捐赠",
|
|
9
|
+
"header_connection": "parcel.app API",
|
|
10
|
+
"header_delivery": "配送",
|
|
17
11
|
"header_display": "显示",
|
|
12
|
+
"header_polling": "轮询",
|
|
13
|
+
"label_apiKey": "API 密钥",
|
|
14
|
+
"label_autoRemoveDelivered": "自动移除已送达的包裹",
|
|
18
15
|
"label_language": "状态语言",
|
|
19
|
-
"
|
|
16
|
+
"label_pollInterval": "轮询间隔(分钟)",
|
|
20
17
|
"lang_de": "德语",
|
|
21
18
|
"lang_en": "英语",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
19
|
+
"msg_connectionFailed": "连接失败!",
|
|
20
|
+
"msg_connectionOk": "连接成功!",
|
|
21
|
+
"tooltip_autoRemoveDelivered": "启用后,已送达的包裹会自动从状态树中移除。禁用后,它们将保持'已送达'状态,直到在 parcel.app 中删除。",
|
|
22
|
+
"tooltip_language": "快递状态标签的语言",
|
|
23
|
+
"tooltip_pollInterval": "多久获取一次快递更新(5-60分钟,默认:10)。速率限制:20次请求/小时。"
|
|
27
24
|
}
|
package/admin/jsonConfig.json
CHANGED
|
@@ -1,131 +1,116 @@
|
|
|
1
1
|
{
|
|
2
2
|
"i18n": true,
|
|
3
|
-
"type": "
|
|
3
|
+
"type": "panel",
|
|
4
4
|
"items": {
|
|
5
|
-
"
|
|
6
|
-
"type": "
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"connectionHeader": {
|
|
10
|
-
"type": "header",
|
|
11
|
-
"text": "header_connection",
|
|
12
|
-
"size": 4
|
|
13
|
-
},
|
|
14
|
-
"apiKeyInfo": {
|
|
15
|
-
"type": "staticText",
|
|
16
|
-
"text": "apiKeyInfo",
|
|
17
|
-
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12,
|
|
18
|
-
"style": {
|
|
19
|
-
"fontSize": 14,
|
|
20
|
-
"color": "#666",
|
|
21
|
-
"marginBottom": 16
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"apiKey": {
|
|
25
|
-
"type": "password",
|
|
26
|
-
"label": "label_apiKey",
|
|
27
|
-
"xs": 12, "sm": 12, "md": 8, "lg": 8, "xl": 8
|
|
28
|
-
},
|
|
29
|
-
"checkConnection": {
|
|
30
|
-
"newLine": true,
|
|
31
|
-
"type": "sendTo",
|
|
32
|
-
"label": "btn_checkConnection",
|
|
33
|
-
"command": "checkConnection",
|
|
34
|
-
"jsonData": "{\"apiKey\": \"${data.apiKey}\"}",
|
|
35
|
-
"result": {
|
|
36
|
-
"okText": "msg_connectionOk",
|
|
37
|
-
"errorText": "msg_connectionFailed"
|
|
38
|
-
},
|
|
39
|
-
"xs": 12, "sm": 12, "md": 4, "lg": 4, "xl": 4
|
|
40
|
-
}
|
|
41
|
-
}
|
|
5
|
+
"connectionHeader": {
|
|
6
|
+
"type": "header",
|
|
7
|
+
"text": "header_connection",
|
|
8
|
+
"size": 4
|
|
42
9
|
},
|
|
43
|
-
"
|
|
44
|
-
"type": "
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
},
|
|
52
|
-
"pollInterval": {
|
|
53
|
-
"type": "number",
|
|
54
|
-
"label": "label_pollInterval",
|
|
55
|
-
"tooltip": "tooltip_pollInterval",
|
|
56
|
-
"min": 5,
|
|
57
|
-
"max": 60,
|
|
58
|
-
"default": 10,
|
|
59
|
-
"xs": 12, "sm": 12, "md": 6, "lg": 6, "xl": 6
|
|
60
|
-
},
|
|
61
|
-
"filterMode": {
|
|
62
|
-
"type": "select",
|
|
63
|
-
"label": "label_filterMode",
|
|
64
|
-
"tooltip": "tooltip_filterMode",
|
|
65
|
-
"default": "active",
|
|
66
|
-
"options": [
|
|
67
|
-
{ "label": "filterMode_active", "value": "active" },
|
|
68
|
-
{ "label": "filterMode_recent", "value": "recent" }
|
|
69
|
-
],
|
|
70
|
-
"xs": 12, "sm": 12, "md": 6, "lg": 6, "xl": 6
|
|
71
|
-
},
|
|
72
|
-
"displayHeader": {
|
|
73
|
-
"newLine": true,
|
|
74
|
-
"type": "header",
|
|
75
|
-
"text": "header_display",
|
|
76
|
-
"size": 5
|
|
77
|
-
},
|
|
78
|
-
"language": {
|
|
79
|
-
"type": "select",
|
|
80
|
-
"label": "label_language",
|
|
81
|
-
"tooltip": "tooltip_language",
|
|
82
|
-
"default": "de",
|
|
83
|
-
"options": [
|
|
84
|
-
{ "label": "lang_de", "value": "de" },
|
|
85
|
-
{ "label": "lang_en", "value": "en" }
|
|
86
|
-
],
|
|
87
|
-
"xs": 12, "sm": 12, "md": 6, "lg": 6, "xl": 6
|
|
88
|
-
}
|
|
10
|
+
"apiKeyInfo": {
|
|
11
|
+
"type": "staticText",
|
|
12
|
+
"text": "apiKeyInfo",
|
|
13
|
+
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12,
|
|
14
|
+
"style": {
|
|
15
|
+
"fontSize": 14,
|
|
16
|
+
"color": "#666",
|
|
17
|
+
"marginBottom": 16
|
|
89
18
|
}
|
|
90
19
|
},
|
|
91
|
-
"
|
|
92
|
-
"type": "
|
|
93
|
-
"label": "
|
|
94
|
-
"
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
20
|
+
"apiKey": {
|
|
21
|
+
"type": "password",
|
|
22
|
+
"label": "label_apiKey",
|
|
23
|
+
"xs": 12, "sm": 12, "md": 8, "lg": 8, "xl": 8
|
|
24
|
+
},
|
|
25
|
+
"checkConnection": {
|
|
26
|
+
"newLine": true,
|
|
27
|
+
"type": "sendTo",
|
|
28
|
+
"label": "btn_checkConnection",
|
|
29
|
+
"command": "checkConnection",
|
|
30
|
+
"jsonData": "{\"apiKey\": \"${data.apiKey}\"}",
|
|
31
|
+
"result": {
|
|
32
|
+
"okText": "msg_connectionOk",
|
|
33
|
+
"errorText": "msg_connectionFailed"
|
|
34
|
+
},
|
|
35
|
+
"xs": 12, "sm": 12, "md": 4, "lg": 4, "xl": 4
|
|
36
|
+
},
|
|
37
|
+
"pollingHeader": {
|
|
38
|
+
"newLine": true,
|
|
39
|
+
"type": "header",
|
|
40
|
+
"text": "header_polling",
|
|
41
|
+
"size": 5
|
|
42
|
+
},
|
|
43
|
+
"pollInterval": {
|
|
44
|
+
"type": "number",
|
|
45
|
+
"label": "label_pollInterval",
|
|
46
|
+
"tooltip": "tooltip_pollInterval",
|
|
47
|
+
"min": 5,
|
|
48
|
+
"max": 60,
|
|
49
|
+
"default": 10,
|
|
50
|
+
"xs": 12, "sm": 12, "md": 6, "lg": 6, "xl": 6
|
|
51
|
+
},
|
|
52
|
+
"deliveryHeader": {
|
|
53
|
+
"newLine": true,
|
|
54
|
+
"type": "header",
|
|
55
|
+
"text": "header_delivery",
|
|
56
|
+
"size": 5
|
|
57
|
+
},
|
|
58
|
+
"autoRemoveDelivered": {
|
|
59
|
+
"type": "checkbox",
|
|
60
|
+
"label": "label_autoRemoveDelivered",
|
|
61
|
+
"tooltip": "tooltip_autoRemoveDelivered",
|
|
62
|
+
"default": true,
|
|
63
|
+
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12
|
|
64
|
+
},
|
|
65
|
+
"displayHeader": {
|
|
66
|
+
"newLine": true,
|
|
67
|
+
"type": "header",
|
|
68
|
+
"text": "header_display",
|
|
69
|
+
"size": 5
|
|
70
|
+
},
|
|
71
|
+
"language": {
|
|
72
|
+
"type": "select",
|
|
73
|
+
"label": "label_language",
|
|
74
|
+
"tooltip": "tooltip_language",
|
|
75
|
+
"default": "de",
|
|
76
|
+
"options": [
|
|
77
|
+
{ "label": "lang_de", "value": "de" },
|
|
78
|
+
{ "label": "lang_en", "value": "en" }
|
|
79
|
+
],
|
|
80
|
+
"xs": 12, "sm": 12, "md": 6, "lg": 6, "xl": 6
|
|
81
|
+
},
|
|
82
|
+
"aboutHeader": {
|
|
83
|
+
"newLine": true,
|
|
84
|
+
"type": "header",
|
|
85
|
+
"text": "aboutHeader",
|
|
86
|
+
"size": 5
|
|
87
|
+
},
|
|
88
|
+
"aboutInfo": {
|
|
89
|
+
"type": "staticText",
|
|
90
|
+
"text": "aboutInfo",
|
|
91
|
+
"xs": 12, "sm": 12, "md": 12, "lg": 12, "xl": 12,
|
|
92
|
+
"style": {
|
|
93
|
+
"fontSize": 14,
|
|
94
|
+
"marginBottom": 16
|
|
128
95
|
}
|
|
96
|
+
},
|
|
97
|
+
"_kofiLink": {
|
|
98
|
+
"type": "staticLink",
|
|
99
|
+
"href": "https://ko-fi.com/krobipd",
|
|
100
|
+
"label": "donateKofi",
|
|
101
|
+
"button": true,
|
|
102
|
+
"variant": "outlined",
|
|
103
|
+
"color": "primary",
|
|
104
|
+
"xs": 12, "sm": 6, "md": 4, "lg": 4, "xl": 4
|
|
105
|
+
},
|
|
106
|
+
"_paypalLink": {
|
|
107
|
+
"type": "staticLink",
|
|
108
|
+
"href": "https://paypal.me/krobipd",
|
|
109
|
+
"label": "donatePaypal",
|
|
110
|
+
"button": true,
|
|
111
|
+
"variant": "outlined",
|
|
112
|
+
"color": "primary",
|
|
113
|
+
"xs": 12, "sm": 6, "md": 4, "lg": 4, "xl": 4
|
|
129
114
|
}
|
|
130
115
|
}
|
|
131
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parcel-client.d.ts","sourceRoot":"","sources":["../../src/lib/parcel-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACX,MAAM,SAAS,CAAC;AAKjB,yCAAyC;AACzC,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAA2B;IAE/C,2CAA2C;gBAC/B,MAAM,EAAE,MAAM;IAI1B;;;;OAIG;IACG,aAAa,CACjB,UAAU,GAAE,QAAQ,GAAG,QAAmB,GACzC,OAAO,CAAC,cAAc,EAAE,CAAC;IAqB5B;;;;OAIG;IACG,WAAW,CACf,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,mBAAmB,CAAC;IAS/B,kDAAkD;IAC5C,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC;IAkB5C;;;;OAIG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,mCAAmC;IAC7B,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAatE;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"parcel-client.d.ts","sourceRoot":"","sources":["../../src/lib/parcel-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACX,MAAM,SAAS,CAAC;AAKjB,yCAAyC;AACzC,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAA2B;IAE/C,2CAA2C;gBAC/B,MAAM,EAAE,MAAM;IAI1B;;;;OAIG;IACG,aAAa,CACjB,UAAU,GAAE,QAAQ,GAAG,QAAmB,GACzC,OAAO,CAAC,cAAc,EAAE,CAAC;IAqB5B;;;;OAIG;IACG,WAAW,CACf,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,mBAAmB,CAAC;IAS/B,kDAAkD;IAC5C,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC;IAkB5C;;;;OAIG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,mCAAmC;IAC7B,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAatE;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO;CAiFhB"}
|
|
@@ -137,6 +137,15 @@ class ParcelClient {
|
|
|
137
137
|
const raw = Buffer.concat(chunks).toString("utf-8");
|
|
138
138
|
if (res.statusCode &&
|
|
139
139
|
(res.statusCode < 200 || res.statusCode >= 300)) {
|
|
140
|
+
if (res.statusCode === 429) {
|
|
141
|
+
const retryAfter = parseInt(res.headers["retry-after"] || "", 10);
|
|
142
|
+
const err = new Error("Rate limit exceeded");
|
|
143
|
+
err.code = "RATE_LIMITED";
|
|
144
|
+
// Use Retry-After header or default to 5 minutes
|
|
145
|
+
err.retryAfterSeconds = retryAfter > 0 ? retryAfter : 5 * 60;
|
|
146
|
+
reject(err);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
140
149
|
const err = new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`);
|
|
141
150
|
err.code =
|
|
142
151
|
res.statusCode === 401 || res.statusCode === 403
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAqB9C,oDAAoD;AACpD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAkB;IAEjC,mDAAmD;gBACvC,OAAO,EAAE,eAAe;IAIpC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAU9B;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM;IAQ3C;;;;;OAKG;IACG,cAAc,CAClB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAiGhB;;;;OAIG;IACG,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAqB9C,oDAAoD;AACpD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAkB;IAEjC,mDAAmD;gBACvC,OAAO,EAAE,eAAe;IAIpC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAU9B;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM;IAQ3C;;;;;OAKG;IACG,cAAc,CAClB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAiGhB;;;;OAIG;IACG,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCtE;;;;OAIG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3D;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAiDjC;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAevB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAkC/B;;;;;;;;OAQG;YACW,YAAY;CAc3B"}
|
|
@@ -102,7 +102,6 @@ class StateManager {
|
|
|
102
102
|
this.createAndSet("summary.activeCount", "Active Deliveries", "number", "value", activeDeliveries.length),
|
|
103
103
|
this.createAndSet("summary.todayCount", "Deliveries Today", "number", "value", todayDeliveries.length),
|
|
104
104
|
this.createAndSet("summary.deliveryWindow", "Combined Delivery Window", "string", "text", this.calculateCombinedWindow(todayDeliveries)),
|
|
105
|
-
this.createAndSet("summary.json", "All Deliveries (JSON)", "string", "json", JSON.stringify(activeDeliveries)),
|
|
106
105
|
]);
|
|
107
106
|
}
|
|
108
107
|
/**
|
package/build/lib/types.d.ts
CHANGED
|
@@ -76,10 +76,10 @@ declare global {
|
|
|
76
76
|
apiKey: string;
|
|
77
77
|
/** Polling interval in minutes */
|
|
78
78
|
pollInterval: number;
|
|
79
|
-
/** Filter mode for deliveries */
|
|
80
|
-
filterMode: "active" | "recent";
|
|
81
79
|
/** Language for status labels */
|
|
82
80
|
language: "de" | "en";
|
|
81
|
+
/** Automatically remove delivered packages from states */
|
|
82
|
+
autoRemoveDelivered: boolean;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
}
|
package/build/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUnD,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUnD,CAAC;AAGF,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,QAAQ,CAAC;QACjB,UAAU,aAAa;YACrB,yBAAyB;YACzB,MAAM,EAAE,MAAM,CAAC;YACf,kCAAkC;YAClC,YAAY,EAAE,MAAM,CAAC;YACrB,iCAAiC;YACjC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUnD,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUnD,CAAC;AAGF,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,QAAQ,CAAC;QACjB,UAAU,aAAa;YACrB,yBAAyB;YACzB,MAAM,EAAE,MAAM,CAAC;YACf,kCAAkC;YAClC,YAAY,EAAE,MAAM,CAAC;YACrB,iCAAiC;YACjC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;YACtB,0DAA0D;YAC1D,mBAAmB,EAAE,OAAO,CAAC;SAC9B;KACF;CACF"}
|
package/build/main.js
CHANGED
|
@@ -40,12 +40,16 @@ require("./lib/types");
|
|
|
40
40
|
const MIN_POLL_INTERVAL = 5;
|
|
41
41
|
const MAX_POLL_INTERVAL = 60;
|
|
42
42
|
const DEFAULT_POLL_INTERVAL = 10;
|
|
43
|
+
const MIN_POLL_GAP_MS = 60_000; // Minimum 60s between polls
|
|
43
44
|
/** ioBroker adapter for parcel.app package tracking */
|
|
44
45
|
class ParcelappAdapter extends utils.Adapter {
|
|
45
46
|
client = null;
|
|
46
47
|
stateManager = null;
|
|
47
48
|
pollTimer = null;
|
|
48
49
|
isPolling = false;
|
|
50
|
+
lastPollTime = 0;
|
|
51
|
+
rateLimitedUntil = 0;
|
|
52
|
+
lastErrorCode = "";
|
|
49
53
|
/** @param options Adapter options */
|
|
50
54
|
constructor(options = {}) {
|
|
51
55
|
super({
|
|
@@ -67,6 +71,8 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
67
71
|
// Initialize
|
|
68
72
|
this.client = new parcel_client_1.ParcelClient(apiKey.trim());
|
|
69
73
|
this.stateManager = new state_manager_1.StateManager(this);
|
|
74
|
+
// Cleanup obsolete states
|
|
75
|
+
await this.cleanupObsoleteStates();
|
|
70
76
|
// Initial poll
|
|
71
77
|
await this.poll();
|
|
72
78
|
// Set up recurring poll
|
|
@@ -124,37 +130,116 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
124
130
|
this.sendTo(obj.from, obj.command, { error: "Unknown command" }, obj.callback);
|
|
125
131
|
}
|
|
126
132
|
}
|
|
133
|
+
async cleanupObsoleteStates() {
|
|
134
|
+
const obsoleteStates = [
|
|
135
|
+
"summary.json", // removed in 0.2.0
|
|
136
|
+
];
|
|
137
|
+
for (const stateId of obsoleteStates) {
|
|
138
|
+
const obj = await this.getObjectAsync(stateId);
|
|
139
|
+
if (obj) {
|
|
140
|
+
await this.delObjectAsync(stateId);
|
|
141
|
+
this.log.debug(`Removed obsolete state: ${stateId}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Classify an error for deduplication and log-level decisions.
|
|
147
|
+
*
|
|
148
|
+
* @param error The error to classify
|
|
149
|
+
*/
|
|
150
|
+
classifyError(error) {
|
|
151
|
+
if (error.code === "RATE_LIMITED") {
|
|
152
|
+
return "RATE_LIMITED";
|
|
153
|
+
}
|
|
154
|
+
if (error.code === "INVALID_API_KEY") {
|
|
155
|
+
return "INVALID_API_KEY";
|
|
156
|
+
}
|
|
157
|
+
// Network errors: DNS, connection refused, no internet
|
|
158
|
+
if (error.code === "ENOTFOUND" ||
|
|
159
|
+
error.code === "ECONNREFUSED" ||
|
|
160
|
+
error.code === "ECONNRESET" ||
|
|
161
|
+
error.code === "ENETUNREACH" ||
|
|
162
|
+
error.code === "EAI_AGAIN") {
|
|
163
|
+
return "NETWORK";
|
|
164
|
+
}
|
|
165
|
+
if (error.message.includes("timeout") || error.code === "ETIMEDOUT") {
|
|
166
|
+
return "TIMEOUT";
|
|
167
|
+
}
|
|
168
|
+
return error.code || "UNKNOWN";
|
|
169
|
+
}
|
|
127
170
|
async poll() {
|
|
128
171
|
if (this.isPolling || !this.client || !this.stateManager) {
|
|
129
172
|
return;
|
|
130
173
|
}
|
|
174
|
+
const now = Date.now();
|
|
175
|
+
// Skip if rate limited
|
|
176
|
+
if (now < this.rateLimitedUntil) {
|
|
177
|
+
const waitMin = Math.ceil((this.rateLimitedUntil - now) / 60_000);
|
|
178
|
+
this.log.debug(`Skipping poll — rate limited for ${waitMin} more minute(s)`);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Throttle: minimum gap between polls
|
|
182
|
+
if (now - this.lastPollTime < MIN_POLL_GAP_MS) {
|
|
183
|
+
this.log.debug("Skipping poll — too soon after last poll");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
131
186
|
this.isPolling = true;
|
|
187
|
+
this.lastPollTime = now;
|
|
132
188
|
try {
|
|
133
|
-
|
|
134
|
-
const
|
|
189
|
+
// When keeping delivered packages, use "recent" to get them from API
|
|
190
|
+
const autoRemove = this.config.autoRemoveDelivered !== false;
|
|
191
|
+
const deliveries = await this.client.getDeliveries(autoRemove ? "active" : "recent");
|
|
192
|
+
// Reset error state on success
|
|
193
|
+
this.rateLimitedUntil = 0;
|
|
194
|
+
if (this.lastErrorCode) {
|
|
195
|
+
this.log.info("Connection restored");
|
|
196
|
+
this.lastErrorCode = "";
|
|
197
|
+
}
|
|
135
198
|
await this.setStateAsync("info.connection", { val: true, ack: true });
|
|
136
|
-
// Filter
|
|
137
|
-
const
|
|
199
|
+
// Filter deliveries based on auto-remove setting
|
|
200
|
+
const visibleDeliveries = autoRemove
|
|
201
|
+
? deliveries.filter((d) => parseInt(d.status_code, 10) !== 0)
|
|
202
|
+
: deliveries;
|
|
138
203
|
// Update each delivery
|
|
139
204
|
const activeIds = [];
|
|
140
|
-
for (const delivery of
|
|
205
|
+
for (const delivery of visibleDeliveries) {
|
|
141
206
|
const carrierName = await this.client.getCarrierName(delivery.carrier_code);
|
|
142
207
|
await this.stateManager.updateDelivery(delivery, carrierName);
|
|
143
208
|
activeIds.push(this.stateManager.packageId(delivery));
|
|
144
209
|
}
|
|
145
210
|
// Cleanup stale deliveries
|
|
146
211
|
await this.stateManager.cleanupDeliveries(activeIds);
|
|
147
|
-
// Update summary
|
|
148
|
-
|
|
149
|
-
|
|
212
|
+
// Update summary
|
|
213
|
+
const summaryDeliveries = autoRemove
|
|
214
|
+
? visibleDeliveries
|
|
215
|
+
: deliveries.filter((d) => parseInt(d.status_code, 10) !== 0);
|
|
216
|
+
await this.stateManager.updateSummary(summaryDeliveries);
|
|
217
|
+
this.log.debug(`Polled ${visibleDeliveries.length} deliveries (${summaryDeliveries.length} active)`);
|
|
150
218
|
}
|
|
151
219
|
catch (err) {
|
|
152
220
|
const error = err;
|
|
153
|
-
|
|
221
|
+
// Classify the error
|
|
222
|
+
const errorCode = this.classifyError(error);
|
|
223
|
+
const isRepeat = errorCode === this.lastErrorCode;
|
|
224
|
+
this.lastErrorCode = errorCode;
|
|
225
|
+
if (error.code === "RATE_LIMITED") {
|
|
226
|
+
const cooldownSec = error.retryAfterSeconds || 5 * 60;
|
|
227
|
+
this.rateLimitedUntil = Date.now() + cooldownSec * 1000;
|
|
228
|
+
this.log.warn(`Rate limit hit — pausing API requests for ${Math.ceil(cooldownSec / 60)} minute(s)`);
|
|
229
|
+
}
|
|
230
|
+
else if (error.code === "INVALID_API_KEY") {
|
|
231
|
+
// Always log — user must fix config
|
|
154
232
|
this.log.error("Invalid API key — please check your parcel.app API key");
|
|
155
233
|
}
|
|
156
|
-
else if (
|
|
157
|
-
|
|
234
|
+
else if (isRepeat) {
|
|
235
|
+
// Same error as last time — don't spam the log
|
|
236
|
+
this.log.debug(`Poll failed (ongoing): ${error.message}`);
|
|
237
|
+
}
|
|
238
|
+
else if (errorCode === "NETWORK") {
|
|
239
|
+
this.log.warn(`Cannot reach parcel.app API — will keep retrying`);
|
|
240
|
+
}
|
|
241
|
+
else if (errorCode === "TIMEOUT") {
|
|
242
|
+
this.log.warn(`API request timeout — will retry next cycle`);
|
|
158
243
|
}
|
|
159
244
|
else {
|
|
160
245
|
this.log.error(`Poll failed: ${error.message}`);
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "parcelapp",
|
|
4
|
-
"version": "0.1
|
|
4
|
+
"version": "0.2.1",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.2.1": {
|
|
7
|
+
"en": "Robust error handling: API rate limit detection, connection error deduplication, poll throttling",
|
|
8
|
+
"de": "Robuste Fehlerbehandlung: Erkennung von API-Ratenlimits, Deduplizierung von Verbindungsfehlern, Polling-Drosselung",
|
|
9
|
+
"ru": "Надежная обработка ошибок: обнаружение ограничения скорости API, дедупликация ошибок соединения, регулирование опроса.",
|
|
10
|
+
"pt": "Tratamento robusto de erros: detecção de limite de taxa de API, desduplicação de erros de conexão, otimização de pesquisa",
|
|
11
|
+
"nl": "Robuuste foutafhandeling: detectie van API-snelheidslimieten, deduplicatie van verbindingsfouten, poll-throttling",
|
|
12
|
+
"fr": "Gestion robuste des erreurs : détection de limite de débit API, déduplication des erreurs de connexion, limitation des interrogations",
|
|
13
|
+
"it": "Gestione efficace degli errori: rilevamento del limite di velocità dell'API, deduplicazione degli errori di connessione, limitazione del poll",
|
|
14
|
+
"es": "Manejo sólido de errores: detección de límite de tasa de API, deduplicación de errores de conexión, limitación de encuestas",
|
|
15
|
+
"pl": "Solidna obsługa błędów: wykrywanie limitów szybkości interfejsu API, deduplikacja błędów połączenia, ograniczanie odpytywania",
|
|
16
|
+
"uk": "Надійна обробка помилок: виявлення обмеження швидкості API, дедуплікація помилок підключення, регулювання опитування",
|
|
17
|
+
"zh-cn": "强大的错误处理:API 速率限制检测、连接错误重复数据删除、轮询限制"
|
|
18
|
+
},
|
|
19
|
+
"0.2.0": {
|
|
20
|
+
"en": "Added option to keep delivered packages, simplified admin UI, removed summary.json state",
|
|
21
|
+
"de": "Option zum Beibehalten gelieferter Pakete hinzugefügt, Admin-Benutzeroberfläche vereinfacht, Status „summary.json“ entfernt",
|
|
22
|
+
"ru": "Добавлена опция сохранения доставленных пакетов, упрощен пользовательский интерфейс администратора, удалено состояние summary.json.",
|
|
23
|
+
"pt": "Adicionada opção para manter pacotes entregues, UI de administração simplificada, estado summary.json removido",
|
|
24
|
+
"nl": "Optie toegevoegd om afgeleverde pakketten te behouden, vereenvoudigde beheerdersinterface, verwijderde summary.json-status",
|
|
25
|
+
"fr": "Ajout d'une option pour conserver les packages livrés, interface utilisateur d'administration simplifiée, suppression de l'état summary.json",
|
|
26
|
+
"it": "Aggiunta opzione per mantenere i pacchetti consegnati, interfaccia utente di amministrazione semplificata, stato summary.json rimosso",
|
|
27
|
+
"es": "Opción agregada para conservar los paquetes entregados, interfaz de usuario de administración simplificada, estado de resumen.json eliminado",
|
|
28
|
+
"pl": "Dodano opcję przechowywania dostarczonych paczek, uproszczony interfejs administratora, usunięto stan podsumowania.json",
|
|
29
|
+
"uk": "Додано параметр збереження доставлених пакетів, спрощений інтерфейс адміністратора, видалено стан summary.json",
|
|
30
|
+
"zh-cn": "添加了保留已交付包的选项,简化了管理 UI,删除了summary.json 状态"
|
|
31
|
+
},
|
|
6
32
|
"0.1.5": {
|
|
7
33
|
"en": "Added auto-merge config, weekly Dependabot schedule, actions/checkout v6",
|
|
8
34
|
"de": "Auto-Merge-Konfiguration hinzugefügt, wöchentlicher Dependabot-Zeitplan, actions/checkout v6",
|
|
@@ -67,19 +93,6 @@
|
|
|
67
93
|
"pl": "Przeprojektowano logo adaptera, naprawiono problemy repochecker",
|
|
68
94
|
"uk": "Оновлено логотип адаптера, виправлено проблеми repochecker",
|
|
69
95
|
"zh-cn": "重新设计适配器图标,修复 repochecker 问题"
|
|
70
|
-
},
|
|
71
|
-
"0.1.0": {
|
|
72
|
-
"en": "Initial release — track packages from 300+ carriers via parcel.app",
|
|
73
|
-
"de": "Erstveröffentlichung — Pakete von 300+ Versandunternehmen über parcel.app verfolgen",
|
|
74
|
-
"ru": "Первый выпуск — отслеживание посылок от 300+ перевозчиков через parcel.app",
|
|
75
|
-
"pt": "Lançamento inicial — rastreie pacotes de mais de 300 transportadoras via parcel.app",
|
|
76
|
-
"nl": "Eerste release — volg pakketten van 300+ vervoerders via parcel.app",
|
|
77
|
-
"fr": "Version initiale — suivez vos colis de plus de 300 transporteurs via parcel.app",
|
|
78
|
-
"it": "Prima versione — traccia pacchi da più di 300 corrieri tramite parcel.app",
|
|
79
|
-
"es": "Versión inicial — rastrea paquetes de más de 300 transportistas a través de parcel.app",
|
|
80
|
-
"pl": "Pierwsze wydanie — śledź przesyłki od 300+ przewoźników przez parcel.app",
|
|
81
|
-
"uk": "Перший випуск — відстеження посилок від 300+ перевізників через parcel.app",
|
|
82
|
-
"zh-cn": "初始版本 — 通过 parcel.app 追踪 300+ 快递公司的包裹"
|
|
83
96
|
}
|
|
84
97
|
},
|
|
85
98
|
"titleLang": {
|
|
@@ -161,8 +174,8 @@
|
|
|
161
174
|
"native": {
|
|
162
175
|
"apiKey": "",
|
|
163
176
|
"pollInterval": 10,
|
|
164
|
-
"
|
|
165
|
-
"
|
|
177
|
+
"language": "de",
|
|
178
|
+
"autoRemoveDelivered": true
|
|
166
179
|
},
|
|
167
180
|
"instanceObjects": [
|
|
168
181
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.parcelapp",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "ioBroker adapter for parcel.app — track packages from 300+ carriers",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "krobi",
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"test:integration": "npm run build:test && mocha --exit \"build/test/**/*.js\"",
|
|
62
62
|
"test": "npm run build:test && mocha --exit \"build/test/**/*.js\"",
|
|
63
63
|
"test:ci": "npm run build:test && mocha --exit --reporter spec \"build/test/**/*.js\"",
|
|
64
|
+
"translate": "translate-adapter",
|
|
64
65
|
"lint": "eslint",
|
|
65
66
|
"lint:fix": "eslint --fix",
|
|
66
67
|
"release": "release-script"
|