<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Tandoor zu Bring]]></title><description><![CDATA[<p dir="auto">Da ich tandoor nutze und Bring als Einkaufslistenapp (wird auch mit Alexa synchronisiert), hab ich mir ein Script erstellt, welches mit die Tandoor items ins Bring holt - ggf. kann das ja noch jemand gebrauchen:</p>
<pre><code>// --- KONFIGURATION ---
const tandoorUrl = 'tandoorURL'; 
const apiToken = 'tandoorAPI-KEY'; 
const bringListState = 'bring.XXX.saveItem'; 

// --- Ab hier keine Konfig mehr ---
const axios = require('axios');
const syncInterval = 5; // Alle 5 Minuten

// --- HAUPTFUNKTION ---
async function syncTandoorToBring() {
    console.log('Tandoor-Sync: Starte Synchronisierung (Bearer-Mode)...');

    try {
        const response = await axios({
            method: 'get',
            url: `${tandoorUrl}/api/shopping-list-entry/`,
            headers: { 
                'Authorization': `Bearer ${apiToken}`, 
                'Accept': 'application/json'
            },
            timeout: 10000
        });

        // Tandoor liefert Liste oft in .results
        let data = Array.isArray(response.data) ? response.data : (response.data.results || []);
        
        // Nur nicht-erledigte Items filtern
        const openEntries = data.filter(entry =&gt; !entry.completed);
        
        if (openEntries.length === 0) {
            console.log('Tandoor: Keine neuen Einkaufslisten-Einträge gefunden.');
            return;
        }

               for (const entry of openEntries) {
            // Logik-Update: Wir prüfen alle Namensfelder von Tandoor
            let name = "";
            
            if (entry.food_display) {
                name = entry.food_display;
            } else if (entry.description) {
                name = entry.description;
            } else if (entry.food &amp;&amp; entry.food.name) {
                name = entry.food.name;
            } else {
                name = "Unbekannte Zutat";
            }

            let amount = (entry.amount &amp;&amp; entry.amount !== 0) ? entry.amount : "";
            let unit = entry.unit_display || "";
            
            // Sauber zusammenfügen und unnötige Leerzeichen entfernen
            let itemName = `${amount} ${unit} ${name}`.replace(/\s+/g, ' ').trim();

            console.log(`Tandoor-Sync: Übertrage "${itemName}" zu Bring!`);

            // 1. In Bring-Adapter schreiben
            await setStateAsync(bringListState, itemName);

            // 2. In Tandoor als erledigt markieren
            await markAsCompleted(entry.id);
        }
        
        console.log('Tandoor-Sync: Synchronisierung abgeschlossen.');

    } catch (error) {
        if (error.response) {
            console.error(`Tandoor-Sync Fehler (${error.response.status}): ${JSON.stringify(error.response.data)}`);
        } else {
            console.error('Tandoor-Sync Netzwerkfehler: ' + error.message);
        }
    }
}

// --- HILFSFUNKTION: ABHAKEN ---
async function markAsCompleted(entryId) {
    try {
        await axios({
            method: 'patch',
            url: `${tandoorUrl}/api/shopping-list-entry/${entryId}/`,
            headers: { 
                'Authorization': `Bearer ${apiToken}`,
                'Content-Type': 'application/json'
            },
            data: { completed: true }
        });
        console.log(`Tandoor-Sync: Item ${entryId} in Tandoor abgehakt.`);
    } catch (error) {
        console.error(`Tandoor-Sync Update Fehler für ID ${entryId}: ${error.message}`);
    }
}

// --- ZEITSTEUERUNG ---
schedule(`*/${syncInterval} * * * *`, syncTandoorToBring);

// Sofort-Start beim Speichern
syncTandoorToBring();```</code></pre>
]]></description><link>https://forum.iobroker.net/topic/84399/tandoor-zu-bring</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 16:16:45 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/84399.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Apr 2026 11:54:42 GMT</pubDate><ttl>60</ttl></channel></rss>