@kohost/api-client 1.0.0-alpha.3 → 1.0.0-beta.0

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.
Files changed (61) hide show
  1. package/commands/CheckInReservationCommand.js +23 -0
  2. package/commands/DiscoverReservationsCommand.js +24 -0
  3. package/commands/DiscoverRoomsCommand.js +21 -0
  4. package/commands/DiscoverUsersCommand.js +21 -0
  5. package/commands/{VerifyDocumentCommand.js → OCRDocumentCommand.js} +4 -8
  6. package/commands/SendEmailCommand.js +24 -0
  7. package/commands/SendSMSCommand.js +21 -0
  8. package/commands/index.js +12 -2
  9. package/defs/http.js +1 -1
  10. package/events/EmailSentEvent.js +17 -0
  11. package/events/Event.js +20 -1
  12. package/events/SMSSentEvent.js +17 -0
  13. package/events/ShortLinkCreatedEvent.js +17 -0
  14. package/events/index.js +7 -0
  15. package/http/handleResponseError.js +9 -29
  16. package/http/handleResponseSuccess.js +2 -2
  17. package/http/index.js +53 -43
  18. package/index.js +2 -2
  19. package/models/credential.js +29 -0
  20. package/models/gateway.js +0 -8
  21. package/models/identification.js +32 -0
  22. package/models/index.js +9 -9
  23. package/models/kohost.js +4 -3
  24. package/models/product.js +30 -0
  25. package/models/reservation.js +47 -0
  26. package/models/room.js +1 -12
  27. package/models/shortLink.js +29 -0
  28. package/models/space.js +1 -1
  29. package/models/thermostat.js +3 -3
  30. package/models/user.js +0 -2
  31. package/models/windowCovering.js +1 -1
  32. package/package.json +11 -10
  33. package/schemas/admin/property.json +127 -1
  34. package/schemas/camera.json +3 -3
  35. package/schemas/courtesy.json +3 -3
  36. package/schemas/credential.json +28 -0
  37. package/schemas/definitions/common.json +53 -0
  38. package/schemas/definitions/device.json +13 -2
  39. package/schemas/dimmer.json +3 -3
  40. package/schemas/gateway.json +16 -47
  41. package/schemas/identification.json +18 -4
  42. package/schemas/lock.json +6 -3
  43. package/schemas/mediaSource.json +3 -3
  44. package/schemas/motionSensor.json +3 -3
  45. package/schemas/payment.json +3 -1
  46. package/schemas/product.json +36 -0
  47. package/schemas/reservation.json +11 -6
  48. package/schemas/room.json +1 -8
  49. package/schemas/shortLink.json +30 -0
  50. package/schemas/switch.json +3 -3
  51. package/schemas/thermostat.json +11 -10
  52. package/schemas/user.json +65 -13
  53. package/schemas/windowCovering.json +3 -3
  54. package/tests/unit/models/user.test.js +28 -0
  55. package/useCases/http.json +345 -41
  56. package/utils/schema.js +2 -2
  57. package/vite.config.js +22 -0
  58. package/models/iotGateway.js +0 -29
  59. package/models/sceneController.js +0 -29
  60. package/schemas/iotGateway.json +0 -29
  61. package/schemas/sceneController.json +0 -58
package/models/index.js CHANGED
@@ -1,13 +1,11 @@
1
- const IotGateway = require("./iotGateway");
2
1
  const Switch = require("./switch");
3
2
  const Alarm = require("./alarm");
4
3
  const Dimmer = require("./dimmer");
5
4
  const Lock = require("./lock");
6
- const SceneController = require("./sceneController");
7
5
  const Thermostat = require("./thermostat");
8
6
  const WindowCovering = require("./windowCovering");
7
+ const Identification = require("./identification");
9
8
  const User = require("./user");
10
- const ACL = require("./acl");
11
9
  const Courtesy = require("./courtesy");
12
10
  const Camera = require("./camera");
13
11
  const MotionSensor = require("./motionSensor");
@@ -18,9 +16,11 @@ const Application = require("./application");
18
16
  const Space = require("./space");
19
17
  const Ticket = require("./ticket");
20
18
  const Scene = require("./scene");
