homebridge-sensor-cmd-polling 2.50.8 → 2.50.10-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.
package/README.md CHANGED
@@ -14,6 +14,14 @@ Originally, [homebridge-sensor-cmd](https://github.com/apexad/homebridge-sensor-
14
14
  This fork keeps all original functionality but **adds automatic polling**.
15
15
  Now, you can define a `pollingInterval` in the config so the plugin updates the sensor state automatically without waiting for HomeKit GET requests.
16
16
 
17
+ The polling implementation is robust against long-running commands and overlapping reads:
18
+
19
+ - no parallel command execution inside the plugin
20
+ - last valid sensor value is cached and reused on command errors
21
+ - empty or invalid stdout no longer falls back to `0`
22
+ - GET requests and background polling share the same cached state instead of racing each other
23
+ - optional `execTimeout` can abort stuck commands
24
+
17
25
  ---
18
26
 
19
27
  ## New Feature: Automatic Polling
@@ -42,10 +50,13 @@ Add this to the `accessories` section of Homebridge's `config.json` after instal
42
50
  "name": "<name of the sensor>",
43
51
  "type": "<sensor type: contact/motion/occupancy - default is contact>",
44
52
  "command": "<command-line/shell command to execute>",
45
- "pollingInterval": 30
53
+ "pollingInterval": 30,
54
+ "execTimeout": 5000
46
55
  }
47
56
  ```
48
57
 
58
+ `execTimeout` is optional and uses milliseconds. Set it to `0` or omit it to disable the timeout.
59
+
49
60
  ---
50
61
 
51
62
  ## Original Author
@@ -32,9 +32,15 @@
32
32
  "type": "number",
33
33
  "default": 0,
34
34
  "description": "Optional: Poll the command automatically at this interval. Set 0 to disable polling."
35
+ },
36
+ "execTimeout": {
37
+ "title": "Command Timeout (milliseconds)",
38
+ "type": "number",
39
+ "default": 0,
40
+ "description": "Optional: Abort long-running commands after this timeout. Set 0 to disable the timeout."
35
41
  }
36
42
  }
37
43
  },
38
44
  "form": null,
39
45
  "display": null
40
- }
46
+ }
package/dist/accessory.js CHANGED
@@ -3,7 +3,9 @@ const child_process_1 = require("child_process");
3
3
  let hap;
4
4
  class SensorCmd {
5
5
  constructor(log, config) {
6
+ var _a;
6
7
  this.log = log;
8
+ this.isShuttingDown = false;
7
9
  this.config = config;
8
10
  // Determine which sensor type to create
9
11
  switch (this.config.type) {
@@ -19,15 +21,20 @@ class SensorCmd {
19
21
  }
20
22
  // Register the on-demand GET handler
21
23
  const characteristic = this.getRelevantCharacteristic();
22
- characteristic.on("get" /* GET */, (callback) => {
23
- this.runCommand((err, value) => callback(null, err ? 0 : value));
24
+ characteristic.on("get" /* CharacteristicEventTypes.GET */, (callback) => {
25
+ const result = this.getFallbackResult();
26
+ callback(null, result.value);
27
+ void this.refreshAfterGet();
24
28
  });
25
29
  // Accessory info
26
30
  this.infoService = new hap.Service.AccessoryInformation()
27
31
  .setCharacteristic(hap.Characteristic.Manufacturer, 'apexad')
28
32
  .setCharacteristic(hap.Characteristic.Model, 'sensor-cmd');
29
33
  // Polling interval (default 60s)
30
- this.pollingInterval = this.config.pollingInterval ? this.config.pollingInterval : 60;
34
+ this.pollingInterval = (_a = this.config.pollingInterval) !== null && _a !== void 0 ? _a : 60;
35
+ this.execTimeout = this.config.execTimeout && this.config.execTimeout > 0
36
+ ? this.config.execTimeout
37
+ : undefined;
31
38
  if (this.pollingInterval > 0) {
32
39
  this.log(`Starting automatic polling every ${this.pollingInterval}s`);
33
40
  this.startPolling();
@@ -45,43 +52,123 @@ class SensorCmd {
45
52
  return this.sensorService.getCharacteristic(hap.Characteristic.ContactSensorState);
46
53
  }
47
54
  }
48
- /** Run the configured command and return parsed result */
49
- runCommand(callback) {
50
- child_process_1.exec(this.config.command, (err, stdout) => {
51
- if (err) {
52
- this.log(`Command failed: ${err.message}`);
53
- callback(true, 0);
54
- return;
55
- }
56
- let parsed = parseInt(stdout.trim(), 10);
57
- if (isNaN(parsed))
58
- parsed = 0;
59
- callback(false, parsed);
60
- });
55
+ /** Keep the previous valid value, falling back to 0 before the first successful read */
56
+ getFallbackResult() {
57
+ if (this.lastValidValue !== undefined) {
58
+ return { value: this.lastValidValue, source: 'cache' };
59
+ }
60
+ return { value: 0, source: 'default' };
61
61
  }
62
- /** Start polling periodically */
63
- startPolling() {
64
- const characteristic = this.getRelevantCharacteristic();
65
- const poll = () => {
66
- this.runCommand((err, value) => {
67
- if (!err) {
68
- this.log(`Polled value: ${value}`);
69
- characteristic.updateValue(value);
62
+ /** Accept only explicit integer output, never treat empty/invalid stdout as 0 */
63
+ parseSensorValue(stdout) {
64
+ const trimmedOutput = stdout.trim();
65
+ if (trimmedOutput.length === 0) {
66
+ return undefined;
67
+ }
68
+ if (!/^-?\d+$/.test(trimmedOutput)) {
69
+ return undefined;
70
+ }
71
+ return Number.parseInt(trimmedOutput, 10);
72
+ }
73
+ /** Run the configured command and update the characteristic only on fresh valid output */
74
+ runCommand() {
75
+ return new Promise((resolve) => {
76
+ const execOptions = this.execTimeout !== undefined
77
+ ? { timeout: this.execTimeout }
78
+ : undefined;
79
+ (0, child_process_1.exec)(this.config.command, execOptions, (error, stdout, stderr) => {
80
+ const stdoutText = String(stdout);
81
+ const stderrText = String(stderr);
82
+ const trimmedStderr = stderrText.trim();
83
+ if (trimmedStderr.length > 0) {
84
+ this.log(`Command stderr: ${trimmedStderr}`);
85
+ }
86
+ if (error) {
87
+ this.log(`Command failed: ${error.message}`);
88
+ resolve(this.getFallbackResult());
89
+ return;
70
90
  }
71
- else {
72
- this.log(`Polling error, keeping previous value`);
91
+ const parsedValue = this.parseSensorValue(stdoutText);
92
+ if (parsedValue === undefined) {
93
+ const trimmedStdout = stdoutText.trim();
94
+ if (trimmedStdout.length === 0) {
95
+ this.log('Command returned empty stdout, keeping last valid value');
96
+ }
97
+ else {
98
+ this.log(`Command returned invalid stdout "${trimmedStdout}", keeping last valid value`);
99
+ }
100
+ resolve(this.getFallbackResult());
101
+ return;
73
102
  }
103
+ this.lastValidValue = parsedValue;
104
+ this.getRelevantCharacteristic().updateValue(parsedValue);
105
+ resolve({ value: parsedValue, source: 'fresh' });
74
106
  });
75
- };
76
- // Initial poll
77
- poll();
78
- // Set recurring interval
79
- this.pollingTimer = setInterval(poll, this.pollingInterval * 1000);
107
+ });
108
+ }
109
+ /** Ensure there is at most one running command for polling and GET refreshes */
110
+ ensureCommandRunning(trigger) {
111
+ if (this.pendingCommand) {
112
+ if (trigger === 'get') {
113
+ const fallback = this.getFallbackResult();
114
+ this.log(`Command already running during GET, returning cached value ${fallback.value}`);
115
+ return this.pendingCommand;
116
+ }
117
+ this.log(`Command already running during ${trigger}, waiting for the current run to finish`);
118
+ return this.pendingCommand;
119
+ }
120
+ this.pendingCommand = this.runCommand()
121
+ .finally(() => {
122
+ this.pendingCommand = undefined;
123
+ });
124
+ return this.pendingCommand;
125
+ }
126
+ /** GET returns immediately and only triggers a background refresh */
127
+ async refreshAfterGet() {
128
+ try {
129
+ await this.ensureCommandRunning('get');
130
+ }
131
+ catch (error) {
132
+ const message = error instanceof Error ? error.message : String(error);
133
+ this.log(`Unexpected GET refresh error: ${message}`);
134
+ }
135
+ }
136
+ /** Schedule the next poll only after the current run has finished */
137
+ scheduleNextPoll() {
138
+ if (this.isShuttingDown || this.pollingInterval <= 0) {
139
+ return;
140
+ }
141
+ this.pollingTimer = setTimeout(() => {
142
+ this.pollingTimer = undefined;
143
+ void this.pollOnce();
144
+ }, this.pollingInterval * 1000);
145
+ }
146
+ /** Start polling without allowing overlapping runs */
147
+ startPolling() {
148
+ void this.pollOnce();
149
+ }
150
+ async pollOnce() {
151
+ try {
152
+ const result = await this.ensureCommandRunning('poll');
153
+ if (result.source === 'fresh') {
154
+ this.log(`Polled value: ${result.value}`);
155
+ }
156
+ else if (result.source === 'cache') {
157
+ this.log(`Polling reused cached value: ${result.value}`);
158
+ }
159
+ else {
160
+ this.log('Polling has no valid sensor value yet, leaving current characteristic unchanged');
161
+ }
162
+ }
163
+ finally {
164
+ this.scheduleNextPoll();
165
+ }
80
166
  }
81
167
  /** Clean up when accessory is unloaded */
82
168
  shutdown() {
169
+ this.isShuttingDown = true;
83
170
  if (this.pollingTimer) {
84
- clearInterval(this.pollingTimer);
171
+ clearTimeout(this.pollingTimer);
85
172
  this.pollingTimer = undefined;
86
173
  }
87
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"accessory.js","sourceRoot":"","sources":["../src/accessory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accessory.js","sourceRoot":"","sources":["../src/accessory.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-sensor-cmd-polling",
3
- "version": "2.50.8",
3
+ "version": "2.50.10-beta.0",
4
4
  "description": "Fork of apexad/homebridge-sensor-cmd with automatic polling support (configurable interval) – original minimal contact sensor via shell command",
5
5
  "main": "dist/accessory.js",
6
6
  "scripts": {