feat: deep sleep single-fetch with probabilistic weighting
Refactor timerWakeCycle() to fetch a single random photo per wake using cycle-mode-aware server-side filtering via Immich's POST /api/search/random endpoint. Changes: - Add fetchOneRandomAssetId() to ImmichClient with support for isFavorite, takenAfter, takenBefore filter parameters - Add timer_last_date NVS field for chronological cursor persistence - Implement probabilistic filter selection per cycle mode: - Random: unfiltered size=1 - Chronological/ReverseChronological: date cursor in NVS - FavoritesWeighted: 66% favorites, 33% unfiltered - WeightedChronological: 66% recent (30d), 33% unfiltered - WeightedReverseChronological: 66% older (30d), 33% unfiltered - Add retry loop with filter relaxation on empty results - Initialize hardware RTC (RX8130CE) firmware-wide: - Seed system clock from RTC at boot (immediate time) - NTP sync after WiFi connect, write back to RTC - Add time_utils.h with isoNow(), isoNowMinus30d(), hasValidTime() Normal mode (PhotoQueue + displayTask) is completely untouched. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
33
src/time_utils.h
Normal file
33
src/time_utils.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <time.h>
|
||||
|
||||
// Returns true if the system clock has been set to a plausible time (year >= 2020).
|
||||
inline bool hasValidTime() {
|
||||
time_t now = time(nullptr);
|
||||
struct tm t;
|
||||
gmtime_r(&now, &t);
|
||||
return (t.tm_year + 1900) >= 2020;
|
||||
}
|
||||
|
||||
// Returns the current UTC time as an ISO 8601 string (e.g., "2026-08-04T17:30:00.000Z").
|
||||
inline String isoNow() {
|
||||
time_t now = time(nullptr);
|
||||
struct tm t;
|
||||
gmtime_r(&now, &t);
|
||||
char buf[32];
|
||||
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S.000Z", &t);
|
||||
return String(buf);
|
||||
}
|
||||
|
||||
// Returns (now - 30 days) as an ISO 8601 UTC string.
|
||||
inline String isoNowMinus30d() {
|
||||
time_t now = time(nullptr);
|
||||
now -= 30 * 24 * 3600; // Subtract 30 days in seconds
|
||||
struct tm t;
|
||||
gmtime_r(&now, &t);
|
||||
char buf[32];
|
||||
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S.000Z", &t);
|
||||
return String(buf);
|
||||
}
|
||||
Reference in New Issue
Block a user