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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [gelöst] regex

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

[gelöst] regex

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
communication
19 Beiträge 4 Kommentatoren 1.5k Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    mike1976
    schrieb am zuletzt editiert von
    #10

    und das ist die export file des adapters:

    system.adapter.parser.0.json

    1 Antwort Letzte Antwort
    0
    • M mike1976

      @Homoran

      testpi.dyndns-at-home.com:56000

      habe ich mal freigeschalten. kannst direkt auf die webseite

      Quellcode:
      aqi.py

      einstellungen von adapter habe ich oben einen screen gemacht. gibt ja nicht viele punkte

      crycodeC Offline
      crycodeC Offline
      crycode
      Developer
      schrieb am zuletzt editiert von
      #11

      @mike1976
      Das Problem an der Stelle ist, dass der eigentliche Wert gar nichtdirekt im HTML Code steht, sondern per JavaScript aus der Datei api.json geladen wird. Versuch mal als URL http://192.168.1.241/api.json und als RegEx den: {"pm10":\s+(\d+(\.\d+)?)[^}]*}]
      Das sollte dann jeweils den letzten (aktuellsten) Wert auslesen, egal ob es nun z.B. 9 oder 9.5 ist.

      Beispiel: https://regex101.com/r/a41Fp3/3

      Alternativ könnte man sicherlich auch über den JavaScript Adapter direkt die JSON-Datei laden und daraus dann den gewünschten Wert extrahieren.

      Meine Adapter: discord | canbus | ds18b20 | odl | radiohead

      M 1 Antwort Letzte Antwort
      1
      • crycodeC crycode

        @mike1976
        Das Problem an der Stelle ist, dass der eigentliche Wert gar nichtdirekt im HTML Code steht, sondern per JavaScript aus der Datei api.json geladen wird. Versuch mal als URL http://192.168.1.241/api.json und als RegEx den: {"pm10":\s+(\d+(\.\d+)?)[^}]*}]
        Das sollte dann jeweils den letzten (aktuellsten) Wert auslesen, egal ob es nun z.B. 9 oder 9.5 ist.

        Beispiel: https://regex101.com/r/a41Fp3/3

        Alternativ könnte man sicherlich auch über den JavaScript Adapter direkt die JSON-Datei laden und daraus dann den gewünschten Wert extrahieren.

        M Offline
        M Offline
        mike1976
        schrieb am zuletzt editiert von
        #12

        @crycode said in regex:

        http://192.168.1.241/api.json

        Leider nein der aufruf geht auch nicht :-(
        parsen7.JPG

        wenn ich im den link so teste bzw. öffne bekomme ich nur 404 not found
        okay muss einsehen das es für mich leider nicht möglich sein wird den wert in iobroker zu bekommen.
        Danke an euch allen für euer rasches bemühen.

        lg mike

        crycodeC 1 Antwort Letzte Antwort
        0
        • M mike1976

          @crycode said in regex:

          http://192.168.1.241/api.json

          Leider nein der aufruf geht auch nicht :-(
          parsen7.JPG

          wenn ich im den link so teste bzw. öffne bekomme ich nur 404 not found
          okay muss einsehen das es für mich leider nicht möglich sein wird den wert in iobroker zu bekommen.
          Danke an euch allen für euer rasches bemühen.

          lg mike

          crycodeC Offline
          crycodeC Offline
          crycode
          Developer
          schrieb am zuletzt editiert von
          #13

          @mike1976 ups, mein Fehler... das sollte aqi.json heißen. Dann müsste er die Datei auch finden ;-)

          Meine Adapter: discord | canbus | ds18b20 | odl | radiohead

          M 1 Antwort Letzte Antwort
          1
          • crycodeC crycode

            @mike1976 ups, mein Fehler... das sollte aqi.json heißen. Dann müsste er die Datei auch finden ;-)

            M Offline
            M Offline
            mike1976
            schrieb am zuletzt editiert von
            #14

            @crycode

            okay damit liest der adapter jetzt die seite ein, aber er will mir einfach keinen wert geben.
            Hast recht auf https://regex101.com/r/a41Fp3/3 geht es einwandfrei.
            Habe jetzt alle varianten gesteset im adapter:
            boolean
            number(.)
            number(,)
            string
            JSON

            eigentlich müsste der type ja nummer(.) sein, aber nicht um die bohne das er mir einen wert gibt

            parsen8.JPG

            1 Antwort Letzte Antwort
            0
            • M Offline
              M Offline
              mike1976
              schrieb am zuletzt editiert von
              #15

              update bekomme jetzt einen wert :-)
              habe bei den einstellungen noch Num 4 drinnen stehen
              geändert auf 0 und siehe da es kommt was rein.

              ich weis das kling jetzt sicherlich frech aber wie könnte ich jetzt immer die letzten werte von
              pm25 und seperat pm10 haben.

              im moment ist es ja immer der von pm10.

              Man Tausend dank erstmal :-)

              1 Antwort Letzte Antwort
              0
              • M Offline
                M Offline
                mike1976
                schrieb am zuletzt editiert von
                #16

                Denke habe es hinbekommen
                geändert auf

                "pm25":\s+(\d+(\.\d+)?)[^}]*}]
                
                1 Antwort Letzte Antwort
                0
                • M Offline
                  M Offline
                  mike1976
                  schrieb am zuletzt editiert von mike1976
                  #17

                  Danke das auslesen der "µg/m³" geht nun einwandfrei.

                  Ist es eigentlich möglich den "AQI (PM2.5)" und den "AQI (PM15)" auch auszulesen?
                  in http://192.168.1.241/aqi.json wird der ja nicht augelistet.

                  parsen3.JPG

                  Das sind die Webseiten auf den das script aufbaut:
                  $ wget -O /var/www/html/index.html https://raw.githubusercontent.com/zefanja/aqi/master/html/index.html
                  $ wget -O /var/www/html/aqi.js https://raw.githubusercontent.com/zefanja/aqi/master/html/aqi.js
                  $ wget -O /var/www/html/style.css https://raw.githubusercontent.com/zefanja/aqi/master/html/style.css

                  crycodeC 1 Antwort Letzte Antwort
                  0
                  • M mike1976

                    Danke das auslesen der "µg/m³" geht nun einwandfrei.

                    Ist es eigentlich möglich den "AQI (PM2.5)" und den "AQI (PM15)" auch auszulesen?
                    in http://192.168.1.241/aqi.json wird der ja nicht augelistet.

                    parsen3.JPG

                    Das sind die Webseiten auf den das script aufbaut:
                    $ wget -O /var/www/html/index.html https://raw.githubusercontent.com/zefanja/aqi/master/html/index.html
                    $ wget -O /var/www/html/aqi.js https://raw.githubusercontent.com/zefanja/aqi/master/html/aqi.js
                    $ wget -O /var/www/html/style.css https://raw.githubusercontent.com/zefanja/aqi/master/html/style.css

                    crycodeC Offline
                    crycodeC Offline
                    crycode
                    Developer
                    schrieb am zuletzt editiert von crycode
                    #18

                    @mike1976 Das sieht doch schon mal gut aus :)

                    Ist es eigentlich möglich den "AQI (PM2.5)" und den "AQI (PM15)" auch auszulesen?

                    Direkt auslesen kannst du die beiden Werte nicht, da die ja nicht so in den Daten enthalten sind.
                    Du kannst die Berechnung aber in ioBroker über ein Script nachbilden und die Ergebnisse dann eigene Datenpunkte schreiben.

                    Dann wäre aber wieder der oben schon mal erwähnte Weg direkt die JSON-Datei zu laden die schönere und zuverlässigere Variante.
                    Das Script dazu sieht dann so aussehen:

                    // URL von der die JSON-Daten geladen werden
                    const url = 'http://192.168.1.241/aqi.json';
                    
                    // Datenpunkte (javascript.0.XX)
                    const objPm10 = 'aqi.pm10';
                    const objPm25 = 'aqi.pm25';
                    const objAqiPm10 = 'aqi.aqiPm10';
                    const objAqiPm25 = 'aqi.aqiPm25';
                    
                    // Objekete anlegen, falls nicht vorhanden
                    createState(objPm10, { name: 'PM10', unit: 'µg/m³', type: 'number', role: 'value' });
                    createState(objPm25, { name: 'PM2.5', unit: 'µg/m³', type: 'number', role: 'value' });
                    createState(objAqiPm10, { name: 'AQI (PM10)', type: 'number', role: 'value' });
                    createState(objAqiPm25, { name: 'AQI (PM2.5)', type: 'number', role: 'value' });
                    
                    // alle 5 Sekunden die Daten laden
                    schedule('*/5 * * * * *', loadData);
                    
                    /**
                     * Funktion zum Laden der Daten.
                     */
                    function loadData () {  
                      request(url, (err, res, body) => {
                        if (err) {
                          log(err.toString(), 'error');
                          return;
                        }
                        const data = JSON.parse(body);
                        
                        const pm10 = data[data.length -1].pm10;
                        const pm25 = data[data.length -1].pm25;
                        const aqiPm10 = calcAQIpm10(pm10);
                        const aqiPm25 = calcAQIpm25(pm25);
                    
                        // Log-Ausgabe zum Testen
                        // log(`pm10: ${pm10}, pm25: ${pm25}, aqiPm10: ${aqiPm10}, aqiPm25: ${aqiPm25}`);
                    
                        setState(objPm10, pm10, true);
                        setState(objPm25, pm25, true);
                        setState(objAqiPm10, aqiPm10, true);
                        setState(objAqiPm25, aqiPm25, true);
                      });
                    }
                    
                    /**
                     * Berechnung von AQI PM 2.5.
                     * Quelle: https://github.com/zefanja/aqi/blob/master/html/aqi.js#L55
                     */
                    function calcAQIpm25(pm25) {
                      let pm1 = 0;
                      let pm2 = 12;
                      let pm3 = 35.4;
                      let pm4 = 55.4;
                      let pm5 = 150.4;
                      let pm6 = 250.4;
                      let pm7 = 350.4;
                      let pm8 = 500.4;
                    
                      let aqi1 = 0;
                      let aqi2 = 50;
                      let aqi3 = 100;
                      let aqi4 = 150;
                      let aqi5 = 200;
                      let aqi6 = 300;
                      let aqi7 = 400;
                      let aqi8 = 500;
                    
                      let aqipm25 = 0;
                    
                      if (pm25 >= pm1 && pm25 <= pm2) {
                        aqipm25 = ((aqi2 - aqi1) / (pm2 - pm1)) * (pm25 - pm1) + aqi1;
                      } else if (pm25 >= pm2 && pm25 <= pm3) {
                        aqipm25 = ((aqi3 - aqi2) / (pm3 - pm2)) * (pm25 - pm2) + aqi2;
                      } else if (pm25 >= pm3 && pm25 <= pm4) {
                        aqipm25 = ((aqi4 - aqi3) / (pm4 - pm3)) * (pm25 - pm3) + aqi3;
                      } else if (pm25 >= pm4 && pm25 <= pm5) {
                        aqipm25 = ((aqi5 - aqi4) / (pm5 - pm4)) * (pm25 - pm4) + aqi4;
                      } else if (pm25 >= pm5 && pm25 <= pm6) {
                        aqipm25 = ((aqi6 - aqi5) / (pm6 - pm5)) * (pm25 - pm5) + aqi5;
                      } else if (pm25 >= pm6 && pm25 <= pm7) {
                        aqipm25 = ((aqi7 - aqi6) / (pm7 - pm6)) * (pm25 - pm6) + aqi6;
                      } else if (pm25 >= pm7 && pm25 <= pm8) {
                        aqipm25 = ((aqi8 - aqi7) / (pm8 - pm7)) * (pm25 - pm7) + aqi7;
                      }
                      return Math.round(aqipm25);
                    }
                    
                    /**
                     * Berechnung von AQI PM 10.
                     * Quelle: https://github.com/zefanja/aqi/blob/master/html/aqi.js#L94
                     */
                    function calcAQIpm10(pm10) {
                      let pm1 = 0;
                      let pm2 = 54;
                      let pm3 = 154;
                      let pm4 = 254;
                      let pm5 = 354;
                      let pm6 = 424;
                      let pm7 = 504;
                      let pm8 = 604;
                    
                      let aqi1 = 0;
                      let aqi2 = 50;
                      let aqi3 = 100;
                      let aqi4 = 150;
                      let aqi5 = 200;
                      let aqi6 = 300;
                      let aqi7 = 400;
                      let aqi8 = 500;
                    
                      let aqipm10 = 0;
                    
                      if (pm10 >= pm1 && pm10 <= pm2) {
                        aqipm10 = ((aqi2 - aqi1) / (pm2 - pm1)) * (pm10 - pm1) + aqi1;
                      } else if (pm10 >= pm2 && pm10 <= pm3) {
                        aqipm10 = ((aqi3 - aqi2) / (pm3 - pm2)) * (pm10 - pm2) + aqi2;
                      } else if (pm10 >= pm3 && pm10 <= pm4) {
                        aqipm10 = ((aqi4 - aqi3) / (pm4 - pm3)) * (pm10 - pm3) + aqi3;
                      } else if (pm10 >= pm4 && pm10 <= pm5) {
                        aqipm10 = ((aqi5 - aqi4) / (pm5 - pm4)) * (pm10 - pm4) + aqi4;
                      } else if (pm10 >= pm5 && pm10 <= pm6) {
                        aqipm10 = ((aqi6 - aqi5) / (pm6 - pm5)) * (pm10 - pm5) + aqi5;
                      } else if (pm10 >= pm6 && pm10 <= pm7) {
                        aqipm10 = ((aqi7 - aqi6) / (pm7 - pm6)) * (pm10 - pm6) + aqi6;
                      } else if (pm10 >= pm7 && pm10 <= pm8) {
                        aqipm10 = ((aqi8 - aqi7) / (pm8 - pm7)) * (pm10 - pm7) + aqi7;
                      }
                      return Math.round(aqipm10);
                    }
                    

                    Die beiden Funktionen calcAQIpm25 und calcAQIpm10 sind direkt aus der aqi.js übernommen. Ich habe dabei lediglich den Rückgabewert angepasst, sodass immer eine Zahl ohne Nachkommastellen zurückgegeben wird.

                    Die Daten sind dann unter javascript.0.aqi.* verfügbar. :-)

                    Meine Adapter: discord | canbus | ds18b20 | odl | radiohead

                    M 1 Antwort Letzte Antwort
                    1
                    • crycodeC crycode

                      @mike1976 Das sieht doch schon mal gut aus :)

                      Ist es eigentlich möglich den "AQI (PM2.5)" und den "AQI (PM15)" auch auszulesen?

                      Direkt auslesen kannst du die beiden Werte nicht, da die ja nicht so in den Daten enthalten sind.
                      Du kannst die Berechnung aber in ioBroker über ein Script nachbilden und die Ergebnisse dann eigene Datenpunkte schreiben.

                      Dann wäre aber wieder der oben schon mal erwähnte Weg direkt die JSON-Datei zu laden die schönere und zuverlässigere Variante.
                      Das Script dazu sieht dann so aussehen:

                      // URL von der die JSON-Daten geladen werden
                      const url = 'http://192.168.1.241/aqi.json';
                      
                      // Datenpunkte (javascript.0.XX)
                      const objPm10 = 'aqi.pm10';
                      const objPm25 = 'aqi.pm25';
                      const objAqiPm10 = 'aqi.aqiPm10';
                      const objAqiPm25 = 'aqi.aqiPm25';
                      
                      // Objekete anlegen, falls nicht vorhanden
                      createState(objPm10, { name: 'PM10', unit: 'µg/m³', type: 'number', role: 'value' });
                      createState(objPm25, { name: 'PM2.5', unit: 'µg/m³', type: 'number', role: 'value' });
                      createState(objAqiPm10, { name: 'AQI (PM10)', type: 'number', role: 'value' });
                      createState(objAqiPm25, { name: 'AQI (PM2.5)', type: 'number', role: 'value' });
                      
                      // alle 5 Sekunden die Daten laden
                      schedule('*/5 * * * * *', loadData);
                      
                      /**
                       * Funktion zum Laden der Daten.
                       */
                      function loadData () {  
                        request(url, (err, res, body) => {
                          if (err) {
                            log(err.toString(), 'error');
                            return;
                          }
                          const data = JSON.parse(body);
                          
                          const pm10 = data[data.length -1].pm10;
                          const pm25 = data[data.length -1].pm25;
                          const aqiPm10 = calcAQIpm10(pm10);
                          const aqiPm25 = calcAQIpm25(pm25);
                      
                          // Log-Ausgabe zum Testen
                          // log(`pm10: ${pm10}, pm25: ${pm25}, aqiPm10: ${aqiPm10}, aqiPm25: ${aqiPm25}`);
                      
                          setState(objPm10, pm10, true);
                          setState(objPm25, pm25, true);
                          setState(objAqiPm10, aqiPm10, true);
                          setState(objAqiPm25, aqiPm25, true);
                        });
                      }
                      
                      /**
                       * Berechnung von AQI PM 2.5.
                       * Quelle: https://github.com/zefanja/aqi/blob/master/html/aqi.js#L55
                       */
                      function calcAQIpm25(pm25) {
                        let pm1 = 0;
                        let pm2 = 12;
                        let pm3 = 35.4;
                        let pm4 = 55.4;
                        let pm5 = 150.4;
                        let pm6 = 250.4;
                        let pm7 = 350.4;
                        let pm8 = 500.4;
                      
                        let aqi1 = 0;
                        let aqi2 = 50;
                        let aqi3 = 100;
                        let aqi4 = 150;
                        let aqi5 = 200;
                        let aqi6 = 300;
                        let aqi7 = 400;
                        let aqi8 = 500;
                      
                        let aqipm25 = 0;
                      
                        if (pm25 >= pm1 && pm25 <= pm2) {
                          aqipm25 = ((aqi2 - aqi1) / (pm2 - pm1)) * (pm25 - pm1) + aqi1;
                        } else if (pm25 >= pm2 && pm25 <= pm3) {
                          aqipm25 = ((aqi3 - aqi2) / (pm3 - pm2)) * (pm25 - pm2) + aqi2;
                        } else if (pm25 >= pm3 && pm25 <= pm4) {
                          aqipm25 = ((aqi4 - aqi3) / (pm4 - pm3)) * (pm25 - pm3) + aqi3;
                        } else if (pm25 >= pm4 && pm25 <= pm5) {
                          aqipm25 = ((aqi5 - aqi4) / (pm5 - pm4)) * (pm25 - pm4) + aqi4;
                        } else if (pm25 >= pm5 && pm25 <= pm6) {
                          aqipm25 = ((aqi6 - aqi5) / (pm6 - pm5)) * (pm25 - pm5) + aqi5;
                        } else if (pm25 >= pm6 && pm25 <= pm7) {
                          aqipm25 = ((aqi7 - aqi6) / (pm7 - pm6)) * (pm25 - pm6) + aqi6;
                        } else if (pm25 >= pm7 && pm25 <= pm8) {
                          aqipm25 = ((aqi8 - aqi7) / (pm8 - pm7)) * (pm25 - pm7) + aqi7;
                        }
                        return Math.round(aqipm25);
                      }
                      
                      /**
                       * Berechnung von AQI PM 10.
                       * Quelle: https://github.com/zefanja/aqi/blob/master/html/aqi.js#L94
                       */
                      function calcAQIpm10(pm10) {
                        let pm1 = 0;
                        let pm2 = 54;
                        let pm3 = 154;
                        let pm4 = 254;
                        let pm5 = 354;
                        let pm6 = 424;
                        let pm7 = 504;
                        let pm8 = 604;
                      
                        let aqi1 = 0;
                        let aqi2 = 50;
                        let aqi3 = 100;
                        let aqi4 = 150;
                        let aqi5 = 200;
                        let aqi6 = 300;
                        let aqi7 = 400;
                        let aqi8 = 500;
                      
                        let aqipm10 = 0;
                      
                        if (pm10 >= pm1 && pm10 <= pm2) {
                          aqipm10 = ((aqi2 - aqi1) / (pm2 - pm1)) * (pm10 - pm1) + aqi1;
                        } else if (pm10 >= pm2 && pm10 <= pm3) {
                          aqipm10 = ((aqi3 - aqi2) / (pm3 - pm2)) * (pm10 - pm2) + aqi2;
                        } else if (pm10 >= pm3 && pm10 <= pm4) {
                          aqipm10 = ((aqi4 - aqi3) / (pm4 - pm3)) * (pm10 - pm3) + aqi3;
                        } else if (pm10 >= pm4 && pm10 <= pm5) {
                          aqipm10 = ((aqi5 - aqi4) / (pm5 - pm4)) * (pm10 - pm4) + aqi4;
                        } else if (pm10 >= pm5 && pm10 <= pm6) {
                          aqipm10 = ((aqi6 - aqi5) / (pm6 - pm5)) * (pm10 - pm5) + aqi5;
                        } else if (pm10 >= pm6 && pm10 <= pm7) {
                          aqipm10 = ((aqi7 - aqi6) / (pm7 - pm6)) * (pm10 - pm6) + aqi6;
                        } else if (pm10 >= pm7 && pm10 <= pm8) {
                          aqipm10 = ((aqi8 - aqi7) / (pm8 - pm7)) * (pm10 - pm7) + aqi7;
                        }
                        return Math.round(aqipm10);
                      }
                      

                      Die beiden Funktionen calcAQIpm25 und calcAQIpm10 sind direkt aus der aqi.js übernommen. Ich habe dabei lediglich den Rückgabewert angepasst, sodass immer eine Zahl ohne Nachkommastellen zurückgegeben wird.

                      Die Daten sind dann unter javascript.0.aqi.* verfügbar. :-)

                      M Offline
                      M Offline
                      mike1976
                      schrieb am zuletzt editiert von
                      #19

                      @crycode

                      Ähhh... Was soll ich sagen ausser 1000 mal Danke.
                      Das funktioniert einwandfrei :smile: :smile:
                      Hatte die hoffnung schon aufgegeben.
                      Kommer leider aus der SPS welt und script mässig ein kompleter noob.

                      Danke nochmal hast mir einen riesen schritt weitergeholfen, jetzt muss ich nur noch eine vernünftige Wochenzeitschaltuhr für die Vis finden.

                      GLG Mike

                      PS: Danke für deine Zeit und Hilfe

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      716

                      Online

                      32.6k

                      Benutzer

                      82.3k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe