iobroker.parcel 0.0.13 → 0.0.16

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
@@ -12,9 +12,10 @@
12
12
 
13
13
  **Tests:** ![Test and Release](https://github.com/TA2k/ioBroker.parcel/workflows/Test%20and%20Release/badge.svg)
14
14
 
15
- ## parcel adapter for ioBroker
15
+ ## Paketverfolgung/Sendungsverfolgung Adapter für ioBroker
16
16
 
17
- Parcel tracking
17
+ Parcel tracking / Sendungsverfolgung
18
+ Verfolge mit deinem ioBroker SmartHome deine Pakete von Amazon, DHL, DPD, Hermes, UPS und GLS. Außerdem wirst du über die Briefverfolgung von der deutschen Post informiert. Direkt per Push auf Telegram, Pushover oder Signal.
18
19
 
19
20
  ## Loginablauf
20
21
 
package/io-package.json CHANGED
@@ -1,8 +1,14 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "parcel",
4
- "version": "0.0.13",
4
+ "version": "0.0.16",
5
5
  "news": {
6
+ "0.0.16": {
7
+ "en": "Fix UPS login"
8
+ },
9
+ "0.0.15": {
10
+ "en": "Fix DPD states and remove canvas dependency"
11
+ },
6
12
  "0.0.13": {
7
13
  "en": "Fix Amazon delivery state, add telegram user"
8
14
  },
package/main.js CHANGED
@@ -6,6 +6,17 @@
6
6
 
7
7
  // The adapter-core module gives you access to the core ioBroker functions
8
8
  // you need to create an adapter
9
+
10
+ //disable canvas because of missing rebuild
11
+ const Module = require("module");
12
+ const originalRequire = Module.prototype.require;
13
+ Module.prototype.require = function () {
14
+ if (arguments[0] === "canvas") {
15
+ return { createCanvas: null, createImageData: null, loadImage: null };
16
+ }
17
+ return originalRequire.apply(this, arguments);
18
+ };
19
+
9
20
  const utils = require("@iobroker/adapter-core");
10
21
  const axios = require("axios");
11
22
  const qs = require("qs");
@@ -13,9 +24,11 @@ const Json2iob = require("./lib/json2iob");
13
24
  const getPwd = require("./lib/rsaKey");
14
25
  const tough = require("tough-cookie");
15
26
  const { HttpsCookieAgent } = require("http-cookie-agent");
16
- const { JSDOM } = require("@applitools/jsdom");
27
+ const { JSDOM } = require("jsdom");
17
28
  const fs = require("fs");
18
29
  const { v4: uuidv4 } = require("uuid");
30
+ const { sep } = require("path");
31
+ const { tmpdir } = require("os");
19
32
 
20
33
  class Parcel extends utils.Adapter {
21
34
  /**
@@ -40,6 +53,7 @@ class Parcel extends utils.Adapter {
40
53
  this.ignoredPath = [];
41
54
  this.firstStart = true;
42
55
  this.delivery_status = { ERROR: -1, UNKNOWN: 5, REGISTERED: 10, IN_PREPARATION: 20, IN_TRANSIT: 30, OUT_FOR_DELIVERY: 40, DELIVERED: 1 };
56
+ this.tmpDir = tmpdir();
43
57
  }
44
58
 
45
59
  /**
@@ -448,6 +462,7 @@ class Parcel extends utils.Adapter {
448
462
  return res.data;
449
463
  })
450
464
  .catch((error) => {
465
+ this.log.error("Amazon login failed");
451
466
  this.log.error(error);
452
467
  if (error.response) {
453
468
  this.log.error(JSON.stringify(error.response.data));
@@ -821,7 +836,7 @@ class Parcel extends utils.Adapter {
821
836
  UPSSecurity: {
822
837
  UsernameToken: {},
823
838
  ServiceAccessToken: {
824
- AccessLicenseNumber: "BDB176074C16EB9D",
839
+ AccessLicenseNumber: "2DBACFA7974B3252",
825
840
  },
826
841
  },
827
842
  LoginSubmitUserIdRequest: {
@@ -919,7 +934,7 @@ class Parcel extends utils.Adapter {
919
934
  ) {
920
935
  this.upsAddressToken = res.data.GetEnrollmentsResponse.MYCEnrollmentSummaries.MYCEnrollmentSummary.AddressToken;
921
936
  } else {
922
- this.log.warn("No UPS address found");
937
+ this.log.warn("No UPS address found. Please activate UPS My Choice in the UPS App");
923
938
  this.log.info(JSON.stringify(res.data));
924
939
  }
925
940
  })
@@ -1102,7 +1117,7 @@ class Parcel extends utils.Adapter {
1102
1117
  });
1103
1118
  }
1104
1119
  if (this.sessions["amz"]) {
1105
- this.getAmazonPackages();
1120
+ await this.getAmazonPackages();
1106
1121
  }
1107
1122
  const statusArrays = {
1108
1123
  dhl: [
@@ -1157,6 +1172,9 @@ class Parcel extends utils.Adapter {
1157
1172
  accept: "*/*",
1158
1173
  "user-agent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.45 Safari/537.36",
1159
1174
  "accept-language": "de-de",
1175
+ "Cache-Control": "no-cache",
1176
+ Pragma: "no-cache",
1177
+ Expires: "0",
1160
1178
  },
1161
1179
  },
1162
1180
  ],
