timex_datalink_caldav 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +2 -1
- data/README.md +6 -6
- data/lib/timex_datalink_caldav/client.rb +65 -15
- data/lib/timex_datalink_caldav/version.rb +1 -1
- data/lib/timex_datalink_caldav.rb +5 -2
- metadata +2 -3
- data/.DS_Store +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d31450cb602c3c36c121b4ffd2240664ed8f9e550388a246f1c5e169d12f7fa
|
4
|
+
data.tar.gz: 351b4213184ca2652205c80e99b7997538385bd0fab7e6ee3f4a6a57f1977247
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08bf1aa6454647ccc74a568cb0e54e5b9724394da3f0d8ff6a8bcb0205d63ddb35208b40d99cbdbdab0be8c6b6e5c0c6febdb9db3369c415bad5cfdba7be7cb5'
|
7
|
+
data.tar.gz: c2334ebf8d3d5515f4bce340808b61cacdc39ccdeaad6d2b7e7e356340fb97cf049c0316d1587d37b74dad9f4a593dcf91be66399bbfc3075018ef023a0e267d
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
timex_datalink_caldav (0.
|
4
|
+
timex_datalink_caldav (0.2.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -92,6 +92,7 @@ DEPENDENCIES
|
|
92
92
|
rspec (~> 3.12)
|
93
93
|
timex_datalink_caldav!
|
94
94
|
timex_datalink_client (~> 0.11.0)
|
95
|
+
tzinfo (~> 2.0)
|
95
96
|
|
96
97
|
BUNDLED WITH
|
97
98
|
2.4.10
|
data/README.md
CHANGED
@@ -45,14 +45,14 @@ After installing the gem, you can use it as a CLI tool:
|
|
45
45
|
timex_datalink_caldav -u https://caldavendpoint.com -n your_username -p your_password -d your_device
|
46
46
|
```
|
47
47
|
|
48
|
-
Please replace `your_username`, `your_password`, and `your_device` with your actual CalDAV server username, password, and device respectively.
|
48
|
+
Please replace `caldavendpoint.com` `your_username`, `your_password`, and `your_device` with your actual CalDAV server, username, password, and serial device respectively.
|
49
49
|
|
50
|
-
|
50
|
+
The device is a serial device that flashes an led when it receives data. On Linux, this is usually `/dev/ttyUSB0`. On macOS, this is usually `/dev/cu.usbserial-0001`. On Windows, this is usually `COM1`.
|
51
51
|
|
52
|
-
|
52
|
+
If you want to use this I highly recommend pairing it with the Raspberry Pi Pico and [this project](https://github.com/famiclone6502/DIY_Datalink_Adapter). It is the cheapest and easiest way to get a serial device that works with the Timex Datalink watch.
|
53
53
|
|
54
|
-
|
54
|
+
## Note
|
55
55
|
|
56
|
-
|
56
|
+
Ensure you have the necessary dependencies installed on your system and you have the correct permissions to access the specified device.
|
57
57
|
|
58
|
-
|
58
|
+
The tool currently filters down to events that have attendees and converts event times to Eastern Standard Time (EST). Events are sorted by time before syncing to the watch.
|
@@ -2,14 +2,27 @@ require 'calendav'
|
|
2
2
|
require 'icalendar/recurrence'
|
3
3
|
require 'timex_datalink_client'
|
4
4
|
require 'active_support/time'
|
5
|
+
require 'tzinfo'
|
5
6
|
|
6
7
|
module TimexDatalinkCaldav
|
7
8
|
class Client
|
8
|
-
def initialize(user, password, server_url, serial_device)
|
9
|
+
def initialize(user, password, server_url, serial_device, protocol_version)
|
9
10
|
@user = user
|
10
11
|
@password = password
|
11
12
|
@server_url = server_url
|
12
13
|
@serial_device = serial_device
|
14
|
+
@protocol_version = protocol_version.to_i
|
15
|
+
@protocol_class = case @protocol_version
|
16
|
+
when 1 then TimexDatalinkClient::Protocol1
|
17
|
+
when 3 then TimexDatalinkClient::Protocol3
|
18
|
+
when 4 then TimexDatalinkClient::Protocol4
|
19
|
+
else
|
20
|
+
raise ArgumentError, "Invalid protocol version: #{@protocol_version}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_localzone
|
25
|
+
TZInfo::Timezone.get(TZInfo::Timezone.all_country_zones.detect {|z| z.period_for_local(Time.now).utc_total_offset == Time.now.utc_offset}.identifier)
|
13
26
|
end
|
14
27
|
|
15
28
|
def get_events
|
@@ -40,11 +53,12 @@ module TimexDatalinkCaldav
|
|
40
53
|
if ical_event.attendee&.any? # Exclude events without attendees
|
41
54
|
next_occurrence = ical_event.occurrences_between(Time.now, Time.now + 24*60*60).first
|
42
55
|
if next_occurrence
|
43
|
-
|
56
|
+
puts get_localzone
|
57
|
+
est_time = next_occurrence.start_time.in_time_zone(get_localzone)
|
44
58
|
key = "#{est_time}_#{ical_event.summary.to_s}"
|
45
59
|
unless appointment_map[key] # Check if the event is already in the map
|
46
60
|
puts "Adding appointment: #{ical_event.summary.to_s} at time #{est_time}"
|
47
|
-
appointment =
|
61
|
+
appointment = @protocol_class::Eeprom::Appointment.new(
|
48
62
|
time: est_time,
|
49
63
|
message: ical_event.summary.to_s
|
50
64
|
)
|
@@ -62,26 +76,62 @@ module TimexDatalinkCaldav
|
|
62
76
|
end
|
63
77
|
|
64
78
|
def write_to_watch(appointments)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
79
|
+
# add 3 because it always seems to be about 3 seconds behind.
|
80
|
+
time1 = Time.now + 3
|
81
|
+
time2 = time1.dup.utc
|
82
|
+
|
83
|
+
if @protocol_version == 1
|
84
|
+
time_model = @protocol_class::Time.new(
|
71
85
|
zone: 1,
|
72
86
|
time: time1,
|
73
87
|
is_24h: false
|
74
|
-
)
|
75
|
-
|
88
|
+
)
|
89
|
+
time_name_model = @protocol_class::TimeName.new(
|
76
90
|
zone: 1,
|
77
91
|
name: time1.zone
|
78
|
-
)
|
79
|
-
|
92
|
+
)
|
93
|
+
utc_time_model = @protocol_class::Time.new(
|
94
|
+
zone: 2,
|
95
|
+
time: time2,
|
96
|
+
is_24h: true
|
97
|
+
)
|
98
|
+
utc_time_name_model = @protocol_class::TimeName.new(
|
99
|
+
zone: 2,
|
100
|
+
name: time2.zone
|
101
|
+
)
|
102
|
+
else
|
103
|
+
time_model = @protocol_class::Time.new(
|
104
|
+
zone: 1,
|
105
|
+
name: time1.zone,
|
106
|
+
time: time1,
|
107
|
+
is_24h: false,
|
108
|
+
date_format: "%_m-%d-%y"
|
109
|
+
)
|
110
|
+
utc_time_model = @protocol_class::Time.new(
|
111
|
+
zone: 2,
|
112
|
+
name: "UTC",
|
113
|
+
time: time2,
|
114
|
+
is_24h: true,
|
115
|
+
date_format: "%y-%m-%d"
|
116
|
+
)
|
117
|
+
time_name_model = nil # Not needed for protocol version 3 and 4
|
118
|
+
utc_time_name_model = nil # Not needed for protocol version 3 and 4
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
models = [
|
123
|
+
@protocol_class::Sync.new,
|
124
|
+
@protocol_class::Start.new,
|
125
|
+
time_model,
|
126
|
+
time_name_model,
|
127
|
+
utc_time_model,
|
128
|
+
utc_time_name_model,
|
129
|
+
@protocol_class::Eeprom.new(
|
80
130
|
appointments: appointments,
|
81
131
|
appointment_notification_minutes: 5
|
82
132
|
),
|
83
|
-
|
84
|
-
]
|
133
|
+
@protocol_class::End.new
|
134
|
+
].compact # Remove any nil entries
|
85
135
|
|
86
136
|
timex_datalink_client = TimexDatalinkClient.new(
|
87
137
|
serial_device: @serial_device,
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'optparse'
|
3
|
-
|
4
3
|
require_relative "timex_datalink_caldav/client"
|
5
4
|
|
6
5
|
module TimexDatalinkCaldav
|
@@ -10,7 +9,7 @@ module TimexDatalinkCaldav
|
|
10
9
|
end
|
11
10
|
|
12
11
|
def execute
|
13
|
-
client = TimexDatalinkCaldav::Client.new(@options.fetch(:user), @options.fetch(:password), @options.fetch(:uri), @options.fetch(:device))
|
12
|
+
client = TimexDatalinkCaldav::Client.new(@options.fetch(:user), @options.fetch(:password), @options.fetch(:uri), @options.fetch(:device), @options.fetch(:api,1))
|
14
13
|
client.sync_to_watch
|
15
14
|
end
|
16
15
|
|
@@ -36,6 +35,10 @@ module TimexDatalinkCaldav
|
|
36
35
|
opts.on("-d", "--device DEVICE", "Serial device for Timex Datalink watch") do |v|
|
37
36
|
options[:device] = v
|
38
37
|
end
|
38
|
+
|
39
|
+
opts.on("-a", "--api PROTOCOL_VERSION", "Protocol Version") do |v|
|
40
|
+
options[:api] = v
|
41
|
+
end
|
39
42
|
end.parse!(arguments)
|
40
43
|
options
|
41
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timex_datalink_caldav
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willy Hardy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'Adds a CLI and a feature to pull your next day of calendar events into
|
14
14
|
the Timex Datalink watch. Note: Hardcoded protocol1 and EST timezone. At the moment.'
|
@@ -19,7 +19,6 @@ executables:
|
|
19
19
|
extensions: []
|
20
20
|
extra_rdoc_files: []
|
21
21
|
files:
|
22
|
-
- ".DS_Store"
|
23
22
|
- CHANGELOG.md
|
24
23
|
- Gemfile
|
25
24
|
- Gemfile.lock
|
data/.DS_Store
DELETED
Binary file
|