Commit Graph

20 Commits

Author SHA1 Message Date
Darell Tan
aa317d4413 Log microseconds only on dev builds 2026-01-16 19:15:32 +08:00
Darell Tan
c52973f225 Maintain MQTT message order during processing
Previously the message handler spawned a goroutine for each message and
hoped for the best, but obviously it didn't work. Z2M often emitted the
current (old) state first, before sending out the updated state. Without
ordering, the old state might get processed later and overwrote the new,
correct state.

Message handling is now serialized, but decoupled, using a buffered
channel and a separate goroutine for processing.
2026-01-16 18:31:47 +08:00
Darell Tan
8f39074f36 Added receive timestamp for MQTT messages 2026-01-12 23:20:44 +08:00
Darell Tan
93a8d59cd9 Added more debugging output and microsecond log timestamps 2026-01-12 23:17:02 +08:00
Darell Tan
03004e809f Suppress debug lines for z2m bridge/logging messages 2024-11-25 02:39:32 +08:00
Darell Tan
40302d6ec0 Code cleanup 2024-11-24 16:13:24 +08:00
Darell Tan
e9b0e4b0f9 Introduce SetCharacteristicValueFunc to the Mapping
This function allows either replacing or modifying the usual
Exposed->Characteristic value propagation.

It also adds a CurrentValue to the mapping to monitor for
changes/updates, regardless of whether the value was updated into the
Characteristic. This will be the source of truth.
2024-11-24 15:52:40 +08:00
Darell Tan
4d51380873 Don't start HAP server without any devices
This ensures that when iOS reconnects, it doesn't find an empty server
and thinks all the devices have been removed, and removes them all
locally.
2024-11-22 04:01:07 +08:00
Darell Tan
e678f2a31d Only process EndDevices during add and more verbose errors
If a Coordinator is present in the device list, AddDevicesFromJSON will
fail catastrophically, which shouldn't happen. Therefore, make sure only
EndDevices are considered during add. Also updated the tests to check
for this.

Added a device descriptor for failed adds. This will help with
identifying which device failed (and perhaps, why).
2024-11-22 03:40:27 +08:00
Darell Tan
1fbc4d520a Use a more secure PIN config by default
The server used to use the hap default PIN, but using a fixed PIN is not
secure. A random PIN is now generated on first run and displayed to the
console (or journal), similar to how homebridge does it. It can also be
specified explicitly by the user in the config file.
2023-08-12 01:35:07 +08:00
Darell Tan
fe5d0ce14c Disable TCP keepalives explicitly
It looks like Go has adopted 15s TCP keepalives as a default for _all_
TCP connections, which is quite dumb if you ask me.
https://github.com/golang/go/issues/48622

For the HAP server's side, it degrades iOS battery life significantly by
waking the device every 15s to respond to these packets. In the case as
a normal MQTT client, it increases traffic on top of the 60s keepalive
we've already set at the application layer. In both cases, the solution
is to just explicitly disable TCP keepalives.

Upgrade hap to the latest version that contains the fix brutella/hap#36.
2023-08-09 01:41:00 +08:00
Darell Tan
b1949c73fd Handle unknown device types
For devices that we have no idea how to handle, i.e. no services or
expose entries were processed, we return ErrUnknownDeviceType and skip
it during AddDevicesFromJSON(). This prevents a device from showing up
where HomeKit says it's not supported.
2023-08-04 23:49:51 +08:00
Darell Tan
ba9a42b64e Added quiet mode for reduced verbosity
This is useful to reduce clutter if you're running the service and it's
writing logs to the main syslog.
2023-08-04 00:56:30 +08:00
Darell Tan
59b049faea Add config options for ListenAddr & Interfaces
These options are helpful when the bridge is running on a multi-homed
device like a wireless router.
2023-08-03 23:28:52 +08:00
Darell Tan
3cfc3f68b0 Added debug mode for more verbose logging
Also had to rename the existing DEBUG consts to DEVMODE, so as to not
confuse the two. DEVMODE is meant for developers and cannot be enabled
on-the-fly, whereas debug mode is for users to check that the bridge is
working, MQTT messages are received etc.

Update logging is throttled to avoid spurious messages for uncoalesced
MQTT updates and motion sensors. On my network with 10 devices, an
update is logged every 1-2 minutes on average.
2023-08-03 21:32:14 +08:00
Darell Tan
54aa0795c3 Fix for unacknowledged numeric Z2M state updates
So far Z2M state updates were only boolean (the device `state` on/off),
but after introducing `brightness` values, Z2M state updates may not be
recognized/acknowledged. Unmarshalled Z2M numeric values are always
float64, but updates sent out via MQTT might not be. As a result, the
values may not directly equal and may never match.

To solve this, cast the outgoing expected value into a float64 to
compare against the received Z2M value, which is already a float64.
2023-06-25 02:34:34 +08:00
Darell Tan
48eabc2342 Mark old last_seen devices as "not responding"
Devices that have not received an update since a fixed timeout (24 hrs
for now), based on its last_seen time, will be marked as "not
responding" in the Home app. With this I can identify which devices are
unreachable or dead.

Also needed to upgrade hap with the fix for brutella/hap#30, or the
entire bridge will stop working.
2023-05-22 22:38:20 +08:00
Darell Tan
edade53b06 Record & persist device last_seen time
This will allow us to mark devices as non-responsive if they haven't
been seen in some time.
2023-05-21 02:20:37 +08:00
Darell Tan
e44f33aa29 Don't persist Z2M state with "zero" values
When storing Z2M state, skip properties with default "zero" values. This
should skip devices and properties that were not updated via MQTT yet.
2023-05-14 02:09:17 +08:00
Darell Tan
84398fc53a "Initial" working version, after cleanup. 2023-04-26 23:20:07 +08:00