21
- const Integration = require("./integration");
22
19
  const Gateway = require("./gateway");
20
+ const Product = require("./product");
23
21
  const DiscoveredDevice = require("./discoveredDevice");
22
+ const Credential = require("./credential");
23
+ const ShortLink = require("./shortLink");
24
24
 
25
25
  const AdminCustomer = require("./admin/customer");
26
26
  const AdminProperty = require("./admin/property");
@@ -31,26 +31,26 @@ module.exports = {
31
31
  Property: AdminProperty,
32
32
  },
33
33
  Gateway,
34
- IotGateway,
35
34
  Switch,
36
35
  Alarm,
37
36
  Dimmer,
38
37
  Lock,
39
38
  Courtesy,
40
39
  Camera,
41
- SceneController,
42
40
  MotionSensor,
43
41
  Thermostat,
44
42
  WindowCovering,
45
43
  MediaSource,
44
+ Identification,
45
+ Product,
46
46
  User,
47
- ACL,
48
47
  Room,
49
- Application,
48
+ Application,
50
49
  Space,
51
50
  Ticket,
52
51
  Scene,
53
- Integration,
54
52
  DiscoveredDevice,
55
53
  Reservation,
54
+ Credential,
55
+ ShortLink,
56
56
  };
package/models/kohost.js CHANGED
@@ -54,10 +54,11 @@ class Kohost {
54
54
 
55
55
  _validate(data) {
56
56
  const valid = this.validator(data);
57
- if (!valid)
57
+ if (!valid) {
58
58
  throw new ValidationError(`Invalid ${this.constructor.name}`, {
59
- cause: this.validator.errors,
60
- });
59
+ cause: this.validator.errors,
60
+ }); }
61
+
61
62
  }
62
63
 
