@mxtommy/kip 4.6.0 → 4.7.0-beta.2

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 (34) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/package.json +5 -5
  3. package/plugin/index.js +38 -40
  4. package/public/3rdpartylicenses.txt +36 -0
  5. package/public/assets/help-docs/dashboards.md +3 -3
  6. package/public/assets/help-docs/datainspector.md +3 -3
  7. package/public/assets/help-docs/history-api.md +31 -21
  8. package/public/assets/help-docs/menu.json +1 -1
  9. package/public/assets/help-docs/nodered-control-flows.md +4 -4
  10. package/public/assets/help-docs/putcontrols.md +6 -6
  11. package/public/assets/help-docs/widget-historical-series.md +55 -11
  12. package/public/assets/help-docs/zones.md +1 -1
  13. package/public/assets/svg/icons.svg +17 -0
  14. package/public/{chunk-AC6VD2FN.js → chunk-2GOHQZH5.js} +4 -4
  15. package/public/{chunk-3JA4CQ7T.js → chunk-3MSOVKX6.js} +4 -4
  16. package/public/{chunk-BMHMHQFO.js → chunk-64MHGMIL.js} +1 -1
  17. package/public/{chunk-B4NYOD6L.js → chunk-7EAIOLCB.js} +1 -1
  18. package/public/{chunk-UYHRT3PR.js → chunk-7H5VXIPS.js} +1 -1
  19. package/public/{chunk-ZY3U4H4Z.js → chunk-AZC2WKQI.js} +1 -1
  20. package/public/{chunk-MGLD6QDJ.js → chunk-B3VMWHNV.js} +5 -5
  21. package/public/{chunk-PPF5S5CV.js → chunk-CHMMSVYD.js} +1 -1
  22. package/public/{chunk-CYTLQDGF.js → chunk-CMHH7BXX.js} +1 -1
  23. package/public/{chunk-MDNGWQNG.js → chunk-EZZ4IJBX.js} +7 -7
  24. package/public/{chunk-5SAXWR6Z.js → chunk-FVGLVFWP.js} +8 -8
  25. package/public/{chunk-QU3JR4YV.js → chunk-FYDLTNP4.js} +1 -1
  26. package/public/chunk-MXUEYEZU.js +5 -0
  27. package/public/{chunk-ZXO4VMEH.js → chunk-NFUW7ILE.js} +1 -1
  28. package/public/{chunk-356CW47X.js → chunk-NK7SNP45.js} +1 -1
  29. package/public/{chunk-NJISHUGY.js → chunk-PTLDR7X7.js} +1 -1
  30. package/public/chunk-Y4DXERRE.js +50 -0
  31. package/public/index.html +1 -1
  32. package/public/{main-I33LH3HC.js → main-VB3XIM4H.js} +1 -1
  33. package/public/chunk-6A4NRSCL.js +0 -5
  34. package/public/chunk-P3M6SJQT.js +0 -50
package/CHANGELOG.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # v4.6.0
2
2
  ## Improvements
3
- * Built-in Time-Series storage and History-API provider now use the native node:sqlite feature, eliminating all binary and external dependencies.
3
+ * Built-in Time-Series storage and History-API provider now use the native node:sqlite feature, eliminating binary and external dependencies.
4
4
  * Requires Node.js 22.5.0 or newer. If you use an older Node.js version, you must select an alternative History-API provider.
