Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. Metzger Mittagsmenü in VIS einbinden

    NEWS

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    Metzger Mittagsmenü in VIS einbinden

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

      Hallo ich möchte gerne für die Famile eine extra Seite visualisieren wo das Mittagsmenü von zwei Metzgern drin steht.

      Die Stellen jede woche einen aktualiserten Plan auf ihre Seite, wie muss ich das machen, dass der sich auch aktuell hält bzw. updatet?

      Bin noch anfänger über eine ausführlichere Antwort würde ich mich freuen

      Hier mal die Links
      http://metzgereibunk.de/speisekarte/
      http://www.deutschlandsschoenstermetzger.de/index.php/speiseplan

      liv-in-sky TheBam OliverIO 4 Replies Last reply Reply Quote 0
      • liv-in-sky
        liv-in-sky @driftkingisback last edited by

        @driftkingisback

        einen metzger habe ich mit diesem script:

        du musst.

        • im setting der javascript instanz 2 werte bei zusätzlichen npm eintragen: axios und cheerio
        • einen datenpunkt vom typ zeichenfolge anlegen und im script angleichen - zeile 5 !!

        
        const cheerio = require('cheerio');
        
        const axios=require('axios');
        let myDPunkt="0_userdata.0.CONTROL-OWN.TABELLEN.GezeitenInSpanien"
        
        let mySchedule1="  33 */8 * * * "; // alle 8 stunden bei minute 33
        
         schedule(mySchedule1,  function () {
         let myVarVar=mathRandomInt(10, 300);
        // log("startet ");
         setTimeout(function() {
             log("jetzt "+myVarVar);
             holeDaten();
        
         }, myVarVar*1000);
         });
        
        holeDaten();
        function mathRandomInt(a, b) {
         if (a > b) {
           // Swap a and b to ensure a is smaller.
           var c = a;
           a = b;
           b = c;
         }
         return Math.floor(Math.random() * (b - a + 1) + a);
        }
        
        async function holeDaten() { 
           await axios.get('http://www.deutschlandsschoenstermetzger.de/index.php/speiseplan', {
                           headers: { 'User-Agent':`Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36` }
        }).then((result) => {
                // log(result.data)
                    const $ = cheerio.load(result.data)
                                      const list5 = $('*')
                                                         .find('tbody tr')
                                                         .toArray()
                                                         .map(element => { return $(element).text()}); //log(list5.length +"---"+list5)
        
                                      let dayArr=['Mo','Di','Mi','Do','Fr','Sa','So'];
                                      let jsonArr=[];
                                      for(let i=0;i<list5.length;i++) {//log(list5[i])
        
                                            if(!list5[i].includes("Gericht")) {           jsonArr.push({
                                                                                              "day":    list5[i],
                                                                                        
                                                                                          })  }
        
        } 
        //log(JSON.stringify(jsonArr))   //hier in dp schreiben
        //log("jetzt "+myVarVar);
        setState(myDPunkt,JSON.stringify(jsonArr))
        //if()
        
               }).catch((error) => {
                   return error;
               })}
        
        
        
        
        

        als widget nimmst das inventwo json widget - dazu die inventwo widgets als adapter installieren

        [{"tpl":"i-vis-jsontable","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iTblRowLimit":"10","iTableRefreshRate":"0","iColCount":"1","iColShow1":"true","iTblTextAlign1":"left","iTblCellFormat1":"normal","iTblCellImageSize1":"200","iTblCellBooleanCheckbox1":"false","iTblCellBooleanColorFalse1":"#ff0000","iTblCellBooleanColorTrue1":"#00ff00","iTblCellNumberDecimals1":"2","iTblCellNumberDecimalSeperator1":".","iTblCellNumberThousandSeperator1":",","iTblCellThresholdsDp1":"","iTblCellThresholdsText1":"","iOpacityAll":"1","iTblRowEvenColor":"#333333","iTblRowUnevenColor":"#455618","iTblHeaderColor":"#333333","iRowSpacing":"10","iTblRowEvenTextColor":"#ffffff","iTblRowUnevenTextColor":"#ffffff","iTblHeaderTextColor":"#ffffff","iBorderSize":"0","iBorderStyleLeft":"none","iBorderStyleRight":"none","iBorderStyleUp":"none","iBorderStyleDown":"none","iBorderColor":"#ffffff","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"iColName1":"MENU","oid":"0_userdata.0.CONTROL-OWN.TABELLEN.GezeitenInSpanien"},"style":{"left":"1001px","top":"523px","width":"496px","height":"362px"},"widgetSet":"vis-inventwo"}]
        

        Image 4.png

        der andere metzger hat einfach ein bild eingefügt - ich denke, das bild wird immer einen aneren namen haben - da brauchen wir ein script, welches den namen des bildes findet und anschliesend kann man das bild als rl-adresse ein der vis anzeigen

        1 Reply Last reply Reply Quote 0
        • TheBam
          TheBam @driftkingisback last edited by

          @driftkingisback
          Ich habe das auch gemacht ich zeige mit der vis auf einen Bereich in einer webseite.

          Hier als Beispiel Mal mit einer Seite wo auf in eine aktien Tabelle geschaut wird.
          Du musst dir den link ändern und teilweise die PX werte ```
          <div style="position:relative;width:500px;height:2000px;overflow:auto;">

          <iframe src="https://kursprognose.com/ethereum-kurs-prognose-eth-in-euro" height="1100" width="1000" style="border:none;overflow:hidden;position:absolute;left:-30px;top:-550px;">
          
          
          
          </iframe>
          

          </div>

          liv-in-sky 1 Reply Last reply Reply Quote 0
          • liv-in-sky
            liv-in-sky @TheBam last edited by

            @thebam wie müssen zuerst den bildnamen herausfinden - der wird nicht statisch sein - teste gerade

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

              @liv-in-sky Der Bildname ist bei dem Widget egal das zeigt einfach einen Bereich aus einer internetseite. Quasie ähnlich die dieses Berümte anzeigen der Tagesschau in 100 sekunden.
              Das führt allerdings dazu das man mit den Pixel etwas Spielen muss und solang das Bild immer auf der selben Position ist dann ist der Name egal.

              Hier noch mal als Widget import wie ich das mit meinem Metzger mache:

              [{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"86400000","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"<div style=\"position:relative;width:1000px;height:2000px;overflow:auto;\">\n\n        <iframe src=\"http://metzgereibunk.de/speisekarte/\" height=\"2000\" width=\"2350\" style=\"border:none;overflow:hidden;position:absolute;left:-750px;top:-600px;\">\n\n \n\n        </iframe>\n\n \n\n</div>"},"style":{"left":"61px","top":"18px","width":"569px","height":"617px"},"widgetSet":"basic"}]
              

              Einfach auf Widget import gehen und den code oben einfügen danach im html Teil evtl. die Pixel anpassen dann sollte das Schon drin sein
              ausschnitt.jpg

              liv-in-sky 1 Reply Last reply Reply Quote 0
              • liv-in-sky
                liv-in-sky @TheBam last edited by

                @thebam ahh - ok - dachte immer, das geht nicht, nur einen teil einer seite zu zeigen - wieder was gelernt

                TheBam 1 Reply Last reply Reply Quote 0
                • TheBam
                  TheBam @liv-in-sky last edited by

                  @liv-in-sky
                  Klar wieso soll das denn nicht gehen 😉
                  Ist halt leider bei Bilder usw. nicht wirklich einfach an die werte zu kommen dann geht das damit am besten.
                  Ich habe hier den erneuerungstimer allerdings so hoch wie möglich gestellt nicht das der server mich irgendwann ablehnt wegen zu vielen anfragen. Aber bei so etwas reicht die updatezeit von 180000 auf jedenfall.

                  liv-in-sky SBorg 2 Replies Last reply Reply Quote 1
                  • liv-in-sky
                    liv-in-sky @driftkingisback last edited by

                    @driftkingisback

                    so - das ganze für das bild mit scriipt

                    es wird immer der aktuelle bildernamen gefunden und in einen datenpunkt geschrieben

                    Image 7.png

                    damit kann sich auch die webseite verschieben ud du bekommst das bild

                    • den datenpunkt ganz oben anpassen
                    • ein image widget mit binding nutzen - den dp mit {0_userdata.0.CONTROL-OWN.TABELLEN........} angeben

                    Image 9.png

                    
                    const cheerio = require('cheerio');
                    
                    const axios=require('axios');
                    let myDPunkt="0_userdata.0.CONTROL-OWN.TABELLEN.GezeitenInSpanienBild"
                    
                    let mySchedule1="  33 */8 * * * "; // alle 8 stunden bei minute 33
                    
                     schedule(mySchedule1,  function () {
                     let myVarVar=mathRandomInt(10, 300);
                    // log("startet ");
                     setTimeout(function() {
                         log("jetzt "+myVarVar);
                         holeDaten();
                    
                     }, myVarVar*1000);
                     });
                    
                    holeDaten();
                    function mathRandomInt(a, b) {
                     if (a > b) {
                       // Swap a and b to ensure a is smaller.
                       var c = a;
                       a = b;
                       b = c;
                     }
                     return Math.floor(Math.random() * (b - a + 1) + a);
                    }
                    
                    async function holeDaten() { 
                       await axios.get('http://metzgereibunk.de/speisekarte/', {
                                       headers: { 'User-Agent':`Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36` }
                    }).then((result) => {
                            // log(result.data)
                                const $ = cheerio.load(result.data)
                    
                                     var listItems = $(".aligncenter.size-full.wp-image-2276"); log(listItems.length); log(typeof listItems ) ; //log( JSON.stringify(listItems) )
                                 //   let thing = $(".aligncenter.size-full.wp-image-2276").find('img').attr('src'); log(thing)
                                          log("lisItems: "+(String(listItems)));
                                        
                                         let myimage=String(listItems).replace(/.*?src="(.*?)".*/g,"$1"); 
                                           log(myimage);
                    
                                         
                       
                    
                    
                    //log(JSON.stringify(jsonArr))   //hier in dp schreiben
                    //log("jetzt "+myVarVar);
                    setState(myDPunkt,(myimage))
                    //if()
                    
                           }).catch((error) => {
                               return error;
                           })}
                    
                    
                    
                    
                    

                    1 Reply Last reply Reply Quote 0
                    • liv-in-sky
                      liv-in-sky @TheBam last edited by

                      @thebam war schon mitten drin - daher postete ich jetzt meine lösung - vielleicht kann es ja noch jmd anders brauchen

                      TheBam 1 Reply Last reply Reply Quote 1
                      • TheBam
                        TheBam @liv-in-sky last edited by

                        @liv-in-sky
                        Die Lösung kannte ich auch noch nicht daher finde ich gut und ich habe auch wieder was gelernt. Danke

                        liv-in-sky 1 Reply Last reply Reply Quote 0
                        • liv-in-sky
                          liv-in-sky @TheBam last edited by

                          @thebam

                          heute ist wohl großer metzger tag - es gibt noch einen thread , der das selbe fragt - nur andere metzgerei 🙂

                          1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @driftkingisback last edited by OliverIO

                            @driftkingisback sagte in Metzger Mittagsmenü in VIS einbinden:

                            Hallo ich möchte gerne für die Famile eine extra Seite visualisieren wo das Mittagsmenü von zwei Metzgern drin steht.

                            Die Stellen jede woche einen aktualiserten Plan auf ihre Seite, wie muss ich das machen, dass der sich auch aktuell hält bzw. updatet?

                            Bin noch anfänger über eine ausführlichere Antwort würde ich mich freuen

                            Hier mal die Links
                            http://metzgereibunk.de/speisekarte/

                            für die erste metzgerei ging es auch mit dem parser-adapter den bildnamen aus der seite zu zeihen

                            im parseradapter als typ string und als regex

                            <img loading="lazy".*src="(.*)" alt
                            

                            eintragen.
                            den datenpunkt dann in einem image widget mit binding auf den datenpunkt in quelle eintragen

                            beim 2. metzger wäre die Lösung oben mit dem iframe am besten.

                            liv-in-sky 1 Reply Last reply Reply Quote 0
                            • liv-in-sky
                              liv-in-sky @OliverIO last edited by

                              @oliverio der nachteil dieser lösung ist: du musst auch ein script schreiben, dass das richtige format für die vis-anzeige macht - es gibt ja auch feiertage - dann hat man datenpunkte, die eigentlich leer sein solten - es aber noch der tag der letzten woche drinteht

                              OliverIO 1 Reply Last reply Reply Quote 0
                              • OliverIO
                                OliverIO @liv-in-sky last edited by OliverIO

                                @liv-in-sky
                                verstehe ich nicht ganz.
                                der parser adapter ruft das bspw einmal täglich in der nacht ab.
                                wenn der metzger das neue bild eingestellt hat, erscheint es im datenpunkt.
                                egal wie das bild heißt.
                                wenn es im datenpunkt erscheint, wird es im image geladen.
                                warum muss man da feiertage wissen?
                                ein bisschen intelligenz kann man dem leser schon zutrauen, das wenn noch der plan von der letzten woche drin steht, gibt es keinen neuen? Es muss ja nicht immer super detailliert automatisiert sein.

                                Homoran liv-in-sky 2 Replies Last reply Reply Quote 0
                                • Homoran
                                  Homoran Global Moderator Administrators @OliverIO last edited by

                                  @oliverio sagte in Metzger Mittagsmenü in VIS einbinden:

                                  wenn es im datenpunkt erscheint, wird es im image geladen.
                                  warum muss man da feiertage wissen?

                                  wenn man den Text parst und nach der Reihenfolge die Tage zuordnet!
                                  Wenn dann mittendrin ein Feiertag ist und die Zeile für den Tag weggelassen wird, stimmen die Zuordnungen der Folgetage nicht mher

                                  1 Reply Last reply Reply Quote 0
                                  • liv-in-sky
                                    liv-in-sky @OliverIO last edited by

                                    @oliverio sorry - verwechselt - bei bild ist das ja egal

                                    1 Reply Last reply Reply Quote 0
                                    • SBorg
                                      SBorg Forum Testing Most Active @TheBam last edited by

                                      @thebam sagte in Metzger Mittagsmenü in VIS einbinden:

                                      Ich habe hier den erneuerungstimer allerdings so hoch wie möglich gestellt nicht das der server mich irgendwann ablehnt wegen zu vielen anfragen. Aber bei so etwas reicht die updatezeit von 180000 auf jedenfall.

                                      Du schreibst, dass du das bei "deinem Metzger" so machst. Ändert der alle drei Minuten sein Menü/Angebot oder warum fragst du dann so häufig ab?

                                      TheBam 1 Reply Last reply Reply Quote 0
                                      • TheBam
                                        TheBam @SBorg last edited by

                                        @sborg
                                        Wieso häufig? Ich habe den größten Wert genommen den das Widget in zu Verfügung stellt. Wollte damit nur sagen wenn es jemand macht sollte man dem Wert so weit hoch setzen wie es geht

                                        Homoran SBorg 2 Replies Last reply Reply Quote 0
                                        • Homoran
                                          Homoran Global Moderator Administrators @TheBam last edited by

                                          @thebam sagte in Metzger Mittagsmenü in VIS einbinden:

                                          den das Widget in zu Verfügung stellt

                                          das Abfrageintervall stellst du doch im Skript ein.

                                          Im Widget nur die Spanne mit der das Widget die Info aus dem Datenpunkt holt

                                          1 Reply Last reply Reply Quote 0
                                          • SBorg
                                            SBorg Forum Testing Most Active @TheBam last edited by

                                            @thebam Naja, 180000 ms sind 180 Sekunden, oder eben 3 Minuten. Dein iFrame aktualisiert sich also alle 3 Minuten 😉
                                            ...und wenn es per Schieberegler nicht geht, kann man auch direkt eine Zahl eintippen (denke auch beim iFrame-Widget).

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            840
                                            Online

                                            32.1k
                                            Users

                                            80.6k
                                            Topics

                                            1.3m
                                            Posts

                                            6
                                            22
                                            647
                                            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