radio: Opa's update - Haagse ronde on scanner 1-3, QO-100 net (weekend reminder), antenna tip
Deploy production / deploy (push) Successful in 1m24s
Deploy production / deploy (push) Successful in 1m24s
- data (scripts/radio-2026-10-27-opa.sql): 145.450 in bank 1 ch 3 (ISS APRS UHF moved to ch 7), NL/EN notes for the Haagse ronde (scanner, not the WebSDR: trolls), new QO-100 satellietronde (daily 09:30, 10489.700 USB) with its reminder on Sat/Sun only - migration: radio.nets.remind_days (null = every day of the net); scripts/radio.ts honours it, and `upcoming [hours]` prints the day too - links: BATC/Goonhilly QO-100 WebSDR (via Opa, 27 Oct 2026); PI1DFT note about trolls - Radioweetjes: Haagse ronde on the scanner, QO-100 net, magnetic antenna on a radiator
This commit is contained in:
1 parent
2c8d1bd881
commit
c175c25615
7 files changed
+45930
-12
No files matched your search
+13
-5
@@ -5,7 +5,7 @@
|
||||
* passes over Gouda into radio.iss_passes (daily timer)
|
||||
* bun scripts/radio.ts remind ntfy reminder 10 minutes before each net (remind = true) and
|
||||
* each ISS pass with max elevation >= 10 deg (every-minute timer)
|
||||
* bun scripts/radio.ts upcoming print what the next 24 h of reminders would be (no sending)
|
||||
* bun scripts/radio.ts upcoming [hours] print the reminders due in the next 24 h (no sending)
|
||||
*
|
||||
* Reminders go to RADIO_NTFY_URL (an ntfy topic URL, optional RADIO_NTFY_TOKEN), passed in with
|
||||
* `docker exec --env-file ~/.config/radio.env`. radio.reminders makes every reminder fire once.
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
QUIET_HOURS,
|
||||
REMIND_MINUTES,
|
||||
compass,
|
||||
fmtDay,
|
||||
fmtTime,
|
||||
formatFreq,
|
||||
inQuiet,
|
||||
@@ -197,15 +198,21 @@ type Due = {
|
||||
tags: string[];
|
||||
};
|
||||
|
||||
/** The net's days that get a reminder: remind_days (when set) narrows the schedule. */
|
||||
function remindDays(days: unknown[], only: unknown[] | null): number[] {
|
||||
const all = days.map(Number);
|
||||
return only ? all.filter((d) => only.map(Number).includes(d)) : all;
|
||||
}
|
||||
|
||||
async function due(from: Date, to: Date): Promise<Due[]> {
|
||||
const out: Due[] = [];
|
||||
const nets = await sql`SELECT n.id, n.name, n.days, n.times, n.active, n.notes,
|
||||
const nets = await sql`SELECT n.id, n.name, n.days, n.remind_days, n.times, n.active, n.notes,
|
||||
f.freq_hz::float8 AS hz, f.mode, f.marine_ch
|
||||
FROM radio.nets n LEFT JOIN radio.frequencies f ON f.id = n.frequency_id
|
||||
WHERE n.remind AND n.active`;
|
||||
for (const n of nets) {
|
||||
for (const at of occurrences(
|
||||
{ id: n.id, days: n.days.map(Number), times: n.times },
|
||||
{ id: n.id, days: remindDays(n.days, n.remind_days), times: n.times },
|
||||
from,
|
||||
to
|
||||
)) {
|
||||
@@ -264,10 +271,11 @@ try {
|
||||
else if (mode === 'remind') await remind();
|
||||
else if (mode === 'upcoming') {
|
||||
const now = new Date();
|
||||
const hours = Number(process.argv[3] ?? 24);
|
||||
console.log(`quiet hours: ${QUIET?.label ?? 'off'} (Europe/Amsterdam, by send time)`);
|
||||
for (const r of await due(now, new Date(now.getTime() + 86_400_000)))
|
||||
for (const r of await due(now, new Date(now.getTime() + hours * 3_600_000)))
|
||||
console.log(
|
||||
`${quiet(r.at) ? 'QUIET-SKIP' : 'SEND '} at ${fmtTime(sendAt(r.at))} ${r.kind}: ${r.title}`
|
||||
`${quiet(r.at) ? 'QUIET-SKIP' : 'SEND '} at ${fmtDay(sendAt(r.at))} ${fmtTime(sendAt(r.at))} ${r.kind}: ${r.title}`
|
||||
);
|
||||
} else throw new Error(`unknown mode ${mode} (iss | remind | upcoming)`);
|
||||
} finally {
|
||||
|
||||
Reference in new issue
Block a user