5
- * **IMPORTANT:** Before upgrading Node.js, always confirm your Signal K server version supports the required Node.js version. See the [Signal K installation documentation](https://demo.signalk.org/documentation/Installation.html).
5
+ * **IMPORTANT:** Before upgrading Node.js, always confirm your Signal K server and OS supports the required Node.js version. See the [Signal K installation documentation](https://demo.signalk.org/documentation/Installation.html).
6
6
  ## Fixes
7
7
  * Extending v4.5.x features to VenusOS (32bit OS) - Error: Failed to start: Error loading duckdb native binding: unsupported arch 'arm' for platform 'linux'. Fixes #979
8
8
  * Uninstallation does not remove all files. Fixes #981
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxtommy/kip",
3
- "version": "4.6.0",
3
+ "version": "4.7.0-beta.2",
4
4
  "description": "An advanced and versatile marine instrumentation package to display Signal K data.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -76,10 +76,10 @@
76
76
  "@angular/platform-browser": "21.2.1",
77
77
  "@angular/platform-browser-dynamic": "21.2.1",
78
78
  "@angular/router": "21.2.1",
79
- "@angular-devkit/build-angular": "^21.1.4",
79
+ "@angular-devkit/build-angular": "^21.2.1",
80
80
  "@angular-devkit/schematics-cli": "^20.1.6",
81
- "@angular/build": "^21.1.4",
82
- "@angular/cli": "^21.1.4",
81
+ "@angular/build": "^21.2.1",
82
+ "@angular/cli": "^21.2.1",
83
83
  "@angular/compiler-cli": "21.2.1",
84
84
  "@angular/language-service": "21.2.1",
85
85
  "@types/canvas-gauges": "^2.1.8",
@@ -89,7 +89,7 @@
89
89
  "@types/js-quantities": "^1.6.6",
90
90
  "@types/lodash-es": "^4.17.9",
91
91
  "@types/node": "^24.1.0",
92
- "angular-eslint": "21.2.0",
92
+ "angular-eslint": "21.3.0",
93
93
  "codelyzer": "^6.0.0",
94
94
  "eslint": "^9.29.0",
95
95
  "jasmine-core": "~4.0.1",
package/plugin/index.js CHANGED
@@ -37,6 +37,14 @@ const server_api_1 = require("@signalk/server-api");
37
37
  const openapi = __importStar(require("./openApi.json"));
38
38
  const history_series_service_1 = require("./history-series.service");
39
39
  const sqlite_history_storage_service_1 = require("./sqlite-history-storage.service");
40
+ async function defaultGetSqliteModule() {
41
+ try {
42
+ return await Promise.resolve().then(() => __importStar(require('node:sqlite')));
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
40
48
  const start = (server) => {
41
49
  const mutableOpenApi = JSON.parse(JSON.stringify(openapi.default ?? openapi));
42
50
  const API_PATHS = {
@@ -87,7 +95,6 @@ const start = (server) => {
87
95
  const SQLITE_INIT_WAIT_TIMEOUT_MS = 5000;
88
96
  const MIN_NODE_SQLITE_VERSION = '22.5.0';
89
97
  let streamUnsubscribes = [];
90
- let historyApiRegistry = null;
91
98
  let historyApiProviderRegistered = false;
92
99
  let runtimeSqliteUnavailableMessage = null;
93
100
  function logRuntimeDependencyVersions() {
@@ -95,16 +102,12 @@ const start = (server) => {
95
102
  const sqliteAvailability = modeConfig && modeConfig.nodeSqliteAvailable ? 'available' : 'unavailable';
96
103
  server.debug(`[KIP][RUNTIME] ${nodeIdentity} node:sqlite=${sqliteAvailability}`);
97
104
  }
98
- async function getSqliteModule() {
99
- try {
100
- return await Promise.resolve().then(() => __importStar(require('node:sqlite')));
101
- }
102
- catch {
103
- return null;
104
- }
105
- }
106
105
  async function detectSqliteRuntime() {
107
- const sqliteModule = await getSqliteModule();
106
+ const exportedStart = start;
107
+ const resolveSqliteModule = typeof exportedStart.getSqliteModule === 'function'
108
+ ? exportedStart.getSqliteModule
109
+ : defaultGetSqliteModule;
110
+ const sqliteModule = await resolveSqliteModule();
108
111
  if (!sqliteModule) {
109
112
  runtimeSqliteUnavailableMessage = `node:sqlite requires Node ${MIN_NODE_SQLITE_VERSION}+`;
110
113
  return false;
@@ -470,7 +473,17 @@ const start = (server) => {
470
473
  server.debug('[KIP][HISTORY_PROVIDER] registration skipped reason=config-disabled');
471
474
  return;
472
475
  }
473
- const host = server;
476
+ const serverWithHistoryApi = server;
477
+ const registerHistoryApiProvider = typeof serverWithHistoryApi.registerHistoryApiProvider === 'function'
478
+ ? serverWithHistoryApi.registerHistoryApiProvider.bind(serverWithHistoryApi)
479
+ : (typeof serverWithHistoryApi.history?.registerHistoryApiProvider === 'function'
480
+ ? serverWithHistoryApi.history.registerHistoryApiProvider.bind(serverWithHistoryApi.history)
481
+ : null);
482
+ // guard when running in SK variants that do not support History API registration
483
+ if (!registerHistoryApiProvider) {
484
+ server.debug('[KIP][HISTORY_PROVIDER] registration skipped reason=api-unavailable');
485
+ return;
486
+ }
474
487
  const apiProvider = {
475
488
  getValues: async (query) => {
476
489
  const resolved = await resolveHistoryValues(buildHistoryQueryFromValuesRequest(query));
@@ -485,26 +498,9 @@ const start = (server) => {
485
498
  getPaths: (query) => resolveHistoryPaths(buildHistoryQueryFromRangeRequest(query)),
486
499
  getContexts: (query) => resolveHistoryContexts(buildHistoryQueryFromRangeRequest(query))
487
500
  };
488
- const registry = host.history && typeof host.history.registerHistoryApiProvider === 'function'
489
- ? host.history
490
- : (typeof host.registerHistoryApiProvider === 'function'
491
- ? {
492
- registerHistoryApiProvider: host.registerHistoryApiProvider.bind(host),
493
- unregisterHistoryApiProvider: typeof host.unregisterHistoryApiProvider === 'function'
494
- ? host.unregisterHistoryApiProvider.bind(host)
495
- : undefined
496
- }
497
- : null);
498
- if (registry && typeof registry.registerHistoryApiProvider === 'function') {
499
- registry.registerHistoryApiProvider(apiProvider);
500
- historyApiProviderRegistered = true;
501
- if (typeof registry.unregisterHistoryApiProvider === 'function') {
502
- historyApiRegistry = { unregisterHistoryApiProvider: registry.unregisterHistoryApiProvider.bind(registry) };
503
- }
504
- server.debug('[KIP][HISTORY_PROVIDER] registration success provider=kip');
505
- return;
506
- }
507
- server.debug('[KIP][HISTORY_PROVIDER] registration skipped reason=api-unavailable');
501
+ registerHistoryApiProvider(apiProvider);
502
+ historyApiProviderRegistered = true;
503
+ server.debug('[KIP][HISTORY_PROVIDER] registration success provider=kip');
508
504
  }
509
505
  function rebuildSeriesCaptureSubscriptions() {
510
506
  stopSeriesCapture();
@@ -742,16 +738,16 @@ const start = (server) => {
742
738
  .catch(() => undefined)
743
739
  .then(() => storageService.close(storageLifecycleToken))
744
740
  .catch(() => undefined);
745
- if (historyApiRegistry) {
746
- try {
747
- historyApiRegistry.unregisterHistoryApiProvider();
748
- server.debug('[KIP][HISTORY_PROVIDER] unregister success provider=kip');
749
- }
750
- catch (error) {
751
- server.error(`[HISTORY PROVIDER] unregister failed: ${String(error.message || error)}`);
752
- }
753
- historyApiRegistry = null;
741
+ const serverWithHistoryApi = server;
742
+ const unregisterHistoryApiProvider = typeof serverWithHistoryApi.unregisterHistoryApiProvider === 'function'
743
+ ? serverWithHistoryApi.unregisterHistoryApiProvider.bind(serverWithHistoryApi)
744
+ : (typeof serverWithHistoryApi.history?.unregisterHistoryApiProvider === 'function'
745
+ ? serverWithHistoryApi.history.unregisterHistoryApiProvider.bind(serverWithHistoryApi.history)
746
+ : null);
747
+ if (unregisterHistoryApiProvider) {
748
+ unregisterHistoryApiProvider();
754
749
  }
750
+ historyApiProviderRegistered = false;
755
751
  sqliteInitializationPromise = null;
756
752
  const msg = 'Stopped.';
757
753
  server.setPluginStatus(msg);
@@ -1093,4 +1089,6 @@ const start = (server) => {
1093
1089
  };
1094
1090
  return plugin;
1095
1091
  };
1092
+ const startWithHooks = start;
1093
+ startWithHooks.getSqliteModule = defaultGetSqliteModule;
1096
1094
  module.exports = start;
@@ -276,6 +276,42 @@ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
276
276
  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
277
277
  THIS SOFTWARE.
278
278
 
279
+ --------------------------------------------------------------------------------
280
+ Package: d3-path
281
+ License: "ISC"
282
+
283
+ Copyright 2015-2022 Mike Bostock
284
+
285
+ Permission to use, copy, modify, and/or distribute this software for any purpose
286
+ with or without fee is hereby granted, provided that the above copyright notice
287
+ and this permission notice appear in all copies.
288
+
289
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
290
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
291
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
292
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
293
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
294
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
295
+ THIS SOFTWARE.
296
+
297
+ --------------------------------------------------------------------------------
298
+ Package: d3-shape
299
+ License: "ISC"
300
+
301
+ Copyright 2010-2022 Mike Bostock
302
+
303
+ Permission to use, copy, modify, and/or distribute this software for any purpose
304
+ with or without fee is hereby granted, provided that the above copyright notice
305
+ and this permission notice appear in all copies.
306
+
307
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
308
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
309
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
310
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
311
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
312
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
313
+ THIS SOFTWARE.
314
+
279
315
  --------------------------------------------------------------------------------
280
316
  Package: d3-zoom
281
317
  License: "ISC"
@@ -69,9 +69,9 @@ KIP widgets turn Signal K data into readable visuals and controls. Available wid
69
69
  - **Position** – Displays latitude and longitude for location tracking and navigation.
70
70
  - **Static Label** – Add customizable labels to organize and clarify your dashboard layout.
71
71
  - **Zones State Panel**: Monitor the health/state of path data. Each panel control displays path data severity and status messages (driven by Signal K metadata zones).
72
- - **Switch Panel** – Group of toggle switches, indicator lights, and press buttons for digital switching and operations. See [Digital Switching and PUT Path Setup](putcontrols.md).
73
- - **Slider** – Range slider for adjusting values (e.g. lighting intensity). See [Digital Switching and PUT Path Setup](putcontrols.md).
74
- - **Multi State Switch** - Lists all available device/path operating modes/states (e.g., On, Off, Charge Only, Invert Only), highlights the current state, and lets you select a new state to send to the device and see the result. See [Digital Switching and PUT Path Setup](putcontrols.md).
72
+ - **Switch Panel** – Group of toggle switches, indicator lights, and press buttons for digital switching and operations. See [Digital Switching and PUT Path Setup](#/help/putcontrols.md).
73
+ - **Slider** – Range slider for adjusting values (e.g. lighting intensity). See [Digital Switching and PUT Path Setup](#/help/putcontrols.md).
74
+ - **Multi State Switch** - Lists all available device/path operating modes/states (e.g., On, Off, Charge Only, Invert Only), highlights the current state, and lets you select a new state to send to the device and see the result. See [Digital Switching and PUT Path Setup](#/help/putcontrols.md).
75
75
  - **Compact Linear** – Simple horizontal linear gauge with a large value label and modern look.
76
76
  - **Linear** – Horizontal or vertical linear gauge with zone highlighting.
77
77
  - **Radial** – Radial gauge with configurable dials and zone highlighting.
@@ -24,7 +24,7 @@ The Data Inspector is a good way to validate raw data and available paths withou
24
24
 
25
25
  2. **PUT Support**:
26
26
  - You can see if a path supports PUT operations, indicated by a green checkmark in the **PUT Support** column.
27
- - For more details on PUT support and how to use it, refer to the [Updating Signal K Data](putcontrols.md) help documentation.
27
+ - For more details on PUT support and how to use it, refer to the [Updating Signal K Data](#/help/putcontrols.md) help documentation.
28
28
 
29
29
  3. **Multiple Data Sources**:
30
30
  - The Data Inspector displays how many sources are providing data for each path.
@@ -42,8 +42,8 @@ The Data Inspector is a good way to validate raw data and available paths withou
42
42
 
43
43
  - **Verify PUT Support**:
44
44
  - Check if a path supports PUT operations. It is required to configure widgets like Switch Panel, Slider, or Multi State Switch.
45
- - For more details on PUT support and how to use it, refer to the [Updating Signal K Data](putcontrols.md) help documentation.
46
- - If you are learning Node-RED flows and want your flow to work with KIP digital switching widgets, continue with [Node-RED Control Flows for KIP Widgets (Beginner Guide)](nodered-control-flows.md).
45
+ - For more details on PUT support and how to use it, refer to the [Updating Signal K Data](#/help/putcontrols.md) help documentation.
46
+ - If you are learning Node-RED flows and want your flow to work with KIP digital switching widgets, continue with [Node-RED Control Flows for KIP Widgets (Beginner Guide)](#/help/nodered-control-flows.md).
47
47
 
48
48
  - **Troubleshoot Data Issues**:
49
49
  - The Data Inspector is a good troubleshooting tool, but it should be used with the Signal K Data Browser when trying to understand raw data and behavior. The combination of these tools provides a more complete picture of the data, its processing, and its behavior.
@@ -1,14 +1,8 @@
1
- ## Using the History-API to Obtain Historical Data
1
+ ## Using External History-API Provider to Obtain Historical Data
2
2
 
3
- KIP can automatically request History Provider historical data points when opening chart widgets, seamlessly integrating past data with live updates.
3
+ KIP can, using a special type of plugin called a History Provider, automatically request historical data points when opening chart widgets, seamlessly integrating past data with live updates.
4
4
 
5
- This enables the display of minutes, hours, days, weeks, etc. of pre-populated historical data immediately—no waiting, no empty charts. The History-API is used to achieve this.
6
-
7
- A History Provider can also be used as a source for the widget historical data feature.
8
-
9
- ## What Is the History-API?
10
-
11
- A Signal K server endpoint that provides access to recorded historical data. Behind the endpoint, the data is served by a history provider plugin. KIP automatically requests historical data points when opening chart widgets, pre-filling the chart instead of starting empty.
5
+ This enables the display of minutes, hours, days, weeks, etc. of pre-populated historical data immediately—no waiting, no empty charts.
12
6
 
13
7
  ## Which Widgets Support History?
14
8
 
@@ -20,15 +14,16 @@ A Signal K server endpoint that provides access to recorded historical data. Beh
20
14
  ### Wind Trends Widget
21
15
  - **Supported**: Yes, uses fixed paths (True Wind Direction and Speed).
22
16
  - **Requirements**: Time Span of `5 minutes` or `30 minutes`.
23
- - See [Wind Trends Fixed Paths](#wind-trends-fixed-paths) below for configuration details.
17
+ - See Wind Trends Fixed Paths below for configuration details.
24
18
 
25
- ### Numeric Widget (with Mini Chart)
19
+ ### Mini-chart
20
+ NOTE: This is the optional chart that can be display in the background of the Numeric Widget.
26
21
  - **Supported**: No. Mini charts use very short time windows (12 seconds) and skip history seeding.
27
22
  - Mini charts start live-only for performance reasons.
28
23
 
29
24
  ## What Plugins and Signal K Version Are Required?
30
25
 
31
- The History-API requires Signal K version 2.22.1 or above and one plugin that records data to a persistent store. Currently, two plugins support the History-API:
26
+ You will need both support for the History-API version 2 and a compatible History provider. The History-API version 2 was introduced in Signal K version 2.22.1. Currently, two plugins support the v2 History-API:
32
27
 
33
28
  ### 1. signalk-to-influxdb2, v2.0.0 or above
34
29
  - **Purpose**: Records Signal K data to an InfluxDB v2 time-series database. Requires pre-installed InfluxDB v2.
@@ -62,40 +57,55 @@ After history data loads:
62
57
  - The chart will display only live data starting from when it was opened.
63
58
  - This is normal and does not indicate an error.
64
59
 
65
- ## Wind Trends Fixed Paths
60
+ ## Provider Configuration Information
61
+
62
+ For performance reasons, all KIP charts display a maximum of 120 datapoints. KIP looks at the chart's configured time span 'window', and ask the provider to gather the requested data and to return results as 120 datapoints.
63
+
64
+ When configuring your provider's path sampling rates, insure your sampling rules meet this requirement. Slower sampling rates will create charts with fewer datapoints/of lesser resolution. Higher sampling rates will NOT create charts with more datapoints/of higher resolution.
65
+
66
+ ### Historical Widget Charts
67
+
68
+ Collect an appropriate mount of data samples for the smallest **last 15 minutes** window; every 7.5 seconds. Every 15 seconds is not too bad a resolution either.
69
+
70
+ ### Wind Trends Fixed Paths
66
71
 
67
72
  The Wind Trends widget uses two fixed Signal K paths:
68
73
  - **True Wind Direction**: `environment.wind.directionTrue`
69
74
  - **True Wind Speed**: `environment.wind.speedTrue`
70
75
 
71
- For Wind Trends to display historical data, both of these paths **must be configured in your chosen History-API plugin**. Check your plugin documentation to ensure these paths are included in the capture list.
76
+ For Wind Trends to display historical data, both of these paths **must be configured in your chosen History-API plugin**.
77
+
78
+ Plan an appropriate data sampling rate to support the chart duration (5 and 30 minutes are supported).
72
79
 
73
80
  ## Limitations
74
81
 
75
- For historical data to seed widgets, you need to, in most cases, manually configure your chosen provider to collect the said data. This is not an automatic process.
82
+ For historical data to seed charts, you need to, in most cases, to manually configure your chosen provider to collect the said data. This is not an automatic process when using a External History Provider.
76
83
 
77
84
  ## Troubleshooting
78
85
 
79
86
  ### History Data Is Not Showing
80
87
 
81
- **Check 1: Is the History-API plugin installed?**
88
+ **Check 1: Are the Technical Requirements Meet?**
89
+ - Confirm that Signal K server version 2.22.1 or above in installed.
90
+
91
+ **Check 2: Is the History-API plugin installed?**
82
92
  - Confirm that a History-API plugin is installed and enabled on your Signal K server.
83
93
  - Verify that the plugin is running without errors (check server logs).
84
94
 
85
- **Check 2: Are the paths configured in the plugin?**
95
+ **Check 3: Are the paths configured in the plugin?**
86
96
  - Open your plugin's configuration settings.
87
97
  - Confirm that the paths you're charting (e.g., `navigation.speedThroughWater`) are in the capture list.
88
98
 
89
- **Check 3: Is there historical data available?**
99
+ **Check 4: Is there historical data available?**
90
100
  - If the plugin was just installed, data will start recording from that moment forward.
91
101
  - Charts will not show history for times before the plugin was enabled or the path configured for recording.
92
102
  - Allow the plugin to record data for a while (days or weeks) before expecting deep history.
93
103
 
94
- **Check 4: Is the chart time scale eligible?**
104
+ **Check 5: Is the chart time scale eligible?**
95
105
  - Very short time scales (seconds) skip history seeding for performance.
96
106
  - Use time scales of **minutes or longer** to enable history seeding.
97
107
 
98
- **Check 5: Are there any network or permission issues?**
108
+ **Check 6: Are there any network or permission issues?**
99
109
  - Confirm that KIP can reach the Signal K server's History-API endpoint. Use the OpenApi link in the Server Admin pages to the test.
100
110
  - Check browser console logs (F12) for any HTTP errors from history requests.
101
111
 
@@ -113,4 +123,4 @@ For historical data to seed widgets, you need to, in most cases, manually config
113
123
  ## Questions or Issues?
114
124
 
115
125
  - Refer to the plugin and History-API documentation for plugin-specific configuration and troubleshooting.
116
- - For general questions or issues, see `Contact-Us` help page—the KIP community is active on Discord and GitHub.
126
+ - For general questions or issues, see `Contact-Us` help page—the Signal K community is active on Discord and GitHub.
@@ -12,7 +12,7 @@
12
12
  "items": [
13
13
  { "title": "Node-RED (Getting Started)", "file": "nodered-control-flows.md" },
14
14
  { "title": "The Embed Page Viewer", "file": "embedwidget.md" },
15
- { "title": "Using The History-API", "file": "history-api.md" },
15
+ { "title": "External History-API Provider", "file": "history-api.md" },
16
16
  { "title": "Grafana Integration", "file": "grafana.md" },
17
17
  { "title": "InfluxDB and Signal K", "file": "influxdb.md" }
18
18
  ]
@@ -2,7 +2,7 @@
2
2
 
3
3
  This guide is for first-time Node-RED users who want KIP control widgets to trigger real actions (like GPIO or relay switching) through Signal K. It is not a full Node-RED product guide or a complete flow-programming course. It focuses on the Signal K and KIP-specific parts you need for digital switching.
4
4
 
5
- Before you start building flows, read **[Digital Switching and PUT Path Setup](putcontrols.md)** so you understand the core concepts, data flow, and control logic.
5
+ Before you start building flows, read **[Digital Switching and PUT Path Setup](#/help/putcontrols.md)** so you understand the core concepts, data flow, and control logic.
6
6
 
7
7
  ## What You Are Building
8
8
 
@@ -120,6 +120,6 @@ Use these terms consistently while setting up your flow.
120
120
  Use these guides next as needed.
121
121
 
122
122
  - SignalK signalk-node-red: [Show and tell](https://github.com/SignalK/signalk-node-red/discussions/categories/show-and-tell)
123
- - Path requirements and widget compatibility: [Digital Switching and PUT Path Setup](putcontrols.md)
124
- - Finding paths and checking PUT support: [Data Inspector](datainspector.md)
125
- - Adding and configuring widgets: [Dashboards and Layout](dashboards.md)
123
+ - Path requirements and widget compatibility: [Digital Switching and PUT Path Setup](#/help/putcontrols.md)
124
+ - Finding paths and checking PUT support: [Data Inspector](#/help/datainspector.md)
125
+ - Adding and configuring widgets: [Dashboards and Layout](#/help/dashboards.md)
@@ -4,7 +4,7 @@ Use KIP digital switching controls when you want to do real actions from your da
4
4
 
5
5
  The focus here is practical KIP setup: what path type to use, what PUT support is needed, and how to avoid common configuration mistakes. This guide supports built-in server handlers, custom plugins, and Node-RED flows.
6
6
 
7
- If you are new to Node-RED, start with this guide, then continue with **[Node-RED Control Flows for KIP Widgets (Beginner Guide)](nodered-control-flows.md)** for beginner flow examples.
7
+ If you are new to Node-RED, start with this guide, then continue with **[Node-RED Control Flows for KIP Widgets (Beginner Guide)](#/help/nodered-control-flows.md)** for beginner flow examples.
8
8
 
9
9
  ## What PUT Does (and Does Not Do)
10
10
 
@@ -14,8 +14,8 @@ PUT writes a value to a Signal K path. By itself, that write does not trigger ha
14
14
 
15
15
  Examples of server-side handlers:
16
16
  - A built-in server handler
17
- - A Signal K plugin (see [Popular Digital Switching Plugins](#popular-digital-switching-plugins))
18
- - A Node-RED flow (see [Node-RED Control Flows for KIP Widgets (Beginner Guide)](nodered-control-flows.md))
17
+ - A Signal K plugin (see Popular Digital Switching Plugins)
18
+ - A Node-RED flow (see Node-RED Control Flows for KIP Widgets - Beginner Guide)
19
19
 
20
20
  ## Basic Requirements
21
21
 
@@ -96,6 +96,6 @@ If something does not work, check these first.
96
96
 
97
97
  Use these guides next as needed.
98
98
 
99
- - **Node-RED beginners:** [Node-RED Control Flows for KIP Widgets (Beginner Guide)](nodered-control-flows.md)
100
- - **Path discovery and validation:** [Data Inspector](datainspector.md)
101
- - **Widget overview and placement:** [Dashboards and Layout](dashboards.md)
99
+ - **Node-RED beginners:** [Node-RED Control Flows for KIP Widgets (Beginner Guide)](#/help/nodered-control-flows.md)
100
+ - **Path discovery and validation:** [Data Inspector](#/help/datainspector.md)
101
+ - **Widget overview and placement:** [Dashboards and Layout](#/help/dashboards.md)
@@ -1,8 +1,49 @@
1
+ ## What is Historical Widget Data
1
2
 
3
+ KIP is built first for live sailing data.
4
+ To make charts useful right away and give you easy access to widget history, KIP includes a simple built-in history feature called Time-Series.
2
5
 
3
- ## Widget Historical Chart
6
+ With this built-in feature, KIP automatically:
7
+ 1. Keeps widget history available for quick viewing.
8
+ 2. Pre-seeds Data Chart and Wind Trends so they show recent trends immediately.
9
+ 3. Syncs with dashboard and widget configuration, and automatically prunes old or unused data.
4
10
 
5
- Widgets that use numeric paths automatically track and store data for their configured paths. This lets you easily view charts showing the last 15 minutes, 1 hour, 8 hours, or 24 hours of data.
11
+ ## Who Is It For
12
+
13
+ This is for users who want history to “just work”:
14
+ * No extra setup.
15
+ * No plugin to install.
16
+ * No data storage rules and retention policies to configure.
17
+
18
+ It is made for quick, hassle-free chart history, not data engineering.
19
+
20
+ ## Built-In Time-Series vs External History Provider
21
+
22
+ ### Built-In Time-Series (default)
23
+ - Works automatically with your dashboards and widgets.
24
+ - Stores only the data KIP needs for widget history and chart startup.
25
+ - Keeps a small rolling history and removes older data.
26
+ - If you change widgets or chart paths, KIP updates history storage rules automatically.
27
+ - No screen to manually manage what gets recorded.
28
+
29
+ #### What Time-Series Don't Do
30
+ - KIP’s built-in Time-Series is not a full data-logging system. You cannot manually set capture paths, sampling policies, or long-term retention rules in built-in mode. Use an External History Provider for this purpose.
31
+ - The dialog window displaying widget history offers **a fixed set** of the last 15 minutes, 1 hour, 8 hours, or 24 hours of data. If you are in need of more flexible and powerful data analytics capabilities, use Grafana and similar purpose built, comprehensive platforms.
32
+
33
+ ### External History Provider (advanced)
34
+
35
+ KIP can disable its built-in Time-Series/provider registration and query any History-API compatible provider instead.
36
+ You then manage capture and retention in that provider.
37
+
38
+ Choose this if you need full control, such as:
39
+
40
+ - Long-term record keeping.
41
+ - Custom retention and sampling rules.
42
+ - Analytics or integration with other tools.
43
+
44
+ When you switch to an external History-API provider, KIP still uses History API queries, but capture/retention behavior is managed by that provider so you then have to **manually manage capture and retention in that provider**.
45
+
46
+ See [External History-API Provider](#/help/history-api.md) for details.
6
47
 
7
48
  ## Accessing Widget Historical Charts
8
49
 
@@ -42,25 +83,28 @@ After history data loads:
42
83
  - The chart smoothly transitions from history to live updates.
43
84
  - Old data points are removed to maintain a rolling window of the configured time scale.
44
85
 
45
- ## How Does Historical Widget Data Work?
46
-
47
- KIP and its server-side plugin work together to seamlessly monitor dashboard and widget configurations requiring historical data. For numeric and chart-type widgets (such as Data Chart and Wind Trends), time-series data is automatically captured and managed in the background. This enables pre-filling the chart instead of starting empty.
86
+ ## What are the Requirements for Historical Widget Data To Work?
48
87
 
49
- Time-series data is pruned automatically, retaining only the data required by active widgets and only for the time ranges those widgets display. This process is fully transparent, requires no manual intervention, and keeps server storage efficient and lean.
88
+ I use KIP's Time-Series built-in feature:
89
+ - Node.JS v20.5.0+: The built-in automatic Time-Series feature (integrated management of data) uses node:sqlite released in Node.JS v20.5.0.
90
+ - Signal K version 2.22.1+: The history querying service uses the History-API v2, introduced in Signal K version 2.22.1.
50
91
 
51
- This feature uses History-API v2 query/request, introduced in Signal K version 2.22.1.
92
+ I use an External History Provider:
93
+ - Signal K version 2.22.1+: The history querying service uses the History-API v2, introduced in Signal K version 2.22.1.
52
94
 
53
95
  ## Configuration Options
54
96
 
55
97
  Configuration options are found in **Settings → Options → Display** under the Widget Historical Data section.
56
98
 
57
99
  You can:
58
- - Disable KIP's automatic time-series and data capture services in favor of the History-API provider of your choice. See [Using The History-API](history-api.md) in the Integrations Help menu for more details.
59
- - Disable access to widget historical charts (disables two-finger tap, mouse right-click, or two-finger click on trackpads).
100
+ - Disable KIP's automatic Time-Series in favor of the History-API provider of your choice (See [External History-API Provider](#/help/history-api.md) in the Integrations Help menu for more details).
101
+ - Disable access to widget historical charts dialogue (disables two-finger tap, mouse right-click, or two-finger click on trackpads).
60
102
 
61
- If you want to completely disable this feature, under the Settings -> Display tab's Widget Historical Data group, select "Other: Use a different History API provider and configure data logging manually" option. This stops the plugin's data capture and historical query services, and toggle the "Disable widget historical charts" switch to disable pointer event and access to UI elements.
103
+ If you want to completely disable the history feature, under the **Settings Options → Display** tab in the Widget Historical Data group:
104
+ - Select "Other: Use a different History API provider and configure data logging manually" option. This stops the plugin's data capture and historical query services.
105
+ - Toggle the "Disable widget historical charts" switch. This disables pointer events to access the charts dialogue window.
62
106
 
63
107
  ## Questions or Issues?
64
108
 
65
- - Refer to [Using The History-API](history-api.md) to learn how to use other History API providers.
109
+ - Refer to [External History-API Provider](#/help/history-api.md) to learn how to use other History API providers.
66
110
  - For general questions or issues, see the `Contact-Us` help page—the KIP community is active on Discord and GitHub.
@@ -6,7 +6,7 @@ Stay informed about your vessel’s data with Signal K’s state notifications.
6
6
  ## Zones & Notification Configuration
7
7
 
8
8
  **Zones** are value ranges defined as metadata for each data path. Learn more at the [Signal K Metadata documentation](https://signalk.org/specification/1.7.0/doc/data_model_metadata.html).
9
- To configure metadata in Signal K, visit the [Data Browser server page](/admin/#/databrowser) and enable the **Meta Data** switch. Here, you can add or edit **methods** and **zones** for any path you want to monitor.
9
+ To configure metadata in Signal K, visit the [Data Browser server page](/../../admin/#/databrowser) and enable the **Meta Data** switch. Here, you can add or edit **methods** and **zones** for any path you want to monitor.
10
10
 
11
11
  > **Note:** Zone values use base units (e.g., wind speed in meters per second). Define your zone ranges using the base unit for each path. KIP will automatically convert and display these values according to your widget’s unit settings.
12
12
 
@@ -331,6 +331,23 @@
331
331
  <path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M10.3004 7.49991C10.3004 8.4943 9.49426 9.30041 8.49988 9.30041C7.50549 9.30041 6.69938 8.4943 6.69938 7.49991C6.69938 6.50553 7.50549 5.69942 8.49988 5.69942C9.49426 5.69942 10.3004 6.50553 10.3004 7.49991ZM11.205 8C10.9699 9.28029 9.84816 10.2504 8.49988 10.2504C7.1516 10.2504 6.0299 9.28029 5.79473 8H0.5C0.223858 8 0 7.77614 0 7.5C0 7.22386 0.223858 7 0.5 7H5.7947C6.0298 5.71962 7.15154 4.74942 8.49988 4.74942C9.84822 4.74942 10.9699 5.71962 11.2051 7H14.5C14.7761 7 15 7.22386 15 7.5C15 7.77614 14.7761 8 14.5 8H11.205Z" />
332
332
  <circle cx="8.5" cy="7.5" r="1.5" fill="var(--mat-sys-primary)" />
333
333
  </svg>
334
+ <svg id="battery_available" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 48 48">
335
+ <path stroke="currentColor" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="3" d="M36.2142 13.502H7.28334c-2.36616 0 -4.28432 1.9181 -4.28432 4.2843v12.4311c0 2.3661 1.91816 4.2843 4.28432 4.2843H36.2142c2.3661 0 4.2843 -1.9182 4.2843 -4.2843V17.7863c0 -2.3662 -1.9182 -4.2843 -4.2843 -4.2843Z"></path>
336
+ <path fill="currentColor" stroke="currentColor" stroke-linecap="square" stroke-miterlimit="10" stroke-width="3" d="M22.1236 18.6504H8.40817c-0.20709 0 -0.37497 0.1679 -0.37497 0.375v9.9489c0 0.207 0.16788 0.3749 0.37497 0.3749H22.1236c0.2072 0 0.375 -0.1679 0.375 -0.3749v-9.9489c0 -0.2071 -0.1678 -0.375 -0.375 -0.375Z"></path>
337
+ <path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="3" d="M44.999 20.501v6.9987"></path>
338
+ </svg>
339
+ <svg id="battery_charging" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 16 16">
340
+ <path d="M9.585 2.568a0.5 0.5 0 0 1 0.226 0.58L8.677 6.832h1.99a0.5 0.5 0 0 1 0.364 0.843l-5.334 5.667a0.5 0.5 0 0 1 -0.842 -0.49L5.99 9.167H4a0.5 0.5 0 0 1 -0.364 -0.843l5.333 -5.667a0.5 0.5 0 0 1 0.616 -0.09z" stroke-width="1"></path>
341
+ <path d="M2 4h4.332l-0.94 1H2a1 1 0 0 0 -1 1v4a1 1 0 0 0 1 1h2.38l-0.308 1H2a2 2 0 0 1 -2 -2V6a2 2 0 0 1 2 -2" stroke-width="1"></path>
342
+ <path d="M2 6h2.45L2.908 7.639A1.5 1.5 0 0 0 3.313 10H2zm8.595 -2 -0.308 1H12a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1H9.276l-0.942 1H12a2 2 0 0 0 2 -2V6a2 2 0 0 0 -2 -2z" stroke-width="1"></path>
343
+ <path d="M12 10h-1.783l1.542 -1.639q0.146 -0.156 0.241 -0.34zm0 -3.354V6h-0.646a1.5 1.5 0 0 1 0.646 0.646M16 8a1.5 1.5 0 0 1 -1.5 1.5v-3A1.5 1.5 0 0 1 16 8" stroke-width="1"></path>
344
+ </svg>
345
+ <svg id="power_available" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
346
+ <path fill="currentColor" d="M12 2c5.5228 0 10 4.47715 10 10 0 5.5228 -4.4772 10 -10 10 -5.52285 0 -10 -4.4772 -10 -10C2 6.47715 6.47715 2 12 2m1 8h3.5l-5.4678 9.9395c0.3174 0.0382 0.6401 0.0605 0.9678 0.0605 4.4183 0 8 -3.5817 8 -8 0 -4.07955 -3.0538 -7.44434 -7 -7.93652zm-1 -6c-4.41828 0 -8 3.58172 -8 8 0 4.0795 3.05384 7.4433 7 7.9355V14H7.5l5.4668 -9.94043C12.6498 4.02138 12.3273 4 12 4" stroke-width="1"></path>
347
+ </svg>
348
+ <svg id="power_renewal" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
349
+ <path fill="currentColor" d="M4.06445 13C4.55672 16.9461 7.92051 20 12 20c2.3364 -0.0002 4.4372 -1.0031 5.8994 -2.6006L15.5 15h6v6l-2.1855 -2.1855C17.4894 20.7734 14.8887 21.9998 12 22c-5.18532 0 -9.44843 -3.9467 -9.9502 -9zM12.5 10H16l-4.5 9v-5H8l4.5 -9zM12 2c5.1851 0.00028 9.4485 3.94685 9.9502 9h-2.0147C19.4434 7.05399 16.0793 4.00027 12 4 9.66354 4 7.56264 5.00292 6.10059 6.60059L8.5 9h-6V3l2.18457 2.18457C6.50965 3.22563 9.11128 2 12 2" stroke-width="1"></path>
350
+ </svg>
334
351
  <svg id="dashboard-beating-starboard" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
335
352
  <g id="g9" transform="matrix(-0.70710678,0.70710678,0.70710678,0.70710678,8.8211956,-6.2237242)">
336
353
  <path d="M 12,5.9999999 C 16,9.777778 17.777778,15.444445 16,23 H 8.0000001 C 6.2222223,15.444445 8.0000001,9.777778 12,5.9999999 Z" fill="var(--mat-sys-tertiary)" id="path1" style="stroke-width:0.229061" />