@rhizomatics/signalk-einklabel-plugin 0.9.1 → 0.10.1
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/CHANGELOG.md +18 -2
- package/README.md +34 -19
- package/dist/cli/index.js +4 -2
- package/dist/config.js +8 -2
- package/dist/render/formatters.js +2 -0
- package/docs/assets/images/real_tidal_clock.jpg +0 -0
- package/docs/assets/screenshots/example_watch_schedule.png +0 -0
- package/package.json +10 -3
- package/templates/.blank/250x128-BWRY.svg +69 -0
- package/templates/.blank/416x240-BWRY.svg +86 -0
- package/templates/watch/416x240-BWRY.svg +199 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
# 0.10.1
|
|
2
|
+
|
|
3
|
+
- Test fixes
|
|
4
|
+
- Moved blank templates to `.blank` directory and suppressed from drop down selection
|
|
5
|
+
- Added recommendations for `signalk-tides` and `signalk-watch-schedule` plugins
|
|
6
|
+
|
|
7
|
+
# 0.10.0
|
|
8
|
+
|
|
9
|
+
## Watch Schedule Example
|
|
10
|
+
|
|
11
|
+
- New template to show current and next crew watch, using `signalk-watch-schedule` plugin
|
|
12
|
+
|
|
13
|
+
## CLI / Debugging
|
|
14
|
+
|
|
15
|
+
- `fields` command now reports where text field definitions can't be interpreted
|
|
16
|
+
- Epoch style timestamps now automatically handled as if proper date time for format options
|
|
17
|
+
|
|
1
18
|
# 0.9.1
|
|
2
19
|
|
|
3
20
|
- Fix for upstream EventEmitter leak in `@naugehyde/node-ble`
|
|
@@ -12,8 +29,7 @@
|
|
|
12
29
|
|
|
13
30
|
## Fixes
|
|
14
31
|
|
|
15
|
-
- Fix configuration JSON holding older versions of itself as subentries
|
|
16
|
-
and data changes
|
|
32
|
+
- Fix configuration JSON holding older versions of itself as subentries and data changes
|
|
17
33
|
- Fix most cases of scanned devices not appearing in device dropdown choice
|
|
18
34
|
|
|
19
35
|
## Improvements
|
package/README.md
CHANGED
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
[](https://github.com)
|
|
8
8
|
[](https://github.com/rhizomatics/signalk-einklabel-plugin/blob/main/LICENSE)
|
|
9
9
|
|
|
10
|
-
Fully working but limited vendor/product support and requires Linux for device access.
|
|
11
|
-
|
|
12
10
|
A SignalK plugin to display data from SignalK paths, Resource APIs and plugins on Electronic Shelf Labels (ESL) over a Bluetooth Low Energy (BLE) connection using simple SVG templates.
|
|
13
11
|
|
|
12
|
+

|
|
13
|
+
|
|
14
14
|
## What is an ESL?
|
|
15
15
|
|
|
16
16
|
Electronic Shelf Labels are [eInk](https://en.wikipedia.org/wiki/E_Ink) devices that consume very little battery energy, presuming they are not constantly updated - the battery is used only when the display changes (which can take 5-10 seconds) and a periodic BLE check for incoming changes. Perfect for info that changes only once or twice a day, like tidal information.
|
|
@@ -27,13 +27,13 @@ Most of requirements below are to make SignalK work with Bluetooth Low Energy, w
|
|
|
27
27
|
|
|
28
28
|
1. A SignalK server, **running Linux**
|
|
29
29
|
|
|
30
|
-
- MacOS and Windows aren't supported by the [BLE interface layer](https://www.npmjs.com/package/@naugehyde/node-ble), however can be used for template development and
|
|
30
|
+
- MacOS and Windows aren't supported by the [BLE interface layer](https://www.npmjs.com/package/@naugehyde/node-ble), however they can be used for template development and
|
|
31
31
|
debugging (everything except `scan` and `paint`)
|
|
32
32
|
|
|
33
33
|
2. A Bluetooth adapter, that can handle BLE (Bluetooth Low Energy).
|
|
34
34
|
|
|
35
35
|
- Bluetooth adapters for Linux can be tricky, TP-Link UB400 and Asus USB-BT500 are two well-known and available ones
|
|
36
|
-
- Some Raspberry Pi models come with suitable Bluetooth
|
|
36
|
+
- Some Raspberry Pi models come with suitable Bluetooth built in
|
|
37
37
|
- Don't worry about the very latest Bluetooth versions, 4.0 is minimum for BLE, 5.0 is nice
|
|
38
38
|
- Home Assistant is massively more popular than SignalK, and often also run on Raspberry Pi and similar, so good source of advice
|
|
39
39
|
|
|
@@ -44,14 +44,14 @@ Most of requirements below are to make SignalK work with Bluetooth Low Energy, w
|
|
|
44
44
|
|
|
45
45
|
4. One or more supported Electronic Shelf Labels
|
|
46
46
|
|
|
47
|
-
- The label used for testing this is the [
|
|
47
|
+
- The label used for testing this is the [Zhsunyco 3.7" BWRY](https://www.aliexpress.com/item/1005010050104435.html)
|
|
48
48
|
|
|
49
49
|
5. Correct time zone set on server if local time is to be shown on display
|
|
50
50
|
|
|
51
51
|
- See [FAQ](#faq-timezone)
|
|
52
52
|
- If not set, everything will work, but you may see the wrong zone or not have daylight savings applied
|
|
53
53
|
|
|
54
|
-
Once you have all of that, it may be worth also installing [signalk-victron-ble](https://github.com/stefanor/signalk-victron-ble),[signalk-ruuvitag-plugin](https://github.com/vokkim/signalk-ruuvitag-plugin) or [bt-sensors-plugin](https://github.com/naugehyde/bt-sensors-plugin-sk) to pull in data from other sensors and equipment.
|
|
54
|
+
Once you have all of that, it may be worth also installing [signalk-victron-ble](https://github.com/stefanor/signalk-victron-ble), [signalk-ruuvitag-plugin](https://github.com/vokkim/signalk-ruuvitag-plugin) or [bt-sensors-plugin](https://github.com/naugehyde/bt-sensors-plugin-sk) to pull in data from other sensors and equipment.
|
|
55
55
|
|
|
56
56
|
## Installation
|
|
57
57
|
|
|
@@ -89,36 +89,47 @@ A _tides_ provider plugin for the Resources API installed and enabled, currently
|
|
|
89
89
|
|
|
90
90
|
The [tides](https://github.com/rhizomatics/signalk-einklabel-plugin/blob/main/templates/tides/) templates can be customized to run with any tide provider, a specific one, or switch to other APIs or SignalK data paths.
|
|
91
91
|
|
|
92
|
-
- In the template it uses a SVG description like `source=resources,resource=tides,provider=tides,path=extremes[0].time,format=local_time` to get the first tide time, ensures
|
|
92
|
+
- In the template it uses a SVG description like `source=resources,resource=tides,provider=tides,path=extremes[0].time,format=local_time` to get the first tide time, ensures it's the preferred `signalk-tides` provider and makes it a simple local time rather than a UTC date-time.
|
|
93
93
|
|
|
94
94
|
To show the lunar phase, the `environment.moon.phaseName` path is required, which can
|
|
95
95
|
be easily achieved by installing and configuring the `derived-data` plugin.
|
|
96
96
|
|
|
97
|
+
### Watch Schedule
|
|
98
|
+
|
|
99
|
+

|
|
100
|
+
|
|
101
|
+
Template available as 416x240-BWRY for 3.7" ESLs.
|
|
102
|
+
|
|
103
|
+
#### Pre-requisites
|
|
104
|
+
|
|
105
|
+
- Source of `watch.current` and `watch.next` values
|
|
106
|
+
- `signalk-watch-schedule` plugin
|
|
107
|
+
|
|
97
108
|
## Setting up a Label
|
|
98
109
|
|
|
99
|
-
Enable the plugin, and use the large **+** sign to add a label, which
|
|
110
|
+
Enable the plugin, and use the large **+** sign to add a label, which opens up these fields.
|
|
100
111
|
|
|
101
112
|

|
|
102
113
|
|
|
103
114
|
- _Friendly Name_ - Give the label any name (word or phrase) you like, for example 'Tide Clock'
|
|
104
|
-
- _Device_ - Unless you have multiple labels, don't bother with pre-scanning or selecting a
|
|
115
|
+
- _Device_ - Unless you have multiple labels, don't bother with pre-scanning or selecting a specific device, instead pick **"All discovered devices"** and it will paint any compatible labels it finds. If you want to pick a specific device, you'll need to wait for a device scan to complete.
|
|
105
116
|
- _Template_ - Choose a built in template, or one you've added to the local templates directory
|
|
106
117
|
- _Repaint Trigger_- Do you want this to repaint every few hours (at a chosen minutes past hour), or when a SignalK path changes?
|
|
107
|
-
- If
|
|
108
|
-
- If
|
|
118
|
+
- If it's a SignalK path, enter it next, for example `environment.tide.state`
|
|
119
|
+
- If it's time based, enter how many hours between repaints, for example 00:00/08:00/16:00 for an 8h schedule, and if you want a specific number of minutes after the hour.
|
|
109
120
|
|
|
110
121
|
There are also two more advanced options, which can usually be ignored.
|
|
111
122
|
|
|
112
123
|
- _BLE AES key_ - Only needed if the default key doesn't work and you have a better alternative, otherwise ignore
|
|
113
124
|
- _Force Repaint_ - Next time the label is due to be painted, update even if the data or template hasn't changed (this flag will automatically be cleared after this.)
|
|
114
125
|
|
|
115
|
-
When the plugin starts, it will automatically re-paint the label if
|
|
126
|
+
When the plugin starts, it will automatically re-paint the label if it's new, or the last timed slot was missed and the data has changed.
|
|
116
127
|
|
|
117
128
|
### Scanning for Devices
|
|
118
129
|
|
|
119
130
|
Since these are ultra-low power devices, they don't respond instantly to either identify themselves or accept a new image. By default, both scanning and painting have time-outs to wait for a response, which can be altered in the plugin configuration or CLI argument.
|
|
120
131
|
|
|
121
|
-
One other quirk is that some devices respond with a different name at different times, for example the
|
|
132
|
+
One other quirk is that some devices respond with a different name at different times, for example the generic `WOESL` sometimes and model specific `WL17500C74` other times. However, the MAC address, e.g. `66:66:17:50:0D:2B` is constant, and this is what's tracked by the plugin.
|
|
122
133
|
|
|
123
134
|
The plugin can optionally re-scan whenever it starts up (off by default), although this isn't essential once a label has been configured. Devices found by any scan are remembered across restarts - see the FAQ below.
|
|
124
135
|
|
|
@@ -246,7 +257,7 @@ See also the commands useful for debugging under [Developing Templates]
|
|
|
246
257
|
- `render` - transform an SVG template and data into a PNG
|
|
247
258
|
- `paint` - render an SVG template and data to a selected ESL
|
|
248
259
|
|
|
249
|
-
The width, height, vertical offset and colour palette for the device
|
|
260
|
+
The width, height, vertical offset and colour palette for the device are taken from the internal register of devices, however can be overridden on the command line. This could be used to help you choose what size of label to buy, or to get an unsupported label working.
|
|
250
261
|
|
|
251
262
|
( The CLI can also be run from a checked out module, or by opening a terminal shell at `~/.signalk/node_modules/@rhizomatics/signalk-einklabel-plugin`, as `npx esl-cli command --args` )
|
|
252
263
|
|
|
@@ -340,7 +351,7 @@ For example, `npx esl-cli fields -t templates/tide.svg -e examples` will show al
|
|
|
340
351
|
|
|
341
352
|
### I can't see my device as a choice on the drop-down list after scan
|
|
342
353
|
|
|
343
|
-
SignalK plugins lack ability to self-update after something like a scan, so first time round you may have to close the config and reload it to see this. Subsequently the plugin will remember all scanned devices, and only drop previously seen ones if it goes 24 hours without a positive scan or with failed paint attempts.
|
|
354
|
+
SignalK plugins lack the ability to self-update after something like a scan, so first time round you may have to close the config and reload it to see this. Subsequently the plugin will remember all scanned devices, and only drop previously seen ones if it goes 24 hours without a positive scan or with failed paint attempts.
|
|
344
355
|
|
|
345
356
|
Easiest way to solve this is to choose 'All Discovered Devices' in the device configuration, and it will paint any compatible devices it finds on future scans.
|
|
346
357
|
|
|
@@ -348,12 +359,12 @@ Easiest way to solve this is to choose 'All Discovered Devices' in the device co
|
|
|
348
359
|
|
|
349
360
|
If the plugin repaints a display at server startup, then the plugin that provides the data may not have started ( or in the case of `derived-data` the plugin that the plugin depends on! ) and unlike Home Assistant, there's no good way of sequencing the start of plugins.
|
|
350
361
|
|
|
351
|
-
Use the _settle_ time, to impose a minimum wait between the eInk Label plugin being initialized, and it attempting to paint any displays, and increase this value if
|
|
362
|
+
Use the _settle_ time, to impose a minimum wait between the eInk Label plugin being initialized, and it attempting to paint any displays, and increase this value if it's still missing data.
|
|
352
363
|
|
|
353
364
|
### Times are showing incorrectly {#faq-timezone}
|
|
354
365
|
|
|
355
366
|
If times are in the wrong timezone, or don't have daylight savings applied correctly,
|
|
356
|
-
then check that the server itself (at the Linux level, not SignalK, which doesn't know)is configured for your timezone, assuming of course that you're a coastal sailor. Use `raspi-config` on a Raspberry Pi, or `timedatectl` on a Linux server.
|
|
367
|
+
then check that the server itself (at the Linux level, not SignalK, which doesn't know) is configured for your timezone, assuming of course that you're a coastal sailor. Use `raspi-config` on a Raspberry Pi, or `timedatectl` on a Linux server.
|
|
357
368
|
|
|
358
369
|
If you're a global cruiser, then use something like [signalk-set-gps-timezone](https://github.com/hoeken/signalk-set-gps-timezone) to set the value in the operating system.
|
|
359
370
|
|
|
@@ -363,12 +374,16 @@ Try a BLE proxy device, ESP32 is popular for this.
|
|
|
363
374
|
|
|
364
375
|
### Can't edit the text contents of SVG template in VSCode
|
|
365
376
|
|
|
366
|
-
If you have an SVG viewer extension, this
|
|
377
|
+
If you have an SVG viewer extension, this will show the image rather than allowing editing of text. To solve, right click on the file in VSCode _Explorer_ view and choose to edit with _Text Editor_.
|
|
378
|
+
|
|
379
|
+
### Description is set in InkScape but doesn't render
|
|
380
|
+
|
|
381
|
+
Check if the text boxes are normal text or flowed text, and correct to normal text.
|
|
367
382
|
|
|
368
383
|
## Other ESL and General eInk Resources
|
|
369
384
|
|
|
370
385
|
- [Open ePaper Link](https://openepaperlink.de) - Alternative open source firmware to flash onto eInk shelf labels, with Home Assistant integration.
|
|
371
|
-
- [
|
|
386
|
+
- [zhsunyco-esl](https://github.com/roxburghm/zhsunyco-esl) - Python interface
|
|
372
387
|
- [WoLink](https://github.com/NickWaterton/Wolink) - Python interface and protocol analysis
|
|
373
388
|
- [e-ink dashboard for Signal K](https://github.com/meri-imperiumi/dashboard) - Waveshare display based multi instrument display.
|
|
374
389
|
- [eInk Dashboard Modern SK](https://github.com/VladimirKalachikhin/e-inkDashboardModernSK) - SignalK dashboard for non-ESL eInk display.
|
package/dist/cli/index.js
CHANGED
|
@@ -248,10 +248,12 @@ program
|
|
|
248
248
|
const elements = doc.getElementsByTagName(tag);
|
|
249
249
|
for (let i = 0; i < elements.length; i++) {
|
|
250
250
|
const element = elements.item(i);
|
|
251
|
-
|
|
252
|
-
if (!element || !desc?.textContent)
|
|
251
|
+
if (!element)
|
|
253
252
|
continue;
|
|
254
253
|
const id = element.getAttribute("id") ?? `${tag}#${i}`;
|
|
254
|
+
const desc = element.getElementsByTagName("desc").item(0);
|
|
255
|
+
if (!desc?.textContent)
|
|
256
|
+
continue;
|
|
255
257
|
try {
|
|
256
258
|
rows.push({ id, tag, desc: desc.textContent, binding: (0, binding_1.parseBinding)(desc.textContent) });
|
|
257
259
|
}
|
package/dist/config.js
CHANGED
|
@@ -200,7 +200,13 @@ function listTemplateVariants(dir) {
|
|
|
200
200
|
.map(parseTemplateVariant)
|
|
201
201
|
.filter((variant) => variant !== undefined);
|
|
202
202
|
}
|
|
203
|
-
/**
|
|
203
|
+
/**
|
|
204
|
+
* A directory only counts as a template-family option if it actually has at least one parseable
|
|
205
|
+
* variant file in it - otherwise it's something else entirely, e.g. `.assets`. Dot-prefixed
|
|
206
|
+
* directories (e.g. `.assets`, `.blank`) are always excluded, even if they happen to contain
|
|
207
|
+
* parseable variant files, since they're reserved for non-template-option use (asset bundles,
|
|
208
|
+
* work-in-progress templates not ready to appear in the dropdown, etc).
|
|
209
|
+
*/
|
|
204
210
|
function listTemplateFamilies(dir) {
|
|
205
211
|
let entries;
|
|
206
212
|
try {
|
|
@@ -210,7 +216,7 @@ function listTemplateFamilies(dir) {
|
|
|
210
216
|
return [];
|
|
211
217
|
}
|
|
212
218
|
return entries
|
|
213
|
-
.filter((entry) => entry.isDirectory() && listTemplateVariants((0, path_1.join)(dir, entry.name)).length > 0)
|
|
219
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith(".") && listTemplateVariants((0, path_1.join)(dir, entry.name)).length > 0)
|
|
214
220
|
.map((entry) => entry.name);
|
|
215
221
|
}
|
|
216
222
|
/** Local templates (files or template-family directories) take priority over a same-named bundled one; both show up as options. */
|
|
@@ -57,6 +57,8 @@ function parseTimestamp(value) {
|
|
|
57
57
|
return luxon_1.DateTime.fromJSDate(value, { zone: "utc" });
|
|
58
58
|
if (typeof value === "string")
|
|
59
59
|
return luxon_1.DateTime.fromISO(value, { zone: "utc" });
|
|
60
|
+
if (typeof value === "number")
|
|
61
|
+
return luxon_1.DateTime.fromMillis(value, { zone: "utc" });
|
|
60
62
|
return undefined;
|
|
61
63
|
}
|
|
62
64
|
/**
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rhizomatics/signalk-einklabel-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Display SignalK data on eInk Electronic Shelf Labels",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ble",
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"signalk-category-hardware",
|
|
13
13
|
"signalk-category-instruments",
|
|
14
14
|
"signalk-node-server-plugin",
|
|
15
|
-
"tides"
|
|
15
|
+
"tides",
|
|
16
|
+
"watch-schedule"
|
|
16
17
|
],
|
|
17
18
|
"homepage": "https://github.com/rhizomatics/signalk-einklabel-plugin#readme",
|
|
18
19
|
"bugs": {
|
|
@@ -79,7 +80,13 @@
|
|
|
79
80
|
"appIcon": "docs/assets/icons/icon_tmp.png",
|
|
80
81
|
"screenshots": [
|
|
81
82
|
"docs/assets/screenshots/example_tidal_clock.png",
|
|
82
|
-
"docs/assets/screenshots/
|
|
83
|
+
"docs/assets/screenshots/example_watch_schedule.png",
|
|
84
|
+
"docs/assets/screenshots/plugin_config.png",
|
|
85
|
+
"docs/assets/screenshots/label_config.png"
|
|
86
|
+
],
|
|
87
|
+
"recommends": [
|
|
88
|
+
"signalk-watch-schedule",
|
|
89
|
+
"signalk-tides"
|
|
83
90
|
]
|
|
84
91
|
}
|
|
85
92
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
width="250"
|
|
4
|
+
height="128"
|
|
5
|
+
viewBox="0 0 250 128"
|
|
6
|
+
version="1.1"
|
|
7
|
+
id="svg1"
|
|
8
|
+
sodipodi:docname="250x128-BWRY.svg"
|
|
9
|
+
inkscape:version="1.3.2 (091e20e, 2023-11-25)"
|
|
10
|
+
xml:space="preserve"
|
|
11
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
12
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
13
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
14
|
+
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
|
15
|
+
id="defs1" /><sodipodi:namedview
|
|
16
|
+
id="namedview1"
|
|
17
|
+
pagecolor="#ffffff"
|
|
18
|
+
bordercolor="#000000"
|
|
19
|
+
borderopacity="0.25"
|
|
20
|
+
inkscape:showpageshadow="2"
|
|
21
|
+
inkscape:pageopacity="0.0"
|
|
22
|
+
inkscape:pagecheckerboard="0"
|
|
23
|
+
inkscape:deskcolor="#d1d1d1"
|
|
24
|
+
inkscape:zoom="1.3906433"
|
|
25
|
+
inkscape:cx="69.751891"
|
|
26
|
+
inkscape:cy="106.78511"
|
|
27
|
+
inkscape:window-width="1488"
|
|
28
|
+
inkscape:window-height="674"
|
|
29
|
+
inkscape:window-x="24"
|
|
30
|
+
inkscape:window-y="33"
|
|
31
|
+
inkscape:window-maximized="0"
|
|
32
|
+
inkscape:current-layer="svg1"
|
|
33
|
+
showgrid="true"
|
|
34
|
+
showguides="true"><inkscape:grid
|
|
35
|
+
id="grid1"
|
|
36
|
+
units="px"
|
|
37
|
+
originx="0"
|
|
38
|
+
originy="0"
|
|
39
|
+
spacingx="1"
|
|
40
|
+
spacingy="1"
|
|
41
|
+
empcolor="#0099e5"
|
|
42
|
+
empopacity="0.30196078"
|
|
43
|
+
color="#0099e5"
|
|
44
|
+
opacity="0.14901961"
|
|
45
|
+
empspacing="5"
|
|
46
|
+
dotted="false"
|
|
47
|
+
gridanglex="30"
|
|
48
|
+
gridanglez="30"
|
|
49
|
+
visible="true" /></sodipodi:namedview><rect
|
|
50
|
+
x="1.0169492"
|
|
51
|
+
y="2.0798673e-08"
|
|
52
|
+
width="249.17073"
|
|
53
|
+
height="129.97897"
|
|
54
|
+
fill="#ffffff"
|
|
55
|
+
id="rect1"
|
|
56
|
+
style="stroke-width:0.569552" /><text
|
|
57
|
+
id="last_repaint"
|
|
58
|
+
x="221.55899"
|
|
59
|
+
y="104.94675"
|
|
60
|
+
font-size="18"
|
|
61
|
+
font-family="serif"
|
|
62
|
+
fill="black"
|
|
63
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.6667px;font-family:serif;-inkscape-font-specification:'serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ffff00;stroke-width:1.19309"
|
|
64
|
+
transform="scale(0.85412559,1.170788)"><desc
|
|
65
|
+
id="desc12">source=einklabel,path=repainted,format=local_datetime_short</desc><tspan
|
|
66
|
+
sodipodi:role="line"
|
|
67
|
+
id="tspan3"
|
|
68
|
+
x="221.55899"
|
|
69
|
+
y="104.94675">27 Jun 26 18:05</tspan></text></svg>
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
width="416"
|
|
4
|
+
height="240"
|
|
5
|
+
viewBox="0 0 416 240"
|
|
6
|
+
version="1.1"
|
|
7
|
+
id="svg1"
|
|
8
|
+
sodipodi:docname="416x240-BWRY.svg"
|
|
9
|
+
inkscape:version="1.3.2 (091e20e, 2023-11-25)"
|
|
10
|
+
xml:space="preserve"
|
|
11
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
12
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
13
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
14
|
+
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
|
15
|
+
id="defs1" /><sodipodi:namedview
|
|
16
|
+
id="namedview1"
|
|
17
|
+
pagecolor="#ffffff"
|
|
18
|
+
bordercolor="#000000"
|
|
19
|
+
borderopacity="0.25"
|
|
20
|
+
inkscape:showpageshadow="2"
|
|
21
|
+
inkscape:pageopacity="0.0"
|
|
22
|
+
inkscape:pagecheckerboard="0"
|
|
23
|
+
inkscape:deskcolor="#d1d1d1"
|
|
24
|
+
inkscape:zoom="1.3906433"
|
|
25
|
+
inkscape:cx="155.3238"
|
|
26
|
+
inkscape:cy="187.32338"
|
|
27
|
+
inkscape:window-width="1488"
|
|
28
|
+
inkscape:window-height="674"
|
|
29
|
+
inkscape:window-x="24"
|
|
30
|
+
inkscape:window-y="33"
|
|
31
|
+
inkscape:window-maximized="0"
|
|
32
|
+
inkscape:current-layer="svg1"
|
|
33
|
+
showgrid="true"
|
|
34
|
+
showguides="true"><inkscape:grid
|
|
35
|
+
id="grid1"
|
|
36
|
+
units="px"
|
|
37
|
+
originx="0"
|
|
38
|
+
originy="0"
|
|
39
|
+
spacingx="1"
|
|
40
|
+
spacingy="1"
|
|
41
|
+
empcolor="#0099e5"
|
|
42
|
+
empopacity="0.30196078"
|
|
43
|
+
color="#0099e5"
|
|
44
|
+
opacity="0.14901961"
|
|
45
|
+
empspacing="5"
|
|
46
|
+
dotted="false"
|
|
47
|
+
gridanglex="30"
|
|
48
|
+
gridanglez="30"
|
|
49
|
+
visible="true" /></sodipodi:namedview><rect
|
|
50
|
+
x="1.0169492"
|
|
51
|
+
y="2.0798673e-08"
|
|
52
|
+
width="416"
|
|
53
|
+
height="240"
|
|
54
|
+
fill="#ffffff"
|
|
55
|
+
id="rect1" /><rect
|
|
56
|
+
style="fill:#ffff00;stroke:#000000;stroke-width:0.614045"
|
|
57
|
+
id="rect2"
|
|
58
|
+
width="416.94916"
|
|
59
|
+
height="18.410578"
|
|
60
|
+
x="-24.928873"
|
|
61
|
+
y="-242.40596"
|
|
62
|
+
transform="matrix(1,0,-0.1068988,-0.99426991,0,0)" /><text
|
|
63
|
+
id="last_repaint"
|
|
64
|
+
x="4.3477793"
|
|
65
|
+
y="201.9895"
|
|
66
|
+
font-size="18"
|
|
67
|
+
font-family="serif"
|
|
68
|
+
fill="black"
|
|
69
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:sans-serif;-inkscape-font-specification:'Roboto',sans-serif;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:1.19309"
|
|
70
|
+
transform="scale(0.85412558,1.170788)"><desc
|
|
71
|
+
id="desc12">source=einklabel,path=repainted,format=local_datetime_short</desc><tspan
|
|
72
|
+
sodipodi:role="line"
|
|
73
|
+
id="tspan3">27 Jun 26 18:05</tspan></text><text
|
|
74
|
+
id="plugin_version"
|
|
75
|
+
x="194.07487"
|
|
76
|
+
y="204.51942"
|
|
77
|
+
font-size="10.373px"
|
|
78
|
+
font-family="sans-serif"
|
|
79
|
+
fill="#ffff00"
|
|
80
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:Roboto;-inkscape-font-specification:'Roboto, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;direction:rtl;fill:#000000;stroke-width:0.864419"
|
|
81
|
+
transform="scale(0.86441854,1.156847)"><desc
|
|
82
|
+
id="desc16">source=einklabel,path=plugin_version</desc><tspan
|
|
83
|
+
sodipodi:role="line"
|
|
84
|
+
id="tspan1"
|
|
85
|
+
x="194.07487"
|
|
86
|
+
y="204.51942">v0.0.1</tspan></text></svg>
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
width="416"
|
|
4
|
+
height="240"
|
|
5
|
+
viewBox="0 0 416 240"
|
|
6
|
+
version="1.1"
|
|
7
|
+
id="svg1"
|
|
8
|
+
sodipodi:docname="416x240-BWRY.svg"
|
|
9
|
+
inkscape:version="1.3.2 (091e20e, 2023-11-25)"
|
|
10
|
+
xml:space="preserve"
|
|
11
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
12
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
13
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
14
|
+
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
|
15
|
+
id="defs1"><rect
|
|
16
|
+
x="176.17746"
|
|
17
|
+
y="50.336416"
|
|
18
|
+
width="168.98654"
|
|
19
|
+
height="53.931875"
|
|
20
|
+
id="rect8" /><rect
|
|
21
|
+
x="53.931875"
|
|
22
|
+
y="29.482758"
|
|
23
|
+
width="134.47014"
|
|
24
|
+
height="40.988225"
|
|
25
|
+
id="rect4" /><rect
|
|
26
|
+
x="176.17746"
|
|
27
|
+
y="50.336414"
|
|
28
|
+
width="168.98654"
|
|
29
|
+
height="53.931873"
|
|
30
|
+
id="rect8-3" /><rect
|
|
31
|
+
x="176.17746"
|
|
32
|
+
y="50.336414"
|
|
33
|
+
width="168.98654"
|
|
34
|
+
height="53.931873"
|
|
35
|
+
id="rect8-3-5" /><rect
|
|
36
|
+
x="176.17746"
|
|
37
|
+
y="50.336414"
|
|
38
|
+
width="168.98654"
|
|
39
|
+
height="53.931873"
|
|
40
|
+
id="rect8-3-0" /><rect
|
|
41
|
+
x="176.17746"
|
|
42
|
+
y="50.336414"
|
|
43
|
+
width="168.98654"
|
|
44
|
+
height="53.931873"
|
|
45
|
+
id="rect8-3-5-4" /><rect
|
|
46
|
+
x="176.17746"
|
|
47
|
+
y="50.336414"
|
|
48
|
+
width="168.98654"
|
|
49
|
+
height="53.931873"
|
|
50
|
+
id="rect8-0" /><rect
|
|
51
|
+
x="53.931873"
|
|
52
|
+
y="29.482758"
|
|
53
|
+
width="134.47014"
|
|
54
|
+
height="40.988224"
|
|
55
|
+
id="rect4-3" /><rect
|
|
56
|
+
x="53.931873"
|
|
57
|
+
y="29.482758"
|
|
58
|
+
width="134.47014"
|
|
59
|
+
height="40.988224"
|
|
60
|
+
id="rect4-4" /><rect
|
|
61
|
+
x="176.17746"
|
|
62
|
+
y="50.336414"
|
|
63
|
+
width="168.98654"
|
|
64
|
+
height="53.931873"
|
|
65
|
+
id="rect8-0-4" /></defs><sodipodi:namedview
|
|
66
|
+
id="namedview1"
|
|
67
|
+
pagecolor="#ffffff"
|
|
68
|
+
bordercolor="#000000"
|
|
69
|
+
borderopacity="0.25"
|
|
70
|
+
inkscape:showpageshadow="2"
|
|
71
|
+
inkscape:pageopacity="0.0"
|
|
72
|
+
inkscape:pagecheckerboard="0"
|
|
73
|
+
inkscape:deskcolor="#d1d1d1"
|
|
74
|
+
inkscape:zoom="0.98333331"
|
|
75
|
+
inkscape:cx="210"
|
|
76
|
+
inkscape:cy="78.305087"
|
|
77
|
+
inkscape:window-width="1488"
|
|
78
|
+
inkscape:window-height="675"
|
|
79
|
+
inkscape:window-x="24"
|
|
80
|
+
inkscape:window-y="33"
|
|
81
|
+
inkscape:window-maximized="0"
|
|
82
|
+
inkscape:current-layer="svg1"
|
|
83
|
+
showgrid="true"
|
|
84
|
+
showguides="true"><inkscape:grid
|
|
85
|
+
id="grid1"
|
|
86
|
+
units="px"
|
|
87
|
+
originx="0"
|
|
88
|
+
originy="0"
|
|
89
|
+
spacingx="1"
|
|
90
|
+
spacingy="1"
|
|
91
|
+
empcolor="#0099e5"
|
|
92
|
+
empopacity="0.30196078"
|
|
93
|
+
color="#0099e5"
|
|
94
|
+
opacity="0.14901961"
|
|
95
|
+
empspacing="5"
|
|
96
|
+
dotted="false"
|
|
97
|
+
gridanglex="30"
|
|
98
|
+
gridanglez="30"
|
|
99
|
+
visible="true" /></sodipodi:namedview><rect
|
|
100
|
+
x="1.0169492"
|
|
101
|
+
y="2.0798673e-08"
|
|
102
|
+
width="416"
|
|
103
|
+
height="240"
|
|
104
|
+
fill="#ffffff"
|
|
105
|
+
id="rect1"
|
|
106
|
+
inkscape:label="label" /><rect
|
|
107
|
+
style="fill:#ffff00;stroke:#000000;stroke-width:0.614045"
|
|
108
|
+
id="rect2"
|
|
109
|
+
width="416.94916"
|
|
110
|
+
height="18.410578"
|
|
111
|
+
x="-24.928873"
|
|
112
|
+
y="-242.40596"
|
|
113
|
+
inkscape:label="bg_footer" /><text
|
|
114
|
+
id="last_repaint"
|
|
115
|
+
x="3.71355"
|
|
116
|
+
y="236.486883"
|
|
117
|
+
font-size="18"
|
|
118
|
+
font-family="serif"
|
|
119
|
+
fill="black"
|
|
120
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:sans-serif;-inkscape-font-specification:'Roboto',sans-serif;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:1.19309"><desc
|
|
121
|
+
id="desc12">source=einklabel,path=repainted,format=local_datetime_short</desc>27 Jun 26 18:05</text><text
|
|
122
|
+
id="plugin_version"
|
|
123
|
+
x="167.761916"
|
|
124
|
+
y="236.597677"
|
|
125
|
+
font-size="10.373px"
|
|
126
|
+
font-family="sans-serif"
|
|
127
|
+
fill="#ffff00"
|
|
128
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:Roboto;-inkscape-font-specification:'Roboto, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;fill:#000000;stroke-width:0.864419"><desc
|
|
129
|
+
id="desc16">source=einklabel,path=plugin_version</desc>v0.0.1</text><text
|
|
130
|
+
id="watch_system"
|
|
131
|
+
x="321.466726"
|
|
132
|
+
y="236.116556"
|
|
133
|
+
font-size="10.373px"
|
|
134
|
+
font-family="sans-serif"
|
|
135
|
+
fill="#ffff00"
|
|
136
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:serif;-inkscape-font-specification:'serif, @wght=100';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variation-settings:'wght' 100;fill:#000000;stroke-width:0.864419"><desc
|
|
137
|
+
id="desc7">watch.system.name</desc>2-on / 2-off</text><text
|
|
138
|
+
id="text4-6"
|
|
139
|
+
x="8.407525"
|
|
140
|
+
y="31.738578"
|
|
141
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:serif;-inkscape-font-specification:'serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;fill:#808080;stroke:none;stroke-width:0.612283;stroke-opacity:1"
|
|
142
|
+
inkscape:label="title">Watches</text><text
|
|
143
|
+
id="current_start"
|
|
144
|
+
x="7.3719606"
|
|
145
|
+
y="120.02129"
|
|
146
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:29.3333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1a1a1a;stroke:#ffff00;stroke-width:0.56247"><desc
|
|
147
|
+
id="desc1">path=watch.current.startTime,format=local_time</desc>12:00</text><text
|
|
148
|
+
id="current_end"
|
|
149
|
+
x="117.756"
|
|
150
|
+
y="120.04606"
|
|
151
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:29.3333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1a1a1a;stroke:#ffff00;stroke-width:0.612;stroke-dasharray:none"><desc
|
|
152
|
+
id="desc2">path=watch.current.endTime,format=local_time</desc>16:00</text><text
|
|
153
|
+
id="next_team"
|
|
154
|
+
x="219.44624"
|
|
155
|
+
y="205.76323"
|
|
156
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:29.3333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1a1a1a;stroke:none;stroke-width:0.612283"><desc
|
|
157
|
+
id="desc5">watch.next.teamName</desc>Team 2</text><text
|
|
158
|
+
id="current_team"
|
|
159
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1a1a1a;fill-opacity:1;stroke:#ffff00;stroke-width:0.73;stroke-dasharray:none;stroke-opacity:1"
|
|
160
|
+
x="221.56224"
|
|
161
|
+
y="121.52837"><desc
|
|
162
|
+
id="desc5-6">watch.current.teamName</desc>Team 1</text><text
|
|
163
|
+
id="next_start"
|
|
164
|
+
x="6.5166879"
|
|
165
|
+
y="205.07277"
|
|
166
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:26.6667px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1a1a1a;stroke:none;stroke-width:0.580975"
|
|
167
|
+
inkscape:label="next_start"><desc
|
|
168
|
+
id="desc4">path=watch.next.startTime,format=local_time</desc>16:00</text><text
|
|
169
|
+
id="next_end"
|
|
170
|
+
x="119.80927"
|
|
171
|
+
y="205.40628"
|
|
172
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:26.6667px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;fill:#1a1a1a;stroke:none;stroke-width:0.612283"><desc
|
|
173
|
+
id="desc3">path=watch.next.endTime,format=local_time</desc>20:00</text>
|
|
174
|
+
|
|
175
|
+
<rect
|
|
176
|
+
style="fill:#ff0000;stroke:none;stroke-width:2.621;stroke-dasharray:none;stroke-opacity:1"
|
|
177
|
+
id="rect15"
|
|
178
|
+
width="397.62714"
|
|
179
|
+
height="35.59322"
|
|
180
|
+
x="9.1525431"
|
|
181
|
+
y="52.881355"
|
|
182
|
+
inkscape:label="bg_current" /><text
|
|
183
|
+
id="text4"
|
|
184
|
+
x="20.708879"
|
|
185
|
+
y="80.673174"
|
|
186
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:26.6667px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;fill:#f9f9f9;stroke:#fefe54;stroke-width:0.612283"
|
|
187
|
+
inkscape:label="label_current">Current</text><rect
|
|
188
|
+
style="fill:#666666;stroke:none;stroke-width:2.6277;stroke-dasharray:none;stroke-opacity:1"
|
|
189
|
+
id="rect15-7"
|
|
190
|
+
width="399.66104"
|
|
191
|
+
height="35.59322"
|
|
192
|
+
x="8.5084782"
|
|
193
|
+
y="140.50848"
|
|
194
|
+
inkscape:label="bg_next" /><text
|
|
195
|
+
id="text4-7"
|
|
196
|
+
x="22.098717"
|
|
197
|
+
y="167.28336"
|
|
198
|
+
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:26.6667px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;fill:#f9f9f9;stroke:#fefe54;stroke-width:0.612283"
|
|
199
|
+
inkscape:label="label_next">Next</text></svg>
|