NEWS
Alexa Shopping List mit Bring synchronisieren
-
@dicken naja, so wie ich es verstanden habe, geht das nur mit so vielen Umwegen, dass es nicht wirklich Sinn macht. Was stört dich denn am direkten Weg? Oder was ist denn der Vorteil mit ToDoIst? Ich hatte für mich bei dem keinen Vorteil (als ich ToDoIst mal nutzte) gefunden.
Ro75.
-
-
-
-
@dicken das ist uns völlig egal. Vor der App da gabs nen Zettel und einen Stift. Und unser Laden räumt regelmäßig um. Für uns ist es wichtig nix zu vergessen - die Reihgenfolge ist reine Nebensache. Die Geschmäcker sind halt verschieden.
Ro75.
-
@ro75
Hi ro75, ich hab mal deine Skript versucht, bekomme aber folgende Fehlermeldung.javascript.0 06:41:56.497 error script.js.Blockly.Alexa.Listen: ReferenceError: CreateDP is not defined javascript.0 06:41:56.498 error at script.js.Blockly.Alexa.Listen:5:1 javascript.0 06:41:56.498 error at script.js.Blockly.Alexa.Listen:55:3Die Daten Punkte Einkaufsliste und ToDoListe habe ich manuell erstellt.
Hast du noch Irgendwas anderes vorab eingestellt / erstellt? -
Hallo zusammen,
Hat schon jemand ein Skript zur Synchronisation der Alexa-Einkaufsliste und Bring geschrieben?
-
@ro75
Hi ro75, ich hab mal deine Skript versucht, bekomme aber folgende Fehlermeldung.javascript.0 06:41:56.497 error script.js.Blockly.Alexa.Listen: ReferenceError: CreateDP is not defined javascript.0 06:41:56.498 error at script.js.Blockly.Alexa.Listen:5:1 javascript.0 06:41:56.498 error at script.js.Blockly.Alexa.Listen:55:3Die Daten Punkte Einkaufsliste und ToDoListe habe ich manuell erstellt.
Hast du noch Irgendwas anderes vorab eingestellt / erstellt? -
Habe das Skript oben korrigiert.
const JSONEinkaufsliste = '0_userdata.0.Alexa.Einkaufsliste'; const JSONEToDoListe = '0_userdata.0.Alexa.ToDoListe'; createState(JSONEinkaufsliste, '[]', {read: true, write: true, desc: 'JSON String for Widget', type: 'string', def: '[]'}); createState(JSONEToDoListe, '[]', {read: true, write: true, desc: 'JSON String for Widget', type: 'string', def: '[]'}); function ListCleaner(Eintrag='') { const arr = Eintrag.split(' '); for (let i = 0; i < arr.length; i++) { arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1); } return arr.join(' '); } function ListenGenerator(sQuelle='', sDP=''){ var ListeLeer = 1; let Liste = []; $(sQuelle).each(function(id, i){ if(getState(id.replace("value","completed")).val === false) { ListeLeer = 0; //dient einfach nur als merkmal, das die Liste nicht leer ist Liste.push({ Eintrag: ListCleaner(getState(id).val) }) } }); if(ListeLeer == 1) { Liste.push({ Eintrag: "kein Eintrag" }) } setState(sDP, JSON.stringify(Liste), true); Liste = []; } function Einkaufsliste(){ setTimeout(function(){ ListenGenerator('alexa2.0.Lists.SHOPPING_LIST.items.*.value',JSONEinkaufsliste) },500); } function TODO() { setTimeout(function(){ ListenGenerator('alexa2.0.Lists.TO_DO.items.*.value',JSONEToDoListe) },500); } on({id: 'alexa2.0.Lists.SHOPPING_LIST.json', change: 'any'}, Einkaufsliste); on({id: 'alexa2.0.Lists.TO_DO.json', change: 'any'}, TODO);Ro75.
-
Habe das Skript oben korrigiert.
const JSONEinkaufsliste = '0_userdata.0.Alexa.Einkaufsliste'; const JSONEToDoListe = '0_userdata.0.Alexa.ToDoListe'; createState(JSONEinkaufsliste, '[]', {read: true, write: true, desc: 'JSON String for Widget', type: 'string', def: '[]'}); createState(JSONEToDoListe, '[]', {read: true, write: true, desc: 'JSON String for Widget', type: 'string', def: '[]'}); function ListCleaner(Eintrag='') { const arr = Eintrag.split(' '); for (let i = 0; i < arr.length; i++) { arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1); } return arr.join(' '); } function ListenGenerator(sQuelle='', sDP=''){ var ListeLeer = 1; let Liste = []; $(sQuelle).each(function(id, i){ if(getState(id.replace("value","completed")).val === false) { ListeLeer = 0; //dient einfach nur als merkmal, das die Liste nicht leer ist Liste.push({ Eintrag: ListCleaner(getState(id).val) }) } }); if(ListeLeer == 1) { Liste.push({ Eintrag: "kein Eintrag" }) } setState(sDP, JSON.stringify(Liste), true); Liste = []; } function Einkaufsliste(){ setTimeout(function(){ ListenGenerator('alexa2.0.Lists.SHOPPING_LIST.items.*.value',JSONEinkaufsliste) },500); } function TODO() { setTimeout(function(){ ListenGenerator('alexa2.0.Lists.TO_DO.items.*.value',JSONEToDoListe) },500); } on({id: 'alexa2.0.Lists.SHOPPING_LIST.json', change: 'any'}, Einkaufsliste); on({id: 'alexa2.0.Lists.TO_DO.json', change: 'any'}, TODO);Ro75.
-
@ro75 Super danke Ro75, Jetzt läuft es. Ist auf jeden fall schonmal ein Anfang um die Alexa Liste auszulesen.
Mal schauen was man so daraus machen kann.Danke
Fuchsbau -
@fuchsbau sagte in Alexa Shopping List mit Bring synchronisieren:
@ro75 Anzeige im VIS, das wäre kein Problem. Ich denke jeher daran mit BRING zu synchronisieren oder in die HA Liste oder TODOIST. Ich muss mal schauen was mir gefällt.
Jau da überlege ich nächste Woche auch mal wie man das regeln kann.
-
@fuchsbau sagte in Alexa Shopping List mit Bring synchronisieren:
@ro75 Anzeige im VIS, das wäre kein Problem. Ich denke jeher daran mit BRING zu synchronisieren oder in die HA Liste oder TODOIST. Ich muss mal schauen was mir gefällt.
Jau da überlege ich nächste Woche auch mal wie man das regeln kann.
-
@dicken ich habe das Problem noch nicht erkannt.? Für unterwegs nutze ich die Alexa-App. Warum sollte ich da was nach Bring oder ToDoIst transferieren?
Ro75.
-
@mcbirne said in Alexa Shopping List mit Bring synchronisieren:
Hallo zusammen,
Hat schon jemand ein Skript zur Synchronisation der Alexa-Einkaufsliste und Bring geschrieben?
Das würde mich auch interessieren. Am besten in beide Richtungen
Hallo zusammen,
da mich das gleiche Problem betrifft, habe ich mich mal an einem Skript dafür versucht.
Über den Alexa und Bring Adapter werden jeweils die Listen abgeglichen in beide Richtungen.
Alles was jeweils in der anderen Liste hinzugefügt wird, wird gesynct. Wenn in der Bring App Dinge als erledigt markiert werden, dann lösche ich diese aus der Alexa Liste komplett raus. Wenn in Alexa Dinge als markiert gesetzt werden, dann wandern die Items in der Bring app unter "zuletetzt verwendet".Am wichtigsten war mir aber, dass ich wieder "Alexa füge Birnen auf die Einkaufsliste" sagen kann und die Sachen wieder bei Bring habe :D
Im ersten Test lief das Skript bei mir ganz gut - gerne mal selbst testen.
Einfach in Zeile 1 auf die passende bring Liste bei euch anpassen der rest kann so bleiben
const bringBaseId = 'bring.0.0f0c420c-3298-4911-91f5-7ed0fbbfd36e'; const alexa2BaseId = 'alexa2.0.Lists.SHOPPING_LIST'; const bringListId = bringBaseId + '.content'; const bringListCompletedId = bringBaseId + '.recentContent'; const bringAddToList = bringBaseId + '.saveItem'; const bringCompleteItem = bringBaseId + '.moveToRecentContent'; const alexaAddToList = alexa2BaseId + '.#New'; const alexaListId = alexa2BaseId + '.json'; //switch off to silence: const printDebug = true; function debug(msg) { if (printDebug) { log(msg) } } const TodoItemStatus = { NeedsAction: 'needs_action', Completed: 'completed', }; /** * @typedef bringItem * @type {object} * @property {string} specification * @property {string} name * @property {string} status * @property {boolean} [found] - keep track if found or not. */ /** * @typedef alexaItem * @type {object} * @property {string} value * @property {string} id * @property {boolean} completed * @property {number} updatedDateTime * @property {boolean} [found] - keep track if found or not. */ /** * Compare alexaItem complete and bringItem status -> returns true if same status. * @param {Array<alexaItem>} alexaList * @param {Array<bringItem>} list * @returns {boolean} true if same status. */ function compareCompleted(alexaItem, bringItem) { if (alexaItem.completed && bringItem.status !== TodoItemStatus.Completed) { return false; } if (!alexaItem.completed && bringItem.status !== TodoItemStatus.NeedsAction) { return false; } return true; } /** * sync lists * @param {Array<alexaItem>} alexaList * @param {Array<bringItem>} list * @param {number} timestampBring * @param {string} msource * @param {Array<bringItem>} recentList * @returns {Array<bringItem>} new bring List */ function syncLists(alexaList, list, timestampBring, msource, recentList) { const newBringList = []; var empty = true; for (const alexaItem of alexaList) { for (const bringItem of list) { empty = false; if (bringItem.name === alexaItem.value) { alexaItem.found = true; bringItem.found = true; //found item. Update completed state from 'newer' list: bringItem.status = TodoItemStatus.NeedsAction; if (alexaItem.updatedDateTime > timestampBring) { if (alexaItem.value !== bringItem.name || !compareCompleted(alexaItem, bringItem)) { if (msource === 'Alexa') { debug('Updating Bring item: ' + bringItem.name + ' from Alexa'); setState(bringCompleteItem, bringItem.name); } } } else { //keep bring: //update alexa: if (!compareCompleted(alexaItem, bringItem)) { if (msource === 'Bring') { bringItem.status = TodoItemStatus.Completed; debug('Update Alexa item: ' + alexaItem.value + ' to ' + (bringItem.status === TodoItemStatus.Completed ? 'done' : 'undone') + ' from Bring.'); setState(`${alexa2BaseId}.items.${alexaItem.id}.completed`, bringItem.status === TodoItemStatus.Completed); } } } } } for (const bringItemCompleted of recentList) { if (bringItemCompleted.name === alexaItem.value) { alexaItem.found = true; bringItemCompleted.found = true; //found item. Update completed state from 'newer' list: bringItemCompleted.status = TodoItemStatus.Completed; if (alexaItem.updatedDateTime > timestampBring) { if (alexaItem.value !== bringItemCompleted.name || !compareCompleted(alexaItem, bringItemCompleted)) { if (msource === 'Alexa') { debug('Adding Bring item: ' + bringItemCompleted.name + ' from Alexa'); setState(bringAddToList, bringItemCompleted.name); } } } else { //keep bring: //update alexa: if (!compareCompleted(alexaItem, bringItemCompleted)) { bringItemCompleted.status = TodoItemStatus.Completed; if (msource === 'Bring') { debug('Delete Alexa item: ' + alexaItem.value + ' from Bring.'); //setState(`${alexa2BaseId}.items.${alexaItem.id}.completed`, bringItemCompleted.status === TodoItemStatus.Completed); setState(`${alexa2BaseId}.items.${alexaItem.id}.#delete`, true); } } } } } if (!alexaItem.found) { //alexa item not found: if (alexaItem.completed) { debug('Delete ' + alexaItem.value + ' because done and not in Bring list.'); setState(`${alexa2BaseId}.items.${alexaItem.id}.#delete`, true); } else { if (msource === 'Alexa') { debug('Adding ' + alexaItem.value + ' to Bring list'); setState(bringAddToList, alexaItem.value); } } } if (empty === true) { if (alexaItem.updatedDateTime < timestampBring) { debug('Delete ' + alexaItem.value + ' from Alexa list because Bring list is all done.'); setState(`${alexa2BaseId}.items.${alexaItem.id}.#delete`, true); } } } for (const bringItem of list) { if (!bringItem.found) { if (bringItem.status === TodoItemStatus.Completed) { //debug('Remove from bring item: ' + bringItem.name + ' because done and not on alexa list'); //Not executed since I want to keep the recent items inside bring app } else { if (msource === 'Bring') { debug('Adding ' + bringItem.name + ' to Alexa list.'); setState(alexaAddToList, bringItem.name); } } } } return newBringList; } function doSync(source) { const alexaList = JSON.parse(getState(alexaListId).val); const state = getState(bringListId); const bringList = JSON.parse(state.val); const state2 = getState(bringListCompletedId); const bringListCompleted = JSON.parse(state2.val); syncLists(alexaList, bringList, state.ts, source, bringListCompleted); } on({id: bringListId, change: 'any'}, e => { debug('Update triggered from Bring'); doSync('Bring'); }); on({id: alexaListId, change: 'any'}, e => { debug('Update triggered from Alexa'); doSync('Alexa'); }); doSync(); -
Hallo zusammen,
da mich das gleiche Problem betrifft, habe ich mich mal an einem Skript dafür versucht.
Über den Alexa und Bring Adapter werden jeweils die Listen abgeglichen in beide Richtungen.
Alles was jeweils in der anderen Liste hinzugefügt wird, wird gesynct. Wenn in der Bring App Dinge als erledigt markiert werden, dann lösche ich diese aus der Alexa Liste komplett raus. Wenn in Alexa Dinge als markiert gesetzt werden, dann wandern die Items in der Bring app unter "zuletetzt verwendet".Am wichtigsten war mir aber, dass ich wieder "Alexa füge Birnen auf die Einkaufsliste" sagen kann und die Sachen wieder bei Bring habe :D
Im ersten Test lief das Skript bei mir ganz gut - gerne mal selbst testen.
Einfach in Zeile 1 auf die passende bring Liste bei euch anpassen der rest kann so bleiben
const bringBaseId = 'bring.0.0f0c420c-3298-4911-91f5-7ed0fbbfd36e'; const alexa2BaseId = 'alexa2.0.Lists.SHOPPING_LIST'; const bringListId = bringBaseId + '.content'; const bringListCompletedId = bringBaseId + '.recentContent'; const bringAddToList = bringBaseId + '.saveItem'; const bringCompleteItem = bringBaseId + '.moveToRecentContent'; const alexaAddToList = alexa2BaseId + '.#New'; const alexaListId = alexa2BaseId + '.json'; //switch off to silence: const printDebug = true; function debug(msg) { if (printDebug) { log(msg) } } const TodoItemStatus = { NeedsAction: 'needs_action', Completed: 'completed', }; /** * @typedef bringItem * @type {object} * @property {string} specification * @property {string} name * @property {string} status * @property {boolean} [found] - keep track if found or not. */ /** * @typedef alexaItem * @type {object} * @property {string} value * @property {string} id * @property {boolean} completed * @property {number} updatedDateTime * @property {boolean} [found] - keep track if found or not. */ /** * Compare alexaItem complete and bringItem status -> returns true if same status. * @param {Array<alexaItem>} alexaList * @param {Array<bringItem>} list * @returns {boolean} true if same status. */ function compareCompleted(alexaItem, bringItem) { if (alexaItem.completed && bringItem.status !== TodoItemStatus.Completed) { return false; } if (!alexaItem.completed && bringItem.status !== TodoItemStatus.NeedsAction) { return false; } return true; } /** * sync lists * @param {Array<alexaItem>} alexaList * @param {Array<bringItem>} list * @param {number} timestampBring * @param {string} msource * @param {Array<bringItem>} recentList * @returns {Array<bringItem>} new bring List */ function syncLists(alexaList, list, timestampBring, msource, recentList) { const newBringList = []; var empty = true; for (const alexaItem of alexaList) { for (const bringItem of list) { empty = false; if (bringItem.name === alexaItem.value) { alexaItem.found = true; bringItem.found = true; //found item. Update completed state from 'newer' list: bringItem.status = TodoItemStatus.NeedsAction; if (alexaItem.updatedDateTime > timestampBring) { if (alexaItem.value !== bringItem.name || !compareCompleted(alexaItem, bringItem)) { if (msource === 'Alexa') { debug('Updating Bring item: ' + bringItem.name + ' from Alexa'); setState(bringCompleteItem, bringItem.name); } } } else { //keep bring: //update alexa: if (!compareCompleted(alexaItem, bringItem)) { if (msource === 'Bring') { bringItem.status = TodoItemStatus.Completed; debug('Update Alexa item: ' + alexaItem.value + ' to ' + (bringItem.status === TodoItemStatus.Completed ? 'done' : 'undone') + ' from Bring.'); setState(`${alexa2BaseId}.items.${alexaItem.id}.completed`, bringItem.status === TodoItemStatus.Completed); } } } } } for (const bringItemCompleted of recentList) { if (bringItemCompleted.name === alexaItem.value) { alexaItem.found = true; bringItemCompleted.found = true; //found item. Update completed state from 'newer' list: bringItemCompleted.status = TodoItemStatus.Completed; if (alexaItem.updatedDateTime > timestampBring) { if (alexaItem.value !== bringItemCompleted.name || !compareCompleted(alexaItem, bringItemCompleted)) { if (msource === 'Alexa') { debug('Adding Bring item: ' + bringItemCompleted.name + ' from Alexa'); setState(bringAddToList, bringItemCompleted.name); } } } else { //keep bring: //update alexa: if (!compareCompleted(alexaItem, bringItemCompleted)) { bringItemCompleted.status = TodoItemStatus.Completed; if (msource === 'Bring') { debug('Delete Alexa item: ' + alexaItem.value + ' from Bring.'); //setState(`${alexa2BaseId}.items.${alexaItem.id}.completed`, bringItemCompleted.status === TodoItemStatus.Completed); setState(`${alexa2BaseId}.items.${alexaItem.id}.#delete`, true); } } } } } if (!alexaItem.found) { //alexa item not found: if (alexaItem.completed) { debug('Delete ' + alexaItem.value + ' because done and not in Bring list.'); setState(`${alexa2BaseId}.items.${alexaItem.id}.#delete`, true); } else { if (msource === 'Alexa') { debug('Adding ' + alexaItem.value + ' to Bring list'); setState(bringAddToList, alexaItem.value); } } } if (empty === true) { if (alexaItem.updatedDateTime < timestampBring) { debug('Delete ' + alexaItem.value + ' from Alexa list because Bring list is all done.'); setState(`${alexa2BaseId}.items.${alexaItem.id}.#delete`, true); } } } for (const bringItem of list) { if (!bringItem.found) { if (bringItem.status === TodoItemStatus.Completed) { //debug('Remove from bring item: ' + bringItem.name + ' because done and not on alexa list'); //Not executed since I want to keep the recent items inside bring app } else { if (msource === 'Bring') { debug('Adding ' + bringItem.name + ' to Alexa list.'); setState(alexaAddToList, bringItem.name); } } } } return newBringList; } function doSync(source) { const alexaList = JSON.parse(getState(alexaListId).val); const state = getState(bringListId); const bringList = JSON.parse(state.val); const state2 = getState(bringListCompletedId); const bringListCompleted = JSON.parse(state2.val); syncLists(alexaList, bringList, state.ts, source, bringListCompleted); } on({id: bringListId, change: 'any'}, e => { debug('Update triggered from Bring'); doSync('Bring'); }); on({id: alexaListId, change: 'any'}, e => { debug('Update triggered from Alexa'); doSync('Alexa'); }); doSync();@icastillo15
Vielen Dank für die Bereitstellung des Skripts. Bei den ersten Tests funktioniert es perfekt..

