Fortsetzung:
Ansage von Alexa, was auf der Einkaufsliste steht.
Eine Routine anlegen mit , wenn gesagt wird einkaufsliste, dann soll Alexa benutzerdefiniert anworten (was, könnt ihr euch aussuchen).
Hat den Hintergrund, dass Alexa auf das Wort "einkaufsliste" reagiert und nicht eine Fehlermeldung raushaut.
Dann ein Blockly anlegen:
[image: 1777925756428-443abf28-f488-40d4-9014-268512c05ed6-image.jpeg]
Damit triggern wir auf das Wort einkaufsliste (Kleinschreibung beachten)
Den DP setzen wir , wenn das Wort erkannt wird, kurz auf true (dadurch wird das Script ausgelöst) und 2 sek später wieder auf false.
Der DP wird vom Skript angelegt.
Korrektur.
Den müsst ihr selber anlegen.
[image: 1777926332516-09a736ff-cd17-44aa-9462-8ff5a4a044aa-image.jpeg]
const TOKEN = "XXXXXXXXXXXX";
// 🔴 numerische Projekt-ID
const PROJECT_ID = "XXXXXXXX";
// 🔵 TRIGGER
const TRIGGER_DP = "0_userdata.0.todoist.readList";
let isRunning = false;
// =====================
// TRIGGER
// =====================
on({ id: TRIGGER_DP, change: "ne" }, (obj) => {
if (obj.state.val !== true) return;
if (isRunning) return;
isRunning = true;
loadTasks();
// Trigger sofort zurücksetzen (kein Loop!)
setTimeout(() => {
setState(TRIGGER_DP, false, true);
isRunning = false;
}, 1500);
});
// =====================
// MAIN
// =====================
function loadTasks() {
httpPost(
"https://api.todoist.com/api/v1/sync",
"sync_token=*&resource_types=" + encodeURIComponent('["items"]'),
{
headers: {
"Authorization": "Bearer " + TOKEN,
"Content-Type": "application/x-www-form-urlencoded"
},
timeout: 10000
},
(err, res) => {
if (err) {
speak("Ich konnte deine Einkaufsliste nicht laden.");
return;
}
let data;
try {
data = JSON.parse(res.data);
} catch (e) {
speak("Fehler beim Verarbeiten der Daten.");
return;
}
const items = data.items || [];
const list = items.filter(t =>
t.project_id == PROJECT_ID
);
if (!list.length) {
speak("Deine Einkaufsliste ist leer.");
return;
}
let text;
if (list.length === 1) {
text = "Du hast nur " + list[0].content + " auf deiner Einkaufsliste.";
}
else if (list.length <= 5) {
text = "Auf deiner Einkaufsliste stehen: " +
list.map(t => t.content).join(", ");
}
else {
text = "Du hast " + list.length + " Artikel. Zum Beispiel: " +
list.slice(0, 5).map(t => t.content).join(", ");
}
speak(text);
}
);
}
// =====================
// 🔊 SPEAK (DEIN FIX BEIBEHALTEN)
// =====================
function speak(text) {
if (!text) return;
const dp =
"alexa2.0.Echo-Devices.XXXXXXXXXXXXX.Commands.speak";
if (!existsState(dp)) {
log("Alexa speak DP nicht gefunden!", "error");
return;
}
log("ALEXA SPEAK: " + text, "info");
setState(dp, "");
setTimeout(() => {
setState(dp, text + " ");
}, 1000);
}
Token und Project ID findet ihr in eurem Todoist Account.
Natürlich solltest ihr vorher eine Einkaufsliste angelegt haben (Projekt).
Den Echo bzw. die Seriennummer bekommt ihr aus dem Alexa2 Adapter.
const dp =
"alexa2.0.Echo-Devices.XXXXXXXXXXXXX.Commands.speak"
Im Skript selber, ich bin da Laie, steht wohl, dass der DP nachdem er auf true gegangen ist, gleich wieder auf false gesetzt wird.
Bei mir hat es nun so, wie ich es hier aufgeschrieben habe funktioniert.
Ihr könnt ja ein wenig rumprobieren.
Was aktuell nicht so einfach funktioniert, ist, Sachen per Sprache auf die Einkaufsliste zu setzen.
Da habe ich mir bis jetzt die Zähne ausgebissen.
Edit: kleiner Hinweis zur summary. Das Wort muss ich sich ja ändern in dem DP. Also 2 mal hintereinander einkaufsliste sagen, löst nur 1 mal das Skript aus.
Also nach dem Wort einkaufsliste nach der Uhrzeit fragen , damit sich der DP wieder ändert
Edit 2: Es funktioniert wohl auch, wenn man beim Trigger aktualisiert nimmt. Da kann man so oft einkaufsliste sagen , wie man will.