@@ -1319,6 +1337,11 @@ class Parcel extends utils.Adapter {
1319
1337
  });
1320
1338
  }
1321
1339
  }
1340
+ this.log.debug("Write states");
1341
+ this.setState("allProviderJson", JSON.stringify(this.mergedJson), true);
1342
+ this.setState("allProviderObjects", JSON.stringify(this.mergedJsonObject), true);
1343
+ this.setState("inDelivery", JSON.stringify(this.inDelivery), true);
1344
+ this.setState("inDeliveryCount", this.inDelivery.length, true);
1322
1345
  }
1323
1346
  async cleanupProvider(id, data) {
1324
1347
  if (id === "dhl" && data.hasOwnProperty("grantToken")) {
@@ -1363,7 +1386,12 @@ class Parcel extends utils.Adapter {
1363
1386
  if (sendung.sendungsdetails && sendung.sendungsdetails.sendungsverlauf && sendung.sendungsdetails.sendungsverlauf.kurzStatus) {
1364
1387
  status = sendung.sendungsdetails.sendungsverlauf.kurzStatus;
1365
1388
  }
1366
- const sendungsObject = { id: sendung.id, name: sendung.sendungsinfo.sendungsname, status: status, source: "DHL" };
1389
+ if (sendung.sendungsdetails && sendung.sendungsdetails.liveTrackingVerfuegbar && sendung.sendungsdetails.liveTracking) {
1390
+ status = status + " " + sendung.sendungsdetails.liveTracking.countdown + " Stopps";
1391
+ }
1392
+ const name = sendung.sendungsinfo.sendungsname;
1393
+
1394
+ const sendungsObject = { id: sendung.id, name: name, status: status, source: "DHL" };
1367
1395
 
1368
1396
  sendungsObject.delivery_status = this.deliveryStatusCheck(sendung, id, sendungsObject);
1369
1397
  if (sendungsObject.delivery_status === this.delivery_status.OUT_FOR_DELIVERY) {
@@ -1426,19 +1454,19 @@ class Parcel extends utils.Adapter {
1426
1454
  }
1427
1455
 
1428
1456
  if (id === "dpd" && data && data.sendungen) {
1429
- for (const sendung of data.sendungen) {
1430
- sendung.source = "DPD";
1431
- sendung.delivery_status = this.deliveryStatusCheck(sendung, id, sendung);
1432
- if (sendung.delivery_status === this.delivery_status.OUT_FOR_DELIVERY) {
1433
- sendung.inDelivery = true;
1434
- this.inDelivery.push(sendung);
1435
- }
1436
- if (!sendung.delivery_status) {
1437
- this.log.warn("Missing status for " + JSON.stringify(sendung));
1457
+ const sendungsArray = data.sendungen.map((sendung) => {
1458
+ const sendungsObject = { id: sendung.id, name: sendung.name, status: sendung.status || "", source: "DPD" };
1459
+
1460
+ sendungsObject.delivery_status = this.deliveryStatusCheck(sendung, id, sendungsObject);
1461
+ if (sendungsObject.delivery_status === this.delivery_status.OUT_FOR_DELIVERY) {
1462
+ sendungsObject.inDelivery = true;
1463
+ this.inDelivery.push(sendungsObject);
1438
1464
  }
1439
- this.mergedJsonObject[sendung.id] = sendung;
1440
- }
1441
- this.mergedJson = this.mergedJson.concat(data.sendungen);
1465
+ this.mergedJsonObject[sendung.id] = sendungsObject;
1466
+
1467
+ return sendungsObject;
1468
+ });
1469
+ this.mergedJson = this.mergedJson.concat(sendungsArray);
1442
1470
  }
1443
1471
  if (id === "amz" && data && data.sendungen) {
1444
1472
  const sendungsArray = data.sendungen.map((sendung) => {
@@ -1495,11 +1523,6 @@ class Parcel extends utils.Adapter {
1495
1523
  this.mergedJson = this.mergedJson.concat(sendungsArray);
1496
1524
  }
1497
1525
 
1498
- this.setState("allProviderJson", JSON.stringify(this.mergedJson), true);
1499
- this.setState("allProviderObjects", JSON.stringify(this.mergedJsonObject), true);
1500
- this.setState("inDelivery", JSON.stringify(this.inDelivery), true);
1501
- this.setState("inDeliveryCount", this.inDelivery.length, true);
1502
-
1503
1526
  if (this.config.sendToActive) {
1504
1527
  const sendungen = this.mergedJsonObject;
1505
1528
  const ids = Object.keys(sendungen);
@@ -1515,12 +1538,30 @@ class Parcel extends utils.Adapter {
1515
1538
  const sendInstances = this.config.sendToInstance.replace(/ /g, "").split(",");
1516
1539
  const sendUser = this.config.sendToUser.replace(/ /g, "").split(",");
1517
1540
  for (const sendInstance of sendInstances) {
1541
+ const text = "📦 " + sendungen[id].source + " " + sendungen[id].name + "\n" + sendungen[id].status;
1518
1542
  if (sendUser.length > 0) {
1519
1543
  for (const user of sendUser) {
1520
- await this.sendToAsync(sendInstance, { user: user, text: "📦 " + sendungen[id].name + "\n" + sendungen[id].status });
1544
+ if (sendInstance.includes("pushover")) {
1545
+ await this.sendToAsync(sendInstance, { user: user, message: text, title: "Paketstatus" });
1546
+ } else if (sendInstance.includes("signal-cmb")) {
1547
+ await this.sendToAsync(sendInstance, "send", {
1548
+ text: text,
1549
+ phone: user,
1550
+ });
1551
+ } else {
1552
+ await this.sendToAsync(sendInstance, { user: user, text: text });
1553
+ }
1521
1554
  }
1522
1555
  } else {
1523
- await this.sendToAsync(sendInstance, "📦 " + sendungen[id].name + "\n" + sendungen[id].status);
1556
+ if (sendInstance.includes("pushover")) {
1557
+ await this.sendToAsync(sendInstance, { message: text, title: "Paketstatus" });
1558
+ } else if (sendInstance.includes("signal-cmb")) {
1559
+ await this.sendToAsync(sendInstance, "send", {
1560
+ text: text,
1561
+ });
1562
+ } else {
1563
+ await this.sendToAsync(sendInstance, text);
1564
+ }
1524
1565
  }
1525
1566
  }
1526
1567
  }
@@ -1589,17 +1630,32 @@ class Parcel extends utils.Adapter {
1589
1630
  return hermes_status[sendung.lastStatusId];
1590
1631
  }
1591
1632
  }
1592
- if (id === "gls" && sendung.status) {
1593
- const gls_status = {
1633
+ if (id === "dpd" && sendung.statusId) {
1634
+ const dpd_status = {
1594
1635
  0: this.delivery_status.REGISTERED,
1595
- 1: this.delivery_status.REGISTERED,
1596
- 2: this.delivery_status.IN_PREPARATION,
1636
+ 1: this.delivery_status.IN_PREPARATION,
1637
+ 2: this.delivery_status.IN_TRANSIT,
1597
1638
  3: this.delivery_status.IN_TRANSIT,
1598
1639
  4: this.delivery_status.OUT_FOR_DELIVERY,
1640
+ 5: this.delivery_status.OUT_FOR_DELIVERY,
1641
+ 6: this.delivery_status.DELIVERED,
1642
+ };
1643
+ if (dpd_status[sendung.statusId] !== undefined) {
1644
+ return dpd_status[sendung.statusId];
1645
+ }
1646
+ }
1647
+ if (id === "gls" && sendung.status) {
1648
+ const gls_status = {
1649
+ PREADVICE: this.delivery_status.REGISTERED,
1650
+ 1: this.delivery_status.REGISTERED,
1651
+ INWAREHOUSE: this.delivery_status.IN_TRANSIT,
1652
+ INTRANSIT: this.delivery_status.IN_TRANSIT,
1653
+ INDELIVERY: this.delivery_status.OUT_FOR_DELIVERY,
1599
1654
  DELIVERED: this.delivery_status.DELIVERED,
1655
+ DELIVEREDPS: this.delivery_status.DELIVERED,
1600
1656
  };
1601
- if (gls_status[sendung.lastStatusId] !== undefined) {
1602
- return gls_status[sendung.lastStatusId];
1657
+ if (gls_status[sendung.status] !== undefined) {
1658
+ return gls_status[sendung.status];
1603
1659
  }
1604
1660
  }
1605
1661
  if (id === "amz" && sendung.detailedState && sendung.detailedState.shortStatus) {
@@ -1624,7 +1680,7 @@ class Parcel extends utils.Adapter {
1624
1680
  }
1625
1681
  }
1626
1682
 
1627
- return this.delivery_status["UNKOWN"];
1683
+ return this.delivery_status.UNKNOWN;
1628
1684
  } catch (error) {
1629
1685
  this.log.error(error);
1630
1686
  return this.delivery_status["ERROR"];
@@ -1666,10 +1722,15 @@ class Parcel extends utils.Adapter {
1666
1722
  parcelList.querySelectorAll(".btnSelectParcel").forEach((parcel) => {
1667
1723
  const parcelInfo = parcel.firstElementChild;
1668
1724
  this.log.debug(parcelInfo.textContent);
1725
+ let statusId = parcelInfo.querySelector("img").src;
1726
+ if (statusId) {
1727
+ statusId = statusId.replace("images/status_", "").replace(".svg", "");
1728
+ }
1669
1729
  result.sendungen.push({
1670
1730
  id: parcelInfo.querySelector(".parcelNo").textContent,
1671
1731
  name: parcelInfo.querySelector(".parcelName").textContent,
1672
1732
  status: parcelInfo.querySelector(".parcelDeliveryStatus").textContent,
1733
+ statusId: statusId,
1673
1734
  });
1674
1735
  });
1675
1736
  return result;
@@ -2103,25 +2164,42 @@ class Parcel extends utils.Adapter {
2103
2164
  return;
2104
2165
  }
2105
2166
  const uuid = uuidv4();
2106
- fs.writeFileSync("/tmp/" + uuid + ".jpg", imageBuffer.toString("base64"), "base64");
2167
+ fs.writeFileSync(`${this.tmpDir}${sep}${uuid}.jpg`, imageBuffer.toString("base64"), "base64");
2107
2168
  const sendInstances = this.config.sendToInstance.replace(/ /g, "").split(",");
2108
2169
  const sendUser = this.config.sendToUser.replace(/ /g, "").split(",");
2109
2170
 
2110
2171
  for (const sendInstance of sendInstances) {
2111
- if (sendInstance.includes("pushover")) {
2112
- await this.sendToAsync(sendInstance, { file: "/tmp/" + uuid + ".jpg", title: "✉️Briefankündigung" });
2113
- } else {
2114
- if (sendUser.length > 0) {
2115
- for (const user of sendUser) {
2172
+ if (sendUser.length > 0) {
2173
+ for (const user of sendUser) {
2174
+ if (sendInstance.includes("pushover")) {
2175
+ await this.sendToAsync(sendInstance, { user: user, file: `${this.tmpDir}${sep}${uuid}.jpg`, title: "✉️Briefankündigung" });
2176
+ } else if (sendInstance.includes("signal-cmb")) {
2177
+ await this.sendToAsync(sendInstance, "send", {
2178
+ text: "✉️Briefankündigung",
2179
+ phone: user,
2180
+ });
2181
+ } else {
2116
2182
  await this.sendToAsync(sendInstance, { user: user, text: "✉️Briefankündigung" });
2117
- await this.sendToAsync(sendInstance, { user: user, text: "/tmp/" + uuid + ".jpg" });
2183
+ await this.sendToAsync(sendInstance, { user: user, text: `${this.tmpDir}${sep}${uuid}.jpg` });
2118
2184
  }
2185
+ }
2186
+ } else {
2187
+ if (sendInstance.includes("pushover")) {
2188
+ await this.sendToAsync(sendInstance, { file: `${this.tmpDir}${sep}${uuid}.jpg`, title: "✉️Briefankündigung" });
2189
+ } else if (sendInstance.includes("signal-cmb")) {
2190
+ await this.sendToAsync(sendInstance, "send", {
2191
+ text: "✉️Briefankündigung",
2192
+ });
2119
2193
  } else {
2120
2194
  await this.sendToAsync(sendInstance, "✉️Briefankündigung");
2121
- await this.sendToAsync(sendInstance, "/tmp/" + uuid + ".jpg");
2195
+ await this.sendToAsync(sendInstance, `${this.tmpDir}${sep}${uuid}.jpg`);
2122
2196
  }
2123
2197
  }
2124
- fs.unlinkSync("/tmp/" + uuid + ".jpg");
2198
+ }
2199
+ try {
2200
+ fs.unlinkSync(`${this.tmpDir}${sep}${uuid}.jpg`);
2201
+ } catch (error) {
2202
+ this.log.error(error);
2125
2203
  }
2126
2204
  }
2127
2205
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.parcel",
3
- "version": "0.0.13",
3
+ "version": "0.0.16",
4
4
  "description": "Parcel tracking",
5
5
  "author": {
6
6
  "name": "TA2k",
@@ -25,33 +25,33 @@
25
25
  "url": "https://github.com/TA2k/ioBroker.parcel"
26
26
  },
27
27
  "dependencies": {
28
- "@applitools/jsdom": "^1.0.4",
29
28
  "@iobroker/adapter-core": "^2.6.0",
30
- "axios": "^0.25.0",
31
- "http-cookie-agent": "^1.0.5",
29
+ "axios": "^0.27.2",
30
+ "http-cookie-agent": "^1.0.6",
31
+ "jsdom": "^19.0.0",
32
32
  "json-bigint": "^1.0.0",
33
- "qs": "^6.10.3",
33
+ "qs": "^6.10.5",
34
34
  "tough-cookie": "^4.0.0",
35
35
  "uuid": "^8.3.2"
36
36
  },
37
37
  "devDependencies": {
38
- "@iobroker/testing": "^2.5.6",
39
- "@types/chai": "^4.3.0",
38
+ "@iobroker/testing": "^3.0.2",
39
+ "@types/chai": "^4.3.1",
40
40
  "@types/chai-as-promised": "^7.1.5",
41
41
  "@types/gulp": "^4.0.9",
42
- "@types/mocha": "^9.1.0",
43
- "@types/node": "^14.18.12",
42
+ "@types/mocha": "^9.1.1",
43
+ "@types/node": "^18.0.0",
44
44
  "@types/proxyquire": "^1.3.28",
45
45
  "@types/sinon": "^10.0.11",
46
46
  "@types/sinon-chai": "^3.2.8",
47
47
  "chai": "^4.3.6",
48
48
  "chai-as-promised": "^7.1.1",
49
- "eslint": "^7.32.0",
50
- "mocha": "^9.2.2",
49
+ "eslint": "^8.18.0",
50
+ "mocha": "^10.0.0",
51
51
  "proxyquire": "^2.1.3",
52
- "sinon": "^12.0.1",
52
+ "sinon": "^14.0.0",
53
53
  "sinon-chai": "^3.7.0",
54
- "typescript": "~4.4.4"
54
+ "typescript": "~4.7.4"
55
55
  },
56
56
  "main": "main.js",
57
57
  "files": [