Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. [Javascript] für Warnungen von Lebensmittelwarnung

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Javascript] für Warnungen von Lebensmittelwarnung

    This topic has been deleted. Only users with topic management privileges can see it.
    • liv-in-sky
      liv-in-sky @SBorg last edited by

      @SBorg hab dein script erst gestern entdeckt - bin auch mal gespannt, was da so alles kommen wird

      1 Reply Last reply Reply Quote 0
      • O
        obakuhl Developer last edited by

        Das Skript funktioniert soweit super, vielen Dank für die Arbeit 😁
        Ich habe nur den String für das Objekt "Titel" modifiziert. Hintergrund ist, das ich einen Gotify PushServer verwende und hier die Anführungszeichen ("), die in manchen Titelbeschreibungen vorhanden sind, den Syntax in dem exec Aufruf verändert haben, sodass nur ein Teil des Titels als Benachrichtigung ankam. Mit .replace() kann man dieses Zeichen entfernen. Ebenso entferne ich die Zeichen „ und “. Da es jetzt vorkommen kann, dass der String mit Leerzeichen beginnt bzw. endet entfernt man diese mit .trim().

        Ich habe im JavascriptCode folgendes ergänzt:

        //Anfuehrungszeichen ersetzen 
        entry.title = entry.title.replace(/["„“]/g, "");
        
        //Entferne Leerzeichen
        entry.title = entry.title.trim();
        

        Das ganze muss vor dem Setzen der Variable "entry.title" geschehen, d.h. vor dem Aufruf:

        setState(DP+'.Nummer_'+i+'.Titel', entry.title);
        

        Evtl. hat jemand dasselbe Problem, das wäre ein Lösungsvorschlag 🤓

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

          @SBorg hi

          habe seit update des neuen javascript adapters auf 4.10.8 einen fehler im script - hast du das auch schon beobachten können ?

          Image 2.png

          SBorg Negalein 2 Replies Last reply Reply Quote 0
          • SBorg
            SBorg Forum Testing Most Active @liv-in-sky last edited by

            @liv-in-sky Nein, noch nicht. Ich nutze die 4.10.8 seit erscheinen. Funktioniert soweit und Meldungen trudeln auch jede Menge ein 🙂 ... oder besser 😞
            Ev. hat es dir den RSS-Parser zerlegt?

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

              @SBorg hast du ne ahnung, wie ich den parser wieder hinbekomme

              habe aber gestern in einem anderen thread auch die constructer fehlermeldung gehabt - mit maillistener

              SBorg 1 Reply Last reply Reply Quote 0
              • Negalein
                Negalein Global Moderator @liv-in-sky last edited by

                @liv-in-sky sagte in [Javascript] für Warnungen von Lebensmittelwarnung:

                javascript adapters auf 4.10.8

                läuft bei mir auch einwandfrei weiter

                1 Reply Last reply Reply Quote 0
                • SBorg
                  SBorg Forum Testing Most Active @liv-in-sky last edited by

                  @liv-in-sky
                  ggf. Verzeichnis anpassen:

                  cd /opt/iobroker && npm install --save rss-parser
                  
                  1 Reply Last reply Reply Quote 0
                  • SBorg
                    SBorg Forum Testing Most Active last edited by

                    [Offtopic]
                    Kommt nach Hessen, hier könnt ihr euch einfach im nächsten Supermarkt eindecken... Kauft Hanföl... 😉


                    Grund der Warnung: Gesundheitsgefahr durch psychoaktiv wirkende Substanzen

                    ...endlich weiß ich auch warum hier dauernd rosa Elefanten rumlaufen... 🙃

                    Neuschwansteini Negalein 2 Replies Last reply Reply Quote 0
                    • Neuschwansteini
                      Neuschwansteini @SBorg last edited by Neuschwansteini

                      @sborg ich sehr gerade n rosa karierter Bär.. hmm bin auch in Hessen... Kommt das vom Wasser? 🤣🙈16126075414451583544811986622375.jpg

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

                        @ilovegym "Gesundheitsgefahr" wäre auch noch zu diskutieren 🖖

                        1 Reply Last reply Reply Quote 0
                        • Negalein
                          Negalein Global Moderator @SBorg last edited by

                          @sborg sagte in [Javascript] für Warnungen von Lebensmittelwarnung:

                          Kauft Hanföl

                          schick mir eine Palette 😂 😂 😂

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

                            @sborg Danke das das Script jetzt schon so lange funktioniert.
                            Gestern habe ich meine VIS umgebaut und mir ist dabei etwas aufgefallen das ich nicht verstehe.
                            Ich versuche den Datenpunkt "neue_Warnung" zu nutzen. Allerdings wird der bei jedem Scriptlauf scheinbar wieder auf true gesetzt. Gibt es irgendwo einen Zeitpunkt ab wann eine Warnung kein "true" mehr auslöst?
                            Der Grund ist einfach das ich den Button zur Anzeige bei einer neuen Warnung blinken lassen möchte. Wenn die Warnung allerdings schon 2 Tage alt ist sollte das Blinken aufhören.

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

                              @chaot 🙂
                              sagte in [Javascript] für Warnungen von Lebensmittelwarnung:

                              Gibt es irgendwo einen Zeitpunkt ab wann eine Warnung kein "true" mehr auslöst?

                              Nicht direkt. Aktuell ist es einfach so, neue Meldung = Datum/Uhrzeit der Meldung in Meldung "...Nummer_0.Datum" ändert sich --> DP "neue Meldung" wird auf true gesetzt und verbleibt so bis der Nutzer es selbst auf false setzt (passiert bei mir bspw. wenn ich die entsprechende View aufrufe)
                              Bei einem festen Reset-Intervall könnte man halt die ein oder andere Meldung verpassen, wäre aber programmiertechnisch umsetzbar. Könnte dann aber uU. zu Fehlmeldungen der "neue Meldung" führen, da dann beim Restart des ioBs/JS-Adapters ggf. initialisiert wird und sich dies mit einer Abfrage bzw. Meldung überschneiden könnte.
                              Würde ich dann aber sowieso konfigurierbar ausführen, dann kann jeder entscheiden ob er es so belassen will wie es aktuell ist, oder eben nach xxx Minuten automatisch resettet haben möchte 😉

                              Chaot 1 Reply Last reply Reply Quote 1
                              • Chaot
                                Chaot @SBorg last edited by

                                @sborg sagte in [Javascript] für Warnungen von Lebensmittelwarnung:

                                ...(passiert bei mir bspw. wenn ich die entsprechende View aufrufe)
                                ...

                                Interessanter Ansatz. Wie machst du das? Würde mir auch reichen.

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

                                  Neue Version V0.1.0 Online:

                                  • + automatischer Reset für "neue Meldung" hinzugefügt

                                  Projekt zu finden im GitHub

                                  Es kann nun per Parameter bestimmt werden ob der Datenpunkt "neue Meldung" auf true bei einer neuen Meldung verbleiben soll (let Reset_neueMeldung = 0;) oder nach xxxx Minuten automatisch wieder auf false gesetzt wird (zB. für 2 Tage: let Reset_neueMeldung = 2880;).

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

                                    @chaot sagte in [Javascript] für Warnungen von Lebensmittelwarnung:

                                    Interessanter Ansatz. Wie machst du das? Würde mir auch reichen.

                                    Bild 1.png

                                    Ich habe als Hinweis ein glühendes "!"
                                    Der Button ist dann ein Widget und enthält nur das aussehen.
                                    Darüber liegt dann ein weiteres, unsichtbares Widget welches die View dann öffnet.
                                    Die beiden sind dann gruppiert und über die Gruppenattribute wird dann der DP gesetzt:
                                    Bild 2.png

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

                                      @sborg Danke - für beides! Genial.

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

                                        @sborg Danke für dein Script.
                                        Ich habe dein Script etwas umgeschrieben um #Grund der Warnung #Hersteller und#"betroffene Bundesländer als separate Datenpunkte zu erhalten.
                                        Falls das wer benötigt:

                                        //09.01.2023 by DasIch83
                                        //Grund der Warnung, Hersteller und betroffene Bundesländer als Datenpunkte hinzugefügt 
                                        //Anzahl auf 6 erhöht wegen eigener VIS
                                        
                                        /*
                                           (c)2019 by SBorg 
                                           V0.0.8 - 31.10.2019 + Meldungen für mehrere Bundesländer möglich
                                           V0.0.7 - 03.10.2019 ~ mehrere Filter möglich
                                           V0.0.6 - 02.09.2019 ~ Wochentage und Monate auf dt. Datumsformat gepatcht
                                                               + Produktart als Datenpunkt
                                                               ~ Datum neu formatiert (Sekunden entfernt und "Uhr" hinzugefügt)
                                           V0.0.5 - 31.08.2019 ~ Bilder als eigener Datenpunkt ausgelagert
                                           V0.0.4 - 29.08.2019 + Fehlermanagement Webserver
                                                               + Datenpunkt für "neue Warnung" / true bei neuer Warnung
                                                               + filtern eines Suchbegriffes (minimal)
                                           V0.0.3 - 28.08.2019 ~ Datum formatiert
                                                               + betroffene Bundesländer anzeigen? 
                                                               ~ Fehler beim ersten Start des Skripts behoben
                                           V0.0.2 - 27.08.2019 + Titel, Datum und Link  
                                           V0.0.1 - 26.08.2019   erste Alpha
                                        
                                           holt die Warnungen von Lebensmittelwarnung.de aus deren RSS-Feed
                                           benötigt 'rss-parser': cd /opt/iobroker && npm install --save rss-parser
                                        
                                              ToDo: - besseres Datenpunktmanagment
                                           
                                           known issues: keine
                                        
                                        */
                                        //START User-Einstellungen ***********************************************************************************************
                                        const debug    = false;                                  //debuggen [true/false]?
                                        const Anzahl   = 6;                                      //wie viele Warnungen sollen gelesen werden?
                                        const BuLand   = true;                                   //zeige Bundesländer an [true/false]?
                                        const DP       = '0_userdata.0.News.Lebensmittelwarnung'; //Datenpunkt
                                        var   FILTER   = ['false'];                              //ausfiltern bestimmter Suchbegriffe (auch RegEx) oder 'false' für keinen Filter
                                        var   LAENDER  = [10];                                    /*Warnung für welches Bundesland/-länder; kommasepariert
                                                                                                  1=Baden-Württemberg, 2=Bayern, 3=Berlin, 4=Brandenburg, 5=Bremen, 
                                                                                                  6=Hamburg, 7=Hessen, 8=Mecklenburg-Vorpommern, 9=Niedersachsen, 
                                                                                                  10=Nordrhein-Westfalen, 11=Rheinland-Pfalz, 12=Saarland, 13=Sachsen, 
                                                                                                  14=Sachsen-Anhalt, 15=Schleswig-Holstein, 16=Thüringen oder 0=alle */
                                        const Zeitplan = "3 */2 * * *";                          /* wann soll die Abfrage stattfinden (Minuten Stunde * * *)
                                           die Minuten sollten auf eine "krumme" Zeit gesetzt werden, damit nicht jeder zur selben Zeit eine Anfrage an den
                                           Webserver von Lebensmittelwarnung.de schickt und diesen ggf. überlastet... 
                                           Hier: alle 8 Stunden UND 3 Minuten = 8:03 Uhr, 16:03 Uhr und 0:03 Uhr
                                           siehe auch cron-Syntax z.B. unter https://de.wikipedia.org/wiki/Cron */
                                        //END User-Einstellungen *************************************************************************************************
                                        
                                        //ab hier gibt es nix mehr zu ändern :)
                                        //firstStart?
                                        if (!isState(DP, false)) { createDP(); }
                                        
                                        //globale Nicht-User-Variablen
                                        const URL      = 'https://www.lebensmittelwarnung.de/bvl-lmw-de/opensaga/feed/alle/alle_bundeslaender.rss'
                                        let Laender    = ['alle','Baden-Württemberg','Bayern','Berlin','Brandenburg','Bremen','Hamburg','Hessen','Mecklenburg-Vorpommern',
                                                          'Niedersachsen','Nordrhein-Westfalen','Rheinland-Pfalz','Saarland','Sachsen','Sachsen-Anhalt', 'Schleswig-Holstein','Thüringen'];
                                        
                                        //Daten beim Start des Scripts abrufen
                                        polldata();
                                        console.log('Hole Daten...');
                                        
                                        //neue Warnung?
                                        on({id: DP+".Nummer_0.Datum", change: "ne"}, function (obj) {
                                          console.log('Neue Warnmeldung vorhanden...');
                                          setTimeout(function() { setState(DP+".neue_Warnung", 'true'); }, 3000);
                                        });
                                        
                                        //scheduler
                                        schedule(Zeitplan, polldata);
                                        
                                        function polldata() {
                                         let Parser = require('rss-parser');
                                         let parser = new Parser({
                                            xml2js: { emptyTag: '--EMPTY--', },
                                            maxRedirects: 50,
                                            timeout: 60000,
                                            customFields: { item: [['description','description', {keepArray: true}],] }
                                         });
                                        
                                         (async () => {
                                         
                                          try {
                                                let feed = await parser.parseURL(URL);
                                                var i=0, Treffer, HitBuL, Beschreibung, Bild, Produktart, Grund, Hersteller, Bundeslaender;
                                                if (debug === true) {console.log(feed.title);}
                                         
                                                feed.items.forEach(function(entry) {
                                                    if (debug === true) {console.log(entry.title + ': ' + entry.link + ' ' + entry.description + ' ' + entry.pubDate);}
                                                    if (i<Anzahl) {
                                                        
                                                       //Filter Bundesländer
                                                       HitBuL=false;
                                                       for(let anzBuLand=0; anzBuLand<LAENDER.length; anzBuLand++) { 
                                                          if (entry.description[0].indexOf(Laender[LAENDER[anzBuLand]], entry.description[0].lastIndexOf('<b>Betroffene Länder:</b>')) != -1) { HitBuL=true; }
                                                       }
                                                       if (HitBuL === true || LAENDER[0] == 0) { 
                                                       
                                                        //Suchfilter auf Beschreibung anwenden
                                                        Treffer=0;
                                                        for(let anzFilter=0; anzFilter<FILTER.length; anzFilter++) { 
                                                            if (entry.description[0].search(FILTER[anzFilter]) == -1) { Treffer++; } 
                                                        }
                                                        if (Treffer==FILTER.length || FILTER[0] == "false") {
                                                            //Bundesländer anzeigen?
                                                            if (BuLand === true) { Beschreibung = entry.description[0] } else { Beschreibung = entry.description[0].substring(0, entry.description[0].lastIndexOf('<b>Betroffene Länder:</b>')); }
                                                            //prüfen ob Bild vorhanden ist und ggf. parsen
                                                            if (Beschreibung.search('<img src="http') != -1) {
                                                                Bild = Beschreibung.substring(0, Beschreibung.indexOf('<br/>')+5);
                                                                Beschreibung = Beschreibung.replace(Bild, ''); 
                                                                Bild = Bild.substring(Bild.indexOf('"')+1, Bild.lastIndexOf('"'));
                                                                Bild = Bild.substring(0, Bild.indexOf('"'));
                                                            } else {Bild = '';}
                                        
                                                            //Datum auf dt. Wochentage patchen
                                                            let WT = entry.pubDate.substring(0, 3);
                                                            switch (WT) {
                                                                case "Mon":
                                                                    entry.pubDate = entry.pubDate.replace('Mon', 'Mo');
                                                                    break;
                                                                case "Tue":
                                                                    entry.pubDate = entry.pubDate.replace('Tue', 'Di');
                                                                    break;    
                                                                case "Wed":
                                                                    entry.pubDate = entry.pubDate.replace('Wed', 'Mi');
                                                                    break;
                                                                case "Thu":
                                                                    entry.pubDate = entry.pubDate.replace('Thu', 'Do');
                                                                    break;
                                                                case "Fri":
                                                                    entry.pubDate = entry.pubDate.replace('Fri', 'Fr');
                                                                    break;
                                                                case "Sat":
                                                                    entry.pubDate = entry.pubDate.replace('Sat', 'Sa');
                                                                    break;
                                                                case "Sun":
                                                                    entry.pubDate = entry.pubDate.replace('Sun', 'So');
                                                                    break;    
                                                                default:
                                                                    console.log('Fehler beim Datum parsen...: '+WT);
                                                            }
                                        
                                                            //Monate auf dt. Format patchen
                                                            if (entry.pubDate.search('Mar')) {entry.pubDate = entry.pubDate.replace('Mar', 'März');}
                                                            if (entry.pubDate.search('May')) {entry.pubDate = entry.pubDate.replace('May', 'Mai');}
                                                            if (entry.pubDate.search('Oct')) {entry.pubDate = entry.pubDate.replace('Oct', 'Okt');}
                                                            if (entry.pubDate.search('Dec')) {entry.pubDate = entry.pubDate.replace('Dec', 'Dez');}
                                        
                                                            //Produktart filtern
                                                            Produktart = Beschreibung.substring(Beschreibung.indexOf('<b>Typ:</b>'));
                                                            Produktart = Produktart.substring(12, Produktart.indexOf('<br/>'));
                                        					
                                        					//Grund filtern
                                        					Grund = Beschreibung.substring(Beschreibung.indexOf('<b>Grund der Warnung:</b>'));
                                        					Grund = Grund.substring(25, Grund.indexOf('<br/>'));
                                        					
                                        					//Hersteller filtern
                                        					Hersteller = Beschreibung.substring(Beschreibung.indexOf('<b>Hersteller '));
                                        					Hersteller = Hersteller.substring(38, Hersteller.indexOf('<br/>'));
                                        					
                                        					//Bundesländer filtern
                                        					Bundeslaender = Beschreibung.substring(Beschreibung.indexOf('<b>Betroffene'));
                                        					Bundeslaender = Bundeslaender.substring(26, Bundeslaender.indexOf('<br/>'));
                                        
                                                            setState(DP+'.Nummer_'+i+'.Titel', entry.title);
                                                            setState(DP+'.Nummer_'+i+'.Link', entry.link);
                                                            setState(DP+'.Nummer_'+i+'.Datum', entry.pubDate.substring(0, entry.pubDate.lastIndexOf(':'))+' Uhr');
                                                            setState(DP+'.Nummer_'+i+'.Beschreibung', Beschreibung);
                                                            setState(DP+'.Nummer_'+i+'.Produktbild', Bild);
                                                            setState(DP+'.Nummer_'+i+'.Produktart', Produktart);
                                        					setState(DP+'.Nummer_'+i+'.Grund', Grund);
                                                            setState(DP+'.Nummer_'+i+'.Hersteller', Hersteller);
                                        					setState(DP+'.Nummer_'+i+'.Bundeslaender', Bundeslaender);
                                                            i++;
                                                        } // end Filter Produkte
                                                       } //end Filter Bundesländer
                                                    } // end Anzahl
                                                })
                                                console.log('Daten aktualisiert...');
                                            } catch (e) {
                                                console.warn('Fehler beim Datenabruf...');
                                                return;
                                                }
                                        
                                            })(); //end async
                                        } //end func
                                        
                                        /*
                                          Checks if a a given state or part of state is existing.
                                          This is a workaround, as getObject() or getState() throw warnings in the log.
                                          Set strict to true if the state shall match exactly. If it is false, it will add a wildcard * to the end.
                                          See: https://forum.iobroker.net/topic/11354/
                                          @param {string}    strStatePath     Input string of state, like 'javas-cript.0.switches.Osram.Bedroom'
                                          @param {boolean}   [strict=false]   Optional: if true, it will work strict, if false, it will add a wildcard * to the end of the string
                                          @return {boolean}                   true if state exists, false if not
                                         */
                                        
                                        function isState(strStatePath, strict) {
                                        
                                            let mSelector;
                                            if (strict) {
                                                mSelector = $('state[id=' + strStatePath + '$]');
                                            } else {
                                                mSelector = $('state[id=' + strStatePath + ']');
                                            }
                                        
                                            if (mSelector.length > 0) {
                                                return true;
                                            } else {
                                                return false;
                                            }
                                        }
                                        
                                        // Pause einlegen
                                        function Sleep(milliseconds) {
                                         return new Promise(resolve => setTimeout(resolve, milliseconds));
                                        }
                                        
                                        //Datenpunkte anlegen
                                        async function createDP() {
                                            console.log(DP + ' existiert nicht... Lege Datenpunkte an...');
                                            createState(DP, '', { name: 'Warnungen von Lebensmittelwarnung.de' });
                                            createState(DP+'.neue_Warnung', '', { name: "neue Warnung vorhanden", type: "string", role: "state" });
                                            for(var i=0; i<Anzahl; i++) { 
                                                createState(DP+'.Nummer_'+i, '', { name: 'Warnung Nummer #'+i }); 
                                                createState(DP+'.Nummer_'+i+'.Beschreibung', '', { name: "HTML-Text der Warnung",
                                                                                                    type: "string",
                                                                                                    role: "state"
                                                                                                 }); 
                                                createState(DP+'.Nummer_'+i+'.Titel', '', { name: "Titel der Warnung",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });
                                                createState(DP+'.Nummer_'+i+'.Link', '', { name: "Link zur Meldung",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });
                                                createState(DP+'.Nummer_'+i+'.Datum', '', { name: "Datum der Meldung",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });
                                                createState(DP+'.Nummer_'+i+'.Produktbild', '', { name: "Produktbild zur Warnung",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });
                                                createState(DP+'.Nummer_'+i+'.Produktart', '', { name: "Produktart zur Warnung",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });
                                                createState(DP+'.Nummer_'+i+'.Grund', '', { name: "Grund der Warnung",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });
                                                createState(DP+'.Nummer_'+i+'.Hersteller', '', { name: "Hersteller",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });
                                        		createState(DP+'.Nummer_'+i+'.Bundeslaender', '', { name: "Bundeslaender",
                                                                                            type: "string",
                                                                                            role: "state"
                                                                                         });										 
                                        
                                                
                                            }
                                            await Sleep(5000);
                                        }
                                        
                                        Nashra 1 Reply Last reply Reply Quote 0
                                        • Nashra
                                          Nashra Most Active Forum Testing @DasIch83 last edited by

                                          @dasich83 sagte in [Javascript] für Warnungen von Lebensmittelwarnung:

                                          @sborg Danke für dein Script.
                                          Ich habe dein Script etwas umgeschrieben um #Grund der Warnung #Hersteller und#"betroffene Bundesländer als separate Datenpunkte zu erhalten.

                                          Hast Du auch die passende View dazu und würdest die teilen?

                                          DasIch83 1 Reply Last reply Reply Quote 0
                                          • DasIch83
                                            DasIch83 @Nashra last edited by

                                            @nashra Ja klar, kein Thema.
                                            Ist allerdings noch nicht ganz fertig. Zugeschnitten auf ein iPad Air 2.
                                            View Lebensmittelwarnung.txt

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            899
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript lebensmittelwarnung
                                            24
                                            293
                                            32020
                                            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