@homebridge-plugins/homebridge-tado 6.0.14

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 (38) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/LICENSE +21 -0
  3. package/README.md +560 -0
  4. package/config.schema.json +878 -0
  5. package/homebridge-ui/public/css/style.css +25 -0
  6. package/homebridge-ui/public/images/tado_logo.png +0 -0
  7. package/homebridge-ui/public/index.html +118 -0
  8. package/homebridge-ui/public/js/main.js +1582 -0
  9. package/homebridge-ui/public/js/modules/compareVersions.min.js +1 -0
  10. package/homebridge-ui/public/js/modules/jquery.min.js +2 -0
  11. package/homebridge-ui/public/js/modules/progressbar.min.js +6 -0
  12. package/homebridge-ui/public/js/progressbars.js +48 -0
  13. package/homebridge-ui/public/js/schema.js +864 -0
  14. package/homebridge-ui/server.js +80 -0
  15. package/images/tado_logo.png +0 -0
  16. package/index.js +14 -0
  17. package/package.json +66 -0
  18. package/src/accessories/airquality.js +56 -0
  19. package/src/accessories/contact.js +124 -0
  20. package/src/accessories/faucet.js +63 -0
  21. package/src/accessories/heatercooler.js +333 -0
  22. package/src/accessories/humidity.js +90 -0
  23. package/src/accessories/lightbulb.js +59 -0
  24. package/src/accessories/lightsensor.js +40 -0
  25. package/src/accessories/motion.js +79 -0
  26. package/src/accessories/occupancy.js +45 -0
  27. package/src/accessories/security.js +79 -0
  28. package/src/accessories/switch.js +261 -0
  29. package/src/accessories/temperature.js +95 -0
  30. package/src/accessories/thermostat.js +337 -0
  31. package/src/helper/handler.js +1467 -0
  32. package/src/helper/logger.js +51 -0
  33. package/src/helper/telegram.js +60 -0
  34. package/src/platform.js +337 -0
  35. package/src/tado/tado-api.js +404 -0
  36. package/src/tado/tado-config.js +1032 -0
  37. package/src/types/custom.js +264 -0
  38. package/src/types/eve.js +337 -0
