Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Alexa Shopping List mit Bring synchronisieren

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    946

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Alexa Shopping List mit Bring synchronisieren

Scheduled Pinned Locked Moved Skripten / Logik
175 Posts 31 Posters 37.2k Views 31 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Ro75R Ro75

    @dicken also so was z.B.

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

    Ro75.

    DickenD Offline
    DickenD Offline
    Dicken
    wrote on last edited by
    #22

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

    Ro75R 1 Reply Last reply
    0
    • DickenD Dicken

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

      Ro75R Offline
      Ro75R Offline
      Ro75
      wrote on last edited by
      #23

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

      SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

      DickenD 1 Reply Last reply
      0
      • Ro75R 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.

        DickenD Offline
        DickenD Offline
        Dicken
        wrote on last edited by
        #24

        @ro75 sagte in Alexa Shopping List mit Bring synchronisieren:

        Die Geschmäcker sind halt verschieden.

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

        1 Reply Last reply
        0
        • FuchsbauF Offline
          FuchsbauF Offline
          Fuchsbau
          wrote on last edited by Fuchsbau
          #25

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

          Ro75R 1 Reply Last reply
          0
          • mcBirneM mcBirne

            Hallo zusammen,

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

            I Offline
            I Offline
            IOMax
            wrote on last edited by
            #26

            @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

            icastillo15I 1 Reply Last reply
            0
            • FuchsbauF 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?

              Ro75R Offline
              Ro75R Offline
              Ro75
              wrote on last edited by
              #27

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

              SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

              1 Reply Last reply
              0
              • Ro75R Offline
                Ro75R Offline
                Ro75
                wrote on last edited by
                #28

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

                Ro75.

                SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                1 Reply Last reply
                0
                • Ro75R Offline
                  Ro75R Offline
                  Ro75
                  wrote on last edited by
                  #29

                  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.

                  SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                  FuchsbauF 1 Reply Last reply
                  0
                  • Ro75R 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.

                    FuchsbauF Offline
                    FuchsbauF Offline
                    Fuchsbau
                    wrote on last edited by
                    #30

                    @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

                    Ro75R 1 Reply Last reply
                    0
                    • FuchsbauF Fuchsbau

                      @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

                      Ro75R Offline
                      Ro75R Offline
                      Ro75
                      wrote on last edited by
                      #31

                      @fuchsbau sowas

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

                      Ro75.

                      SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                      FuchsbauF 1 Reply Last reply
                      0
                      • Ro75R Ro75

                        @fuchsbau sowas

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

                        Ro75.

                        FuchsbauF Offline
                        FuchsbauF Offline
                        Fuchsbau
                        wrote on last edited by
                        #32

                        @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
                        0
                        • DickenD Offline
                          DickenD Offline
                          Dicken
                          wrote on last edited by
                          #33

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

                          Ro75R 1 Reply Last reply
                          0
                          • DickenD Dicken

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

                            Ro75R Offline
                            Ro75R Offline
                            Ro75
                            wrote on last edited by
                            #34

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

                            SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                            DickenD 1 Reply Last reply
                            0
                            • Ro75R Ro75

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

                              DickenD Offline
                              DickenD Offline
                              Dicken
                              wrote on last edited by
                              #35

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

                              1 Reply Last reply
                              0
                              • I IOMax

                                @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

                                icastillo15I Offline
                                icastillo15I Offline
                                icastillo15
                                wrote on last edited by
                                #36

                                @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 :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();
                                
                                
                                mcBirneM OreiderO FuchsbauF I 4 Replies Last reply
                                1
                                • icastillo15I icastillo15

                                  @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 :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();
                                  
                                  
                                  mcBirneM Offline
                                  mcBirneM Offline
                                  mcBirne
                                  wrote on last edited by
                                  #37

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

                                  1 Reply Last reply
                                  0
                                  • icastillo15I icastillo15

                                    @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 :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();
                                    
                                    
                                    OreiderO Offline
                                    OreiderO Offline
                                    Oreider
                                    wrote on last edited by
                                    #38

                                    @icastillo15

                                    Vielen Dank!

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

                                    1 Reply Last reply
                                    0
                                    • icastillo15I icastillo15

                                      @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 :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();
                                      
                                      
                                      FuchsbauF Offline
                                      FuchsbauF Offline
                                      Fuchsbau
                                      wrote on last edited by
                                      #39

                                      @icastillo15

                                      Hi icastillo15,

                                      erstmal :+1: für deine tolle Arbeit,
                                      Ich hab es eben getestet und bin recht erstaunt wie schnell es Sync.

                                      Aber Alexa macht es uns nicht einfach.

                                      Alle was ich per Sprache in die Alexa Liste eintrage wird klein geschrieben.
                                      Alle was ich per Sprache in Bring eintrage wird Großgeschrieben.

                                      Vorlagen Artikel in Bring sind Großgeschrieben und auch die automatische Zuordnung in die Bring Kategorien werden nur mit den Großgeschrieben Artikel erkannt.
                                      Bei Alexa kann ich einen identischen Artikel mehrfach in die Liste eintragen. Bring überprüft und trägt den identischen Artikel nur einmal ein. Bring überprüft auch Groß u. Kleinschreibung und es wird der Artikel nur einmal eingetragen. Dadurch entsteht ein Problem, habe ich z.B.: 3-mal Zitronen in der Alexa Liste, so habe ich in der Bring Liste nur 1-mal Zitronen. Lösche ich Zitronen in Bring, wird nur 1-mal Zitronen in Alexa gelöscht. Ergo, da noch 2-mal Zitrone in der Alexa Liste stehen, steht nach kurzer Zeit 1-mal Zitronen wieder in der Bring Liste.

                                      Bei identischem Artikel einmal Groß und einmal Kleingeschrieben passiert dasselbe.

                                      Wäre es nicht sinnvoller nur in eine Richtung zu synchronisieren. Von der Alexa Liste in die Bring Liste (wenn man nur Bring beim Einkaufen nutz). Irgendwie so, dass alle neu eintragen Artikel in der Alexa Liste, mit Anfangsbuchstaben Großgeschriebene zu Bring synchronisiert werden. Und idealerweise dann direkt in der Alexa Liste gelöscht.

                                      Gruß
                                      Fuchsbau

                                      icastillo15I 1 Reply Last reply
                                      0
                                      • FuchsbauF Fuchsbau

                                        @icastillo15

                                        Hi icastillo15,

                                        erstmal :+1: für deine tolle Arbeit,
                                        Ich hab es eben getestet und bin recht erstaunt wie schnell es Sync.

                                        Aber Alexa macht es uns nicht einfach.

                                        Alle was ich per Sprache in die Alexa Liste eintrage wird klein geschrieben.
                                        Alle was ich per Sprache in Bring eintrage wird Großgeschrieben.

                                        Vorlagen Artikel in Bring sind Großgeschrieben und auch die automatische Zuordnung in die Bring Kategorien werden nur mit den Großgeschrieben Artikel erkannt.
                                        Bei Alexa kann ich einen identischen Artikel mehrfach in die Liste eintragen. Bring überprüft und trägt den identischen Artikel nur einmal ein. Bring überprüft auch Groß u. Kleinschreibung und es wird der Artikel nur einmal eingetragen. Dadurch entsteht ein Problem, habe ich z.B.: 3-mal Zitronen in der Alexa Liste, so habe ich in der Bring Liste nur 1-mal Zitronen. Lösche ich Zitronen in Bring, wird nur 1-mal Zitronen in Alexa gelöscht. Ergo, da noch 2-mal Zitrone in der Alexa Liste stehen, steht nach kurzer Zeit 1-mal Zitronen wieder in der Bring Liste.

                                        Bei identischem Artikel einmal Groß und einmal Kleingeschrieben passiert dasselbe.

                                        Wäre es nicht sinnvoller nur in eine Richtung zu synchronisieren. Von der Alexa Liste in die Bring Liste (wenn man nur Bring beim Einkaufen nutz). Irgendwie so, dass alle neu eintragen Artikel in der Alexa Liste, mit Anfangsbuchstaben Großgeschriebene zu Bring synchronisiert werden. Und idealerweise dann direkt in der Alexa Liste gelöscht.

                                        Gruß
                                        Fuchsbau

                                        icastillo15I Offline
                                        icastillo15I Offline
                                        icastillo15
                                        wrote on last edited by
                                        #40

                                        @fuchsbau

                                        Danke für die Rückmeldung und das Testen. Mir war das bisher egal, ob Artikel groß oder kleingeschrieben sind aber du hast natürlich Recht. Es schränkt leider etwas Funktionalität ein. Grundsätzlich brauch ich den Sync aber in beide Richtungen, da ich oder meine Freundin gerne auch mal von unterwegs direkt in Bring Sachen hinzufügen und nicht über Alexa. Das sollte dann synchronisiert bleiben.

                                        Also du nutzt sowohl Alexa Spracheingabe als auch über die Bring App direkt eine Spracheingabe oder meinst du das über den Alexa Bring Skill? Andernfalls wusste ich noch nicht, dass man auch direkt in Bring eine Spracheingabe hat 😀

                                        Als Erweiterung vom Script könnte ich mir vorstellen, dass ich vorher noch vor jedem Sync ein Cleanup einbaue. Der würde dann über alle Alexa Items rübergehen und die Groß-Kleinschreibung erzwingen. Dabei könnte man auch gleich dupletten entfernen. Dann sollte im anschließenden Sync alles reibungslos klappen.

                                        Ich schau mir das heute nochmal an wenn ich Zeit finde 🙂 Ansonsten klasse, dass es bei den anderen soweit für ihre Zwecke funktioniert 👍🏻

                                        I 1 Reply Last reply
                                        1
                                        • icastillo15I icastillo15

                                          @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 :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();
                                          
                                          
                                          I Offline
                                          I Offline
                                          IOMax
                                          wrote on last edited by IOMax
                                          #41

                                          @icastillo15 Super, vielen Dank, das klappt schonmal sehr gut!

                                          mcBirneM 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          680

                                          Online

                                          32.6k

                                          Users

                                          82.2k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe