signalk-relay-windlass 0.0.4 → 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.
package/README.md CHANGED
@@ -5,17 +5,14 @@ A Signal K server plugin that provides safe control of an electric windlass (anc
5
5
  ## Features
6
6
 
7
7
  - **Dual Relay Control**: Controls windlass up/down operation using separate relays
8
- - **Safety Timeout**: Configurable automatic shutoff to prevent motor damage from extended operation
8
+ - **Safety Timeout**: Configurable automatic shutoff in case of network/swithing failure
9
9
  - **Direction Switch Delay**: Prevents rapid direction changes that could damage windlass
10
10
  - **Chain Counter**: Automatic tracking of chain deployment based on operation time and configurable rate
11
- - **Real-time Status**: Live monitoring of windlass state based on relay feedback
11
+ - **External Control Integration**: Monitor external windlass controls with automatic state and chain tracking
12
+ - **Real-time Status**: Live monitoring of windlass state based on relay and external control feedback
12
13
  - **Notification System**: Alert notifications when safety timeout is triggered
13
14
  - **PUT Handler**: Control windlass through Signal K PUT requests
14
15
 
15
- ## Configuration
16
-
17
- The plugin requires configuration of three main parameters:
18
-
19
16
  ### Settings
20
17
 
21
18
  - **Windlass State Path**: Signal K path for windlass control state (default: `electrical.windlass.control.state`)
@@ -25,7 +22,9 @@ The plugin requires configuration of three main parameters:
25
22
  - **Direction Switch Delay**: Minimum delay when switching between up and down directions in seconds (default: 2, range: 0-30, 0 = disabled)
26
23
  - **Chain Rate**: Rate at which chain is deployed/retrieved in feet per minute (default: 60, range: 0-500, 0 = disable chain counter)
27
24
  - **Chain Counter Path**: Signal K path for chain out counter in feet (default: `navigation.anchor.chainOut`)
28
- - **Chain Counter Reset Path**: Signal K path for chain counter reset command (default: `navigation.anchor.chainOut.reset`)
25
+ - **Chain Counter Reset Path**: Signal K path for chain counter reset command (default: `electrical.windlass.chainCounterReset.state`)
26
+ - **External Up Path**: Optional Signal K path for external windlass up control monitoring (used for chain counter tracking and state reporting)
27
+ - **External Down Path**: Optional Signal K path for external windlass down control monitoring (used for chain counter tracking and state reporting)
29
28
 
30
29
  ## Usage
31
30
 
@@ -33,10 +32,9 @@ The plugin requires configuration of three main parameters:
33
32
 
34
33
  The windlass can be controlled through several methods:
35
34
 
36
- 1. **Signal K Web Interface**: Use the controls in the web interface
37
- 2. **PUT Requests**: Send HTTP PUT requests to the windlass path
38
- 3. **WebSocket**: Send delta messages via WebSocket
39
- 4. **Node-RED**: Use Signal K nodes in Node-RED flows
35
+ 1. **PUT Requests**: Send HTTP PUT requests to the windlass path
36
+ 2. **WebSocket**: Send delta messages via WebSocket
37
+ 3. **Node-RED**: Use Signal K nodes in Node-RED flows
40
38
 
41
39
  ### Control Values
42
40
 
@@ -49,12 +47,40 @@ The windlass can be controlled through several methods:
49
47
  The chain counter can be reset to zero using a PUT request:
50
48
 
51
49
  ```bash
52
- curl -X PUT \
53
- http://localhost:3000/signalk/v1/api/vessels/self/navigation/anchor/chainOut/reset \
54
- -H 'Content-Type: application/json' \
55
- -d '{"value": true}'
50
+ curl -X PUT -H "Content-Type: application/json" \\
51
+ -d '{"value": true}' \\
52
+ http://your-signalk-server:3000/signalk/v1/api/vessels/self/navigation/anchor/chainCounterReset/state
56
53
  ```
57
54
 
55
+ ### External Control Monitoring
56
+
57
+ The plugin can monitor external windlass controls (such as NMEA 2000 data or other control systems) for both chain counter tracking and windlass state reporting. When external control paths are configured:
58
+
59
+ - The plugin subscribes to the specified external control paths
60
+ - Chain counter tracking works with both internal relay control and external control
61
+ - **Windlass state path updates**: The configured windlass state path will reflect external control states
62
+ - External control takes precedence over relay control for both chain counter and state reporting
63
+ - When external control is active, the windlass state path shows the external state
64
+ - When external control is inactive, the windlass state path shows the relay state
65
+ - External control does not affect the relay-based windlass PUT handler operations
66
+ - External control is only active when chain counter is enabled (chain rate > 0)
67
+
68
+ This feature is useful when:
69
+
70
+ - Your windlass is controlled by multiple systems (relay plugin + external system)
71
+ - You want to track chain deployment from NMEA 2000 windlass data
72
+ - You need chain counter tracking even when the windlass is operated manually or by other systems
73
+ - You want unified windlass state reporting regardless of which system is controlling the windlass
74
+ - You're integrating with existing windlass control systems while adding chain tracking and state monitoring
75
+
76
+ **State Priority Logic:**
77
+
78
+ - If external up control is active → windlass state path shows "up"
79
+ - If external down control is active → windlass state path shows "down"
80
+ - If external control is off but relay up is active → windlass state path shows "up"
81
+ - If external control is off but relay down is active → windlass state path shows "down"
82
+ - If both external and relay controls are off → windlass state path shows "off"
83
+
58
84
  ### PUT Request Example
59
85
 
60
86
  ```bash
@@ -68,13 +94,12 @@ curl -X PUT \
68
94
 
69
95
  ### Automatic Timeout Protection
70
96
 
71
- The plugin includes configurable timeout protection to prevent windlass motor damage:
97
+ The plugin includes configurable timeout protection:
72
98
 
73
99
  - **Configurable Duration**: Set maximum run time (0-300 seconds)
74
100
  - **Automatic Shutoff**: Both relays automatically deactivated when timeout reached
75
101
  - **Visual/Audio Alerts**: Notifications sent through Signal K alert system
76
102
  - **Auto-Clear Alerts**: Timeout notifications automatically reset to normal after 10 seconds
77
- - **Debug Logging**: Timeout events logged for troubleshooting
78
103
 
79
104
  ### Direction Switch Delay Protection
80
105
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,SAAS,EACT,MAAM,EAKP,MAAM,qBAAqB,CAAA;AAsB5B,QAAA,MAAM,KAAK,GAAI,KAAK,SAAS,WA2pB5B,CAAA;AAGD,eAAe,KAAK,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,SAAS,EACT,MAAM,EAKP,MAAM,qBAAqB,CAAA;AAsB5B,QAAA,MAAM,KAAK,GAAI,KAAK,SAAS,WA4xB5B,CAAA;AAGD,eAAe,KAAK,CAAA"}
package/dist/index.js CHANGED
@@ -43,6 +43,10 @@ const start = (app) => {
43
43
  let lastChainUpdate = Date.now(); // Last time chain counter was updated
44
44
  let chainCounterUpdateTimer = null; // Timer for continuous chain counter updates
45
45
  let notificationResetTimer = null; // Timer for resetting timeout notification
46
+ // External control state tracking for chain counter
47
+ let externalUpState = false;
48
+ let externalDownState = false;
49
+ let externalCurrentState = WindlassState.Off;
46
50
  function clearTimeoutTimer() {
47
51
  if (timeoutTimer) {
48
52
  app.debug('Clearing windlass timeout timer');
@@ -76,8 +80,11 @@ const start = (app) => {
76
80
  const updateInterval = 1000; // Fixed 1 second interval
77
81
  app.debug('Starting chain counter continuous updates every 1 second');
78
82
  chainCounterUpdateTimer = setInterval(() => {
79
- // Update chain counter based on current state
80
- updateChainCounter(currentState, currentState);
83
+ // Update chain counter based on the appropriate active state
84
+ // Priority: external control takes precedence if any external path is active
85
+ const externalActive = externalCurrentState !== WindlassState.Off;
86
+ const activeState = externalActive ? externalCurrentState : currentState;
87
+ updateChainCounter(activeState, activeState);
81
88
  // Send current chain counter value
82
89
  sendChainCounterUpdate();
83
90
  }, updateInterval);
@@ -205,6 +212,45 @@ const start = (app) => {
205
212
  notificationResetTimer = null;
206
213
  }, 10000);
207
214
  }
215
+ function updateExternalWindlassState() {
216
+ if (!started)
217
+ return;
218
+ // Only track external state for chain counter if enabled
219
+ if (!props.chainRateFeetPerMinute || props.chainRateFeetPerMinute <= 0) {
220
+ return;
221
+ }
222
+ let newExternalState;
223
+ if (externalUpState && !externalDownState) {
224
+ newExternalState = WindlassState.Up;
225
+ }
226
+ else if (!externalUpState && externalDownState) {
227
+ newExternalState = WindlassState.Down;
228
+ }
229
+ else {
230
+ newExternalState = WindlassState.Off;
231
+ }
232
+ // Handle external windlass state change for chain counter
233
+ if (newExternalState !== externalCurrentState) {
234
+ app.debug(`External windlass state changing: ${externalCurrentState} -> ${newExternalState} (up: ${externalUpState}, down: ${externalDownState})`);
235
+ // Update chain counter based on previous external state
236
+ updateChainCounter(newExternalState, externalCurrentState);
237
+ // Manage chain counter timer based on external state
238
+ // External control takes precedence over relay control for continuous updates
239
+ if (newExternalState === WindlassState.Up ||
240
+ newExternalState === WindlassState.Down) {
241
+ startChainCounterContinuousUpdates();
242
+ }
243
+ else {
244
+ // Only stop if relay control is also off
245
+ if (currentState === WindlassState.Off) {
246
+ stopChainCounterContinuousUpdates();
247
+ }
248
+ }
249
+ externalCurrentState = newExternalState;
250
+ // Update overall windlass state (external takes precedence)
251
+ updateOverallWindlassState();
252
+ }
253
+ }
208
254
  function updateWindlassState() {
209
255
  if (!started)
210
256
  return;
@@ -225,11 +271,15 @@ const start = (app) => {
225
271
  updateChainCounter(newState, currentState);
226
272
  clearTimeoutTimer();
227
273
  // Manage chain counter timer based on state
274
+ // Only stop continuous updates if both relay and external control are off
228
275
  if (newState === WindlassState.Up || newState === WindlassState.Down) {
229
276
  startChainCounterContinuousUpdates();
230
277
  }
231
278
  else {
232
- stopChainCounterContinuousUpdates();
279
+ // Only stop if external control is also off
280
+ if (externalCurrentState === WindlassState.Off) {
281
+ stopChainCounterContinuousUpdates();
282
+ }
233
283
  }
234
284
  // Start timeout timer for active states
235
285
  if ((newState === WindlassState.Up || newState === WindlassState.Down) &&
@@ -240,7 +290,8 @@ const start = (app) => {
240
290
  }, props.timeoutSeconds * 1000);
241
291
  }
242
292
  currentState = newState;
243
- sendState(newState);
293
+ // Update overall windlass state (external takes precedence if active)
294
+ updateOverallWindlassState();
244
295
  }
245
296
  }
246
297
  const plugin = {
@@ -255,20 +306,38 @@ const start = (app) => {
255
306
  app.debug(` chainRateFeetPerMinute: ${props.chainRateFeetPerMinute}`);
256
307
  app.debug(` chainCounterPath: ${props.chainCounterPath}`);
257
308
  app.debug(` chainCounterResetPath: ${props.chainCounterResetPath}`);
309
+ app.debug(` externalUpPath: ${props.externalUpPath}`);
310
+ app.debug(` externalDownPath: ${props.externalDownPath}`);
258
311
  // Initialize chain counter
259
312
  lastChainUpdate = Date.now();
313
+ const subscriptionPaths = [
314
+ {
315
+ path: props.upRelayPath,
316
+ period: 100
317
+ },
318
+ {
319
+ path: props.downRelayPath,
320
+ period: 100
321
+ }
322
+ ];
323
+ // Add external control paths if configured
324
+ if (props.externalUpPath && props.chainRateFeetPerMinute > 0) {
325
+ subscriptionPaths.push({
326
+ path: props.externalUpPath,
327
+ period: 100
328
+ });
329
+ app.debug(`Added external up path subscription: ${props.externalUpPath}`);
330
+ }
331
+ if (props.externalDownPath && props.chainRateFeetPerMinute > 0) {
332
+ subscriptionPaths.push({
333
+ path: props.externalDownPath,
334
+ period: 100
335
+ });
336
+ app.debug(`Added external down path subscription: ${props.externalDownPath}`);
337
+ }
260
338
  const subscriptionOptions = {
261
339
  context: 'vessels.self',
262
- subscribe: [
263
- {
264
- path: props.upRelayPath,
265
- period: 100
266
- },
267
- {
268
- path: props.downRelayPath,
269
- period: 100
270
- }
271
- ]
340
+ subscribe: subscriptionPaths
272
341
  };
273
342
  app.debug('Setting up subscriptions for relay monitoring');
274
343
  app.subscriptionmanager.subscribe(subscriptionOptions, onStop, (error) => {
@@ -286,6 +355,16 @@ const start = (app) => {
286
355
  downRelayState = Boolean(value.value);
287
356
  updateWindlassState();
288
357
  }
358
+ else if (value.path === props.externalUpPath) {
359
+ app.debug(`External up control changed: ${externalUpState} -> ${Boolean(value.value)}`);
360
+ externalUpState = Boolean(value.value);
361
+ updateExternalWindlassState();
362
+ }
363
+ else if (value.path === props.externalDownPath) {
364
+ app.debug(`External down control changed: ${externalDownState} -> ${Boolean(value.value)}`);
365
+ externalDownState = Boolean(value.value);
366
+ updateExternalWindlassState();
367
+ }
289
368
  });
290
369
  });
291
370
  });
@@ -463,7 +542,7 @@ const start = (app) => {
463
542
  type: 'number',
464
543
  title: 'Direction Switch Delay (seconds)',
465
544
  description: 'Delay when switching between up and down directions (0 = no delay)',
466
- default: 5
545
+ default: 1
467
546
  },
468
547
  chainRateFeetPerMinute: {
469
548
  type: 'number',
@@ -482,6 +561,18 @@ const start = (app) => {
482
561
  title: 'Chain Counter Reset Path',
483
562
  description: 'Signal K path for chain counter reset command',
484
563
  default: 'electrical.windlass.chainCounterReset.state'
564
+ },
565
+ externalUpPath: {
566
+ type: 'string',
567
+ title: 'External Up Control Path (Optional)',
568
+ description: 'Signal K path for external windlass up control - used for chain counter tracking only',
569
+ default: 'electrical.windlass.externalUp.state'
570
+ },
571
+ externalDownPath: {
572
+ type: 'string',
573
+ title: 'External Down Control Path (Optional)',
574
+ description: 'Signal K path for external windlass down control - used for chain counter tracking only',
575
+ default: 'electrical.windlass.externalDown.state'
485
576
  }
486
577
  }
487
578
  }
@@ -517,6 +608,18 @@ const start = (app) => {
517
608
  ]
518
609
  });
519
610
  }
611
+ // Determine and send the current overall windlass state
612
+ // External control takes precedence over relay control
613
+ function updateOverallWindlassState() {
614
+ if (!started)
615
+ return;
616
+ // External control takes precedence
617
+ const overallState = externalCurrentState !== WindlassState.Off
618
+ ? externalCurrentState
619
+ : currentState;
620
+ app.debug(`Overall windlass state: ${overallState} (external: ${externalCurrentState}, relay: ${currentState})`);
621
+ sendState(overallState);
622
+ }
520
623
  function setWindlassUp(cb) {
521
624
  app.debug('Executing windlass UP: turning off down relay first');
522
625
  app.putSelfPath(props.downRelayPath, false, (reply) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "signalk-relay-windlass",
3
- "version": "0.0.4",
3
+ "version": "1.0.0",
4
4
  "description": "Signal K Plugin to control a windlass using two relay switches",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -0,0 +1,460 @@
1
+ import { expect } from 'chai'
2
+ import { describe, it, beforeEach, afterEach } from 'mocha'
3
+ import windlassPlugin from '../src/index'
4
+
5
+ // Enhanced mock for external control testing
6
+ class ExternalControlMockAPI {
7
+ public messages: any[] = []
8
+ public subscriptions: any[] = []
9
+ public putHandlers: Map<string, Function> = new Map()
10
+ public relayStates: Map<string, boolean> = new Map()
11
+
12
+ debug() {}
13
+ error() {}
14
+
15
+ handleMessage(pluginId: string, message: any) {
16
+ this.messages.push({ pluginId, message, timestamp: Date.now() })
17
+ }
18
+
19
+ subscriptionmanager = {
20
+ subscribe: (
21
+ options: any,
22
+ onStop: any[],
23
+ errorCallback: Function,
24
+ deltaCallback: Function
25
+ ) => {
26
+ this.subscriptions.push({ options, onStop, errorCallback, deltaCallback })
27
+ return { unsubscribe: () => {} }
28
+ }
29
+ }
30
+
31
+ registerPutHandler(context: string, path: string, handler: Function) {
32
+ this.putHandlers.set(path, handler)
33
+ }
34
+
35
+ putSelfPath(path: string, value: any, callback?: Function) {
36
+ this.relayStates.set(path, Boolean(value))
37
+
38
+ // Also trigger subscription for relay paths
39
+ if (path.includes('relay') || path.includes('.state')) {
40
+ this.simulatePathChange(path, Boolean(value))
41
+ }
42
+
43
+ if (callback) {
44
+ setTimeout(() => {
45
+ callback({ state: 'COMPLETED', statusCode: 200 })
46
+ }, 1)
47
+ }
48
+ }
49
+
50
+ simulatePathChange(path: string, value: boolean) {
51
+ const subscription = this.subscriptions[0]
52
+ if (subscription && subscription.deltaCallback) {
53
+ subscription.deltaCallback({
54
+ updates: [
55
+ {
56
+ values: [
57
+ {
58
+ path: path,
59
+ value: value
60
+ }
61
+ ]
62
+ }
63
+ ]
64
+ })
65
+ }
66
+ }
67
+
68
+ // Helper method to get latest chain counter value
69
+ getLatestChainCounterValue() {
70
+ for (let i = this.messages.length - 1; i >= 0; i--) {
71
+ const message = this.messages[i]
72
+ const updates = message.message?.updates || []
73
+ for (const update of updates) {
74
+ const values = update.values || []
75
+ for (const value of values) {
76
+ if (value.path === 'navigation.anchor.chainOut') {
77
+ return value.value
78
+ }
79
+ }
80
+ }
81
+ }
82
+ return null
83
+ }
84
+
85
+ reset() {
86
+ this.messages = []
87
+ this.subscriptions = []
88
+ this.putHandlers.clear()
89
+ this.relayStates.clear()
90
+ }
91
+ }
92
+
93
+ describe('External Control Tests', () => {
94
+ let mockApp: ExternalControlMockAPI
95
+ let plugin: any
96
+ let externalConfig: any
97
+
98
+ beforeEach(() => {
99
+ mockApp = new ExternalControlMockAPI()
100
+ plugin = windlassPlugin(mockApp)
101
+ externalConfig = {
102
+ windlassPath: 'electrical.windlass.control.state',
103
+ upRelayPath: 'electrical.windlass.up.state',
104
+ downRelayPath: 'electrical.windlass.down.state',
105
+ timeoutSeconds: 30,
106
+ switchingDelaySeconds: 0,
107
+ chainRateFeetPerMinute: 60, // 1 foot per second for easy calculation
108
+ chainCounterPath: 'navigation.anchor.chainOut',
109
+ chainCounterResetPath: 'navigation.anchor.chainOut.reset',
110
+ externalUpPath: 'electrical.external.windlass.up',
111
+ externalDownPath: 'electrical.external.windlass.down'
112
+ }
113
+ })
114
+
115
+ afterEach(() => {
116
+ if (plugin && plugin.stop) {
117
+ plugin.stop()
118
+ }
119
+ mockApp.reset()
120
+ })
121
+
122
+ describe('Configuration', () => {
123
+ it('should include external control paths in schema', () => {
124
+ expect(plugin.schema.properties.externalUpPath).to.exist
125
+ expect(plugin.schema.properties.externalDownPath).to.exist
126
+ expect(plugin.schema.properties.externalUpPath.title).to.include(
127
+ 'External Up Control Path'
128
+ )
129
+ expect(plugin.schema.properties.externalDownPath.title).to.include(
130
+ 'External Down Control Path'
131
+ )
132
+ })
133
+
134
+ it('should start with external control paths configured', () => {
135
+ plugin.start(externalConfig, () => {})
136
+
137
+ // Should have subscriptions for external paths
138
+ expect(mockApp.subscriptions.length).to.equal(1)
139
+ const subscription = mockApp.subscriptions[0]
140
+ const subscribedPaths = subscription.options.subscribe.map(
141
+ (s: any) => s.path
142
+ )
143
+
144
+ expect(subscribedPaths).to.include(externalConfig.externalUpPath)
145
+ expect(subscribedPaths).to.include(externalConfig.externalDownPath)
146
+ })
147
+
148
+ it('should work without external control paths configured', () => {
149
+ const configWithoutExternal = { ...externalConfig }
150
+ delete configWithoutExternal.externalUpPath
151
+ delete configWithoutExternal.externalDownPath
152
+
153
+ plugin.start(configWithoutExternal, () => {})
154
+
155
+ // Should still work normally with just relay paths
156
+ const subscription = mockApp.subscriptions[0]
157
+ const subscribedPaths = subscription.options.subscribe.map(
158
+ (s: any) => s.path
159
+ )
160
+
161
+ expect(subscribedPaths).to.include(configWithoutExternal.upRelayPath)
162
+ expect(subscribedPaths).to.include(configWithoutExternal.downRelayPath)
163
+ expect(subscribedPaths).to.not.include('electrical.external.windlass.up')
164
+ })
165
+ })
166
+
167
+ describe('Chain Counter with External Control', () => {
168
+ beforeEach(() => {
169
+ plugin.start(externalConfig, () => {})
170
+ })
171
+
172
+ it('should update chain counter when external up control is active', (done) => {
173
+ // Clear any initial chain messages
174
+ mockApp.messages = []
175
+
176
+ // First deploy some chain using down control
177
+ mockApp.simulatePathChange(externalConfig.externalDownPath, true)
178
+
179
+ setTimeout(() => {
180
+ // Stop down control
181
+ mockApp.simulatePathChange(externalConfig.externalDownPath, false)
182
+
183
+ setTimeout(() => {
184
+ // Get the chain value after deployment
185
+ const deployedChainValue = mockApp.getLatestChainCounterValue()
186
+ console.log('Deployed chain value:', deployedChainValue)
187
+
188
+ // Clear messages and start up control to retrieve chain
189
+ mockApp.messages = []
190
+ mockApp.simulatePathChange(externalConfig.externalUpPath, true)
191
+
192
+ setTimeout(() => {
193
+ // Stop up control
194
+ mockApp.simulatePathChange(externalConfig.externalUpPath, false)
195
+
196
+ setTimeout(() => {
197
+ // Log all messages for debugging
198
+ const chainMessages = mockApp.messages.filter(
199
+ (m) =>
200
+ m.message?.updates?.[0]?.values?.[0]?.path ===
201
+ 'navigation.anchor.chainOut'
202
+ )
203
+ console.log(
204
+ 'Up chain messages:',
205
+ chainMessages.map((m) => m.message.updates[0].values[0].value)
206
+ )
207
+
208
+ const finalChainValue = mockApp.getLatestChainCounterValue()
209
+ console.log('Final chain value after retrieval:', finalChainValue)
210
+
211
+ // Should be less than what was deployed
212
+ expect(finalChainValue).to.be.lessThan(deployedChainValue)
213
+ done()
214
+ }, 50)
215
+ }, 300) // Retrieve for 0.3 seconds
216
+ }, 50)
217
+ }, 300) // Deploy for 0.3 seconds first
218
+ }).timeout(3000)
219
+
220
+ it('should update chain counter when external down control is active', (done) => {
221
+ // Simulate external down control activation
222
+ mockApp.simulatePathChange(externalConfig.externalDownPath, true)
223
+
224
+ setTimeout(() => {
225
+ // Stop external control
226
+ mockApp.simulatePathChange(externalConfig.externalDownPath, false)
227
+
228
+ setTimeout(() => {
229
+ const chainValue = mockApp.getLatestChainCounterValue()
230
+ expect(chainValue).to.be.greaterThan(0) // Should be positive (chain going out)
231
+ done()
232
+ }, 50)
233
+ }, 500) // Run for 0.5 seconds
234
+ }).timeout(2000)
235
+
236
+ it('should prioritize external control over relay control for chain counter', (done) => {
237
+ // First deploy some chain using relay control
238
+ mockApp.simulatePathChange(externalConfig.downRelayPath, true)
239
+
240
+ setTimeout(() => {
241
+ mockApp.simulatePathChange(externalConfig.downRelayPath, false)
242
+ const deployedValue = mockApp.getLatestChainCounterValue()
243
+
244
+ // Clear messages and start external down control to deploy more
245
+ mockApp.messages = []
246
+ mockApp.simulatePathChange(externalConfig.externalDownPath, true)
247
+
248
+ setTimeout(() => {
249
+ // Stop external control
250
+ mockApp.simulatePathChange(externalConfig.externalDownPath, false)
251
+
252
+ setTimeout(() => {
253
+ const finalValue = mockApp.getLatestChainCounterValue()
254
+
255
+ // Should have added more chain
256
+ expect(finalValue).to.be.greaterThan(deployedValue)
257
+ done()
258
+ }, 50)
259
+ }, 300) // External control for 0.3 seconds
260
+ }, 300) // Initial deployment
261
+ }).timeout(2000)
262
+
263
+ it('should not interfere with relay-controlled windlass PUT handlers', (done) => {
264
+ const windlassHandler = mockApp.putHandlers.get(
265
+ externalConfig.windlassPath
266
+ )
267
+ expect(windlassHandler).to.exist
268
+
269
+ // External control should not affect PUT handler registration
270
+ const result = windlassHandler(
271
+ 'vessels.self',
272
+ externalConfig.windlassPath,
273
+ 'up',
274
+ (callbackResult: any) => {
275
+ expect(callbackResult.state).to.equal('COMPLETED')
276
+ setTimeout(() => {
277
+ expect(mockApp.relayStates.get(externalConfig.upRelayPath)).to.be
278
+ .true
279
+
280
+ // Check that windlass state path reflects the relay up state
281
+ const windlassStateMessage = mockApp.messages.find(
282
+ (m) =>
283
+ m.message?.updates?.[0]?.values?.[0]?.path ===
284
+ externalConfig.windlassPath &&
285
+ m.message?.updates?.[0]?.values?.[0]?.value === 'up'
286
+ )
287
+ expect(windlassStateMessage).to.exist
288
+
289
+ done()
290
+ }, 50)
291
+ }
292
+ )
293
+
294
+ // The direct return should be PENDING
295
+ expect(result.state).to.equal('PENDING')
296
+ })
297
+ })
298
+
299
+ describe('Mixed Control Scenarios', () => {
300
+ beforeEach(() => {
301
+ plugin.start(externalConfig, () => {})
302
+ })
303
+
304
+ it('should handle simultaneous relay and external control properly', (done) => {
305
+ // Start with relay control up
306
+ mockApp.simulatePathChange(externalConfig.upRelayPath, true)
307
+
308
+ // After a short time, start external down control
309
+ setTimeout(() => {
310
+ mockApp.simulatePathChange(externalConfig.externalDownPath, true)
311
+
312
+ // Stop relay control while external continues
313
+ setTimeout(() => {
314
+ mockApp.simulatePathChange(externalConfig.upRelayPath, false)
315
+
316
+ // Finally stop external control
317
+ setTimeout(() => {
318
+ mockApp.simulatePathChange(externalConfig.externalDownPath, false)
319
+
320
+ setTimeout(() => {
321
+ const chainValue = mockApp.getLatestChainCounterValue()
322
+ // Chain movement should reflect external control taking precedence
323
+ expect(chainValue).to.be.a('number')
324
+ done()
325
+ }, 50)
326
+ }, 200)
327
+ }, 200)
328
+ }, 200)
329
+ }).timeout(3000)
330
+ })
331
+
332
+ describe('Windlass State Path Updates', () => {
333
+ beforeEach(() => {
334
+ plugin.start(externalConfig, () => {})
335
+ })
336
+
337
+ it('should update windlass state path when external up control is active', (done) => {
338
+ // Clear initial messages
339
+ mockApp.messages = []
340
+
341
+ // Simulate external up control
342
+ mockApp.simulatePathChange(externalConfig.externalUpPath, true)
343
+
344
+ setTimeout(() => {
345
+ // Should have windlass state path update
346
+ const windlassStateMessage = mockApp.messages.find(
347
+ (m) =>
348
+ m.message?.updates?.[0]?.values?.[0]?.path ===
349
+ externalConfig.windlassPath &&
350
+ m.message?.updates?.[0]?.values?.[0]?.value === 'up'
351
+ )
352
+ expect(windlassStateMessage).to.exist
353
+
354
+ // Turn off external control
355
+ mockApp.simulatePathChange(externalConfig.externalUpPath, false)
356
+
357
+ setTimeout(() => {
358
+ // Should update to off state
359
+ const offStateMessage = mockApp.messages.find(
360
+ (m) =>
361
+ m.message?.updates?.[0]?.values?.[0]?.path ===
362
+ externalConfig.windlassPath &&
363
+ m.message?.updates?.[0]?.values?.[0]?.value === 'off'
364
+ )
365
+ expect(offStateMessage).to.exist
366
+ done()
367
+ }, 50)
368
+ }, 50)
369
+ })
370
+
371
+ it('should update windlass state path when external down control is active', (done) => {
372
+ // Clear initial messages
373
+ mockApp.messages = []
374
+
375
+ // Simulate external down control
376
+ mockApp.simulatePathChange(externalConfig.externalDownPath, true)
377
+
378
+ setTimeout(() => {
379
+ // Should have windlass state path update
380
+ const windlassStateMessage = mockApp.messages.find(
381
+ (m) =>
382
+ m.message?.updates?.[0]?.values?.[0]?.path ===
383
+ externalConfig.windlassPath &&
384
+ m.message?.updates?.[0]?.values?.[0]?.value === 'down'
385
+ )
386
+ expect(windlassStateMessage).to.exist
387
+
388
+ done()
389
+ }, 50)
390
+ })
391
+
392
+ it('should prioritize external control state over relay control state', (done) => {
393
+ // Start relay up control
394
+ mockApp.simulatePathChange(externalConfig.upRelayPath, true)
395
+
396
+ setTimeout(() => {
397
+ // Should show up state
398
+ let windlassStateMessages = mockApp.messages.filter(
399
+ (m) =>
400
+ m.message?.updates?.[0]?.values?.[0]?.path ===
401
+ externalConfig.windlassPath
402
+ )
403
+ expect(
404
+ windlassStateMessages[windlassStateMessages.length - 1].message
405
+ .updates[0].values[0].value
406
+ ).to.equal('up')
407
+
408
+ // Clear messages and start external down control
409
+ mockApp.messages = []
410
+ mockApp.simulatePathChange(externalConfig.externalDownPath, true)
411
+
412
+ setTimeout(() => {
413
+ // Should now show down state (external takes precedence)
414
+ const externalStateMessage = mockApp.messages.find(
415
+ (m) =>
416
+ m.message?.updates?.[0]?.values?.[0]?.path ===
417
+ externalConfig.windlassPath &&
418
+ m.message?.updates?.[0]?.values?.[0]?.value === 'down'
419
+ )
420
+ expect(externalStateMessage).to.exist
421
+
422
+ // Stop external control
423
+ mockApp.simulatePathChange(externalConfig.externalDownPath, false)
424
+
425
+ setTimeout(() => {
426
+ // Should revert to relay state (up)
427
+ const revertStateMessage = mockApp.messages.find(
428
+ (m) =>
429
+ m.message?.updates?.[0]?.values?.[0]?.path ===
430
+ externalConfig.windlassPath &&
431
+ m.message?.updates?.[0]?.values?.[0]?.value === 'up'
432
+ )
433
+ expect(revertStateMessage).to.exist
434
+ done()
435
+ }, 50)
436
+ }, 50)
437
+ }, 50)
438
+ })
439
+ })
440
+
441
+ describe('External Control Without Chain Counter', () => {
442
+ it('should not subscribe to external paths when chain counter is disabled', () => {
443
+ const configNoChain = { ...externalConfig }
444
+ configNoChain.chainRateFeetPerMinute = 0 // Disable chain counter
445
+
446
+ plugin.start(configNoChain, () => {})
447
+
448
+ const subscription = mockApp.subscriptions[0]
449
+ const subscribedPaths = subscription.options.subscribe.map(
450
+ (s: any) => s.path
451
+ )
452
+
453
+ // Should only have relay paths, not external paths
454
+ expect(subscribedPaths).to.include(configNoChain.upRelayPath)
455
+ expect(subscribedPaths).to.include(configNoChain.downRelayPath)
456
+ expect(subscribedPaths).to.not.include(configNoChain.externalUpPath)
457
+ expect(subscribedPaths).to.not.include(configNoChain.externalDownPath)
458
+ })
459
+ })
460
+ })