feat: HA-Entitaeten fuer Push-Erinnerungen und Kanban; neues Feature Sidebar-Sichtbarkeit pro Nutzer
This commit is contained in:
@@ -288,6 +288,28 @@ function publishDiscovery() {
|
||||
availability_topic: AVAILABILITY_TOPIC, device: DEVICE,
|
||||
}],
|
||||
|
||||
// ── Dashboard ─────────────────────────────────────────────────────────
|
||||
['sensor', 'dickendock_dashboard_push_erinnerungen', {
|
||||
name: 'Dashboard Push-Erinnerungen offen',
|
||||
unique_id: 'dickendock_dashboard_push_erinnerungen',
|
||||
state_topic: `${BASE_TOPIC}/dashboard/push_erinnerungen`,
|
||||
json_attributes_topic: `${BASE_TOPIC}/dashboard/push_erinnerungen_attributes`,
|
||||
icon: 'mdi:bell-ring-outline',
|
||||
unit_of_measurement: 'Erinnerungen', state_class: 'measurement',
|
||||
availability_topic: AVAILABILITY_TOPIC, device: DEVICE,
|
||||
}],
|
||||
|
||||
// ── Kanban ────────────────────────────────────────────────────────────
|
||||
['sensor', 'dickendock_kanban_karten', {
|
||||
name: 'Kanban Karten offen',
|
||||
unique_id: 'dickendock_kanban_karten',
|
||||
state_topic: `${BASE_TOPIC}/kanban/karten`,
|
||||
json_attributes_topic: `${BASE_TOPIC}/kanban/karten_attributes`,
|
||||
icon: 'mdi:view-column-outline',
|
||||
unit_of_measurement: 'Karten', state_class: 'measurement',
|
||||
availability_topic: AVAILABILITY_TOPIC, device: DEVICE,
|
||||
}],
|
||||
|
||||
// ── System ────────────────────────────────────────────────────────────
|
||||
['sensor', 'dickendock_system_online', {
|
||||
name: 'System Nutzer online',
|
||||
@@ -542,6 +564,43 @@ function publishDruckStatistik() {
|
||||
pub('druck/bestellungen_gesamt', allOrders.length);
|
||||
}
|
||||
|
||||
// Wird jede Minute vom Scheduler aufgerufen — offene (noch nicht versendete,
|
||||
// in der Zukunft liegende) Push-Erinnerungen aus dem Dashboard, systemweit
|
||||
function publishPushErinnerungen() {
|
||||
if (!client?.connected) return;
|
||||
const offen = db.prepare(`
|
||||
SELECT s.message, s.scheduled_at, u.username
|
||||
FROM push_schedules s JOIN users u ON u.id = s.user_id
|
||||
WHERE s.sent = 0 AND s.scheduled_at > datetime('now','localtime')
|
||||
ORDER BY s.scheduled_at ASC
|
||||
`).all();
|
||||
client.publish(`${BASE_TOPIC}/dashboard/push_erinnerungen`, String(offen.length), { retain: true });
|
||||
client.publish(`${BASE_TOPIC}/dashboard/push_erinnerungen_attributes`, JSON.stringify({
|
||||
erinnerungen: offen,
|
||||
}), { retain: true });
|
||||
}
|
||||
|
||||
// Wird jede Minute vom Scheduler aufgerufen — alle Kanban-Karten über alle
|
||||
// Nutzer-Boards hinweg (Kanban ist pro Nutzer, hier systemweit aggregiert)
|
||||
function publishKanban() {
|
||||
if (!client?.connected) return;
|
||||
const karten = db.prepare(`
|
||||
SELECT k.title, k.priority, col.title AS spalte, u.username
|
||||
FROM kanban_cards k
|
||||
JOIN kanban_columns col ON col.id = k.column_id
|
||||
JOIN users u ON u.id = k.user_id
|
||||
ORDER BY u.username ASC, col.position ASC, k.position ASC
|
||||
`).all();
|
||||
const proNutzer = {};
|
||||
for (const k of karten) proNutzer[k.username] = (proNutzer[k.username] || 0) + 1;
|
||||
|
||||
client.publish(`${BASE_TOPIC}/kanban/karten`, String(karten.length), { retain: true });
|
||||
client.publish(`${BASE_TOPIC}/kanban/karten_attributes`, JSON.stringify({
|
||||
karten,
|
||||
pro_nutzer: proNutzer,
|
||||
}), { retain: true });
|
||||
}
|
||||
|
||||
// Wird von index.js gesetzt, um Zirkel-Requires zu vermeiden
|
||||
function setKoepiCheckHandler(fn) { koepiCheckHandler = fn; }
|
||||
function setMediaAckHandler(fn) { mediaAckHandler = fn; }
|
||||
@@ -553,6 +612,8 @@ module.exports = {
|
||||
publishPresence,
|
||||
publishMediaAnfragen,
|
||||
publishDruckStatistik,
|
||||
publishPushErinnerungen,
|
||||
publishKanban,
|
||||
setKoepiCheckHandler,
|
||||
setMediaAckHandler,
|
||||
setMediaAckAllHandler,
|
||||
|
||||
Reference in New Issue
Block a user