63
64
  static generateId() {
@@ -0,0 +1,30 @@
1
+ // Create the Product Model
2
+ const schemas = require("../utils/schema");
3
+ const schema = require("../schemas/product.json");
4
+ const Kohost = require("./kohost");
5
+
6
+ schemas.add(schema);
7
+ const validator = schemas.compile(schema);
8
+
9
+ class Product extends Kohost {
10
+ constructor(data) {
11
+ super(data);
12
+ }
13
+ }
14
+
15
+ Object.defineProperty(Product.prototype, "schema", {
16
+ value: schema,
17
+ });
18
+
19
+ Object.defineProperty(Product.prototype, "validator", {
20
+ get: function () {
21
+ return validator;
22
+ },
23
+ });
24
+
25
+ Object.defineProperty(Product, "validProperties", {
26
+ value: Object.keys(schema.properties),
27
+ });
28
+
29
+
30
+ module.exports = Product;
@@ -17,6 +17,53 @@ class Reservation extends Kohost {
17
17
  get hasPayment() {
18
18
  return this.paymentId?.length > 0;
19
19
  }
20
+
21
+ range(tz) {
22
+ const start = new Date(this.checkInDateTime);
23
+ const end = new Date(this.checkOutDateTime);
24
+
25
+ // output Dec 19-23 if same month and year
26
+ if (
27
+ start.getMonth() === end.getMonth() &&
28
+ start.getFullYear() === end.getFullYear()
29
+ ) {
30
+ return `${start.toLocaleString("default", {
31
+ month: "short",
32
+ timeZone: tz,
33
+ })} ${start.toLocaleString("default", {
34
+ timeZone: tz,
35
+ day: "numeric",
36
+ })}-${end.toLocaleString("default", {
37
+ timeZone: tz,
38
+ day: "numeric",
39
+ })}`;
40
+ }
41
+
42
+ // output Dec 19 - Jan 2 if different month and year
43
+ return `${start.toLocaleString("default", {
44
+ month: "short",
45
+ timeZone: tz,
46
+ })} ${start.getDate()} - ${end.toLocaleString("default", {
47
+ month: "short",
48
+ timeZone: tz,
49
+ })} ${end.getDate()}`;
50
+ }
51
+
52
+ checkInTime(tz) {
53
+ return new Date(this.checkInDateTime).toLocaleString("default", {
54
+ hour: "numeric",
55
+ minute: "numeric",
56
+ timeZone: tz,
57
+ });
58
+ }
59
+
60
+ checkOutTime(tz) {
61
+ return new Date(this.checkOutDateTime).toLocaleString("default", {
62
+ hour: "numeric",
63
+ minute: "numeric",
64
+ timeZone: tz,
65
+ });
66
+ }
20
67
  }
21
68
 
22
69
  Object.defineProperty(Reservation.prototype, "schema", {
package/models/room.js CHANGED
@@ -11,7 +11,6 @@ const Thermostat = require("./thermostat");
11
11
  const Lock = require("./lock");
12
12
  const WindowCovering = require("./windowCovering");
13
13
  const Courtesy = require("./courtesy");
14
- const SceneController = require("./sceneController");
15
14
  const Camera = require("./camera");
16
15
  const Alarm = require("./alarm");
17
16
  const Source = require("./mediaSource");
@@ -37,7 +36,6 @@ class Room extends Kohost {
37
36
  "lock",
38
37
  "windowCovering",
39
38
  "courtesy",
40
- "sceneController",
41
39
  "camera",
42
40
  "source",
43
41
  "motionSensor",
@@ -79,10 +77,6 @@ class Room extends Kohost {
79
77
  return this.courtesy?.length > 0;
80
78
  }
81
79
 
82
- get hasSceneController() {
83
- return this.sceneControllers?.length > 0;
84
- }
85
-
86
80
  get hasCamera() {
87
81
  return this.cameras?.length > 0;
88
82
  }
@@ -135,7 +129,7 @@ function mapRoomData(data) {
135
129
  });
136
130
 
137
131
  roomData.thermostats?.map((thermostat) => {
138
- if (thermostat instanceof Thermostat) return thermostat;
132
+ if (thermostat instanceof Thermostat) return thermostat;
139
133
  else return new Thermostat(thermostat);
140
134
  });
141
135
 
@@ -154,11 +148,6 @@ function mapRoomData(data) {
154
148
  else return new Source(source);
155
149
  });
156
150
 
157
- roomData.sceneControllers?.map((sceneController) => {
158
- if (sceneController instanceof SceneController) return sceneController;
159
- else return new SceneController(sceneController);
160
- });
161
-
162
151
  roomData.cameras?.map((camera) => {
163
152
  if (camera instanceof Camera) return camera;
164
153
  else return new Camera(camera);
@@ -0,0 +1,29 @@
1
+ // Create the Lock Model
2
+ const schemas = require("../utils/schema");
3
+ const schema = require("../schemas/shortLink.json");
4
+ const Kohost = require("./kohost");
5
+
6
+ schemas.add(schema);
7
+ const validator = schemas.compile(schema);
8
+
9
+ class ShortLink extends Kohost {
10
+ constructor(data) {
11
+ super(data);
12
+ }
13
+ }
14
+
15
+ Object.defineProperty(ShortLink.prototype, "schema", {
16
+ value: schema,
17
+ });
18
+
19
+ Object.defineProperty(ShortLink.prototype, "validator", {
20
+ get: function () {
21
+ return validator;
22
+ },
23
+ });
24
+
25
+ Object.defineProperty(ShortLink, "validProperties", {
26
+ value: Object.keys(schema.properties),
27
+ });
28
+
29
+ module.exports = ShortLink;
package/models/space.js CHANGED
@@ -10,7 +10,7 @@ const Room = require("./room");
10
10
  schemas.add(schema);
11
11
  const validator = schemas.compile(schema);
12
12
 
13
- class Space extends Kohost {
13
+ class Space extends Kohost {
14
14
  constructor(data) {
15
15
  const spaceData = mapSpaceData(data);
16
16
  super(spaceData);
@@ -11,16 +11,16 @@ class Thermostat extends Kohost {
11
11
  }
12
12
 
13
13
  toCelsius() {
14
- if (this.temperatureScale === "farenheit")
14
+ if (this.temperatureScale === "fahrenheit")
15
15
  this.currentTemperature = ((this.currentTemperature - 32) * 5) / 9;
16
16
  this.temperatureScale = "celsius";
17
17
  return this.currentTemperature;
18
18
  }
19
19
 
20
- toFarenheit() {
20
+ toFahrenheit() {
21
21
  if (this.temperatureScale === "celsius")
22
22
  this.currentTemperature = (this.currentTemperature * 9) / 5 + 32;
23
- this.temperatureScale = "farenheit";
23
+ this.temperatureScale = "fahrenheit";
24
24
  return this.currentTemperature;
25
25
  }
26
26
 
package/models/user.js CHANGED
@@ -1,13 +1,11 @@
1
1
  // Create the User Model
2
2
  const schemas = require("../utils/schema");
3
3
  const schema = require("../schemas/user.json");
4
- const idSchema = require("../schemas/identification.json");
5
4
  const paymentSchema = require("../schemas/payment.json");
6
5
  const Kohost = require("./kohost");
7
6
 
8
7
  const { nanoid } = require("nanoid/async");
9
8
 
10
- schemas.add(idSchema);
11
9
  schemas.add(paymentSchema);
12
10
  schemas.add(schema);
13
11
 
@@ -11,7 +11,7 @@ class WindowCovering extends Kohost {
11
11
  super(data);
12
12
  }
13
13
 
14
- static getActionDelta(old, _new) {
14
+ static getActionDelta(old, _new) {
15
15
  const delta = {};
16
16
  for (const action in _new) {
17
17
  if (this.actionProperties?.includes(action)) {
package/package.json CHANGED
@@ -1,17 +1,9 @@
1
1
  {
2
- "dependencies": {
3
- "ajv": "^8.11.0",
4
- "ajv-formats": "^2.1.1",
5
- "axios": "^1.0.0",
6
- "lodash.clonedeep": "^4.5.0",
7
- "lodash.findlast": "^4.6.0",
8
- "lodash.sortby": "^4.7.0",
9
- "nanoid": "^3.3.4"
10
- },
11
2
  "name": "@kohost/api-client",
12
- "version": "1.0.0-alpha.3",
3
+ "version": "1.0.0-beta.0",
13
4
  "description": "API client for Kohost utils",
14
5
  "main": "index.js",
6
+ "module": "index.js",
15
7
  "scripts": {
16
8
  "test": "jest",
17
9
  "test:watch": "jest --watchAll",
@@ -30,6 +22,15 @@
30
22
  "lint-staged": "^13.0.3",
31
23
  "prettier": "^2.5.1"
32
24
  },
25
+ "dependencies": {
26
+ "ajv": "^8.11.0",
27
+ "ajv-formats": "^2.1.1",
28
+ "axios": "^1.0.0",
29
+ "lodash.clonedeep": "^4.5.0",
30
+ "lodash.findlast": "^4.6.0",
31
+ "lodash.sortby": "^4.7.0",
32
+ "nanoid": "^3.3.4"
33
+ },
33
34
  "lint-staged": {
34
35
  "*.js": "eslint --cache --fix",
35
36
  "*.{js,css,md,json}": "prettier --write"
@@ -4,7 +4,7 @@
4
4
  "title": "Property",
5
5
  "type": "object",
6
6
  "description": "A property is a physical asset or building",
7
- "required": ["id", "name", "type"],
7
+ "required": ["id", "name", "type", "hostname"],
8
8
  "properties": {
9
9
  "id": {
10
10
  "$ref": "https://api.kohost.app/schemas/v3/definitions/common.json#/definitions/id"
@@ -19,6 +19,12 @@
19
19
  "timezone": {
20
20
  "type": "string"
21
21
  },
22
+ "smsNumber": {
23
+ "type": "string"
24
+ },
25
+ "hostname": {
26
+ "type": "string"
27
+ },
22
28
  "address": {
23
29
  "type": "object",
24
30
  "properties": {
@@ -45,6 +51,126 @@
45
51
  "longitude": {
46
52
  "type": "number"
47
53
  },
54
+ "appManifest": {
55
+ "type": "object",
56
+
57
+ "properties": {
58
+ "name": {
59
+ "type": "string"
60
+ },
61
+ "short_name": {
62
+ "type": "string"
63
+ },
64
+ "scope": {
65
+ "type": "string"
66
+ },
67
+ "start_url": {
68
+ "type": "string"
69
+ },
70
+ "themeColor": {
71
+ "type": "string"
72
+ },
73
+ "backgroundColor": {
74
+ "type": "string"
75
+ },
76
+ "display": {
77
+ "type": "string",
78
+ "enum": ["fullscreen", "standalone", "minimal-ui", "browser"],
79
+ "default": "fullscreen"
80
+ },
81
+ "orientation": {
82
+ "type": "string",
83
+ "enum": ["portrait", "landscape"],
84
+ "default": "portrait"
85
+ },
86
+ "splash": {
87
+ "type": "object",
88
+ "properties": {
89
+ "src": {
90
+ "type": "string"
91
+ },
92
+ "type": {
93
+ "type": "string"
94
+ },
95
+ "sizes": {
96
+ "type": "string"
97
+ }
98
+ }
99
+ },
100
+ "icons": {
101
+ "type": "array",
102
+ "items": {
103
+ "type": "object",
104
+ "properties": {
105
+ "src": {
106
+ "type": "string"
107
+ },
108
+ "sizes": {
109
+ "type": "string"
110
+ },
111
+ "type": {
112
+ "type": "string"
113
+ }
114
+ }
115
+ }
116
+ },
117
+ "logo": {
118
+ "type": "object",
119
+ "properties": {
120
+ "src": {
121
+ "type": "string"
122
+ },
123
+ "type": {
124
+ "type": "string"
125
+ },
126
+ "sizes": {
127
+ "type": "string"
128
+ }
129
+ }
130
+ }
131
+ },
132
+ "default": {
133
+ "name": "Kohost",
134
+ "short_name": "Kohost",
135
+ "start_url": "/",
136
+ "scope": "/",
137
+ "display": "fullscreen",
138
+ "orientation": "portrait",
139
+ "theme_color": "#1d1f22",
140
+ "background_color": "#1d1f22",
141
+ "icons": [
142
+ {
143
+ "src": "https://cdn.kohost.app/defaultIcon.png",
144
+ "sizes": "512x512",
145
+ "type": "image/png"
146
+ }
147
+ ],
148
+ "splash": {
149
+ "src": "https://cdn.kohost.app/defaultSplash.jpg",
150
+ "sizes": "1500x800",
151
+ "type": "image/jpg"
152
+ },
153
+ "logo": {
154
+ "src": "https://cdn.kohost.app/defaultLogo.png",
155
+ "sizes": "300x75",
156
+ "type": "image/png"
157
+ }
158
+ }
159
+ },
160
+ "appFeatures": {
161
+ "type": "object",
162
+ "properties": {
163
+ "RoomControl": {},
164
+ "CheckIn": {},
165
+ "CheckOut": {},
166
+ "Concierge": {},
167
+ "Elevator": {}
168
+ },
169
+ "additionalProperties": false,
170
+ "default": {
171
+ "RoomControl": {}
172
+ }
173
+ },
48
174
  "credentials": {
49
175
  "type": "object",
50
176
  "additionalProperties": true
@@ -11,9 +11,6 @@
11
11
  "type": {
12
12
  "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/type"
13
13
  },
14
- "systemData": {
15
- "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/systemData"
16
- },
17
14
  "supportedNotifications": {
18
15
  "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/supportedNotifications"
19
16
  },
@@ -34,6 +31,9 @@
34
31
  "type": ["string", "null"]
35
32
  }
36
33
  }
34
+ },
35
+ "systemData": {
36
+ "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/systemData"
37
37
  }
38
38
  },
39
39
  "additionalProperties": false,
@@ -11,9 +11,6 @@
11
11
  "type": {
12
12
  "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/type"
13
13
  },
14
- "systemData": {
15
- "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/systemData"
16
- },
17
14
  "supportedNotifications": {
18
15
  "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/supportedNotifications"
19
16
  },
@@ -30,6 +27,9 @@
30
27
  "state": {
31
28
  "type": "string",
32
29
  "$ref": "#/properties/supportedStates/items"
30
+ },
31
+ "systemData": {
32
+ "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/systemData"
33
33
  }
34
34
  },
35
35
  "additionalProperties": false,
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "$id": "https://api.kohost.app/schemas/v3/credential.json",
4
+ "title": "Credential",
5
+ "type": "object",
6
+ "required": ["type", "credential", "expires"],
7
+ "properties": {
8
+ "id": {
9
+ "$ref": "https://api.kohost.app/schemas/v3/definitions/common.json#/definitions/id"
10
+ },
11
+ "type": {
12
+ "type": "string",
13
+ "enum": ["verificationCode", "token"]
14
+ },
15
+ "credential": {
16
+ "type": "string"
17
+ },
18
+ "user": {
19
+ "type": "string"
20
+ },
21
+ "userAgent": {
22
+ "type": "string"
23
+ },
24
+ "expires": {
25
+ "string": "string"
26
+ }
27
+ }
28
+ }
@@ -9,6 +9,10 @@
9
9
  "type": "object",
10
10
  "default": {}
11
11
  },
12
+ "metadata": {
13
+ "type": "object",
14
+ "default": {}
15
+ },
12
16
  "createdAt": {
13
17
  "type": ["string", "object"],
14
18
  "format": "date-time"
@@ -16,6 +20,55 @@
16
20
  "updatedAt": {
17
21
  "type": ["string", "object"],
18
22
  "format": "date-time"
23
+ },
24
+ "file": {
25
+ "type":"object",
26
+ "required": ["name", "type", "data"],
27
+ "properties": {
28
+ "name": {
29
+ "type":"string",
30
+ "description": "Name of the file."
31
+ },
32
+ "type": {
33
+ "type":"string",
34
+ "description": "MIME type of the file (e.g. application/pdf)."
35
+ },
36
+ "data": {
37
+ "type":"string",
38
+ "description": "Base64-encoded data of the file."
39
+ }
40
+ }
41
+ },
42
+ "address": {
43
+ "type":"object",
44
+ "properties": {
45
+ "id": {
46
+ "type":"string"
47
+ },
48
+ "line1": {
49
+ "type":"string"
50
+ },
51
+ "line2": {
52
+ "type":"string"
53
+ },
54
+ "line3": {
55
+ "type":"string"
56
+ },
57
+ "city": {
58
+ "type":"string"
59
+ },
60
+ "state": {
61
+ "type":"string"
62
+ },
63
+ "postalCode": {
64
+ "type":"string"
65
+ },
66
+ "countryCode": {
67
+ "type":"string",
68
+ "minLength": 2,
69
+ "maxLength": 2
70
+ }
71
+ }
19
72
  }
20
73
  }
21
74
  }
@@ -20,10 +20,11 @@
20
20
  "thermostat",
21
21
  "lock",
22
22
  "courtesy",
23
- "sceneController"
23
+ "sceneController",
24
+ "gateway"
24
25
  ]
25
26
  },
26
- "name": {
27
+ "name": {
27
28
  "type": "string"
28
29
  },
29
30
  "subType": {
@@ -34,6 +35,11 @@
34
35
  "uniqueItems": true,
35
36
  "items": {
36
37
  "enum": [
38
+ "button 1",
39
+ "button 2",
40
+ "button 3",
41
+ "button 4",
42
+ "button 5",
37
43
  "idle",
38
44
  "powerHasBeedApplied",
39
45
  "acMainsDisconnected",
@@ -60,6 +66,11 @@
60
66
  "minimum": 1655907956593
61
67
  }
62
68
  }
69
+ },
70
+ "batteryLevel": {
71
+ "type":"number",
72
+ "minimum": 0,
73
+ "maximum": 100
63
74
  }
64
75
  }
65
76
  }
@@ -14,9 +14,6 @@
14
14
  "subType": {
15
15
  "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/subType"
16
16
  },
17
- "systemData": {
18
- "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/systemData"
19
- },
20
17
  "supportedNotifications": {
21
18
  "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/supportedNotifications"
22
19
  },
@@ -27,6 +24,9 @@
27
24
  "type": "number",
28
25
  "minimum": 0,
29
26
  "maximum": 100
27
+ },
28
+ "systemData": {
29
+ "$ref": "https://api.kohost.app/schemas/v3/definitions/device.json#/definitions/systemData"
30
30
  }
31
31
  },
32
32
  "additionalProperties": false,