Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Script] Einkaufsliste –> Telegram

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Script] Einkaufsliste –> Telegram

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      dwm last edited by

      Coole Idee … Danke!

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Hi,

        sehr cool ungesetzt. Du kannst nun noch eine mobile View basteln, die du beim Einkaufen per VPN, cloud.pro oder Proxy aufrufst und dort die gekauften Dinge wieder abwählst.

        Dann hast du ziemlich genau die Funktion von Bring!

        Gruß

        Pix

        1 Reply Last reply Reply Quote 0
        • D
          dna909 last edited by

          @pix:

          Hi,

          sehr cool ungesetzt. Du kannst nun noch eine mobile View basteln, die du beim Einkaufen per VPN, cloud.pro oder Proxy aufrufst und dort die gekauften Dinge wieder abwählst.

          Dann hast du ziemlich genau die Funktion von Bring!

          Gruß

          Pix `

          Kann mir im Moment nur die Einkaufsliste per Handy anfordern. Editieren überleg ich noch. Mal schaun ob ich da was vernünftiges gebastelt kriege.

          ! 2269_screenshot_20171030-121710.png

          Gruß

          dna909

          1 Reply Last reply Reply Quote 0
          • T
            tempestas last edited by

            Super Sache, hätte ich selbst nie umsetzen können. Aber mit deiner Vorarbeit schaue ich mal, was ich hinbekomme. Vielen Dank

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

              Cool wäre noch die Preise vom Rewe, Aldi und Lidl um die Ecke zu vergleichen, damit ich weiß wo ich was kaufen sollte 😉 :ugeek:

              1 Reply Last reply Reply Quote 0
              • D
                dna909 last edited by

                Die Idee ist garnicht mal so verkehrt. Aber ich glaube da fehlt mir dann doch einfach die Zeit für. Falls es sonst noch Ideen gibt, immer her damit [emoji16]

                Gruß

                dna909

                1 Reply Last reply Reply Quote 0
                • Jey Cee
                  Jey Cee Developer last edited by

                  Ich hätte da eine. Du könntest noch Mengen Angaben hinzufügen.

                  Konkret stelle ich mir vor das ein popup aufgeht in dem man die Menge eingeben kann.

                  Gesendet von Unterwegs

                  1 Reply Last reply Reply Quote 0
                  • D
                    dna909 last edited by

                    Das hatte ich auch geplant. Die Datenpunkte dafür, werden vom Script ja schpn erzeugt. Muss mal schaun, wie ich das am Besten mache….

                    Gruß

                    dna909

                    1 Reply Last reply Reply Quote 0
                    • P
                      pix last edited by

                      Hallo,

                      aus meiner Erfahrung sollte die Mengenangabe (eben auch wie bei Bring!) als String gespeichert werden. Dann ist sie mehr eine Gedächtnisstütze, so wie die ganze Liste.

                      Die Akzeptanz für die Software schwindet, wenn man zu viele Eingaben machen muss. Wenn du also die Mengen als Zahl speicherst und auch noch eine Einheit (zB aus dropdown-Liste) forderst, wird das schnell unkomfortabel.

                      Da würde ich lieber ein Zusatzfeld für eben Zusatzinfos in Textform ermöglichen ("1kg-Paket, wenn Angebot, dann Tabs" oder "mindestens 2x" sind doch typische Anweisungen, wenn man zum Einkaufen geschickt wird 8-) )

                      Und wenn es tatsächlich jemand hinbekommt, die Preise von Discountern einzulesen, wird er es mühelos schaffen, aus den Textfeldern die Mengen rauszuparsen :lol:

                      Gruß

                      Pix

                      1 Reply Last reply Reply Quote 0
                      • Dutchman
                        Dutchman Developer Most Active Administrators last edited by

                        @pix:

                        Hallo,

                        aus meiner Erfahrung sollte die Mengenangabe (eben auch wie bei Bring!) als String gespeichert werden. Dann ist sie mehr eine Gedächtnisstütze, so wie die ganze Liste.

                        Die Akzeptanz für die Software schwindet, wenn man zu viele Eingaben machen muss. Wenn du also die Mengen als Zahl speicherst und auch noch eine Einheit (zB aus dropdown-Liste) forderst, wird das schnell unkomfortabel.

                        Da würde ich lieber ein Zusatzfeld für eben Zusatzinfos in Textform ermöglichen ("1kg-Paket, wenn Angebot, dann Tabs" oder "mindestens 2x" sind doch typische Anweisungen, wenn man zum Einkaufen geschickt wird 8-) )

                        Und wenn es tatsächlich jemand hinbekommt, die Preise von Discountern einzulesen, wird er es mühelos schaffen, aus den Textfeldern die Mengen rauszuparsen :lol:

                        Gruß

                        Pix `

                        Man könnte einfach eine + Button machen für die Anzahl (optional)

                        Ich habe gesucht aber keine api für Preise gefunden 😕

                        –-----------------------

                        Send from mobile device

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

                          Mega Arbeit, sehr cool und definitiv erweiterbar. Klasse Sache!!!!!! werde es weiterverfolgen.

                          1 Reply Last reply Reply Quote 0
                          • T
                            tempestas last edited by

                            Hi dna909,

                            angeregt von deinem Skript bin ich ebenfalls mal beigegangen. Meins ist (teilweise) anders aufgebaut, funktioniert soweit auch.

                            Da ich gerne lerne und begreife wäre ich dir dankbar, wenn du mir diesen Teil erklären könntest. Was tut das string.fromCharCode da?

                                    if (getState(Path+FoodList[CounterFoodStates]).val === true){
                                        ShoppingList=ShoppingList+ '"' + String.fromCharCode(97+CounterPositionFood) + '":"' + FoodList[CounterFoodStates]+'",';
                                        CounterPositionFood++;
                                    }
                            

                            Danke!

                            1 Reply Last reply Reply Quote 0
                            • D
                              dna909 last edited by

                              @tempestas:

                              Hi dna909,

                              angeregt von deinem Skript bin ich ebenfalls mal beigegangen. Meins ist (teilweise) anders aufgebaut, funktioniert soweit auch.

                              Da ich gerne lerne und begreife wäre ich dir dankbar, wenn du mir diesen Teil erklären könntest. Was tut das string.fromCharCode da?

                                      if (getState(Path+FoodList[CounterFoodStates]).val === true){
                                          ShoppingList=ShoppingList+ '"' + String.fromCharCode(97+CounterPositionFood) + '":"' + FoodList[CounterFoodStates]+'",';
                                          CounterPositionFood++;
                                      }
                              

                              Danke! `

                              Hi tempestas,

                              da ich die ganze Einkaufsliste auch als JSON zusammenbaue und in einem JSON der Schlüssel nicht aus einer Zahl bestehen darf, habe ich es so gelöst:

                              Ich nehme den Zähler und addiere den Wert 97 dazu, daraus erzeuge ich dann ein ASCII-Zeichen, mit String.fromCharCode.

                              Somit ist der Schlüssel im JSON ein "a".

                              Das JSON sieht dann z.B. so aus:

                              {"a":"Mischbrot","b":"Toastbrot","c":"Wurst","d":"Pilze","e":"Hackfleisch","f":"Kräuterquark","g":"Suppengrün"}

                              Er zählt dann halt das Alphabet durch. Habe aber noch nicht getestet, was passiert, wenn er die 26 Buchstaben durch hat.

                              Ich hoffe die Erklärung war soweit verständlich 🙂

                              Gruß

                              dna909

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

                                Servus, hab mir das Skript jetzt mal gezogen und dich bitte mal zu erläutern wie du das in die view eingesetzt hast, vielleicht ein per Beispiele dazu.

                                danke dir echt super Arbeit.

                                1 Reply Last reply Reply Quote 0
                                • D
                                  dna909 last edited by

                                  @fischi87:

                                  Servus, hab mir das Skript jetzt mal gezogen und dich bitte mal zu erläutern wie du das in die view eingesetzt hast, vielleicht ein per Beispiele dazu.

                                  danke dir echt super Arbeit. `

                                  Hallo fischi,

                                  ich stelle einfach mal die relevanten Views als Export bereit. Vielleicht erklärt sich das Meiste dadurch schon. Ansonsten bin ich gern bereit, das Ganze auch noch ausführlicher zu machen. In den Views sind jetzt auch schon die Mengen eingebaut. Sobald ein Artikel angewählt wird, wird die Mengenauswahl dazu eingeblendet.

                                  ! 2269_beispiel.png

                                  Muß jetzt nur noch das Script anpassen 🙂

                                  Hier die Views:

                                  ! 2269_einkaufsliste.txt filename="Obst_Gemüse.txt" index="0">~~ 2269_lebensmittel.txt filename="Getränke.txt" index="2">~~ 2269_drogerie.txt

                                  Gruß

                                  dna909

                                  1 Reply Last reply Reply Quote 0
                                  • T
                                    tempestas last edited by

                                    @dna909:

                                    @tempestas:

                                    Hi dna909,

                                    angeregt von deinem Skript bin ich ebenfalls mal beigegangen. Meins ist (teilweise) anders aufgebaut, funktioniert soweit auch.

                                    Da ich gerne lerne und begreife wäre ich dir dankbar, wenn du mir diesen Teil erklären könntest. Was tut das string.fromCharCode da?

                                            if (getState(Path+FoodList[CounterFoodStates]).val === true){
                                                ShoppingList=ShoppingList+ '"' + String.fromCharCode(97+CounterPositionFood) + '":"' + FoodList[CounterFoodStates]+'",';
                                                CounterPositionFood++;
                                            }
                                    

                                    Danke! `

                                    Hi tempestas,

                                    da ich die ganze Einkaufsliste auch als JSON zusammenbaue und in einem JSON der Schlüssel nicht aus einer Zahl bestehen darf, habe ich es so gelöst:

                                    Ich nehme den Zähler und addiere den Wert 97 dazu, daraus erzeuge ich dann ein ASCII-Zeichen, mit String.fromCharCode.

                                    Somit ist der Schlüssel im JSON ein "a".

                                    Das JSON sieht dann z.B. so aus:

                                    {"a":"Mischbrot","b":"Toastbrot","c":"Wurst","d":"Pilze","e":"Hackfleisch","f":"Kräuterquark","g":"Suppengrün"}

                                    Er zählt dann halt das Alphabet durch. Habe aber noch nicht getestet, was passiert, wenn er die 26 Buchstaben durch hat.

                                    Ich hoffe die Erklärung war soweit verständlich 🙂

                                    Gruß

                                    dna909 `

                                    Vielen Dank, hat mir geholfen.

                                    Da ich (per Stand jetzt) keine Mengeneingaben mit einbaue, reicht mir eine einfache String Variable, in die ich alles reinschreibe.

                                    Oder übersehe ich einen Grund, warum du explizit ein JSON nimmst? (eins der vielen Themen, bei denen ich mich nicht auskenne)

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

                                      @dna909:

                                      @fischi87:

                                      Servus, hab mir das Skript jetzt mal gezogen und dich bitte mal zu erläutern wie du das in die view eingesetzt hast, vielleicht ein per Beispiele dazu.

                                      danke dir echt super Arbeit. `

                                      Hallo fischi,

                                      ich stelle einfach mal die relevanten Views als Export bereit. Vielleicht erklärt sich das Meiste dadurch schon. Ansonsten bin ich gern bereit, das Ganze auch noch ausführlicher zu machen. In den Views sind jetzt auch schon die Mengen eingebaut. Sobald ein Artikel angewählt wird, wird die Mengenauswahl dazu eingeblendet.

                                      ! Beispiel.PNG

                                      Muß jetzt nur noch das Script anpassen 🙂

                                      Hier die Views:

                                      ! Einkaufsliste.txtObst_Gemüse.txtLebensmittel.txtGetränke.txtDrogerie.txt

                                      Gruß

                                      dna909 `

                                      ich danke dir sehr für deine schnelle Antwort.

                                      lass es mich bzw uns wissen wenn das script angepasst ist 😉

                                      1 Reply Last reply Reply Quote 0
                                      • D
                                        dna909 last edited by

                                        Aktuelle Version ist immer im 1.Beitrag.

                                        dna909

                                        1 Reply Last reply Reply Quote 0
                                        • D
                                          dna909 last edited by

                                          So, das Script habe ich angepasst.

                                          Darf dann getestet werden 🙂

                                          dna909

                                          1 Reply Last reply Reply Quote 0
                                          • T
                                            tempestas last edited by

                                            Hi,

                                            ich habe dna909s Vorarbeit mal genutzt und ein etwas angepasstes Skript gemacht.

                                            Dieses hat derzeit KEINE Mengenabgaben inkludiert; kann man zwar einschalten, aber ich brauche es nicht, da die Liste wirklich als Gedankenstütze, wie pix es so schön sagte, sein soll.

                                            Die wesentlichen Unterschiede bei gleicher Basis sind zu dna909:

                                            1. Kein manuelles Erstellen der Liste notwendig, da ich mit einem regex Auslöser arbeite;

                                            2. es wird daher automatisch laufend eine Liste für VIS erstellt

                                            3. in Teilen etwas anders gescripted und eventuell (das liegt im Auge des Betrachters) in Teilen etwas leichter lesbar, wobei da sicherlich noch viel Potenzial ist. Ich übe ja auch noch massiv.

                                            4. es sollte kein Problem geben bei mehr als 26 Gegenständen

                                            5. kein JSON (das könnte sich vielleicht rächen, wenn ich Mengen mit aufnehmen möchte)

                                            6. Keine Unterscheidung nach Drogerie und Sonstigem als Liste, da wir wenn dann eh alles zusammen holen

                                            Danke an dna909 für seine Vorarbeit, die natürlich Erwähnung findet in meinem Skript 🙂

                                            Nun aber das Skript, falls es interessiert:

                                            ! ```
                                            `// Einkaufsliste
                                            //
                                            // Idee und Basis: dna909
                                            //
                                            // http://forum.iobroker.net/viewtopic.php?f=21&t=8766
                                            //
                                            // abgewandelt: tempestas, Datum 6.11.2017
                                            //
                                            // status: v 1.0 - stable
                                            ! // SKRIPTEINSTELLUNGEN
                                            ! var debug = false;
                                            var force = true;
                                            var path = "javascript.0.Einkaufsliste."; // Pfad für generelle Variablen und States
                                            var pathItems = "javascript.0.Einkaufsliste.Items."; // Pfad für die zu kaufenden Gegenstände
                                            ! // ############################
                                            // ########## STATES ##########
                                            // ############################
                                            ! createState(path +'Liste', "", { // String, in dem die Einkaufsliste gespeichert wird
                                            name: "Liste",
                                            type: 'string',
                                            role: 'string',
                                            });
                                            ! createState(path +'clearBtn', false, force, { // löschen Button, damit man nicht alles manuell abwählen muss
                                            name: 'Clear Liste',
                                            desc: 'Löscht die Liste',
                                            type: 'boolean',
                                            role: 'state',
                                            unit: ''
                                            });
                                            ! createState(path +'telegramBtn', false, force, { // sendet die Liste via Telegram
                                            name: 'Send Telegram',
                                            desc: 'Sendet Telegram Einkaufsliste',
                                            type: 'boolean',
                                            role: 'state',
                                            unit: ''
                                            });
                                            ! // #########################################################
                                            // ########## ARRAY MIT INHALT DER KATEGORIEN ##############
                                            // #########################################################
                                            ! var PurchList=new Array( "Ananas", "Apfel", "Aprikose_Pfirsich","Banane", "Birne", "Datteln", "Erdbeeren","Kirschen",
                                            "Kiwi", "Mandarine","Mango", "Melone", "Orange", "Waldbeeren", "Weintrauben", "Zitrone_Limette",

                                                                "Chilis", "Erbsen", "Gurke","Karotten", "Kartoffeln", "Kohl", "Kohlrabi", "Kürbis", "Lauch", "Mais", "Paprika",
                                                                "Pilze", "Radieschen", "Tomaten", "Zucchini", "Zwiebeln", 
                                            
                                                                "Aufschnitt", "Geflügel", "Geschnetzeltes", "Hackfleisch", "Kabanossi", "Rind", "Schwein", "Wiener","Fischstäbchen", "Garnelen", 
                                            
                                                                "Bratfix", "Butter", "Creme-Fraiche", "Dips", "Eier", "Frischkaese", "Joghurt", "Kaese", "Kochsahne", "Kraeuterquark", "Milch",
                                                                "Mozzarella", "Quark", "Sauerrahm", "Schmelzkäse", 
                                            
                                                                "Brötchen", "Brot", "Couscous", "Haferflocken", "Kichererbsen", "Mehl", "Müsli", "Nudeln","Pizzateig", "Reis", "Sonnenblumenkerne", "Vollkornnudeln",
                                            
                                                                "Asiasauce", "Brühe","BBQ-Sauce", "Chili", "Essig", "Ketchup", "Mayonaise", "Öl", "Paprikapulver", "Pesto", "Pfeffer", "Salz", "Tomatenmark", "Tomatensauce", "Senf", "Zucker", 
                                            
                                                                "Saft", "Tonicwater", "Cola", "Fanta", "Sprite", "Bier", "Bier-alkoholfrei","Alsterwasser", 
                                                                "Alsterwasser-alkoholfrei", "Weizenbier", "Sekt","Energydrink", "Wein", "Tee", "Kaffee", "Kaffee-entkoffiniert", 
                                            
                                                                "Alufolie", "Backpapier", "Biomüllbeutel","Klopapier", "Küchenrolle", "Deo", "Haargel", "Rasierklingen", "Zahnbürste", "Zahnpasta","Duschgel", "Raumduft", "Shampoo",  "Seife",  "Schwamm", "Bürste", "Spüli", 
                                                                "Klarspüler", "Spülmaschinensalz", "Tabs","Badreiniger", "Glasreiniger","Fettlöser", "Bodenreiniger", "Ceranreiniger", "Weichspüler", "Waschmittel", "Fleckentferner");
                                            

                                            !
                                            // ##################################################################
                                            // Variablen
                                            // ##################################################################
                                            ! var idListe = path + 'Liste';
                                            ! var idClear = path + 'clearBtn';
                                            ! var idTelegram = path + 'telegramBtn';
                                            ! var lengthListPurch=(PurchList.length)-1; // Variablen für Auslesen wieviele Inhalte in den jeweiligen Arrays stehen

                                            var regexTrigger = /^javascript.0.Einkaufsliste.Items..*$/;

                                            ! var listeTotal = [];
                                            ! // ################################################################
                                            // ###### STATES FÜR DIE GEGENSTÄNDE IN OBJEKTEN ERZEUGEN #######
                                            // ################################################################
                                            ! function createItems(){
                                            var i = 0;
                                            for (i = 0; i < lengthListPurch; i++){
                                            createState(pathItems +PurchList[i], false, force, {
                                            name: 'Einkauf',
                                            desc: PurchList[i],
                                            type: 'boolean',
                                            role: 'state',
                                            unit: ''
                                            });

                                                /*
                                                createState(pathItems +(PurchList[i]) + ".Menge", 0, force, {           // hier könnte man Mengenangaben mit einbeziehen, brauche ich jedoch nicht.
                                                    name: 'Einkauf',
                                                    desc: PurchList[i],
                                                    type: 'number',
                                                    role: 'state',
                                                    unit: ''
                                                });
                                             */   
                                            
                                            }
                                            

                                            }

                                            ! // #############################################################
                                            // TRIGGER FÜR ERZEUGUNG, LÖSCHEN UND TELEGRAM
                                            // #############################################################
                                            ! on({ id:regexTrigger,
                                            change: 'ne'},
                                            function(data) { // regex trigger, löst immer aus sobald etwas an- oder abgewählt wird
                                            purchlistCreate();
                                            });
                                            ! on(idClear, function(obj){ // trigger fürs Löschen
                                            if(obj.state.val === true){
                                            clearPurch();
                                            }
                                            });
                                            ! on(idTelegram, function(obj){ // trigger für Telegram
                                            if(obj.state.val === true){
                                            sendTelegram();
                                            }
                                            });
                                            ! // #################################################################
                                            // FUNCTIONS
                                            // #################################################################
                                            ! ///// Einkaufsliste erzeugen //////////////////////////////////////////////////////////////////
                                            ! function purchlistCreate(){
                                            var i = 0;
                                            var item;

                                                listeTotal = [];
                                            
                                                for (i = 0; i < lengthListPurch; i++){
                                            
                                                    if(getState(pathItems +PurchList[i]).val === true) {
                                                    item = PurchList[i];
                                                    listeTotal.push(item);
                                                    if(debug) log(item + " zur Einkaufsliste hinzugefügt ");
                                                    }
                                                } 
                                            setState(idListe, listeTotal.join('
                                            

                                            ')); // Liste wird für VIS formatiert
                                            }

                                            ! function clearPurch(){
                                            var i = 0;
                                            ! for (i = 0; i < lengthListPurch; i++){

                                                    if(getState(pathItems +PurchList[i]).val === true) {
                                                        setState(pathItems +PurchList[i], false);
                                                        setState(idListe, "");
                                                        setStateDelayed(idClear, false, 2000);
                                                    }
                                                }
                                            

                                            }

                                            ! function sendTelegram() {

                                                    var telegramtext = getState(idListe).val.replace(/
                                            

                                            /g , "\n"); // telegram Liste formatieren, entfernt den Zeilenumbruch für vis und ersettz mit Zeilenumbruch Telegram

                                                    sendTo('telegram.0', {                                          // Nachricht per Telegram senden
                                                    text: "Bitte mitbringen:\n\n" + telegramtext        
                                                    });
                                            
                                                    setStateDelayed(idTelegram, false, 2000);
                                            

                                            }

                                            ! // Bei Start
                                            ! createItems();` [/i][/i][/i][/i][/i][/i][/i][/i]

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            993
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

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