Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Alexa Shopping List mit Bring synchronisieren

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Alexa Shopping List mit Bring synchronisieren

    This topic has been deleted. Only users with topic management privileges can see it.
    • Ro75
      Ro75 @Dicken last edited by

      @dicken also so was z.B.

      05f79b79-eeff-4b49-b786-5a66c184a56f-image.png

      Ro75.

      Dicken 2 Replies Last reply Reply Quote 0
      • Dicken
        Dicken @Ro75 last edited by

        @ro75 Au man, da hätt ich ja auch mal selber drauf kommen können nachzusehen. Wusste nicht das Alexa mittlerweile auch Widgets anbietet 😅. Danke für die Info 🙂

        1 Reply Last reply Reply Quote 0
        • mcBirne
          mcBirne last edited by

          Hallo zusammen,

          Hat schon jemand ein Skript zur Synchronisation der Alexa-Einkaufsliste und Bring geschrieben?

          I 1 Reply Last reply Reply Quote 1
          • Dicken
            Dicken @Ro75 last edited by

            @ro75 @ro75 Jetzt weiß ich auch wieder warum ich die Alexa App nicht verwendet hab.... Es gibt keine Möglichkeit die Liste von Hand zu sortieren. Das ist Extrem bescheiden.... Da wir vor dem Einkaufen es immer in die Reihenfolge geschoben haben, wie es auch im Laden zu finden ist.

            Ro75 1 Reply Last reply Reply Quote 0
            • Ro75
              Ro75 @Dicken last edited by

              @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.

              Dicken 1 Reply Last reply Reply Quote 0
              • Dicken
                Dicken @Ro75 last edited by

                @ro75 sagte in Alexa Shopping List mit Bring synchronisieren:

                Die Geschmäcker sind halt verschieden.

                So ist es 😄 wir finden das halt praktisch. Naja werd die Tage mal schauen wie ich das jetzt regel

                1 Reply Last reply Reply Quote 0
                • Fuchsbau
                  Fuchsbau last edited by Fuchsbau

                  @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:3
                  

                  Die Daten Punkte Einkaufsliste und ToDoListe habe ich manuell erstellt.
                  Hast du noch Irgendwas anderes vorab eingestellt / erstellt?

                  Ro75 1 Reply Last reply Reply Quote 0
                  • I
                    IOMax @mcBirne last edited by

                    @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

                    icastillo15 1 Reply Last reply Reply Quote 0
                    • Ro75
                      Ro75 @Fuchsbau last edited by

                      @fuchsbau sagte in Alexa Shopping List mit Bring synchronisieren:

                      Die Daten Punkte Einkaufsliste und ToDoListe habe ich manuell erstellt.

                      nicht nötig. Die DP werden selbst erstellt. Zeige mal das Skript bitte.

                      Ro75.

                      1 Reply Last reply Reply Quote 0
                      • Ro75
                        Ro75 last edited by

                        AH Moment, ich habe da eine selbst erstellte Funktion für die Erstellung der Datenpunkte drin. Ich ändere das mal.

                        Ro75.

                        1 Reply Last reply Reply Quote 0
                        • Ro75
                          Ro75 last edited by

                          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.

                          Fuchsbau 1 Reply Last reply Reply Quote 0
                          • Fuchsbau
                            Fuchsbau @Ro75 last edited by

                            @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

                            Ro75 1 Reply Last reply Reply Quote 0
                            • Ro75
                              Ro75 @Fuchsbau last edited by

                              @fuchsbau sowas

                              ebfc2bc4-d102-4658-9c63-27d29d9df132-image.png

                              Ro75.

                              Fuchsbau 1 Reply Last reply Reply Quote 0
                              • Fuchsbau
                                Fuchsbau @Ro75 last edited by

                                @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.

                                1 Reply Last reply Reply Quote 0
                                • Dicken
                                  Dicken last edited by

                                  @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.

                                  Ro75 1 Reply Last reply Reply Quote 0
                                  • Ro75
                                    Ro75 @Dicken last edited by

                                    @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.

                                    Dicken 1 Reply Last reply Reply Quote 0
                                    • Dicken
                                      Dicken @Ro75 last edited by

                                      @ro75 Sortierung der Einträge im nachhinein, hatten wir doch oben schon 😉 nur weil dir das egal ist wie die reihenfolge in der app ist, muss es ja nicht allen anderen auch egal sein 😄

                                      1 Reply Last reply Reply Quote 0
                                      • icastillo15
                                        icastillo15 @IOMax last edited by

                                        @iomax @mcBirne

                                        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 😄

                                        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();
                                        
                                        
                                        mcBirne Oreider Fuchsbau I 4 Replies Last reply Reply Quote 1
                                        • mcBirne
                                          mcBirne @icastillo15 last edited by

                                          @icastillo15
                                          Vielen Dank für die Bereitstellung des Skripts. Bei den ersten Tests funktioniert es perfekt..

                                          1 Reply Last reply Reply Quote 0
                                          • Oreider
                                            Oreider @icastillo15 last edited by

                                            @icastillo15

                                            Vielen Dank!

                                            Ich teste mit.
                                            Auf den ersten Blick schaut es super aus!

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            675
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            25
                                            144
                                            14805
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo