NEWS
[Test] KanBan-Board
-
Neuer Adapter: Kanban Board
Stand: Version 0.3.0. Was sich seit 0.2.1 geändert hat, steht unten unter „Neu in 0.3.0".
Ein Kanban-Board als eigener ioBroker-Adapter. Er bringt seinen eigenen Webserver mit, liefert eine Single-Page-App ohne Framework aus und hält alle offenen Ansichten per WebSocket live synchron. Gedacht für Haushalte, die Aufgaben gemeinsam verwalten wollen, ob Familie, WG oder Wartungsplan fürs Haus, und die sie dort haben möchten, wo ohnehin ioBroker läuft. Jedes Ereignis landet in einem State, den Skripte und Node-RED auswerten können, und das Board lässt sich als Webpage-Card in Lovelace einbetten.
Die Features

- Eigener Webserver (Standardport 8095), die Oberfläche kommt direkt vom Adapter, für UI-Updates ist kein
iobroker uploadnötig - Mehrere Boards mit frei konfigurierbaren Spalten (Name, Reihenfolge, Anzeige-Limit, WIP-Limit, Häkchen für „Neu" und „Erledigt")
- Karten mit Titel, Markdown-Beschreibung, Zuständigen, Fälligkeit (auf Wunsch mit Uhrzeit), Labels, Farbe, Priorität, Checkliste, Link, Ort und Kalender-Einladung
- Wiederkehrende Aufgaben: täglich, wöchentlich, monatlich, jährlich, n-ter Wochentag, n-ter Arbeitstag inklusive Feiertagsberechnung, dazu freie Cron-Ausdrücke
- Papierkorb je Board: Gelöschtes bleibt 30 Tage wiederherstellbar, altes Erledigtes wandert auf Wunsch automatisch dorthin
- Sortierung je Spalte in fünf Modi mit Richtungsumschalter, oder weiter von Hand per Drag & Drop
- Drag & Drop mit Maus und Touch, Live-Sync über WebSocket auf alle offenen Ansichten
- Mehrere Benutzer ohne Login: Die Benutzerliste steht in den Instanzeinstellungen, je Board wird festgelegt, wer zuweisbar ist. Die Chips in der Kopfzeile sind zugleich ein je Board gespeicherter Personenfilter
- E-Mail-Benachrichtigungen über den
email-Adapter bei Zuweisung, Fälligkeit und Karten-Ereignissen, je Ereignis und je Benutzer schaltbar, mit Kalender-Einladung als Anhang - Elf Sprachen (de, en, fr, nl, it, es, pl, pt, ru, uk, zh-cn), dazu Datums- und Uhrzeitformat je Instanz, Theme hell/dunkel/automatisch, Akzentfarbe und eigenes CSS

Integration
- REST-API für alles, was die Oberfläche auch kann. Lesen ist im LAN offen, Schreiben braucht einen Token
- Eingehende Webhooks mit eigenen Tokens je Integration, auf einzelne Boards begrenzbar
- Ausgehende Webhooks: JSON-POST an beliebige URLs bei jedem Ereignis
sendTound deraction-State für ioBroker-Skripte, mit demselben Kommando-Vokabular- Spiegel-States je Board und je Benutzer (Kartenzahl, überfällige Karten, letztes Ereignis) für Dashboards und Skript-Trigger
- iframe-tauglich, mit
?embed=1für Lovelace-Webpage-Cards
Andere Dienste wie Telegram oder Pushover sind bewusst nicht fest eingebaut. Jedes Ereignis landet im State
kanban.0.lastEventund geht auf Wunsch als ausgehender Webhook raus, ein kurzes Skript verteilt es weiter. Ein fertiges Telegram-Beispiel zum Kopieren steht in der Doku, für Pushover, Pushbullet oder WhatsApp tauscht man nur die Sende-Zeile.Mobil
Auf schmalen Bildschirmen stapelt das Board die Spalten untereinander, jede lässt sich als Akkordeon ein- und ausklappen. Dialoge öffnen im Vollbild mit fester Aktionsleiste. Zum Verschieben eine Karte kurz gedrückt halten, beim Ziehen erscheint oben eine Leiste mit den Zielspalten.

