towerops/CHANGELOG.txt
Graham McIntire abbe117f5e
add sensor value change events for all sensor types
extract sensor change detection from DevicePollerWorker into shared
SensorChangeDetector module. add sensor_value_changed event for non-%
sensors when value differs from last_value. agent channel now detects
changes and updates last_value, matching phoenix poller behavior.
2026-02-11 15:06:55 -06:00

54 lines
3.3 KiB
Text

CHANGELOG - towerops-web
========================
2026-02-11 - feat: add sensor value change events for all sensor types
- New file: lib/towerops/snmp/sensor_change_detector.ex
Extracted shared sensor change detection logic from DevicePollerWorker.
Detects threshold violations, spike/drop for % sensors, and new
sensor_value_changed events for all non-% sensors when value changes.
- File: lib/towerops/devices/event.ex
Added "sensor_value_changed" to allowed event types.
- File: lib/towerops/workers/device_poller_worker.ex
Replaced inline detect_sensor_changes with SensorChangeDetector module.
Removed ~240 lines of private functions now in shared module.
- File: lib/towerops_web/channels/agent_channel.ex
Added change detection and last_value/last_checked_at update to
process_sensor_reading/3 so agent-polled devices get same events
as Phoenix-polled devices.
- New file: test/towerops/snmp/sensor_change_detector_test.exs
11 tests covering value changes, spike/drop, thresholds, nil handling.
2026-02-11 - fix: live polling uses effective agent from site/org cascade
- File: lib/towerops_web/live/graph_live/show.ex
- Bug: Live poll mode used Agents.get_device_assignment/1 which only checks
direct device-level assignments. Devices with agent assigned at site or
org level fell through to direct Phoenix SNMP instead of routing to agent.
- Fix: Replaced with Agents.get_effective_agent_token/1 which walks the
device → site → org cascade, matching how regular polling resolves agents.
Also simplified request_agent_live_poll_and_wait to accept token_id directly.
2026-02-11 - fix: round sensor values to 1 decimal place
- Files: lib/towerops/workers/device_poller_worker.ex (poll_simple_sensor/2),
lib/towerops_web/channels/agent_channel.ex (process_sensor_reading/3)
- Bug: Division by sensor_divisor produced full float precision (e.g. 34.09999999)
- Fix: Wrap division result with Float.round(..., 1) in both Phoenix and agent paths
2026-02-11 - fix: update device status from agent monitoring checks
- File: lib/towerops_web/channels/agent_channel.ex (store_monitoring_check/2)
- Bug: Devices polled by remote agents stayed in "unknown" state because
store_monitoring_check saved the ping result but never called
Devices.update_device_status/2. The DeviceMonitorWorker (Phoenix-side)
skips agent-assigned devices entirely, so nothing ever updated status.
- Fix: Added update_device_status_from_check/2 and handle_agent_status_change/3
to derive :up/:down from check status, update device, create alerts on
transitions, and broadcast via PubSub — matching DeviceMonitorWorker behavior
- Also added alias Towerops.Alerts to the channel module
2026-02-11 - fix: update last_snmp_poll_at for agent-polled devices
- File: lib/towerops_web/channels/agent_channel.ex (process_polling_result/3)
- Bug: Devices polled by remote agents showed "Last Polled: Never" because
process_polling_result never called Devices.update_snmp_poll_time/1
- The Phoenix-side DevicePollerWorker already had this call (line 172),
but the agent channel path was missing it
- Fix: Added Devices.update_snmp_poll_time(device) at the top of
process_polling_result/3, matching the DevicePollerWorker pattern