homebridge-tuya-without-developer-account 1.0.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 (97) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/LICENSE +20 -0
  3. package/PUBLISHING.md +80 -0
  4. package/README.md +233 -0
  5. package/SUPPORTED_DEVICES.md +206 -0
  6. package/config.schema.json +131 -0
  7. package/dist/cloud/api/TuyaHACloudAPI.js +286 -0
  8. package/dist/cloud/api/TuyaHASharingMQ.js +114 -0
  9. package/dist/cloud/device/TuyaDevice.js +50 -0
  10. package/dist/cloud/device/TuyaHADeviceManager.js +355 -0
  11. package/dist/index.js +7 -0
  12. package/dist/platform.js +397 -0
  13. package/dist/settings.js +18 -0
  14. package/dist/shared/AccessoryFactory.js +276 -0
  15. package/dist/shared/accessories/AccessoryFactory.js +305 -0
  16. package/dist/shared/accessories/AirConditionerAccessory.js +307 -0
  17. package/dist/shared/accessories/AirPurifierAccessory.js +90 -0
  18. package/dist/shared/accessories/AirQualitySensorAccessory.js +30 -0
  19. package/dist/shared/accessories/BaseAccessory.js +406 -0
  20. package/dist/shared/accessories/BlindsAccessory.js +199 -0
  21. package/dist/shared/accessories/CameraAccessory.js +121 -0
  22. package/dist/shared/accessories/CarbonDioxideSensorAccessory.js +52 -0
  23. package/dist/shared/accessories/CarbonMonoxideSensorAccessory.js +52 -0
  24. package/dist/shared/accessories/ContactSensorAccessory.js +30 -0
  25. package/dist/shared/accessories/DehumidifierAccessory.js +68 -0
  26. package/dist/shared/accessories/DiffuserAccessory.js +55 -0
  27. package/dist/shared/accessories/DimmerAccessory.js +94 -0
  28. package/dist/shared/accessories/DoorbellAccessory.js +91 -0
  29. package/dist/shared/accessories/ExtractionHoodAccessory.js +120 -0
  30. package/dist/shared/accessories/FanAccessory.js +129 -0
  31. package/dist/shared/accessories/GarageDoorAccessory.js +69 -0
  32. package/dist/shared/accessories/HeaterAccessory.js +102 -0
  33. package/dist/shared/accessories/HeaterAccessory_old.js +96 -0
  34. package/dist/shared/accessories/HumanPresenceSensorAccessory.js +20 -0
  35. package/dist/shared/accessories/HumidifierAccessory.js +137 -0
  36. package/dist/shared/accessories/IRAirConditionerAccessory.js +278 -0
  37. package/dist/shared/accessories/IRControlHubAccessory.js +49 -0
  38. package/dist/shared/accessories/IRControlHubSubAccessory.js +52 -0
  39. package/dist/shared/accessories/IRGenericAccessory.js +49 -0
  40. package/dist/shared/accessories/LeakSensorAccessory.js +36 -0
  41. package/dist/shared/accessories/LightAccessory.js +36 -0
  42. package/dist/shared/accessories/LightSensorAccessory.js +32 -0
  43. package/dist/shared/accessories/LocationWeatherAccessory.js +72 -0
  44. package/dist/shared/accessories/LockAccessory.js +56 -0
  45. package/dist/shared/accessories/MotionSensorAccessory.js +20 -0
  46. package/dist/shared/accessories/OutletAccessory.js +23 -0
  47. package/dist/shared/accessories/PetFeederAccessory.js +139 -0
  48. package/dist/shared/accessories/SceneAccessory.js +32 -0
  49. package/dist/shared/accessories/SceneSwitchAccessory.js +44 -0
  50. package/dist/shared/accessories/SecuritySystemAccessory.js +30 -0
  51. package/dist/shared/accessories/SmokeSensorAccessory.js +35 -0
  52. package/dist/shared/accessories/SwitchAccessory.js +148 -0
  53. package/dist/shared/accessories/TemperatureHumiditySensorAccessory.js +24 -0
  54. package/dist/shared/accessories/ThermostatAccessory.js +192 -0
  55. package/dist/shared/accessories/TowerRackAccessory.js +157 -0
  56. package/dist/shared/accessories/ValveAccessory.js +45 -0
  57. package/dist/shared/accessories/VibrationSensorAccessory.js +46 -0
  58. package/dist/shared/accessories/WeatherStationAccessory.js +58 -0
  59. package/dist/shared/accessories/WetBulbGlobeTemperatureAccessory.js +23 -0
  60. package/dist/shared/accessories/WhiteNoiseLightAccessory.js +59 -0
  61. package/dist/shared/accessories/WindowAccessory.js +14 -0
  62. package/dist/shared/accessories/WindowCoveringAccessory.js +156 -0
  63. package/dist/shared/accessories/WirelessSwitchAccessory.js +42 -0
  64. package/dist/shared/accessories/characteristic/Active.js +22 -0
  65. package/dist/shared/accessories/characteristic/AirQuality.js +74 -0
  66. package/dist/shared/accessories/characteristic/CurrentRelativeHumidity.js +23 -0
  67. package/dist/shared/accessories/characteristic/CurrentTemperature.js +23 -0
  68. package/dist/shared/accessories/characteristic/CurrentWeather.js +49 -0
  69. package/dist/shared/accessories/characteristic/CurrentWeatherByOpenMeteo.js +49 -0
  70. package/dist/shared/accessories/characteristic/CurrentWetBulbGlobeTemperature.js +48 -0
  71. package/dist/shared/accessories/characteristic/EnergyUsage.js +98 -0
  72. package/dist/shared/accessories/characteristic/Light.js +268 -0
  73. package/dist/shared/accessories/characteristic/LightSensor.js +23 -0
  74. package/dist/shared/accessories/characteristic/LockPhysicalControls.js +21 -0
  75. package/dist/shared/accessories/characteristic/MotionDetected.js +22 -0
  76. package/dist/shared/accessories/characteristic/Name.js +15 -0
  77. package/dist/shared/accessories/characteristic/OccupancyDetected.js +19 -0
  78. package/dist/shared/accessories/characteristic/On.js +25 -0
  79. package/dist/shared/accessories/characteristic/OutletInUse.js +14 -0
  80. package/dist/shared/accessories/characteristic/ProgrammableSwitchEvent.js +89 -0
  81. package/dist/shared/accessories/characteristic/RelativeHumidityDehumidifierThreshold.js +28 -0
  82. package/dist/shared/accessories/characteristic/RotationSpeed.js +78 -0
  83. package/dist/shared/accessories/characteristic/SecuritySystemState.js +74 -0
  84. package/dist/shared/accessories/characteristic/SwingMode.js +21 -0
  85. package/dist/shared/accessories/characteristic/TargetTemperature.js +29 -0
  86. package/dist/shared/accessories/characteristic/TemperatureDisplayUnits.js +25 -0
  87. package/dist/shared/util/ConfigHash.js +79 -0
  88. package/dist/shared/util/FfmpegStreamingProcess.js +126 -0
  89. package/dist/shared/util/InfraredTool.js +392 -0
  90. package/dist/shared/util/Logger.js +42 -0
  91. package/dist/shared/util/TuyaRecordingDelegate.js +22 -0
  92. package/dist/shared/util/TuyaStreamDelegate.js +329 -0
  93. package/dist/shared/util/color.js +23 -0
  94. package/dist/shared/util/util.js +135 -0
  95. package/homebridge-ui/public/index.html +329 -0
  96. package/homebridge-ui/server.js +224 -0
  97. package/package.json +61 -0
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const util_1 = require("../util/util");
7
+ const BaseAccessory_1 = __importDefault(require("./BaseAccessory"));
8
+ const SCHEMA_CODE = [
9
+ {
10
+ NAME: 'control',
11
+ CURRENT_POSITION: ['percent_state'],
12
+ TARGET_POSITION_CONTROL: ['control', 'mach_operate'],
13
+ TARGET_POSITION_PERCENT: ['percent_control', 'position'],
14
+ },
15
+ {
16
+ NAME: 'control_2',
17
+ CURRENT_POSITION: ['percent_state'],
18
+ TARGET_POSITION_CONTROL: ['control_2', 'mach_operate'],
19
+ TARGET_POSITION_PERCENT: ['percent_control_2', 'position'],
20
+ },
21
+ ];
22
+ class WindowCoveringAccessory extends BaseAccessory_1.default {
23
+ requiredSchema() {
24
+ return [SCHEMA_CODE[0].TARGET_POSITION_CONTROL]; //, SCHEMA_CODE[1].TARGET_POSITION_CONTROL];
25
+ }
26
+ configureServices() {
27
+ let amount = 1;
28
+ const schema = this.getSchema('control_2');
29
+ if (schema) {
30
+ amount = 2;
31
+ }
32
+ this.log.warn('Curtain amount:', amount);
33
+ for (let i = 0; i < amount; i++) {
34
+ this.configureCurrentPosition(i);
35
+ this.configurePositionState(i);
36
+ if (this.getSchema(...SCHEMA_CODE[i].TARGET_POSITION_PERCENT)) {
37
+ this.configureTargetPositionPercent(i);
38
+ }
39
+ else {
40
+ this.configureTargetPositionControl(i);
41
+ }
42
+ }
43
+ }
44
+ configureCurrentPosition(i) {
45
+ const currentSchema = this.getSchema(...SCHEMA_CODE[i].CURRENT_POSITION);
46
+ const targetSchema = this.getSchema(...SCHEMA_CODE[i].TARGET_POSITION_PERCENT);
47
+ const targetControlSchema = this.getSchema(...SCHEMA_CODE[i].TARGET_POSITION_CONTROL);
48
+ const service = this.accessory.getService(SCHEMA_CODE[i].NAME) ||
49
+ this.accessory.addService(this.Service.WindowCovering, SCHEMA_CODE[i].NAME, SCHEMA_CODE[i].NAME);
50
+ service.getCharacteristic(this.Characteristic.CurrentPosition)
51
+ .onGet(() => {
52
+ if (currentSchema) {
53
+ const status = this.getStatus(currentSchema.code);
54
+ return (0, util_1.limit)(status.value, 0, 100);
55
+ }
56
+ else if (targetSchema) {
57
+ const status = this.getStatus(targetSchema.code);
58
+ return (0, util_1.limit)(status.value, 0, 100);
59
+ }
60
+ const status = this.getStatus(targetControlSchema.code);
61
+ if (status.value === 'close' || status.value === 'FZ') {
62
+ return 0;
63
+ }
64
+ else if (status.value === 'stop' || status.value === 'STOP') {
65
+ return 50;
66
+ }
67
+ else if (status.value === 'open' || status.value === 'ZZ') {
68
+ return 100;
69
+ }
70
+ this.log.warn('Unknown CurrentPosition:', status.value);
71
+ return 50;
72
+ });
73
+ }
74
+ configurePositionState(i) {
75
+ const currentSchema = this.getSchema(...SCHEMA_CODE[i].CURRENT_POSITION);
76
+ const targetSchema = this.getSchema(...SCHEMA_CODE[i].TARGET_POSITION_PERCENT);
77
+ const { DECREASING, INCREASING, STOPPED } = this.Characteristic.PositionState;
78
+ const service = this.accessory.getService(SCHEMA_CODE[i].NAME) ||
79
+ this.accessory.addService(this.Service.WindowCovering, SCHEMA_CODE[i].NAME, SCHEMA_CODE[i].NAME);
80
+ service.getCharacteristic(this.Characteristic.PositionState)
81
+ .onGet(() => {
82
+ if (!currentSchema || !targetSchema) {
83
+ return STOPPED;
84
+ }
85
+ const currentStatus = this.getStatus(currentSchema.code);
86
+ const targetStatus = this.getStatus(targetSchema.code);
87
+ if (targetStatus.value === 100 && currentStatus.value !== 100) {
88
+ return INCREASING;
89
+ }
90
+ else if (targetStatus.value === 0 && currentStatus.value !== 0) {
91
+ return DECREASING;
92
+ }
93
+ else {
94
+ return STOPPED;
95
+ }
96
+ });
97
+ }
98
+ configureTargetPositionPercent(i) {
99
+ const schema = this.getSchema(...SCHEMA_CODE[i].TARGET_POSITION_PERCENT);
100
+ if (!schema) {
101
+ return;
102
+ }
103
+ const service = this.accessory.getService(SCHEMA_CODE[i].NAME) ||
104
+ this.accessory.addService(this.Service.WindowCovering, SCHEMA_CODE[i].NAME, SCHEMA_CODE[i].NAME);
105
+ service.getCharacteristic(this.Characteristic.TargetPosition)
106
+ .onGet(() => {
107
+ const status = this.getStatus(schema.code);
108
+ return (0, util_1.limit)(status.value, 0, 100);
109
+ })
110
+ .onSet(async (value) => {
111
+ await this.sendCommands([{ code: schema.code, value: value }], true);
112
+ });
113
+ }
114
+ configureTargetPositionControl(i) {
115
+ const schema = this.getSchema(...SCHEMA_CODE[i].TARGET_POSITION_CONTROL);
116
+ if (!schema) {
117
+ return;
118
+ }
119
+ const isOldSchema = !schema.property.range.includes('open');
120
+ const service = this.accessory.getService(SCHEMA_CODE[i].NAME) ||
121
+ this.accessory.addService(this.Service.WindowCovering, SCHEMA_CODE[i].NAME, SCHEMA_CODE[i].NAME);
122
+ service.getCharacteristic(this.Characteristic.TargetPosition)
123
+ .onGet(() => {
124
+ const status = this.getStatus(schema.code);
125
+ if (status.value === 'close' || status.value === 'FZ') {
126
+ return 0;
127
+ }
128
+ else if (status.value === 'stop' || status.value === 'STOP') {
129
+ return 50;
130
+ }
131
+ else if (status.value === 'open' || status.value === 'ZZ') {
132
+ return 100;
133
+ }
134
+ this.log.warn('Unknown TargetPosition:', status.value);
135
+ return 50;
136
+ })
137
+ .onSet(async (value) => {
138
+ let control;
139
+ if (value === 0) {
140
+ control = isOldSchema ? 'FZ' : 'close';
141
+ }
142
+ else if (value === 100) {
143
+ control = isOldSchema ? 'ZZ' : 'open';
144
+ }
145
+ else {
146
+ control = isOldSchema ? 'STOP' : 'stop';
147
+ }
148
+ await this.sendCommands([{ code: schema.code, value: control }], true);
149
+ })
150
+ .setProps({
151
+ minStep: 50,
152
+ });
153
+ }
154
+ }
155
+ exports.default = WindowCoveringAccessory;
156
+ //# sourceMappingURL=WindowCoveringAccessory.js.map
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const BaseAccessory_1 = __importDefault(require("./BaseAccessory"));
7
+ const ProgrammableSwitchEvent_1 = require("./characteristic/ProgrammableSwitchEvent");
8
+ const SCHEMA_CODE = {
9
+ ON: ['switch_mode1', 'switch1_value'],
10
+ };
11
+ class SwitchAccessory extends BaseAccessory_1.default {
12
+ requiredSchema() {
13
+ return [SCHEMA_CODE.ON];
14
+ }
15
+ configureServices() {
16
+ const schema = this.device.schema.filter(schema => schema.code.match(/switch_mode(\d+)/) || schema.code.match(/switch(\d+)_value/));
17
+ for (const _schema of schema) {
18
+ const name = (schema.length === 1) ? this.device.name : _schema.code;
19
+ this.configureSwitch(_schema, name);
20
+ }
21
+ }
22
+ configureSwitch(schema, name) {
23
+ const service = this.accessory.getService(schema.code)
24
+ || this.accessory.addService(this.Service.StatelessProgrammableSwitch, name, schema.code);
25
+ const group = schema.code.match(/switch_mode(\d+)/) || schema.code.match(/switch(\d+)_value/);
26
+ const index = group[1];
27
+ service.setCharacteristic(this.Characteristic.ServiceLabelIndex, index);
28
+ (0, ProgrammableSwitchEvent_1.configureProgrammableSwitchEvent)(this, service, schema);
29
+ }
30
+ async onDeviceStatusUpdate(status) {
31
+ super.onDeviceStatusUpdate(status);
32
+ for (const _status of status) {
33
+ const service = this.accessory.getService(_status.code);
34
+ if (!service) {
35
+ continue;
36
+ }
37
+ (0, ProgrammableSwitchEvent_1.onProgrammableSwitchEvent)(this, service, _status);
38
+ }
39
+ }
40
+ }
41
+ exports.default = SwitchAccessory;
42
+ //# sourceMappingURL=WirelessSwitchAccessory.js.map
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureActive = configureActive;
4
+ function configureActive(accessory, service, schema) {
5
+ if (!schema) {
6
+ return;
7
+ }
8
+ const { ACTIVE, INACTIVE } = accessory.Characteristic.Active;
9
+ service.getCharacteristic(accessory.Characteristic.Active)
10
+ .onGet(() => {
11
+ accessory.checkOnlineStatus();
12
+ const status = accessory.getStatus(schema.code);
13
+ return status.value ? ACTIVE : INACTIVE;
14
+ })
15
+ .onSet(async (value) => {
16
+ await accessory.sendCommands([{
17
+ code: schema.code,
18
+ value: (value === ACTIVE) ? true : false,
19
+ }], true);
20
+ });
21
+ }
22
+ //# sourceMappingURL=Active.js.map
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureAirQuality = configureAirQuality;
4
+ const TuyaDevice_1 = require("../../../cloud/device/TuyaDevice");
5
+ const util_1 = require("../../util/util");
6
+ function configureAirQuality(accessory, service, airQualitySchema, pm2_5Schema, pm10Schema, vocSchema) {
7
+ if (!airQualitySchema) {
8
+ return;
9
+ }
10
+ if (!service) {
11
+ service = accessory.accessory.getService(accessory.Service.AirQualitySensor)
12
+ || accessory.accessory.addService(accessory.Service.AirQualitySensor);
13
+ }
14
+ const property = airQualitySchema.property;
15
+ const multiple = Math.pow(10, property ? property.scale : 0);
16
+ const { UNKNOWN, EXCELLENT, GOOD, FAIR, INFERIOR, POOR } = accessory.Characteristic.AirQuality;
17
+ service.getCharacteristic(accessory.Characteristic.AirQuality)
18
+ .onGet(() => {
19
+ const status = accessory.getStatus(airQualitySchema.code);
20
+ if (airQualitySchema.type === TuyaDevice_1.TuyaDeviceSchemaType.Integer) {
21
+ const value = (0, util_1.limit)(status.value / multiple, 0, 1000);
22
+ if (value <= 10) {
23
+ return EXCELLENT;
24
+ }
25
+ else if (value <= 50) {
26
+ return GOOD;
27
+ }
28
+ else if (value <= 100) {
29
+ return FAIR;
30
+ }
31
+ else if (value <= 200) {
32
+ return INFERIOR;
33
+ }
34
+ else {
35
+ return POOR;
36
+ }
37
+ }
38
+ else if (airQualitySchema.type === TuyaDevice_1.TuyaDeviceSchemaType.Enum) {
39
+ if (status.value === 'great') {
40
+ return EXCELLENT;
41
+ }
42
+ else if (status.value === 'good') {
43
+ return GOOD;
44
+ }
45
+ else if (status.value === 'mild') {
46
+ return FAIR;
47
+ }
48
+ else if (status.value === 'medium') {
49
+ return INFERIOR;
50
+ }
51
+ else if (status.value === 'severe') {
52
+ return POOR;
53
+ }
54
+ }
55
+ return UNKNOWN;
56
+ });
57
+ pm2_5Schema && configureDensity(accessory, service, accessory.Characteristic.PM2_5Density, pm2_5Schema);
58
+ pm10Schema && configureDensity(accessory, service, accessory.Characteristic.PM10Density, pm10Schema);
59
+ vocSchema && configureDensity(accessory, service, accessory.Characteristic.VOCDensity, vocSchema);
60
+ }
61
+ function configureDensity(accessory, service, characteristic, schema) {
62
+ if (!schema) {
63
+ return;
64
+ }
65
+ const property = schema.property;
66
+ const multiple = Math.pow(10, property ? property.scale : 0);
67
+ service.getCharacteristic(characteristic)
68
+ .onGet(() => {
69
+ const status = accessory.getStatus(schema.code);
70
+ const value = (0, util_1.limit)(status.value / multiple, 0, 1000);
71
+ return value;
72
+ });
73
+ }
74
+ //# sourceMappingURL=AirQuality.js.map
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureCurrentRelativeHumidity = configureCurrentRelativeHumidity;
4
+ const util_1 = require("../../util/util");
5
+ function configureCurrentRelativeHumidity(accessory, service, schema) {
6
+ if (!schema) {
7
+ return;
8
+ }
9
+ if (!service) {
10
+ service = accessory.accessory.getService(accessory.Service.HumiditySensor)
11
+ || accessory.accessory.addService(accessory.Service.HumiditySensor);
12
+ }
13
+ const property = schema.property || {};
14
+ const props = (0, util_1.toHapProperty)(property);
15
+ const multiple = Math.pow(10, property['scale'] || 0);
16
+ service.getCharacteristic(accessory.Characteristic.CurrentRelativeHumidity)
17
+ .onGet(() => {
18
+ const status = accessory.getStatus(schema.code);
19
+ return (0, util_1.limit)(status.value / multiple, props['minValue'], props['maxValue']);
20
+ })
21
+ .setProps(props);
22
+ }
23
+ //# sourceMappingURL=CurrentRelativeHumidity.js.map
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureCurrentTemperature = configureCurrentTemperature;
4
+ const util_1 = require("../../util/util");
5
+ function configureCurrentTemperature(accessory, service, schema) {
6
+ if (!schema) {
7
+ return;
8
+ }
9
+ if (!service) {
10
+ service = accessory.accessory.getService(accessory.Service.TemperatureSensor)
11
+ || accessory.accessory.addService(accessory.Service.TemperatureSensor);
12
+ }
13
+ const property = schema.property || {};
14
+ const props = (0, util_1.toHapProperty)(property);
15
+ const multiple = Math.pow(10, property['scale'] || 0);
16
+ service.getCharacteristic(accessory.Characteristic.CurrentTemperature)
17
+ .onGet(() => {
18
+ const status = accessory.getStatus(schema.code);
19
+ return (0, util_1.limit)(status.value / multiple, props['minValue'], props['maxValue']);
20
+ })
21
+ .setProps(props);
22
+ }
23
+ //# sourceMappingURL=CurrentTemperature.js.map
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureCurrentWeather = configureCurrentWeather;
4
+ function configureCurrentWeather(accessory, weatherCondition) {
5
+ // First time
6
+ accessory.log.info('get current weather from Tuya.');
7
+ const res = accessory.deviceManager.getCurrentWeather(accessory.device.lat, accessory.device.lon);
8
+ res.then(result => Object.assign(weatherCondition, result));
9
+ // Controlling API call frequency
10
+ setInterval(() => {
11
+ const res = accessory.deviceManager.getCurrentWeather(accessory.device.lat, accessory.device.lon);
12
+ res.then(result => Object.assign(weatherCondition, result));
13
+ }, 10 * 60 * 1000); // 10 minutes
14
+ {
15
+ let service;
16
+ if (!service) {
17
+ service = accessory.accessory.getService(accessory.Service.TemperatureSensor)
18
+ || accessory.accessory.addService(accessory.Service.TemperatureSensor);
19
+ }
20
+ service.getCharacteristic(accessory.Characteristic.CurrentTemperature)
21
+ .onGet(() => {
22
+ return weatherCondition.current_weather.temp;
23
+ })
24
+ .setProps({
25
+ unit: '℃',
26
+ minValue: -273.15,
27
+ maxValue: 500.0,
28
+ minStep: 0.1,
29
+ });
30
+ }
31
+ {
32
+ let service;
33
+ if (!service) {
34
+ service = accessory.accessory.getService(accessory.Service.HumiditySensor)
35
+ || accessory.accessory.addService(accessory.Service.HumiditySensor);
36
+ }
37
+ service.getCharacteristic(accessory.Characteristic.CurrentRelativeHumidity)
38
+ .onGet(() => {
39
+ return weatherCondition.current_weather.humidity;
40
+ })
41
+ .setProps({
42
+ unit: '%',
43
+ minValue: 0.0,
44
+ maxValue: 100.0,
45
+ minStep: 0.1,
46
+ });
47
+ }
48
+ }
49
+ //# sourceMappingURL=CurrentWeather.js.map
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureCurrentWeatherByOpenMeteo = configureCurrentWeatherByOpenMeteo;
4
+ function configureCurrentWeatherByOpenMeteo(accessory, weatherCondition) {
5
+ // First time
6
+ accessory.log.info('get current weather from Open-Meteo.');
7
+ const res = accessory.deviceManager.getCurrentWeatherByOpenMeteo(accessory.device.lat, accessory.device.lon);
8
+ res.then(result => Object.assign(weatherCondition, result));
9
+ // Controlling API call frequency
10
+ setInterval(() => {
11
+ const res = accessory.deviceManager.getCurrentWeatherByOpenMeteo(accessory.device.lat, accessory.device.lon);
12
+ res.then(result => Object.assign(weatherCondition, result));
13
+ }, 15 * 60 * 1000); // 15 minutes
14
+ {
15
+ let service;
16
+ if (!service) {
17
+ service = accessory.accessory.getService(accessory.Service.TemperatureSensor)
18
+ || accessory.accessory.addService(accessory.Service.TemperatureSensor);
19
+ }
20
+ service.getCharacteristic(accessory.Characteristic.CurrentTemperature)
21
+ .onGet(() => {
22
+ return weatherCondition.current.temperature_2m;
23
+ })
24
+ .setProps({
25
+ unit: weatherCondition.current_units.temperature_2m,
26
+ minValue: -273.15,
27
+ maxValue: 500.0,
28
+ minStep: 0.1,
29
+ });
30
+ }
31
+ {
32
+ let service;
33
+ if (!service) {
34
+ service = accessory.accessory.getService(accessory.Service.HumiditySensor)
35
+ || accessory.accessory.addService(accessory.Service.HumiditySensor);
36
+ }
37
+ service.getCharacteristic(accessory.Characteristic.CurrentRelativeHumidity)
38
+ .onGet(() => {
39
+ return weatherCondition.current.relative_humidity_2m;
40
+ })
41
+ .setProps({
42
+ unit: weatherCondition.current_units.relative_humidity_2m,
43
+ minValue: 0.0,
44
+ maxValue: 100.0,
45
+ minStep: 0.1,
46
+ });
47
+ }
48
+ }
49
+ //# sourceMappingURL=CurrentWeatherByOpenMeteo.js.map
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureCurrentWetBulbGlobeTemperature = configureCurrentWetBulbGlobeTemperature;
4
+ const SCHEMA_CODE = {
5
+ CURRENT_TEMP: ['va_temperature', 'temp_value'],
6
+ CURRENT_HUMIDITY: ['va_humidity', 'humidity_value'],
7
+ };
8
+ // Custom Characteristic. Depends on TemperatureHumiditySensorAccessory or somethings like.
9
+ function configureCurrentWetBulbGlobeTemperature(accessory) {
10
+ const service = accessory.accessory.getService(accessory.Service.TemperatureSensor)
11
+ || accessory.accessory.addService(accessory.Service.TemperatureSensor);
12
+ service.getCharacteristic(accessory.Characteristic.CurrentTemperature)
13
+ .onGet(() => {
14
+ const rhSchema = accessory.getSchema(...SCHEMA_CODE.CURRENT_HUMIDITY);
15
+ const rh = accessory.getStatus(rhSchema.code)?.value || 1;
16
+ const tSchema = accessory.getSchema(...SCHEMA_CODE.CURRENT_TEMP);
17
+ const t = accessory.getStatus(tSchema.code)?.value || 1;
18
+ const rhProperty = rhSchema?.property || {};
19
+ const rhMultiple = Math.pow(10, rhProperty['scale'] || 0);
20
+ const tProperty = rhSchema?.property || {};
21
+ const tMultiple = Math.pow(10, tProperty['scale'] || 0);
22
+ return calculateWBGT(t / tMultiple, rh / rhMultiple).wbgtIndoor;
23
+ })
24
+ .setProps({
25
+ unit: '℃',
26
+ minValue: -273.15,
27
+ maxValue: 100,
28
+ minStep: 0.1,
29
+ });
30
+ }
31
+ function calculateWBGT(temperature, humidity) {
32
+ // 湿球温度の近似式(Stullの式)
33
+ const tw = temperature * Math.atan(0.151977 * Math.sqrt(humidity + 8.313659)) +
34
+ Math.atan(temperature + humidity) -
35
+ Math.atan(humidity - 1.676331) +
36
+ 0.00391838 * Math.pow(humidity, 1.5) * Math.atan(0.023101 * humidity) -
37
+ 4.686035;
38
+ // 屋外(直射日光あり)のWBGT近似式
39
+ const outdoor = 0.7 * tw + 0.2 * temperature + 0.1 * temperature;
40
+ // 屋内(直射日光なし)のWBGT近似式
41
+ const indoor = 0.7 * tw + 0.3 * temperature;
42
+ return {
43
+ wetBulbTemp: parseFloat(tw.toFixed(1)),
44
+ wbgtOutdoor: parseFloat(outdoor.toFixed(1)),
45
+ wbgtIndoor: parseFloat(indoor.toFixed(1)),
46
+ };
47
+ }
48
+ //# sourceMappingURL=CurrentWetBulbGlobeTemperature.js.map
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureEnergyUsage = configureEnergyUsage;
4
+ exports.createAmperesCharacteristic = createAmperesCharacteristic;
5
+ function configureEnergyUsage(api, accessory, service, currentSchema, powerSchema, voltageSchema, totalSchema) {
6
+ if (currentSchema) {
7
+ const amperes = createAmperesCharacteristic(api);
8
+ if (!service.testCharacteristic(amperes)) {
9
+ service.addCharacteristic(amperes);
10
+ }
11
+ service.getCharacteristic(amperes).onGet(createStatusGetter(accessory, currentSchema, isUnit(currentSchema, 'mA') ? 1000 : 0));
12
+ }
13
+ if (powerSchema) {
14
+ const watts = createWattsCharacteristic(api);
15
+ if (!service.testCharacteristic(watts)) {
16
+ service.addCharacteristic(watts);
17
+ }
18
+ service.getCharacteristic(watts).onGet(createStatusGetter(accessory, powerSchema));
19
+ }
20
+ if (voltageSchema) {
21
+ const volts = createVoltsCharacteristic(api);
22
+ if (!service.testCharacteristic(volts)) {
23
+ service.addCharacteristic(volts);
24
+ }
25
+ service.getCharacteristic(volts).onGet(createStatusGetter(accessory, voltageSchema));
26
+ }
27
+ if (totalSchema) {
28
+ const kwh = createKilowattHourCharacteristic(api);
29
+ if (!service.testCharacteristic(kwh)) {
30
+ service.addCharacteristic(kwh);
31
+ }
32
+ service.getCharacteristic(kwh).onGet(createStatusGetter(accessory, totalSchema));
33
+ }
34
+ }
35
+ function isUnit(schema, ...units) {
36
+ return units.includes(schema.property.unit);
37
+ }
38
+ function createStatusGetter(accessory, schema, divisor = 1) {
39
+ const property = schema.property;
40
+ divisor *= Math.pow(10, property.scale);
41
+ return () => {
42
+ const status = accessory.getStatus(schema.code);
43
+ return status.value / divisor;
44
+ };
45
+ }
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ function createAmperesCharacteristic(api) {
48
+ return class Amperes extends api.hap.Characteristic {
49
+ static { this.UUID = 'E863F126-079E-48FF-8F27-9C2605A29F52'; }
50
+ constructor() {
51
+ super('Amperes', Amperes.UUID, {
52
+ format: "float" /* api.hap.Formats.FLOAT */,
53
+ perms: ["ev" /* api.hap.Perms.NOTIFY */, "pr" /* api.hap.Perms.PAIRED_READ */],
54
+ unit: 'A',
55
+ });
56
+ }
57
+ };
58
+ }
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ function createWattsCharacteristic(api) {
61
+ return class Watts extends api.hap.Characteristic {
62
+ static { this.UUID = 'E863F10D-079E-48FF-8F27-9C2605A29F52'; }
63
+ constructor() {
64
+ super('Consumption', Watts.UUID, {
65
+ format: "float" /* api.hap.Formats.FLOAT */,
66
+ perms: ["ev" /* api.hap.Perms.NOTIFY */, "pr" /* api.hap.Perms.PAIRED_READ */],
67
+ unit: 'W',
68
+ });
69
+ }
70
+ };
71
+ }
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ function createVoltsCharacteristic(api) {
74
+ return class Volts extends api.hap.Characteristic {
75
+ static { this.UUID = 'E863F10A-079E-48FF-8F27-9C2605A29F52'; }
76
+ constructor() {
77
+ super('Volts', Volts.UUID, {
78
+ format: "float" /* api.hap.Formats.FLOAT */,
79
+ perms: ["ev" /* api.hap.Perms.NOTIFY */, "pr" /* api.hap.Perms.PAIRED_READ */],
80
+ unit: 'V',
81
+ });
82
+ }
83
+ };
84
+ }
85
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ function createKilowattHourCharacteristic(api) {
87
+ return class KilowattHour extends api.hap.Characteristic {
88
+ static { this.UUID = 'E863F10C-079E-48FF-8F27-9C2605A29F52'; }
89
+ constructor() {
90
+ super('Total Consumption', KilowattHour.UUID, {
91
+ format: "float" /* api.hap.Formats.FLOAT */,
92
+ perms: ["ev" /* api.hap.Perms.NOTIFY */, "pr" /* api.hap.Perms.PAIRED_READ */],
93
+ unit: 'kWh',
94
+ });
95
+ }
96
+ };
97
+ }
98
+ //# sourceMappingURL=EnergyUsage.js.map