Installation
Voraussetzungen: js-controller ab 6.0.11 und Node.js ab 22. Für E-Mail-Benachrichtigungen zusätzlich eine eingerichtete
email-Instanz, für regionsgenaue Feiertage optional derfeiertage-Adapter.Im offiziellen ioBroker-Repository ist der Adapter noch nicht, die Aufnahme läuft. Bis dahin über Adapter → eigene URL installieren:
https://github.com/bmueller77/ioBroker.kanbanDanach eine Instanz anlegen, unter Instanzen den Port prüfen und die Oberfläche unter
http://<host>:8095/öffnen.Neu in 0.3.0
Zwei der größeren Punkte kommen aus diesem Thread, danke an @lyc für die Anstöße in Beitrag #5.
Sortierung je Spalte (#10): Ein Umschalter im Spaltenkopf bietet fünf Modi, Drag & Drop, Anfasser, Fälligkeit, Priorität und Alter in der Spalte. Bei den automatischen Modi kehrt ein zweiter Schalter die Richtung um. Beides wird pro Gerät gespeichert, gilt also nur für dich, und die eigene Reihenfolge bleibt beim Zurückschalten erhalten. Der Anfasser-Modus war der zweite Teil des Wunsches: Dort wird nur über einen Griff links an der Karte gezogen, was auf dem Touchscreen deutlich besser zu treffen ist.
Karten zwischen Boards verschieben oder kopieren (#11): Der Button „Verwalten" im Karten-Editor bietet klonen, kopieren und verschieben. Die im Thread offenen Punkte sind so gelöst: Zielspalte ist die erste Spalte des Ziel-Boards, Labels werden über den Namen abgeglichen, und Zuständige bleiben nur, wenn sie im Ziel-Board Mitglied sind. Bliebe niemand übrig, fragt der Dialog nach.
Messenger-Anbindung (#12) bleibt offen. Fest eingebaut ist weiterhin nur E-Mail, alles andere läuft über
lastEventoder einen ausgehenden Webhook. Der Benachrichtigungs-Tab verweist jetzt direkt auf den passenden Doku-Abschnitt.
Dazu neu: der Papierkorb mit 30-Tage-Frist und automatischem Aufräumen alter erledigter Karten, Wiederholung per Cron-Ausdruck mit Klartext-Vorschau und den nächsten drei Terminen, Serientermin-Einladungen statt eines Einzeltermins je Wiederholung,
dueAt(Fälligkeit inklusive Uhrzeit als ISO-Zeitstempel) in jedem Ereignis und jeder API-Antwort, eine Option für minutengenauecardDue-Ereignisse, Bestätigungsdialoge innerhalb der Oberfläche statt der Browser-Abfrage, 6 weitere Sprachen und einige Designanpassungen.Sicherheit, bitte lesen
Zwei Lücken, die jeden betreffen, der die API benutzt:
Der Schreib-Token war für jede Webseite lesbar.
Access-Control-Allow-Origin: *stand auf allen Routen, auch auf der Seite, die den Token an die Oberfläche ausliefert. Eine beliebige offene Webseite konnte im Hintergrund den Adapter im Netz suchen, diese Seite auslesen, den Token übernehmen und anschließend Karten und Boards ändern oder löschen. CORS ist jetzt auf/apiund/webhookbeschränkt und nur für eingetragene Herkünfte offen, Vorgabe leer. Betroffen war ausschließlich der Zugriff aus einem Browser, Skripte und curl liefen nie über diese Prüfung.Ein board-begrenzter Token kam aus seinen Boards heraus. Auf
/apiwurde die Begrenzung gar nicht geprüft, auf der Kommando-Route genügte ein erlaubtes Board irgendwo im Body als Nachweis. Jetzt zählt das Board, das der Aufruf tatsächlich anfasst.Außerdem: Eine leer gelassene Token-Zeile passte bisher auf jede Anfrage ohne Token, und ein leeres Feld „Erlaubte Boards" galt als „alle" statt als „keins". Beides ist korrigiert. Tokens werden nicht mehr als URL-Parameter angenommen, das interne SPA-Secret liegt im Dateispeicher statt in einem lesbaren State.
Wichtig für bestehende Automatisierungen
Die API biegt fehlerhafte Angaben nicht mehr stillschweigend zurecht. Eine unbekannte
columnIdlandete bisher in der ersten Spalte, ein ungültigesduewurde verworfen,getBoardauf ein unbekanntes Board antwortete mit200undnull. Alle drei Fälle liefern jetzt einen Fehler.Behobene Fehler aus 0.2.1
- Auf Tablets ließen sich Karten nicht in eine andere Spalte ziehen.
- Karten landeten beim Ziehen an falscher Stelle, wenn ein Filter oder Anzeige-Limit aktiv war.
- Der Ansichten-Dialog bot nach einem Board-Wechsel weiter die Benutzer des vorherigen Boards an.
- Eine Board-Aktualisierung konnte auf das gerade verlassene Board zurückspringen.
- Wiederholungen vererbten Uhrzeit, Ort und Kalender-Häkchen nicht an die Folgekarte.
- Ein Board, dessen Mitgliederliste nach dem Umbenennen von Benutzer-IDs ins Leere zeigte, wurde unbenutzbar.
- Das Abhaken eines Checklisten-Punkts scrollte das Board nach oben.
Rückmeldungen und Wünsche gerne hier im Thread. Die ausführliche Doku liegt im Repository unter
docs/de/README.md, den vollständigen Changelog gibt es im README. - Eigener Webserver (Standardport 8095), die Oberfläche kommt direkt vom Adapter, für UI-Updates ist kein
-
Neuer Adapter: Kanban Board
Stand: Version 0.3.0. Was sich seit 0.2.1 geändert hat, steht unten unter „Neu in 0.3.0".
Ein Kanban-Board als eigener ioBroker-Adapter. Er bringt seinen eigenen Webserver mit, liefert eine Single-Page-App ohne Framework aus und hält alle offenen Ansichten per WebSocket live synchron. Gedacht für Haushalte, die Aufgaben gemeinsam verwalten wollen, ob Familie, WG oder Wartungsplan fürs Haus, und die sie dort haben möchten, wo ohnehin ioBroker läuft. Jedes Ereignis landet in einem State, den Skripte und Node-RED auswerten können, und das Board lässt sich als Webpage-Card in Lovelace einbetten.
Die Features

- Eigener Webserver (Standardport 8095), die Oberfläche kommt direkt vom Adapter, für UI-Updates ist kein
iobroker uploadnötig - Mehrere Boards mit frei konfigurierbaren Spalten (Name, Reihenfolge, Anzeige-Limit, WIP-Limit, Häkchen für „Neu" und „Erledigt")
- Karten mit Titel, Markdown-Beschreibung, Zuständigen, Fälligkeit (auf Wunsch mit Uhrzeit), Labels, Farbe, Priorität, Checkliste, Link, Ort und Kalender-Einladung
- Wiederkehrende Aufgaben: täglich, wöchentlich, monatlich, jährlich, n-ter Wochentag, n-ter Arbeitstag inklusive Feiertagsberechnung, dazu freie Cron-Ausdrücke
- Papierkorb je Board: Gelöschtes bleibt 30 Tage wiederherstellbar, altes Erledigtes wandert auf Wunsch automatisch dorthin
- Sortierung je Spalte in fünf Modi mit Richtungsumschalter, oder weiter von Hand per Drag & Drop
- Drag & Drop mit Maus und Touch, Live-Sync über WebSocket auf alle offenen Ansichten
- Mehrere Benutzer ohne Login: Die Benutzerliste steht in den Instanzeinstellungen, je Board wird festgelegt, wer zuweisbar ist. Die Chips in der Kopfzeile sind zugleich ein je Board gespeicherter Personenfilter
- E-Mail-Benachrichtigungen über den
email-Adapter bei Zuweisung, Fälligkeit und Karten-Ereignissen, je Ereignis und je Benutzer schaltbar, mit Kalender-Einladung als Anhang - Elf Sprachen (de, en, fr, nl, it, es, pl, pt, ru, uk, zh-cn), dazu Datums- und Uhrzeitformat je Instanz, Theme hell/dunkel/automatisch, Akzentfarbe und eigenes CSS

Integration
- REST-API für alles, was die Oberfläche auch kann. Lesen ist im LAN offen, Schreiben braucht einen Token
- Eingehende Webhooks mit eigenen Tokens je Integration, auf einzelne Boards begrenzbar
- Ausgehende Webhooks: JSON-POST an beliebige URLs bei jedem Ereignis
sendTound deraction-State für ioBroker-Skripte, mit demselben Kommando-Vokabular- Spiegel-States je Board und je Benutzer (Kartenzahl, überfällige Karten, letztes Ereignis) für Dashboards und Skript-Trigger
- iframe-tauglich, mit
?embed=1für Lovelace-Webpage-Cards
Andere Dienste wie Telegram oder Pushover sind bewusst nicht fest eingebaut. Jedes Ereignis landet im State
kanban.0.lastEventund geht auf Wunsch als ausgehender Webhook raus, ein kurzes Skript verteilt es weiter. Ein fertiges Telegram-Beispiel zum Kopieren steht in der Doku, für Pushover, Pushbullet oder WhatsApp tauscht man nur die Sende-Zeile.Mobil
Auf schmalen Bildschirmen stapelt das Board die Spalten untereinander, jede lässt sich als Akkordeon ein- und ausklappen. Dialoge öffnen im Vollbild mit fester Aktionsleiste. Zum Verschieben eine Karte kurz gedrückt halten, beim Ziehen erscheint oben eine Leiste mit den Zielspalten.

Installation
Voraussetzungen: js-controller ab 6.0.11 und Node.js ab 22. Für E-Mail-Benachrichtigungen zusätzlich eine eingerichtete
email-Instanz, für regionsgenaue Feiertage optional derfeiertage-Adapter.Im offiziellen ioBroker-Repository ist der Adapter noch nicht, die Aufnahme läuft. Bis dahin über Adapter → eigene URL installieren:
https://github.com/bmueller77/ioBroker.kanbanDanach eine Instanz anlegen, unter Instanzen den Port prüfen und die Oberfläche unter
http://<host>:8095/öffnen.Neu in 0.3.0
Zwei der größeren Punkte kommen aus diesem Thread, danke an @lyc für die Anstöße in Beitrag #5.
Sortierung je Spalte (#10): Ein Umschalter im Spaltenkopf bietet fünf Modi, Drag & Drop, Anfasser, Fälligkeit, Priorität und Alter in der Spalte. Bei den automatischen Modi kehrt ein zweiter Schalter die Richtung um. Beides wird pro Gerät gespeichert, gilt also nur für dich, und die eigene Reihenfolge bleibt beim Zurückschalten erhalten. Der Anfasser-Modus war der zweite Teil des Wunsches: Dort wird nur über einen Griff links an der Karte gezogen, was auf dem Touchscreen deutlich besser zu treffen ist.
Karten zwischen Boards verschieben oder kopieren (#11): Der Button „Verwalten" im Karten-Editor bietet klonen, kopieren und verschieben. Die im Thread offenen Punkte sind so gelöst: Zielspalte ist die erste Spalte des Ziel-Boards, Labels werden über den Namen abgeglichen, und Zuständige bleiben nur, wenn sie im Ziel-Board Mitglied sind. Bliebe niemand übrig, fragt der Dialog nach.
Messenger-Anbindung (#12) bleibt offen. Fest eingebaut ist weiterhin nur E-Mail, alles andere läuft über
lastEventoder einen ausgehenden Webhook. Der Benachrichtigungs-Tab verweist jetzt direkt auf den passenden Doku-Abschnitt.
Dazu neu: der Papierkorb mit 30-Tage-Frist und automatischem Aufräumen alter erledigter Karten, Wiederholung per Cron-Ausdruck mit Klartext-Vorschau und den nächsten drei Terminen, Serientermin-Einladungen statt eines Einzeltermins je Wiederholung,
dueAt(Fälligkeit inklusive Uhrzeit als ISO-Zeitstempel) in jedem Ereignis und jeder API-Antwort, eine Option für minutengenauecardDue-Ereignisse, Bestätigungsdialoge innerhalb der Oberfläche statt der Browser-Abfrage, 6 weitere Sprachen und einige Designanpassungen.Sicherheit, bitte lesen
Zwei Lücken, die jeden betreffen, der die API benutzt:
Der Schreib-Token war für jede Webseite lesbar.
Access-Control-Allow-Origin: *stand auf allen Routen, auch auf der Seite, die den Token an die Oberfläche ausliefert. Eine beliebige offene Webseite konnte im Hintergrund den Adapter im Netz suchen, diese Seite auslesen, den Token übernehmen und anschließend Karten und Boards ändern oder löschen. CORS ist jetzt auf/apiund/webhookbeschränkt und nur für eingetragene Herkünfte offen, Vorgabe leer. Betroffen war ausschließlich der Zugriff aus einem Browser, Skripte und curl liefen nie über diese Prüfung.Ein board-begrenzter Token kam aus seinen Boards heraus. Auf
/apiwurde die Begrenzung gar nicht geprüft, auf der Kommando-Route genügte ein erlaubtes Board irgendwo im Body als Nachweis. Jetzt zählt das Board, das der Aufruf tatsächlich anfasst.Außerdem: Eine leer gelassene Token-Zeile passte bisher auf jede Anfrage ohne Token, und ein leeres Feld „Erlaubte Boards" galt als „alle" statt als „keins". Beides ist korrigiert. Tokens werden nicht mehr als URL-Parameter angenommen, das interne SPA-Secret liegt im Dateispeicher statt in einem lesbaren State.
Wichtig für bestehende Automatisierungen
Die API biegt fehlerhafte Angaben nicht mehr stillschweigend zurecht. Eine unbekannte
columnIdlandete bisher in der ersten Spalte, ein ungültigesduewurde verworfen,getBoardauf ein unbekanntes Board antwortete mit200undnull. Alle drei Fälle liefern jetzt einen Fehler.Behobene Fehler aus 0.2.1
- Auf Tablets ließen sich Karten nicht in eine andere Spalte ziehen.
- Karten landeten beim Ziehen an falscher Stelle, wenn ein Filter oder Anzeige-Limit aktiv war.
- Der Ansichten-Dialog bot nach einem Board-Wechsel weiter die Benutzer des vorherigen Boards an.
- Eine Board-Aktualisierung konnte auf das gerade verlassene Board zurückspringen.
- Wiederholungen vererbten Uhrzeit, Ort und Kalender-Häkchen nicht an die Folgekarte.
- Ein Board, dessen Mitgliederliste nach dem Umbenennen von Benutzer-IDs ins Leere zeigte, wurde unbenutzbar.
- Das Abhaken eines Checklisten-Punkts scrollte das Board nach oben.
Rückmeldungen und Wünsche gerne hier im Thread. Die ausführliche Doku liegt im Repository unter
docs/de/README.md, den vollständigen Changelog gibt es im README. - Eigener Webserver (Standardport 8095), die Oberfläche kommt direkt vom Adapter, für UI-Updates ist kein
-
Ich hab den Adapter jetzt auch mal installiert, läuft.
Hab dann mal ein Board angelegt und zwei Benutzer.Ich kann allerdings keine Bilder auswählen, egal ob ich das original Bild nehme, oder es vorher schon verkleinere (auf 128x128px), es spielt auch keine Rolle ob .jpg oder .png, ich bekomme jedesmal die Meldung ' Upload fehlgeschlagen: Bild konnte nicht gelesen werden'.
-
H Homoran verschob dieses Thema von Entwicklung am
-
Hab den Adapter auch mal installiert und ein wenig damit herumgespielt. Was mir auffällt, um diesen wirklich zu nutzen, "Termine" lassen sich nicht oder werden nicht sortiert, ich muss also alle Einträge durchsuchen was in den nächsten Tagen als Nächstes ansteht oder bis wann es erledigt werden muss. Ein verschieben von Aufgaben auf andere Board gibt es nicht, also nur neu anlegen. Bilder zum Benutzer hinzufügen gibt nur den Fehler "Upload fehlgeschlagen: Bild konnte nicht gelesen werden". Optional, wäre es super, dass es andere Benachrichtigungsmöglichkeiten direkt im Adapter gibt z. B. Pushover, Whatsapp, etc. Danke für das Teilen und testen lassen.
-
Danke euch fürs Testen und das Feedback!
@icebear @lyc: Avatar-Upload ("Bild konnte nicht gelesen werden") Den Fehler konnte ich reproduzieren: Die Content-Security-Policy der Oberfläche blockiert das lokale Einlesen des Bildes. Der Fix kommt im nächsten Update.
@lyc: Sortierung Per Default gibt es bei Kanban bewusst keine automatische Sortierung: du schiebst die Karten selbst in die gewünschte Reihenfolge (klicken, halten, hoch/runter; geht auch per Touch am Handy). Eine automatische Sortierung wirft immer Fragen auf: nach Priorität? Nach Datum? Einträge ohne Datum oben oder unten? Nach Person? etc. pp.
Was ich mir aber gut vorstellen kann: ein optionaler Schalter „nach Fälligkeit sortieren" pro Spalte. Dann bleibt „manuell" der Standard und wer will, schaltet die Sortierung dazu. Alternativ (oder zusätzlich) ein Anfasser zum leichteren Verschieben, wie bei den Spalten in den Board-Einstellungen. Wie sind hier die Meinungen der Community?@lyc – Karten auf ein anderes Board verschieben Guter Punkt, das gibt es aktuell nicht (nur neu anlegen). Nehme ich als Feature-Wunsch auf.
Was die Integration von Messengern oder Pushdiensten angeht... da hat natürlich jeder seine persönlichen Vorlieben. Wenn ich heute Whatsapp und Pushover nativ integriere, möchte morgen jemand Matrix, übermorgen ein anderer PushBullet und Signal oder Telegram... usw.
Daher würde ich das gerne anders lösen und diese Möglichkeit habt ihr bereits mit der Version 0.2.0: Der Adapter feuert bei jedem Ereignis einen ausgehenden Webhook und schreibt zusätzlich den State kanban.0.lastEvent (inklusive Board, Karte, Zuständigen und Fälligkeit). Damit kann sich jeder die Benachrichtigung per Skript oder Node-RED an jeden beliebigen Dienst (Pushover, Signal, Telegram, Pushbullet …) schicken lassen.Hier ein fertiges JavaScript-Beispiel (Telegram), das auch in der Doku landen wird.
// ============================================================ // Kanban -> messenger notifications (Telegram example) // Runs in the ioBroker JavaScript adapter. // Reacts to kanban.0.lastEvent and sends the assigned users a // message. The same pattern works with Pushover, Signal, // Pushbullet, WhatsApp ... - just swap the sendTo line. // ============================================================ // ---- Configuration ----------------------------------------- const KANBAN = 'kanban.0'; // Kanban instance const MESSENGER = 'telegram.0'; // messenger instance (Telegram here) const BASE_URL = 'http://192.168.1.10:8095'; // board base URL (fallback if the event has no link) // Mapping: Kanban user id -> messenger chat id // Key = the Kanban user id (lowercase "name" as in card.assignees, e.g. "user1"), NOT the display name. // Value = the recipient id (Telegram: the numeric "ID" column of telegram.0.communicate.users). const USERS = { user1: '123456789', // user2: '234567890', }; // Which events should trigger a message? // Available: cardCreated, cardAssigned, cardUpdated, cardMoved, cardDone, cardDeleted, cardDue // Tip: 'cardAssigned' + 'cardDue' is enough for most setups. Adding 'cardCreated' // sends an extra message when a card is created. const EVENTS = ['cardAssigned', 'cardDue']; // Skip the person who triggered the change? Uses ev.detail.by (the actor). // Note: the board has NO login, so the web UI does not identify the actor - // "by" is only filled for changes made via API / webhooks / scripts that pass // a "by" field (e.g. your own agents). For plain clicks in the board UI this // option therefore has no effect. const SKIP_SELF = true; // If a person has no messenger mapping: send to everyone? (false = skip) const BROADCAST_IF_UNMAPPED = false; // ------------------------------------------------------------ const HEADER = { cardAssigned: 'Assigned to you', cardDue: 'Due', cardCreated: 'New card', cardMoved: 'Moved', cardDone: 'Done', cardUpdated: 'Updated', }; const PRIO = ['', 'Priority: High', 'Priority: Urgent']; function buildText(ev) { const c = ev.card || {}; const b = ev.board || {}; const lines = ['[Kanban] ' + (HEADER[ev.event] || ev.event), '']; lines.push(c.title || '(no title)'); lines.push('Board: ' + (b.title || b.id || '?')); if (c.due) lines.push('Due: ' + c.due + (c.dueTime ? ' ' + c.dueTime : '')); if (c.priority) lines.push(PRIO[c.priority]); // The adapter adds a ready-to-use deep link as ev.link; fall back to building one const link = ev.link || (c.id && b.id ? BASE_URL + '/?board=' + encodeURIComponent(b.id) + '&card=' + encodeURIComponent(c.id) : ''); if (link) { lines.push(''); lines.push(link); } return lines.join('\n'); } on({ id: KANBAN + '.lastEvent', change: 'any' }, (obj) => { let ev; try { ev = JSON.parse(obj.state.val); } catch (e) { return; } if (!ev || !EVENTS.includes(ev.event)) return; // Determine recipients let recipients; if (ev.event === 'cardAssigned' && ev.detail && ev.detail.assignee) { recipients = [ev.detail.assignee]; // only the newly assigned person } else { recipients = (ev.card && ev.card.assignees) || []; // all assignees } // Optionally drop the person who triggered the change (no self-notification) const by = ev.detail && ev.detail.by; if (SKIP_SELF && by) recipients = recipients.filter(u => u !== by); if (!recipients.length) return; const text = buildText(ev); const already = new Set(); for (const uid of recipients) { const chatId = USERS[uid]; if (chatId) { if (already.has(chatId)) continue; already.add(chatId); sendTo(MESSENGER, { chatId: chatId, text: text }); // adjust to your messenger's sendTo parameters if needed } else if (BROADCAST_IF_UNMAPPED) { sendTo(MESSENGER, { text: text }); // adjust to your messenger's broadcast parameters if needed } // otherwise: no mapping -> skipped } });WhatsApp direkt einzubauen ist übrigens unpraktisch, weil der kostenlose WhatsApp-Adapter den API-Key an eine feste Empfängernummer (CallMeBot) bindet. Heisst, je User bräuchte man eine eigene Instanz.
-
Danke euch fürs Testen und das Feedback!
@icebear @lyc: Avatar-Upload ("Bild konnte nicht gelesen werden") Den Fehler konnte ich reproduzieren: Die Content-Security-Policy der Oberfläche blockiert das lokale Einlesen des Bildes. Der Fix kommt im nächsten Update.
@lyc: Sortierung Per Default gibt es bei Kanban bewusst keine automatische Sortierung: du schiebst die Karten selbst in die gewünschte Reihenfolge (klicken, halten, hoch/runter; geht auch per Touch am Handy). Eine automatische Sortierung wirft immer Fragen auf: nach Priorität? Nach Datum? Einträge ohne Datum oben oder unten? Nach Person? etc. pp.
Was ich mir aber gut vorstellen kann: ein optionaler Schalter „nach Fälligkeit sortieren" pro Spalte. Dann bleibt „manuell" der Standard und wer will, schaltet die Sortierung dazu. Alternativ (oder zusätzlich) ein Anfasser zum leichteren Verschieben, wie bei den Spalten in den Board-Einstellungen. Wie sind hier die Meinungen der Community?@lyc – Karten auf ein anderes Board verschieben Guter Punkt, das gibt es aktuell nicht (nur neu anlegen). Nehme ich als Feature-Wunsch auf.
Was die Integration von Messengern oder Pushdiensten angeht... da hat natürlich jeder seine persönlichen Vorlieben. Wenn ich heute Whatsapp und Pushover nativ integriere, möchte morgen jemand Matrix, übermorgen ein anderer PushBullet und Signal oder Telegram... usw.
Daher würde ich das gerne anders lösen und diese Möglichkeit habt ihr bereits mit der Version 0.2.0: Der Adapter feuert bei jedem Ereignis einen ausgehenden Webhook und schreibt zusätzlich den State kanban.0.lastEvent (inklusive Board, Karte, Zuständigen und Fälligkeit). Damit kann sich jeder die Benachrichtigung per Skript oder Node-RED an jeden beliebigen Dienst (Pushover, Signal, Telegram, Pushbullet …) schicken lassen.Hier ein fertiges JavaScript-Beispiel (Telegram), das auch in der Doku landen wird.
// ============================================================ // Kanban -> messenger notifications (Telegram example) // Runs in the ioBroker JavaScript adapter. // Reacts to kanban.0.lastEvent and sends the assigned users a // message. The same pattern works with Pushover, Signal, // Pushbullet, WhatsApp ... - just swap the sendTo line. // ============================================================ // ---- Configuration ----------------------------------------- const KANBAN = 'kanban.0'; // Kanban instance const MESSENGER = 'telegram.0'; // messenger instance (Telegram here) const BASE_URL = 'http://192.168.1.10:8095'; // board base URL (fallback if the event has no link) // Mapping: Kanban user id -> messenger chat id // Key = the Kanban user id (lowercase "name" as in card.assignees, e.g. "user1"), NOT the display name. // Value = the recipient id (Telegram: the numeric "ID" column of telegram.0.communicate.users). const USERS = { user1: '123456789', // user2: '234567890', }; // Which events should trigger a message? // Available: cardCreated, cardAssigned, cardUpdated, cardMoved, cardDone, cardDeleted, cardDue // Tip: 'cardAssigned' + 'cardDue' is enough for most setups. Adding 'cardCreated' // sends an extra message when a card is created. const EVENTS = ['cardAssigned', 'cardDue']; // Skip the person who triggered the change? Uses ev.detail.by (the actor). // Note: the board has NO login, so the web UI does not identify the actor - // "by" is only filled for changes made via API / webhooks / scripts that pass // a "by" field (e.g. your own agents). For plain clicks in the board UI this // option therefore has no effect. const SKIP_SELF = true; // If a person has no messenger mapping: send to everyone? (false = skip) const BROADCAST_IF_UNMAPPED = false; // ------------------------------------------------------------ const HEADER = { cardAssigned: 'Assigned to you', cardDue: 'Due', cardCreated: 'New card', cardMoved: 'Moved', cardDone: 'Done', cardUpdated: 'Updated', }; const PRIO = ['', 'Priority: High', 'Priority: Urgent']; function buildText(ev) { const c = ev.card || {}; const b = ev.board || {}; const lines = ['[Kanban] ' + (HEADER[ev.event] || ev.event), '']; lines.push(c.title || '(no title)'); lines.push('Board: ' + (b.title || b.id || '?')); if (c.due) lines.push('Due: ' + c.due + (c.dueTime ? ' ' + c.dueTime : '')); if (c.priority) lines.push(PRIO[c.priority]); // The adapter adds a ready-to-use deep link as ev.link; fall back to building one const link = ev.link || (c.id && b.id ? BASE_URL + '/?board=' + encodeURIComponent(b.id) + '&card=' + encodeURIComponent(c.id) : ''); if (link) { lines.push(''); lines.push(link); } return lines.join('\n'); } on({ id: KANBAN + '.lastEvent', change: 'any' }, (obj) => { let ev; try { ev = JSON.parse(obj.state.val); } catch (e) { return; } if (!ev || !EVENTS.includes(ev.event)) return; // Determine recipients let recipients; if (ev.event === 'cardAssigned' && ev.detail && ev.detail.assignee) { recipients = [ev.detail.assignee]; // only the newly assigned person } else { recipients = (ev.card && ev.card.assignees) || []; // all assignees } // Optionally drop the person who triggered the change (no self-notification) const by = ev.detail && ev.detail.by; if (SKIP_SELF && by) recipients = recipients.filter(u => u !== by); if (!recipients.length) return; const text = buildText(ev); const already = new Set(); for (const uid of recipients) { const chatId = USERS[uid]; if (chatId) { if (already.has(chatId)) continue; already.add(chatId); sendTo(MESSENGER, { chatId: chatId, text: text }); // adjust to your messenger's sendTo parameters if needed } else if (BROADCAST_IF_UNMAPPED) { sendTo(MESSENGER, { text: text }); // adjust to your messenger's broadcast parameters if needed } // otherwise: no mapping -> skipped } });WhatsApp direkt einzubauen ist übrigens unpraktisch, weil der kostenlose WhatsApp-Adapter den API-Key an eine feste Empfängernummer (CallMeBot) bindet. Heisst, je User bräuchte man eine eigene Instanz.
@lyc: Sortierung Per Default gibt es bei Kanban bewusst keine automatische Sortierung: du schiebst die Karten selbst in die gewünschte Reihenfolge (klicken, halten, hoch/runter; geht auch per Touch am Handy). Eine automatische Sortierung wirft immer Fragen auf: nach Priorität? Nach Datum? Einträge ohne Datum oben oder unten? Nach Person? etc. pp.
Was ich mir aber gut vorstellen kann: ein optionaler Schalter „nach Fälligkeit sortieren" pro Spalte. Dann bleibt „manuell" der Standard und wer will, schaltet die Sortierung dazu. Alternativ (oder zusätzlich) ein Anfasser zum leichteren Verschieben, wie bei den Spalten in den Board-Einstellungen. Wie sind hier die Meinungen der Community?Sortieren, gerade nach Datum , ist in meinen Augen nur eine konsequente Erweiterung der Benachrichtigung. Ich kann ja auch nach Nutzer "sortieren" , also ein/ausblenden. Beim rumprobieren mit ein paar mehr Kacheln war, das die erste Funktion, die ich gesucht habe, somit ist für mich Dein optionaler Schalter eine gute Idee, so könnte man nach Fälligkeit und zusätzlich über die Nutzer filtern.
Das mit den Messengern verstehe ich. Neben E-Mail , nativ einen Messenger zu unterstützen, wie Telegram oder Pushover würde die "Hürde" den Adapter zu nutzen in meinen Augen senken. Obwohl Blockly das auch bequem lösen würde.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden
