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:
// --- 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 => !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 && entry.food.name) {
name = entry.food.name;
} else {
name = "Unbekannte Zutat";
}
let amount = (entry.amount && 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();```