package/README.md ADDED
@@ -0,0 +1,560 @@
1
+ <p align="center">
2
+ <img src="https://github.com/homebridge-plugins/homebridge-tado/blob/master/images/tado_logo.png" height="200">
3
+ </p>
4
+
5
+ # homebridge-tado
6
+
7
+ [![npm](https://img.shields.io/npm/v/@homebridge-plugins/homebridge-tado.svg?style=flat-square)](https://www.npmjs.com/package/@homebridge-plugins/homebridge-tado)
8
+ [![npm](https://img.shields.io/npm/dt/@homebridge-plugins/homebridge-tado.svg?style=flat-square)](https://www.npmjs.com/package/@homebridge-plugins/homebridge-tado)
9
+ [![GitHub last commit](https://img.shields.io/github/last-commit/homebridge-plugins/homebridge-tado.svg?style=flat-square)](https://github.com/homebridge-plugins/homebridge-tado)
10
+ [![verified-by-homebridge](https://badgen.net/badge/homebridge/verified/purple)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
11
+ [![Discord](https://img.shields.io/discord/432663330281226270?color=728ED5&logo=discord&label=discord)](https://discord.gg/kqNCe2D)
12
+ [![Donate](https://img.shields.io/badge/Donate-PayPal-blue.svg?style=flat-square&maxAge=2592000)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=NP4T3KASWQLD8)
13
+
14
+ **Creating and maintaining Homebridge plugins consume a lot of time and effort, if you would like to share your appreciation, feel free to "Star" or donate.**
15
+
16
+ [Click here](https://github.com/SeydX) to review more of my plugins.
17
+
18
+ ## Info
19
+
20
+ **TafoPlatform** is possibly the biggest homebridge plugin for Tado devices.
21
+
22
+
23
+ **Multiple home support**
24
+
25
+ The plugin even offers support for multiple houses. So it is finally possible to create multiple houses and control them together.
26
+
27
+
28
+ **Full HomeKit Support**
29
+
30
+ Everything Tado offers can be displayed through the plugin in Apple HomeKit. The thermostat buttons themselves have custom characteristics and can even display the air quality for a room. Full hot water support, weather temperature, solar intensity, weather air quality, tado quick actions, child lock, presence lock and much more awaits you with this plugin!
31
+
32
+
33
+ **History**
34
+
35
+ Every temperature sensor, humidity sensor, contact sensor, motion sensor and thermostats are also able to show the history in Elgato EVE app.
36
+
37
+
38
+ **Push Notification**
39
+
40
+ In addition, you can even get push notifications via Telegram when a user arrives or is absent, or when "Open Window" is triggered.
41
+
42
+
43
+ You can do that and much more with the new version 6. Have Fun!
44
+
45
+ ## Installation
46
+
47
+ After [Homebridge](https://github.com/nfarina/homebridge) has been installed:
48
+
49
+ ```sudo npm install -g @homebridge-plugins/homebridge-tado@latest```
50
+
51
+ ## Documentation
52
+
53
+ - [Example config.json](https://github.com/homebridge-plugins/homebridge-tado/blob/master/example-config.json)
54
+ - [Non Config Ui X User?](#non-config-ui-x-user)
55
+ - [Configuration](#configuration)
56
+ - [Thermostat](#thermostat)
57
+ - [Open Window](#open-window)
58
+ - [Hot Water](#hot-water)
59
+ - [Presence](#presence)
60
+ - [Weather](#weather)
61
+ - [Air Quality](#air-quality)
62
+ - [Extras](#extras)
63
+ - [Central Switch](#central-switch)
64
+ - [Boost Switch](#boost-switch)
65
+ - [Shedule Switch](#shedule-switch)
66
+ - [Turnoff Switch](#turnoff-switch)
67
+ - [Dummy Switch](#dummy-switch)
68
+ - [Presence Lock](#presence-lock)
69
+ - [Child Lock](#child-lock)
70
+ - [Telegram](#telegram)
71
+ - [Supported Clients](#supported-clients)
72
+ - [Contributing](#contributing)
73
+ - [Troubleshooting](#troubleshooting)
74
+
75
+ ## Custom UI
76
+
77
+ Unlike other plugins, this plugin allows you to manually enable/disable each zone, thermostat, user and everything you see in HomeKit via config.json.
78
+
79
+ The config.json offers a lot of configuration options. And if, as recommended, you use Config UI X, the plugin will be all the better.
80
+
81
+ It supports the full potential of Config UI X and makes configuring the plugin much easier. With it, you can create a "home" in no time and control everything through Config UI X. From logging in to creating config.json works fully automatically with Config UI X!
82
+
83
+ <img src="https://i.ibb.co/tL955Lg/hb-tadoplatform-ui-test.gif" align="center" alt="CustomUI">
84
+
85
+ _(In the section below you can find more information about the functions.)_
86
+
87
+ ## Non Config Ui X User?:
88
+
89
+ The plugin can also work without config ui x or a custom ui. If you want the config.json auto-fill feature, you have to put the following part in your config.json. This will generate a ready to use config.json with all options disabled except thermostats. After the first start, thhis user will get ``"reconfigure": false``. If you want to refresh a home, just enable ``"reconfigure"`` for the user and restart homebridge. If you want to add an another home, add the user credentials (username/password) to the array. The Plugin can handle multiple accounts.
90
+
91
+ **Note:**
92
+
93
+ If you on HOOBS, you need to reboot the HOOBS server to get your first start config changes instead of restarting Homebridge/HOOBS service.
94
+
95
+ ```
96
+ {
97
+ "bridge": {
98
+ ...
99
+ },
100
+ "accessories": [
101
+ ...
102
+ ],
103
+ "platforms": [
104
+ {
105
+ "name": "TadoPlatform",
106
+ "platform": "TadoPlatform",
107
+ "debug": false,
108
+ "user": [
109
+ {
110
+ "username": "test@mail.com",
111
+ "password": "testPassword123"
112
+ }
113
+ ]
114
+ }
115
+ ]
116
+ }
117
+ ```
118
+ See [Example Config](https://github.com/homebridge-plugins/homebridge-tado/edit/master/example-config.json) for more details
119
+
120
+ ## Configuration
121
+
122
+ ## Thermostat
123
+
124
+ Each zone in the config.json with ``"type": "HEATING"`` and ``"easyMode": false`` is exposed to HomeKit as a thermostat accessory with the following features:
125
+
126
+ - Current Mode: OFF | COOLING | HEATING | AUTO
127
+ - Target Mode: OFF | HEATING | AUTO
128
+ - Curent Temperature
129
+ - Target Temperature
130
+ - Built-in humidity sensor
131
+ - Room Air Quality
132
+ - Separate Humidity (if ``"separateHumidity": true``)
133
+ - Separate Temperature Sensor (if ``"separateTemperature": true``)
134
+ - Battery state (if ``noBattery: false``)
135
+ - Delay Switch characteristic with timer (if ``"delaySwitch": true``)
136
+ - Elgato EVE history feature (FakeGato)
137
+
138
+ **Delay Switch**
139
+ The Delay Switch (characteristic) can be used for eg. if you have an automation with `Open Window => Thermostat Off / Close Window => Thermostat On` and you want avoid multiple state changes, u can set ``"delaySwitch": true``in your config and change the timer (in seconds) via a third party app. If setted correctly, the thermostat will wait eg 60 seconds before switching to ON. It can also be used for own automations if you need a switch that turns off automatically after the given perioswithout affecting your thermostats (``"autoOffDelay": true``)
140
+
141
+ **Mode / Mode Timer**
142
+ ``mode`` for the commands to be sent with. can be 'MANUAL' for manual control until ended by the user, 'AUTO' for manual control until next schedule change in tado° app OR 'TIMER' for manual control until timer ends. ``modeTimer`` for the ``MANUAL`` mode in minutes.
143
+
144
+ Each zone in the config.json with ``type: HEATING`` and ``easyMode: true`` is exposed to HomeKit as a HeaterCooler accessory with the features as above and some minor changes:
145
+
146
+ - Active: ON | OFF
147
+ - Target Mode: HEATING
148
+ - **NO** Elgato EVE history feature (FakeGato)
149
+
150
+ You can also adjust the minimum temperature step ``"minStep"``, minimum temperature value ``"minValue"`` or maximum temperature value ``"maxValue"`` via config.json.
151
+
152
+ - **minValue**: By default, HEATING devices, also this plugin, supports a minValue of 5° Celsius / 41° Fahrenheit. If your device has a different minValue, you can set it up here. (Incorrect minValue may cause problems!)
153
+ - **maxValue**: By default, HEATING devices, also this plugin, supports a maxValue of 25° Celsius / 77° Fahrenheit by default. If your device has a different minValue, you can set it up here. (Incorrect maxValue may cause problems!)
154
+ - **minStep**: Minimum step for temperature adjustment. (Default: 1, must be between 0 - 1)
155
+
156
+ ```
157
+ "homes": [
158
+ {
159
+ "zones": [
160
+ {
161
+ "active": true,
162
+ "id": 32,
163
+ "name": "Living Room",
164
+ "type": "HEATING",
165
+ "mode": "MANUAL",
166
+ "modeTimer": 30,
167
+ "delaySwitch": true,
168
+ "autoOffDelay": false,
169
+ "openWindowSensor": true,
170
+ "openWindowSwitch": false,
171
+ "airQuality": true,
172
+ "separateTemperature": false,
173
+ "separateHumidity": true,
174
+ "mode": "MANUAL",
175
+ "modeTimer": 30,
176
+ "minValue": 5,
177
+ "maxValue": 25,
178
+ "minStep": "0.5",
179
+ "easyMode": false,
180
+ "noBattery": false
181
+ }
182
+ ...
183
+ ]
184
+ }
185
+ ...
186
+ ]
187
+ ```
188
+
189
+ #### Open Window:
190
+
191
+ Each zone with ``"type": "HEATING"`` also has the possibility to display "OpenWindow" contact sensors or switches in HomeKit with the following features:
192
+
193
+ - Switch to enable disable open window for the zone or trigger the open window state of the zone
194
+ - Contact sensor to show the open window state
195
+
196
+ ```
197
+ "homes": [
198
+ {
199
+ "zones": [
200
+ {
201
+ "active": true,
202
+ "name": "Living Room",
203
+ "type": "HEATING",
204
+ "mode": "AUTO"
205
+ "openWindowSensor": true,
206
+ "openWindowSwitch": true
207
+ ...
208
+ }
209
+ ...
210
+ ]
211
+ }
212
+ ...
213
+ ]
214
+ ```
215
+
216
+ ## Hot Water
217
+
218
+ Each zone in the config.json with ``"type": HOT_WATER`` and ``"boilerTempSupport": false`` is exposed to HomeKit as a switch (``"accTypeBoiler: "SWITCH"``) or faucet (``"accTypeBoiler: "FAUCET"``) accessory with the following features:
219
+
220
+ - Active: ON | OFF
221
+
222
+ Each zone in the config.json with ``type: HOT_WATER`` and ``boilerTempSupport: true`` is exposed to HomeKit as a HeaterCooler accessory with the following features:
223
+
224
+ - Current Mode: OFF | ON
225
+ - Target Mode: OFF | ON
226
+ - Curent Temperature
227
+ - Target Temperature
228
+ - Separate Temperature Sensor (if ``separateTemperature: true``)
229
+
230
+ You can also adjust the minimum temperature step ``"minStep"``, minimum temperature value ``"minValue"`` or maximum temperature value ``"maxValue"`` via config.json.
231
+
232
+ - **minValue**: By default, HOT WATER devices, also this plugin, supports a minValue of 30° Celsius / 86° Fahrenheit. If your device has a different minValue, you can set it up here. (Incorrect minValue may cause problems!)
233
+ - **maxValue**: By default, HOT WATER devices, also this plugin, supports a maxValue of 65° Celsius / 149° Fahrenheit by default. If your device has a different minValue, you can set it up here. (Incorrect maxValue may cause problems!)
234
+ - **minStep**: Minimum step for temperature adjustment. (Default: 1, must be between 0 - 1)
235
+
236
+ ```
237
+ "homes": [
238
+ {
239
+ "zones": [
240
+ {
241
+ "active": true,
242
+ "id": 1,
243
+ "name": "Bathroom",
244
+ "type": "HOT_WATER",
245
+ "mode": "MANUAL",
246
+ "modeTimer": 30,
247
+ "minValue": 30,
248
+ "maxValue": 65,
249
+ "minStep": "1",
250
+ "separateTemperature": true,
251
+ "boilerTempSupport": false,
252
+ "accTypeBoiler": "SWITCH"
253
+ }
254
+ ...
255
+ ]
256
+ }
257
+ ...
258
+ ]
259
+ ```
260
+
261
+ ## Presence
262
+
263
+ Each user or anyone sensor in the config.json is exposed to HomeKit as a occupancy (``"accType: "OCCUPANCY"``) or motion (``"accType: "MOTION"``) accessory.
264
+
265
+ ```
266
+ "homes": [
267
+ {
268
+ "zones": [ ... ],
269
+ "extras": { ... },
270
+ "presence": {
271
+ "anyone": true,
272
+ "accTypeAnyone": "MOTION",
273
+ "user": [
274
+ {
275
+ "active": true,
276
+ "name": "Buddy 1",
277
+ "accType": "MOTION"
278
+ },
279
+ {
280
+ "active": true,
281
+ "name": "Buddy 2",
282
+ "accType": "OCCUPANCY"
283
+ }
284
+ ]
285
+ }
286
+ ...
287
+ }
288
+ ]
289
+ ```
290
+
291
+ ## Weather
292
+
293
+ Weather settings allow you to display a sensor for temperature, a light bulb (```"accTypeSolarIntensity": "LIGHTBULB"```) or light sensor (```"accTypeSolarIntensity": "SENSOR"```) for sun intensity, or a sensor for air quality in HomeKit.
294
+
295
+ ```
296
+ "homes": [
297
+ {
298
+ "zones": [ ... ],
299
+ "extras": { ... },
300
+ "presence": { ... },
301
+ "weather": {
302
+ "temperatureSensor": true,
303
+ "solarIntensity": true,
304
+ "accTypeSolarIntensity": "LIGHTBULB",
305
+ "airQuality": true
306
+ }
307
+ ...
308
+ }
309
+ ...
310
+ ]
311
+ ```
312
+
313
+ ### Air Quality
314
+
315
+ In order to use the Air Quality Sensor, you need to enable airQuality ``"airQuality": true`` (see above) **AND** you must enter your location data (latitude and longitude) in config.json. You can easily find the coordinates to your location/address on the following page: [latlong.net](https://www.latlong.net/convert-address-to-lat-long.html)
316
+
317
+
318
+ ```
319
+ "homes": [
320
+ {
321
+ "geolocation": {
322
+ "longitude": "10.1234567",
323
+ "latitude": "23.4567890"
324
+ },
325
+ "zones": [ ... ],
326
+ "extras": { ... },
327
+ "presence": { ... },
328
+ "weather": {
329
+ "airQuality": true
330
+ }
331
+ ...
332
+ }
333
+ ...
334
+ ]
335
+ ```
336
+
337
+ ## Extras
338
+
339
+ ### Central Switch
340
+ Shows a switch accessory with additional switches in HomeKit which mimics the "Boost" and "Turnoff" switch from Tado. It also shows the Heater Running information as a custom characteristic for the month (in hours) and it shows also how many thermostats are in auto, manual or off mode. Its also possible to show a dummy switch withiun the central switch for eg. automation purposes.
341
+
342
+ ```
343
+ "homes": [
344
+ {
345
+ "zones": [ ... ],
346
+ "extras": { ... },
347
+ "presence": { ... },
348
+ "weather": { ... },
349
+ "extras": {
350
+ "centralSwitch": true,
351
+ "runningInformation": true
352
+ }
353
+ ...
354
+ }
355
+ ...
356
+ ]
357
+ ```
358
+
359
+ #### Boost Switch
360
+ Shows a switch accessory in HomeKit (added to central switch) which mimics the "Boost" switch from Tado and switches all heaters to max temperature.
361
+ _Note: Central Switch needs to be truned on._
362
+
363
+ ```
364
+ "homes": [
365
+ {
366
+ "zones": [ ... ],
367
+ "extras": { ... },
368
+ "presence": { ... },
369
+ "weather": { ... },
370
+ "extras": {
371
+ "centralSwitch": true,
372
+ "boostSwitch": true
373
+ }
374
+ ...
375
+ }
376
+ ...
377
+ ]
378
+ ```
379
+
380
+ #### Shedule Switch
381
+ Shows a switch accessory in HomeKit (added to central switch) which mimics the "Shedule" switch from Tado and switches all heaters to their default shedule
382
+ _Note: Central Switch needs to be truned on._
383
+
384
+ ```
385
+ "homes": [
386
+ {
387
+ "zones": [ ... ],
388
+ "extras": { ... },
389
+ "presence": { ... },
390
+ "weather": { ... },
391
+ "extras": {
392
+ "centralSwitch": true,
393
+ "sheduleSwitch": true
394
+ }
395
+ ...
396
+ }
397
+ ...
398
+ ]
399
+ ```
400
+
401
+ #### Turnoff Switch
402
+ Shows a switch accessory in HomeKit (added to central switch) which mimics the "Turn Off" switch from Tado and switches all heaters off
403
+ _Note: Central Switch needs to be truned on._
404
+
405
+ ```
406
+ "homes": [
407
+ {
408
+ "zones": [ ... ],
409
+ "extras": { ... },
410
+ "presence": { ... },
411
+ "weather": { ... },
412
+ "extras": {
413
+ "centralSwitch": true,
414
+ "turnoffSwitch": true
415
+ }
416
+ ...
417
+ }
418
+ ...
419
+ ]
420
+ ```
421
+
422
+
423
+ #### Dummy Switch
424
+ Shows a dummy switch accessory in HomeKit (added to central switch) without any functions. Can be used for eg automation purposes.
425
+ _Note: Central Switch needs to be truned on._
426
+
427
+ ```
428
+ "homes": [
429
+ {
430
+ "zones": [ ... ],
431
+ "extras": { ... },
432
+ "presence": { ... },
433
+ "weather": { ... },
434
+ "extras": {
435
+ "centralSwitch": true,
436
+ "dummySwitch": true
437
+ }
438
+ ...
439
+ }
440
+ ...
441
+ ]
442
+ ```
443
+
444
+ ### Presence Lock
445
+ Shows a switch with to sub switchs within the main accessory (``"accTypePresenceLock": "SWITCH"``) or security (``"accTypePresenceLock": "ALARM"``) accessory in HomeKit with following features: HOME | AWAY | DISABLED
446
+
447
+ ```
448
+ "homes": [
449
+ {
450
+ "zones": [ ... ],
451
+ "extras": { ... },
452
+ "presence": { ... },
453
+ "weather": { ... },
454
+ "extras": {
455
+ "presenceLock": true,
456
+ "accTypePresenceLock": "SWITCH"
457
+ }
458
+ ...
459
+ }
460
+ ...
461
+ ]
462
+ ```
463
+
464
+ ### Child Lock
465
+ Each device with ``"type": "HEATING"`` and child lock support can be exposed to HomeKit as a "sub" switch to the main switch accessory which can show you if child lock is enabled or you can also enable/disable child lock.
466
+
467
+ ```
468
+ "homes": [
469
+ {
470
+ "zones": [ ... ],
471
+ "extras": { ... },
472
+ "presence": { ... },
473
+ "weather": { ... },
474
+ "extras": {
475
+ "childLockSwitches": [
476
+ {
477
+ "active": true,
478
+ "name": "Living Room Heater",
479
+ "serialNumber": "VA1234567890"
480
+ },
481
+ {
482
+ "active": true,
483
+ "name": "Sleeping Room Heater",
484
+ "serialNumber": "VA1234567890"
485
+ }
486
+ ]
487
+ }
488
+ ...
489
+ }
490
+ ...
491
+ ]
492
+ ```
493
+
494
+ ## Telegram
495
+
496
+ You can set up the notifier to get a Telegram notification with customized messages and markdown capability when user arrives/leaves or open window detection triggers. Before you can use the "Telegram Notification" functionality, you need to set up a bot. Here you can find more information: [Setup Telegram Bot](https://github.com/SeydX/homebridge-fritz-platform/blob/master/docs/Telegram.md)
497
+
498
+ **Hint:**
499
+ To better customize the messages, special characters can be set so that the plugin replaces them.
500
+
501
+ **@** character will be replaced by the Accessory name
502
+
503
+ **%** character will be replaced by the house name
504
+
505
+ ```
506
+ "homes": [
507
+ {
508
+ "zones": [ ... ],
509
+ "extras": { ... },
510
+ "presence": { ... },
511
+ "weather": { ... },
512
+ "telegram": {
513
+ "active": true,
514
+ "token": "136373846:HKAHEVbsuwxl0uCSIi8kdFJsheköjezz72525",
515
+ "chatID": "-123456789",
516
+ "messages": {
517
+ "presence": {
518
+ "user_in": "%: Welcome @",
519
+ "user_out": "%: Bye Bye @",
520
+ "anyone_in": "%: Anyone at home.",
521
+ "anyone_out": "%: Nobody at home."
522
+ },
523
+ "openWindow": {
524
+ "opened": "%: Open Window activated from @!",
525
+ "closed": "%: Open Window deactivated from @!"
526
+ }
527
+ }
528
+ }
529
+ }
530
+ ...
531
+ ]
532
+ ```
533
+
534
+ ## Supported clients
535
+
536
+ This plugin has been verified to work with the following apps on iOS 14:
537
+
538
+ * Apple Home
539
+ * All 3rd party apps like Elgato Eve etc.
540
+ * Homebridge >= v1.1.6
541
+
542
+ ## Contributing
543
+
544
+ You can contribute to this homebridge plugin in following ways:
545
+
546
+ - [Report issues](https://github.com/homebridge-plugins/homebridge-tado/issues) and help verify fixes as they are checked in.
547
+ - Review the [source code changes](https://github.com/homebridge-plugins/homebridge-tado/pulls).
548
+ - Contribute bug fixes.
549
+ - Contribute changes to extend the capabilities
550
+
551
+ Pull requests are accepted.
552
+
553
+ ## Troubleshooting
554
+
555
+ If you have any issues with the plugin, you can enable the debug mode, which will provide some additional information. This might be useful for debugging issues. Open your config.json and set ``"debug": true``
556
+
557
+
558
+ ## Disclaimer
559
+
560
+ All product and company names are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.