Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. pix

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    P
    • Profile
    • Following 0
    • Followers 4
    • Topics 129
    • Posts 2965
    • Best 65
    • Groups 5

    pix

    @pix

    Meine Adapter (https://github.com/Pix–-):

    iobroker.feiertage
    iobroker.homepilot
    iobroker.tvspielfilm
    iobroker.tankerkoenig

    Zuerst kam Homematic, dann CCU.IO und schließlich ioBroker.

    107
    Reputation
    660
    Profile views
    2965
    Posts
    4
    Followers
    0
    Following
    Joined Last Online

    pix Follow
    Forum Testing Developer Pro Starter Most Active

    Best posts made by pix

    • RE: Biowetter aus WetterOnline (wie Pollenflug)

      @Nashra Hallo Nashra,

      danke für Deinen Vorschlag, habe das umgesetzt:

      /* Biowetter Parser von gesundheit.de
      
      http://forum.iobroker.net/viewtopic.php?f=23&t=2799&sid=936235bdac98a70a1d8672897d334a07#p25266
      
      05.05.2016 erstellt von steinwedel für homoran
      06.05.2016 Anpassung durch pix (Vorhersage mehrere Tage)
      
      Änderung in Biowetterparser
      12.01.2017 Biowetter
      14.01.2017 vom Pollenflug Skript separiert
      10.06.2019 neue Quellseite www.gesundheit.de (Anpassung von pix)
      
      */
      
      const pfad = "Biowetter.";
      const logging = false;
      
      // Städte können natürlich auch gelöscht werden
      const stadt = [
          // Baden - Württemberg
          { "URL_" : "freiburg",
            "name" : "Freiburg" },
                
          { "URL_" : "stuttgart",
            "name" : "Stuttgart" },
          // Bayern   
          { "URL_" : "kempten",
            "name" : "Kempten" },
                
          { "URL_" : "muenchen",
            "name" : "München" },
                
          { "URL_" : "nuernberg",
            "name" : "Nürnberg" },
          // Berlin 
          { "URL_" : "berlin",
            "name" : "Berlin" },
          // Brandenburg  
          { "URL_" : "cottbus",
            "name" : "Cottbus" },
          // Bremen   
          { "URL_" : "bremen",
            "name" : "Bremen" },
          // Hamburg   
          { "URL_" : "hamburg",
            "name" : "Hamburg" },
          // Hessen     
          { "URL_" : "frankfurt-am-main",
            "name" : "Frankfurt am Main" },
                
          { "URL_" : "kassel",
            "name" : "Kassel" },
          // Mecklenburg - Vorpommern    
          { "URL_" : "rostock",
            "name" : "Rostock" },
                
          { "URL_" : "schwerin",
            "name" : "Schwerin" },
          // Niedersachsen      
          { "URL_" : "emden",
            "name" : "Emden" },
                
          { "URL_" : "hannover",
            "name" : "Hannover" },
          // Nordrhein - Westfalen     
          { "URL_" : "bochum",
            "name" : "Bochum" },
                
          { "URL_" : "dortmund",
            "name" : "Dortmund" },
                
          { "URL_" : "duisburg",
            "name" : "Duisburg" },
                
          { "URL_" : "duesseldorf",
            "name" : "Düsseldorf" },
                
          { "URL_" : "essen",
            "name" : "Essen" },
                
          { "URL_" : "koeln",
            "name" : "Köln" },
                
          { "URL_" : "muenster",
            "name" : "Münster" },
          // Rheinland - Pfalz   
          { "URL_" : "koblenz",
            "name" : "Koblenz" },
          // Saarland     
          { "URL_" : "saarbruecken",
            "name" : "Saarbrücken" },
          // Sachsen     
          { "URL_" : "leipzig",
            "name" : "Leipzig" },
                
          { "URL_" : "dresden",
            "name" : "Dresden" },
          // Sachsen - Anhalt      
          { "URL_" : "halle",
            "name" : "Halle" },
               
          { "URL_" : "magdeburg",
            "name" : "Magdeburg" },
          // Schleswig - Holstein    
          { "URL_" : "kiel",
            "name" : "Kiel" },
          // Thüringen      
          { "URL_" : "erfurt",
            "name" : "Erfurt" }
      
      ];
      
      // ab hier nix ändern
      
      const biowetter_url = "https://www.gesundheit.de/rat-hilfe/biowetter/";
      const biodatenpunkte = ["heute", "morgen", "Kombi"];
      
      let request = require("request");
      
      function bioDpAnlegen() {
          // alle stadte durchgehen
      
          stadt.forEach(function(city) {
              let bio_pfad = pfad + city.name.toLowerCase();
              setTimeout(function() {
                  for (var bdp = 0; bdp < biodatenpunkte.length; bdp++) {
                      createState(bio_pfad + "." + biodatenpunkte[bdp], {
                          def: "",
                          name: "Biowetter " + city.name + " " + biodatenpunkte[bdp],
                          desc: "Biowetter Vorhersage (gesundheit.de)für " + biodatenpunkte[bdp] + " in " + city.name,
                          type: "string"
                      });
                  }
              }, 1000);
          });
      }
      
      
      function readBiowetter() {
          stadt.forEach(function(s) {
              setTimeout(function() {
                  if (logging) log("Es wird abgefragt: " + s.URL_ + " für " + s.name);
                  readURL(s.URL_, s.name);
              }, 1000);
          });
      }
      
      
      
      function readURL(stadt_URL_, stadt_name) {
      
          try {
              let options = {
                  url: biowetter_url + stadt_URL_, // korrekten Link erstellen
                  headers: {
                      "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
                  }
              };
      
              request(options, function(error, response, body) {
                  if (!error && response.statusCode == 200) { // kein Fehler, Inhalt in body
                      /*body=body.replaceAll(String.fromCharCode(13),"");
                      body=body.replaceAll(String.fromCharCode(10),"");
                      body=body.replaceAll(String.fromCharCode(9)," ");
                      body=strip_tags(body);*/
      
                      /* // betroffener HTML Code
                                  <div></div>
      
      
                                  <h2>Heute</h2>
                                  <p>Die aktuelle Wetterlage belastet Herz und Kreislauf stärker als sonst üblich. Aufgrund der warmen Luftmasse ist die Durchblutung vermindert. Viele Menschen fühlen sich weiterhin müde und abgespannt. Trotzdem fällt der erholsame Tiefschlaf schwer. Menschen, die verstärkt mit Kopfschmerzen und Migräneattacken auf Wetterreize reagieren, sollten ihre Schmerzmittel nicht vergessen. Anstrengungen am Mittag und Nachmittag sollten vermieden werden.</p>
          
                                  <h2>Morgen</h2>
                                  <p>Mit der Witterung sind häufig Leistungs- und Konzentrationsdefizite verbunden. Auch das Reaktionsvermögen lässt nach, sodass die Unfallgefahr zunimmt. Wetterfühlige Menschen klagen vor allem über Kopfweh und eine erhöhte Müdigkeit.</p>
          
      
                                  <h2>Biowetter Freiburg</h2>
                           */
      
      
                      // Code für HEUTE extrahieren
                      let wetter_heute;
                      let heute_start = "<h2>Heute</h2>";
                      let heute_ende = "<h2>Morgen</h2>"; // dazwischen ist Text für heute
      
                      let pos_heute_start = body.indexOf(heute_start);
                      let pos_heute_ende = body.indexOf(heute_ende);
                      log("Start: " + pos_heute_start + " Ende: " + pos_heute_ende, "debug");
      
                      if (heute_start != -1 && heute_ende != -1) { // wenn gesuchte Strings überhaupt existieren
      
                          let heute_bereich = body.substring(pos_heute_start + heute_start.length, body.length); // Ab aber ohne ersten Treffer bis Ende
                          heute_bereich = heute_bereich.substring(0, heute_bereich.indexOf(heute_ende)); // Suchwort am Ende abschneiden
                          wetter_heute = strip_tags(heute_bereich).trim(); // fertige Ausgabe
                          if (logging) log("Biowetter in " + stadt_name + " (heute): " + wetter_heute);
      
                          setState(pfad + stadt_name.toLowerCase() + ".heute", wetter_heute);
      
                      } else log("gesuchter Quellcode (www.gesundheit.de) nicht gefunden | Stichwort 'heute'", "error");
      
      
                      // Code für MORGEN extrahieren
                      let wetter_morgen;
                      let morgen_start = "<h2>Morgen</h2>";
                      let morgen_ende = "<h2>Biowetter "; // dazwischen ist Text für morgen
      
                      let pos_morgen_start = body.indexOf(morgen_start);
                      let pos_morgen_ende = body.indexOf(morgen_ende);
                      log("Start: " + pos_morgen_start + " Ende: " + pos_morgen_ende, "debug");
      
                      if (morgen_start != -1 && morgen_ende != -1) { // wenn gesuchte Strings überhaupt existieren
      
                          let morgen_bereich = body.substring(pos_morgen_start + morgen_start.length, body.length); // Ab aber ohne ersten Treffer bis Ende
                          morgen_bereich = morgen_bereich.substring(0, morgen_bereich.indexOf(morgen_ende)); // Suchwort am Ende abschneiden
                          wetter_morgen = strip_tags(morgen_bereich).trim(); // fertige Ausgabe
                          if (logging) log("Biowetter in " + stadt_name + " (morgen): " + wetter_morgen);
      
                          setState(pfad + stadt_name.toLowerCase() + ".morgen", wetter_morgen);
      
                      } else log("gesuchter Quellcode (www.gesundheit.de) nicht gefunden | Stichwort 'morgen'", "error");
      
      
                      // Code für Kombidatenpunkt mit HTML
                      if (!wetter_morgen || !wetter_heute) log("Fehler: keine Biowetterdaten extragiert", "error");
                      else {
      
                          let kombi = "<div class =\"Biowetter\">" +
                              "<h4>Biowetter (gesundheit.de) für " + stadt_name + "</h4>" +
                              "<h2>Heute</h2>" +
                              "<p>" + wetter_heute + "</p>" +
                              "<h2>Morgen</h2>" +
                              "<p>" + wetter_morgen + "</p>";
      
                          setState(pfad + stadt_name.toLowerCase() + "." + biodatenpunkte[2], kombi);
                      }
      
                  } else {
                      log("StatusCode = " + response.statusCode);
                      log(error, "error"); // Error beim Einlesen
                  }
              });
      
          } catch (e) {
              log("Fehler (try) leseWebseite (gesundheit.de): " + e, "error");
          }
          log("Biowetter eingelesen", "info");
      }
      
      function strip_tags(data) {
          var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
          return (rueckgabe);
      }
      
      String.prototype.replaceAll = function(find, replace) {
          var str = this;
          return str.replace(new RegExp(find.replace(/([.*+?^=!:${}()|[]\/\])/g, "\\$1"), "g"), replace);
      };
      
      function main() {
          bioDpAnlegen();
          setTimeout(readBiowetter, 3000);
      }
      
      main();
      schedule("5 0 * * *", main);
      
      

      Es wird der Text für heute und morgen für alle Städte eingelesnen. Man kann einfach aus dem Objekt oben im Skript die unerwünschten Städte löschen, muss aber nicht.

      Die Quellseite sieht so aus:
      Bildschirmfoto 2019-06-10 um 19.14.40.jpg
      Bildschirmfoto 2019-06-10 um 19.14.54.jpg

      Objekte in Admin:
      Bildschirmfoto 2019-06-10 um 19.16.39.jpg

      <div class ="Biowetter"><h4>Biowetter (gesundheit.de) für Berlin</h4><h2>Heute</h2><p>Die aktuelle Wetterlage belastet Herz und Kreislauf. Menschen, die unter diesen Beschwerden leiden, sollten sich schonen und anstrengende Arbeiten vermeiden. Verstärkt treten Schlaf- und Konzentrationsstörungen sowie eine erhöhte Unfallgefahr auf den Straßen auf.</p><h2>Morgen</h2><p>Die derzeitige Wetterlage verursacht ein beeinträchtigtes Wohlbefinden. Herz und Kreislauf werden leicht geschwächt, Blutdruck und Stoffwechsel laufen vermindert ab. Der erholsame Tiefschlaf leidet unter der relativ warmen Luft, man fühlt sich müde, unausgeschlafen und schlecht gelaunt. Vorsicht auf Straßen und Wegen. Aufgrund der verlängerten Reaktionszeit ist die Unfallgefahr etwas erhöht.</p>
      

      Über die Klasse "Biowetter" kann man in VIS die Formatierung zentral steuern (zB in VIS CSS)

      und schließlich für hier dann in meinem VIS so:
      Bildschirmfoto 2019-06-10 um 19.18.45.png

      Freue mich über Feedback 🙂

      Gruß,
      Pix

      PS: Nein, werde keinen Adapter daraus bauen. Adapter, die Webseiten parsen machen sehr viel Arbeit und man kommt mit der Wartung nicht nach. ;D

      posted in Skripten / Logik
      P
      pix
    • RE: [Aufruf] Neuer DWD Pollenflug Adapter

      Hallo,

      ich habe mich mal an die Darstellung der Pollenbelastung gesetzt. Beim Stöbern auf anderen Platform ist mir die Umsetzung von Heiko/pitti auf IP-Symcon aufgefallen. Nach Klärung der Rechte mit ihm (Icons), zeige ich hier die natürlich in VIS komplett neu erstellte Ansicht.

      Bildschirmfoto 2019-04-02 um 10.35.08.jpg

      Es braucht dazu diese Widgets (als txt-Datei angehängt zum Importieren im VIS-Editor

      pollen-widgets_neu.txt

      und die CSS-Anweisungen in VIS. Dazu im VIS Editor unter dem Reiter CSS / Projekt diesen ganzen Code einfügen (ist sehr viel!).

      pollen_css.txt

      Die Icons kommen von
      Icon made by Freepik from Free vector icons - SVG, PSD, PNG, EPS & Icon Font - Thousands of free icons (http://www.flaticon.com)

      Sie sind im CSS Code als SVG hinterlegt (daher der lange Code).

      Ich hoffe, es kann jemand damit arbeiten. Ich bitte um Feedback.

      Gruß
      Pix

      04.04.2019 EDIT: Textdatei pollen-widgets.txt korrigiert
      06.04.2019 EDIT: Aktuellste Versionen ab jetzt auf Github https://github.com/Pix---/vis_widget_dwd_pollenflug

      posted in Tester
      P
      pix
    • RE: [Aufruf] Neuer Adapter ioBroker.pi-hole

      Hier nochmal die Widgets, die ich für die obige View nutze. Die Datenpunkte liegen in javascript.2 und das Bild ist aus der pi-hole-Admin-Seite.

      [{"tpl":"tplHtml","data":{"g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","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,"html":"System | Pi-hole","name":"Überschrift","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},"style":{"left":"89px","top":"21px","z-index":"25","width":"auto","height":"30px","font-size":"25px"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.aktiv","visibility-cond":"==","visibility-val":1,"name":"Pihole aktiv?","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">Ist der pi-hole aktiv?<br></p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"108px","top":"411px","z-index":"21","width":"140px","height":"45px","text-align":"right","background-color":"{a:javascript.2.Pi-hole.aktiv; (a != false) ? \"rgba(150,150,150,0.5)\" : \"rgba(250,20,20,0.5)\"}","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"10"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Ads_blocked","visibility-cond":"==","visibility-val":1,"name":"Anzeige Sonnenuntergang","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">Blockierte Werbung (heute)<br></p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"107px","top":"264px","z-index":"21","width":"140px","height":"45px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"10"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Ads_percentage","visibility-cond":"==","visibility-val":1,"name":"Anzeige Sonnenaufgang","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">Werbeanteil (heute)<br></p>","html_append":" %","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,"visibility-groups-action":"hide","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},"style":{"left":"107px","top":"338px","z-index":"21","width":"140px","height":"45px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"10"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.DNS_queries","visibility-cond":"==","visibility-val":1,"name":"Elevation Anzeige","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">DNS Anfragen (heute)<br></p>","html_append":"","test_html":"","gestures-offsetX":0,"gestures-offsetY":0,"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,"label_true":"<span class=\"metro_beschriftung\">Hauptschalter<br>Beschattung aktiviert<br><br></span><span style=\"font-size: 80%; font-family: RobotoCondensed-Regular;\">Automatische Erkennung, ob Beschattung notwendig ist</span>","visibility-groups-action":"hide","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},"style":{"left":"107px","top":"192px","z-index":"21","width":"140px","color":"rgba(250,250,250,1)","font-size":"25px","height":"45px","text-align":"right","padding":"10px","background":"rgba(150,150,150,0.5)"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Domains_blocked","visibility-cond":"==","visibility-val":1,"name":"pi-hole Domains blocked","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">Blockierte Domains (heute)<br></p>","html_append":"","test_html":"","gestures-offsetX":0,"gestures-offsetY":0,"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,"label_true":"<span class=\"metro_beschriftung\">Hauptschalter<br>Beschattung aktiviert<br><br></span><span style=\"font-size: 80%; font-family: RobotoCondensed-Regular;\">Automatische Erkennung, ob Beschattung notwendig ist</span>","visibility-groups-action":"hide","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},"style":{"left":"107px","top":"120px","z-index":"21","width":"140px","color":"rgba(250,250,250,1)","font-size":"25px","height":"45px","text-align":"right","padding":"10px","background":"rgba(150,150,150,0.5)"},"widgetSet":"basic"},{"tpl":"tplValueListHtml8","data":{"oid":"javascript.2.scriptEnabled.common.VIS.VIS_Pihole_Info","visibility-cond":"==","visibility-val":1,"count":"1","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,"html_prepend":"","value0":"<div style=\"float: left; margin: 0; padding: 12px 0 0 13px;\">Pi-hole-Skript inaktiv</div>","style0":"background-color: rgba(250,0,0,0.3);","style1":"background-color: rgba(120,120,120,0.3);","test_list":"1","html_append":"","value1":"<div style=\"float: left; margin: 0; padding: 12px 0 0 13px;\">Pi-hole Daten</div>","name":"Hintergrund Pi-hole","visibility-groups-action":"hide","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},"style":{"left":"93px","top":"75px","width":"188px","height":"417px","background":"","padding-top":"","z-index":"5","font-size":"18px","color":"rgba(250,250,250,1)","border-radius":"0 20px 0 0px"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Load","visibility-cond":"==","visibility-val":1,"name":"Server Load","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0; padding: 10px 0 0 0;\">CPU Load<br></p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"340px","top":"272px","z-index":"21","width":"160px","height":"65px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"","padding-right":"10px"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Version.Pihole","visibility-cond":"==","visibility-val":1,"name":"Server Version PiHole","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">Pi-hole Version</p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"518px","top":"124px","z-index":"21","width":"140px","height":"45px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"10px"},"widgetSet":"basic"},{"tpl":"tplValueListHtml8","data":{"oid":"javascript.2.scriptEnabled.common.VIS.VIS_Pihole_Info","visibility-cond":"==","visibility-val":1,"count":"1","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,"html_prepend":"","value0":"<div style=\"float: left; margin: 0; padding: 12px 0 0 13px;\">Pi-hole-Skript inaktiv</div>","style0":"background-color: rgba(250,0,0,0.3);","style1":"background-color: rgba(120,120,120,0.3);","test_list":"1","html_append":"","value1":"<div style=\"float: left; margin: 0; padding: 12px 0 0 13px;\">Server Daten [Raspberry Pi 3]</div>","name":"Hintergrund Server","visibility-groups-action":"hide","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},"style":{"left":"293px","top":"75px","width":"556px","height":"418px","background":"","padding-top":"","z-index":"5","font-size":"18px","color":"rgba(250,250,250,1)","border-radius":"0 20px 0 0px"},"widgetSet":"basic"},{"tpl":"tplImage","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":"0","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,"src":"/vis.0/iPad/img/pihole.svg"},"style":{"left":"699px","top":"123px","width":"129px","height":"193px","z-index":"25","opacity":"0.5"},"widgetSet":"basic"},{"tpl":"tplIFrame","data":{"visibility-cond":"==","visibility-val":1,"refreshInterval":"0","src":"http://192.168.178.38:8082/flot/index.html?relativeEnd=now&range=1440&aggregateType=step&aggregateSpan=300&getNull=true&noBorder=noborder&titleColor=rgba(250%2C250%2C250%2C1)&titleSize=16px&legend=nw&hoverDetail=true&timeFormat=%25H%3A%25M%3A%25S+%25d.%25m.%25y&useComma=false&l%5B0%5D%5Bid%5D=javascript.2.Pi-hole.Speicher&l%5B0%5D%5Binstance%5D=influxdb.0&l%5B0%5D%5Boffset%5D=0&l%5B0%5D%5Bcolor%5D=%23fff400&l%5B0%5D%5Bthickness%5D=2&l%5B0%5D%5Bunit%5D=%25&l%5B0%5D%5Bname%5D=Speicherbelegung&l%5B0%5D%5BchartType%5D=line&l%5B0%5D%5Baggregate%5D=minmax&l%5B0%5D%5BignoreNull%5D=false&l%5B0%5D%5Byaxe%5D=rightColor&l%5B0%5D%5Bshadowsize%5D=0&l%5B0%5D%5BafterComma%5D=0&l%5B0%5D%5Bxaxe%5D=bottom&l%5B0%5D%5Bfill%5D=0.1&l%5B1%5D%5Bid%5D=javascript.2.Pi-hole.Temperatur&l%5B1%5D%5Binstance%5D=influxdb.0&l%5B1%5D%5Boffset%5D=0&l%5B1%5D%5Baggregate%5D=minmax&l%5B1%5D%5Bcolor%5D=%23ff0000&l%5B1%5D%5Bthickness%5D=3&l%5B1%5D%5Bshadowsize%5D=3&l%5B1%5D%5Bunit%5D=%C2%B0C&l%5B1%5D%5Bname%5D=Temperature&l%5B1%5D%5Byaxe%5D=rightColor&l%5B1%5D%5BafterComma%5D=0&l%5B1%5D%5Bxaxe%5D=off&x_labels_color=rgba(250%2C250%2C250%2C1)&y_labels_color=rgba(250%2C250%2C250%2C1)&timeType=relative&zoom=true&noedit=true&animation=300&legBg=rgba(0%2C0%2C0%2C0)&window_bg=rgba(0%2C0%2C0%2C0)&border_color=rgba(250%2C250%2C250%2C0.2)","name":"Diagramm","comment":"","class":"","refreshOnWakeUp":"false","refreshOnViewChange":"false","scrollX":"false","scrollY":"false","seamless":"true","gestures-offsetX":0,"gestures-offsetY":0,"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,"visibility-groups-action":"hide","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},"style":{"left":"273px","top":"508px","z-index":"20","width":"715px","height":"236px"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Version.FTL","visibility-cond":"==","visibility-val":1,"name":"Server Version FTL","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">FTL Version</p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"518px","top":"198px","z-index":"21","width":"140px","height":"45px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"10"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Version.Interface","visibility-cond":"==","visibility-val":1,"name":"Server Version WebInterface","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">Web Interface Version</p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"518px","top":"272px","z-index":"21","width":"140px","height":"45px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"10"},"widgetSet":"basic"},{"tpl":"tplJustgageValueIndicatorColored","data":{"visibility-cond":"==","visibility-val":1,"equalAfter":"0","balance1":"0.8","balance2":"1","gestures-offsetX":0,"gestures-offsetY":0,"visibility-oid":"","oid":"javascript.2.Pi-hole.Speicher","unit":" %","digits":"1","color1":"#00a348","color2":"#f59d00","color3":"#ff0000","html_prepend":"<p style=\"font-size: 48%; color: rgba(250,250,250,1); margin: -3px 0 -1px 0; padding: 5px 0 5px 0;\">Speicherbelegung<br></p>","equal":" &asymp;","up":" &uarr;","down":" &darr;","html_append_singular":"","html_append_plural":"","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,"changeBgColor":false,"fullBri":true,"name":"Server Speichernutzung","visibility-groups-action":"hide","is_tdp":"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,"min_oid":0,"max_oid":100},"style":{"left":"340px","top":"124px","z-index":"25","width":"160px","height":"65px","text-align":"right","font-size":"25px","border-width":"0px","border-style":"solid","border-color":"rgba(200,200,200,0.2)","color":"rgba(250,250,250,1)","background":"","background-color":"rgba(150,150,150,0.5)","padding":"","padding-right":"10px","padding-bottom":""},"widgetSet":"justgage"},{"tpl":"tplValueLastchange","data":{"oid":"javascript.2.Pi-hole.Temperatur","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":true,"g_css_shadow_padding":true,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","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,"format_date":"DD.MM.YYYY hh:mm:ss","name":"Server Lastchange","html_prepend":"<span style=\"font-size: 80%; color: rgba(250,250,250,1);\">Lastchange </span>","html_append":"<span style=\"font-size: 80%; margin: 0 8px 0 0\">&nbsp; (parsed)</span>"},"style":{"left":"569px","top":"464px","z-index":"25","width":"267px","height":"17px","font-size":"80%","color":"","background-color":"rgba(150,150,150,0.0)","text-align":"right","padding":"","padding-left":"","padding-top":"1px","padding-right":"","margin-right":""},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.aktiv_parse","visibility-cond":"==","visibility-val":1,"name":"Pi-hole Aktiv (parse)","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0; padding: 10px 0 0 0;\">Pi-hole aktiv (parsed)?</p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"340px","top":"346px","z-index":"21","width":"160px","height":"65px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"","padding-right":"10px"},"widgetSet":"basic"},{"tpl":"tplShapes","data":{"g_fixed":true,"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","svgType":"circle","strokeColor":"#FFFFFF","fill":"{javascript.2.Pi-hole.Farbe.Speicher}","strokeWidth":"5","scaleWidth":"1","scaleHeight":"1","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,"name":"Farbe Speicherbelegung"},"style":{"left":"304px","top":"142px","z-index":"30","width":"20px","height":"20px","opacity":"0.75"},"widgetSet":"basic"},{"tpl":"tplShapes","data":{"g_fixed":true,"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","svgType":"circle","strokeColor":"#FFFFFF","fill":"{javascript.2.Pi-hole.Farbe.Load}","strokeWidth":"5","scaleWidth":"1","scaleHeight":"1","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,"name":"Farbe LOAD"},"style":{"left":"304px","top":"291px","z-index":"30","width":"20px","height":"20px","opacity":"0.75"},"widgetSet":"basic"},{"tpl":"tplShapes","data":{"g_fixed":true,"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","svgType":"circle","strokeColor":"#FFFFFF","fill":"{javascript.2.Pi-hole.Farbe.aktiv_parse}","strokeWidth":"5","scaleWidth":"1","scaleHeight":"1","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,"name":"Farbe Aktivität"},"style":{"left":"305px","top":"364px","z-index":"30","width":"20px","height":"20px","opacity":"0.75"},"widgetSet":"basic"},{"tpl":"tplShapes","data":{"g_fixed":true,"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","svgType":"square","strokeColor":"#FFFFFF","fill":"{javascript.2.Pi-hole.Temperatur_Farbe}","strokeWidth":"5","scaleWidth":"1","scaleHeight":"1","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,"name":"Farbe Temperatur"},"style":{"left":"303px","top":"217px","z-index":"30","width":"20px","height":"20px","opacity":"0.75"},"widgetSet":"basic"},{"tpl":"tplJustgageValueIndicatorColored","data":{"visibility-cond":"==","visibility-val":1,"equalAfter":"0","balance1":"0.8","balance2":"1","gestures-offsetX":0,"gestures-offsetY":0,"visibility-oid":"","oid":"javascript.2.Pi-hole.Temperatur","unit":" °C","digits":"1","color1":"#00a348","color2":"#f59d00","color3":"#ff0000","html_prepend":"<p style=\"; font-size: 48%; color: rgba(250,250,250,1); margin: -3px 0 -1px 0; padding: 5px 0 5px 0;\">Temperatur<br></p>","equal":" &asymp;","up":" &uarr;","down":" &darr;","html_append_singular":"","html_append_plural":"","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,"changeBgColor":false,"fullBri":true,"name":"Server Temperatur","visibility-groups-action":"hide","is_tdp":"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,"comment":""},"style":{"left":"340px","top":"198px","z-index":"25","width":"160px","height":"65px","text-align":"right","font-size":"25px","border-width":"0px","border-style":"solid","border-color":"rgba(200,200,200,0.2)","color":"rgba(250,250,250,1)","background":"","background-color":"rgba(150,150,150,0.5)","padding":"","padding-right":"10px","padding-bottom":""},"widgetSet":"justgage"},{"tpl":"tplMetroTileToggle","data":{"visibility-cond":"==","visibility-val":1,"hover":false,"transform":"true","bg_class_true":"bg-violet","bg_class_false":"bg-transparent","icon_class_true":"icon-flag-2","icon_class_false":"icon-cancel","icon_badge_true":"","icon_badge_false":"","badge_bg_class_true":"","badge_bg_class_false":"","brand_bg_class_true":"","brand_bg_class_false":"","select_on_true":true,"label_true":"<span class=\"metro_beschriftung\">Lüfter Anrichte ist an</span>","label_false":"<span class=\"metro_beschriftung\">Lüfter Anrichte ist aus</span>","toggle_oid":"hm-rpc.0.IEQ0007259.1.STATE","name":"Flur Lüfter Anrichte","icon_true":"","icon_false":"","icon_width":"69","icon_height":"68","oid":"hm-rpc.0.KEQ0193137.1.STATE","icon_top":"21","icon_left":"35","badge_top":"0","badge_left":"0","gestures-offsetX":0,"gestures-offsetY":0,"visibility-groups-action":"hide","signals-cond-0":"!=","signals-val-0":"null","signals-icon-0":"/icons Challenger png/Sonstiges/iPad.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":"74","signals-vert-0":"73","signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":"true","signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":"1","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,"comment":"Unterputzaktor Anrichte","signals-oid-1":"","signals-oid-0":"","signals-text-0":"","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,"class":"farbe"},"style":{"left":"117px","top":"535px","width":"137px","height":"137px","font-family":"","z-index":"15","cursor":"pointer"},"widgetSet":"metro"},{"tpl":"tplValueString","data":{"oid":"javascript.2.Pi-hole.Update","visibility-cond":"==","visibility-val":1,"name":"Pi-hole Update (parse)","html_prepend":"<p style=\"font-size: 48%; margin: 0 0 2px 0\">Pi-hole Update verfügbar?</p>","html_append":"","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,"visibility-groups-action":"hide","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},"style":{"left":"518px","top":"346px","z-index":"21","width":"140px","height":"45px","text-align":"right","background-color":"rgba(150,150,150,0.5)","color":"rgba(250,250,250,1)","font-size":"25px","font-weight":"","padding":"10"},"widgetSet":"basic"},{"tpl":"tplHtml","data":{"g_fixed":true,"g_visibility":true,"g_css_font_text":true,"g_css_background":true,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":"true","visibility-groups-action":"hide","refreshInterval":"0","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,"name":"Pi-Hole Update verfügbar Anzeige","visibility-oid":"javascript.2.Pi-hole.Update","html":"<div style=\"width: 10px; height: 65px; background-color: red; border-radius: 0 20px 20px 0; float: left;\">\n</div>\n\n<div style=\"font-size: 25px; width: auto; height: 65px; float: left; padding: 9px 0 5px 10px;\">\n    <p style=\"margin: 0; padding: 0 0 0 0; font-size: small; \">Update (ssh):</p>\n    pihole -up\n</div>"},"style":{"left":"681px","top":"346px","z-index":"30","background-color":"","width":"161px","height":"65px","font-family":""},"widgetSet":"basic"}]
      

      Gruß
      Pix

      posted in Tester
      P
      pix
    • RE: [Gelöst] Pi-Hole Daten auslesen

      Hallo,

      seit der neuen Version von pi-hole (glaube, v5) passt mein Skript nicht mehr so ganz. Habe einige Anpassungen gemacht. Bitte nicht einfach copy/paste und loslegen, da auch individuelle Anpassungen nötig sind (Pfad, influxDB, IP des pihole)

      Wer das alte Skript noch hat und nicht oder zusätzlich den Pi-Hole-Adapter nutzt, kann hier die Korrekturen für die neuen RegEx-Abfragen finden. Die Muster mussten angepasst werden, da die Weboberfläche der neuesten Pi-Hole Version einen anderen Quellcode hat. Wer keine Infos mehr parsen will, kann hier auch aufhören zu lesen 🙂

      /* Pi-hole
      pi-hole JSON Leser und Statusseiten Parser
      InfluxDB Vorbereitung
      
      23.04.2017 von Pix erstellt
      28.05.2017 let tabelle umgestellt
      31.05.2017 forceCreation und common/influx
      11.02.2018 Parse Temperatur, LOAD, Mem, Aktivitität; jeweils mit Farbe
                Code optimiert
                Ablauf optimiert
      26.02.2018 Update der Serversoftware wird abgefragt
      01.03.2018 Muster zur Temperaturerkennung optimiert
      17.07.2020 Anpassung RegExp, da Pi-Hole Adminkonsole neuen Quelltext hat
                
      todo: Reaktionen mit Optin und telegram bei Serverausfall, Temperatur zu hoch, etc.           
           Farben korrekt einlesen (wenn überhaupt noch nötig)
           Update bereit Mitteilung korrekt auslesen (jetzt über API nicht mehr über Web)
      */
      
      const fC = false; // forceCreation
      const logging = true;
      const pfad = ".Pi-hole.";
      const zeitplan = "*/5 * * * *"; // alle 5 Minuten
      const zeitplan_parse = "*/1 * * * *"; // minütlich
      const ip_pihole = "192.xxx.xxx.xxx"; // <------ IP des PI-Hole
      
      
      // #############################################################################
      // ab hier nix mehr ändern
      
      const url = "http://" + ip_pihole + "/admin/api.php";
      const url_parse = "http://" + ip_pihole + "/admin/index.php";
      
      // Instanz des Javascript-Adapters ermitteln
      let instanz = "javascript." + instance;
      if (logging) log(instanz);
      
      // ID definieren
      const idJSON             = instanz + pfad + "JSON",
           idDomains          = instanz + pfad + "Domains_blocked",
           idDNSQueries       = instanz + pfad + "DNS_queries",
           idAdsBlocked       = instanz + pfad + "Ads_blocked",
           idAdsPercentage    = instanz + pfad + "Ads_percentage",
           idActive           = instanz + pfad + "aktiv",
           idTemp             = instanz + pfad + "Temperatur",
           idTempFarbe        = instanz + pfad + "Farbe.Temperatur",
           idMemory           = instanz + pfad + "Speicher",
           idMemoryFarbe      = instanz + pfad + "Farbe.Speicher",
           idVersionFTL       = instanz + pfad + "Version.FTL",
           idVersionPihole    = instanz + pfad + "Version.Pihole",
           idVersionInterface = instanz + pfad + "Version.Interface",
           idLoad             = instanz + pfad + "Load",
           idLoadFarbe        = instanz + pfad + "Farbe.Load",
           idAktiv            = instanz + pfad + "aktiv_parse",
           idAktivFarbe       = instanz + pfad + "Farbe.aktiv_parse",
           idTabelle          = instanz + pfad + "Tabelle",
           idUpdate           = instanz + pfad + "Update";
      
      // States erstellen
      createState(idJSON, "", fC, {
         name: "JSON Datei vom Pi-hole Server",
         desc: "Kopie der JSON Datei",
         type: "string",
         read: true,
         write: true,
         role: "json",
         custom: {
             "influxdb.0": {
                 "enabled": false,
                 "changesOnly": false,
                 "debounce": "",
                 "retention": 657000 // 1 Monat
             }
         }
      });
      createState(idDomains, 0, fC, {
         name: "Pi-hole Domains blocked today", 
         desc: "Heute blockierte Domains (API)",
         type: "number", 
         def:  0,
         read: true,
         write: true,
         role: "value",
         custom: {
             "influxdb.0": {
                 "enabled": true,
                 "changesOnly": true,
                 "debounce": "",
                 "retention": 657000 // 1 Monat
             }
         }
      });
      createState(idDNSQueries, 0, fC, {
         name: "Pi-hole DNS Queries today", 
         desc: "Heutige DOmain Name Server Anfragen (API)",
         type: "number", 
         def:  0,
         read: true,
         write: true,
         role: "value",
         custom: {
             "influxdb.0": {
                 "enabled": true,
                 "changesOnly": true,
                 "debounce": "",
                 "retention": 657000 // 1 Monat
             }
         }
      });
      createState(idAdsBlocked, 0, fC, {
         name: "Pi-hole Ads blocked today", 
         desc: "Heute blockierte Werbungen (API)",
         type: "number", 
         def:  0,
         read: true,
         write: true,
         role: "value",
         custom: {
             "influxdb.0": {
                 "enabled": true,
                 "changesOnly": true,
                 "debounce": "",
                 "retention": 657000 // 1 Monat
             }
         }
      });
      createState(idAdsPercentage, 0, fC, {
         name: "Pi-hole Ads percentage today", 
         desc: "Anteil heute blockierter Werbungen an allen Werbungen (API)", // weiß nicht, ob das korrekt übersetzt ist
         type: "number", 
         def:  0,
         read: true,
         write: true,
         min: 0,
         max: 100,
         role: "value",
         custom: {
             "influxdb.0": {
                 "enabled": true,
                 "changesOnly": true,
                 "debounce": "",
                 "retention": 63072000 // 2 Jahre
             }
         }
      });
      createState(idActive, false, fC, {
         name: "Ist der Pi-hole Server aktiv?", 
         desc: "Liefert das Webinterface pi.hole/admin/api.php Daten? (API)",
         type: "boolean", 
         read: true,
         write: true,
         role: "indicator",
         custom: {
             "influxdb.0": {
                 "enabled": false,
                 "changesOnly": false,
                 "debounce": "",
                 "retention": 657000 // 1 Monat
             }
         }
      });
      createState(idAktiv, false, fC, {
         name: "Ist der Pi-hole Server aktiv?", 
         desc: "Läuft der Server (Webseite)",
         type: "boolean", 
         read: true,
         write: true,
         role: "indicator",
         custom: {
             "influxdb.0": {
                 "enabled": false,
                 "changesOnly": false,
                 "debounce": "",
                 "retention": 657000 // 1 Monat
             }
         }
      });
      createState(idAktivFarbe, "#FFFFFFF", fC, {
         name: "Pi-hole Aktivität HEX-Farbwert", 
         desc: "Indikator Farbwert Aktivität des Pi-Hole Servers (Webseite)",
         type: "string",
         def:  "#FFFFFF",
         read: true,
         write: true,
         role: "text"
      });
      createState(idLoad, "0", fC, {
         name: "Pi-hole CPU Load", 
         desc: "CPU Belastung (Load) des Pi-Hole Servers (Webseite)",
         type: "string",
         def:  "0",
         read: true,
         write: true,
         role: "text"
      });
      createState(idLoadFarbe, "#FFFFFFF", fC, {
         name: "Pi-hole Load HEX-Farbwert", 
         desc: "Indikator Farbwert LOAD des Pi-Hole Servers (Webseite)",
         type: "string",
         def:  "#FFFFFF",
         read: true,
         write: true,
         role: "text"
      });
      createState(idTemp, 0, fC, {
         name: "Pi-hole Temperatur", 
         desc: "Wärmeentwicklung des Pi-Hole Servers (Webseite)",
         type: "number",
         unit: "°C",
         def:  0,
         read: true,
         write: true,
         role: "value.temperature",
         custom: {
             "influxdb.0": {
                 "enabled": true,
                 "changesOnly": true,
                 "debounce": "",
                 "retention": 63072000 // 2 Jahre
             }
         }
      });
      createState(idTempFarbe, "#FFFFFFF", fC, {
         name: "Pi-hole Temperatur HEX-Farbwert", 
         desc: "Indikator Farbwert des Pi-Hole Servers (Webseite)",
         type: "string",
         def:  "#FFFFFF",
         read: true,
         write: true,
         role: "text"
      });
      createState(idVersionPihole, "", fC, {
         name: "Pi-hole Version", 
         desc: "Software Version Pi-hole (Webseite)",
         type: "string",
         def:  "",
         read: true,
         write: true,
         role: "text"
      });
      createState(idVersionFTL, "", fC, {
         name: "FTL Version", 
         desc: "Software Version FTL (Webseite)",
         type: "string",
         def:  "",
         read: true,
         write: true,
         role: "text"
      });
      createState(idVersionInterface, "", fC, {
         name: "Web Interface Version", 
         desc: "Software Version Web Interface (Webseite)",
         type: "string",
         def:  "",
         read: true,
         write: true,
         role: "text"
      });
      createState(idMemory, 0, fC, {
         name: "Pi-hole Speichernutzung", 
         desc: "von Pi-Hole belegter Hauptspeicher (Webseite)",
         type: "number",
         unit: "%",
         def:  0,
         read: true,
         write: true,
         min: 0,
         max: 100,
         role: "value",
         custom: {
             "influxdb.0": {
                 "enabled": true,
                 "changesOnly": true,
                 "debounce": "",
                 "retention": 63072000 // 2 Jahre
             }
         }
      });
      createState(idMemoryFarbe, "#FFFFFFF", fC, {
         name: "Pi-hole Speichernutzung HEX-Farbwert", 
         desc: "Indikator Farbwert Speichernutzung des Pi-Hole Servers (Webseite)",
         type: "string",
         def:  "#FFFFFF",
         read: true,
         write: true,
         role: "text"
      });
      createState(idTabelle, "", true, {
         name: "Pi-hole HTML Tabelle",
         desc: "HMTL Tabelle mit den Daten der JSON-Datei",
         type: "string",
         read: true,
         write: true,
         role: "html",
         custom: {
             "influxdb.0": {
                 "enabled": false,
                 "changesOnly": false,
                 "debounce": "",
                 "retention": 63072000 // 2 Jahre
             }
         }
      });
      createState(idUpdate, false, fC, {
         name: "Ist ein Pi-hole Softwareupdate möglich?", 
         desc: "Gibt es eine neue Version der Serversoftware? (Webseite)",
         type: "boolean", 
         read: true,
         write: true,
         role: "indicator"
      });
      
      
      // let request = require("request");
      
      function parseWebsite() { // für Version 3.3 seit 17.7.2020 für 5.1
         let options = {
             url: url_parse,
             headers: {
                 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
             }
         }; 
         try {
             request(options, function (error, response, body) {
                 if (!error && response.statusCode == 200) {              // kein Fehler, Inhalt in body
                     // Temperatur Zahl
                     // const temp_pattern = /\d{1,2}\.?\d*(?=&nbsp;&deg;C)/; // vor v5 
                     const temp_pattern = /\d{1,2}\.?\d*(?=<\/span><span id="tempdisplay")/; // ab v5
                     if (body.match(temp_pattern) === null) log("gesuchter Quellcode (Temperatur Pi-Hole) nicht gefunden", "error");
                     else {
                         let temp_arr =  body.match(temp_pattern);
                         let temp = parseFloat(temp_arr[0]);
                         temp = parseFloat( temp.toFixed(1) );
                         if (logging) log("Temperatur: " + temp + "°C");
                         setState(idTemp, temp);        
                     }
                     // Temperatur Farbe String
                     // const tempfarbe_pattern = /.{7}(?="><\/i> Temp)/; // vor v5
                     const tempfarbe_pattern = /.{7}(?="><\/i> Temp)/; // ab v5
                     if (body.match(tempfarbe_pattern) === null) log("gesuchter Quellcode (Temperatur Farbe Pi-Hole) nicht gefunden", "error");
                     else {
                         let tempfarbe_arr =  body.match(tempfarbe_pattern);
                         if (logging) log("Temperatur-Farbe (HEX-Wert): " + tempfarbe_arr[0]);
                         setState(idTempFarbe, tempfarbe_arr[0]);        
                     }
                     // Speicherbelegung Zahl
                     // const mem_pattern = /\d{1,2}\.\d{1}(?=&thinsp;%<\/a>)/; // vor v5
                     const mem_pattern = /\d{1,2}\.?\d*(?=&thinsp;%)/; // ab v5
                     if (body.match(mem_pattern) === null) log("gesuchter Quellcode (Speicherbelegung Pi-Hole) nicht gefunden", "error");
                     else {
                         let mem_arr =  body.match(mem_pattern);
                         let mem = parseFloat(mem_arr[0]);
                         if (logging) log("Speicherbelegung: " + mem + "%");
                         setState(idMemory, mem);        
                     }
                     // Farbe Speicherbelegung String / HEX-Wert
                     //const memfarbe_pattern = /.{7}(?="><\/i> Memory)/; // vor v5
                     const memfarbe_pattern = /(?<=text-).*(?="\>\<\/i\>.*Memory usage:&nbsp)/; // ab v5
                     if (body.match(memfarbe_pattern) === null) log("gesuchter Quellcode (Farbe Speicherbelegung Pi-Hole) nicht gefunden", "error");
                     else {
                         let memfarbe_arr =  body.match(memfarbe_pattern);
                         if (logging) log("Speicherbelegung Farbe: " + memfarbe_arr[0]);
                         setState(idMemoryFarbe, memfarbe_arr[0]);        
                     }
                     // LOAD String zB 0 0 0 oder 10.4 1.45 0
                     const load_pattern = /Load:&nbsp;&nbsp;(\d*|\d*\.\d*)&nbsp;&nbsp;(\d*|\d*\.\d*)&nbsp;&nbsp;(\d*|\d*\.\d*)/;
                     if (body.match(load_pattern) === null) log("gesuchter Quellcode (LOAD Pi-Hole) nicht gefunden", "error");
                     else {
                         let load_arr =  body.match(load_pattern);
                         let load0 = load_arr[0].replace(/Load:/i,"");
                         let load = load0.replace(/&nbsp;/g,"  ");
                         if (logging) log("CPU LOAD Server: " + load);
                         setState(idLoad, load);        
                     }
                     // Farbe LOAD String / HEX-Wert
                     // const loadfarbe_pattern = /.{7}(?="><\/i>.*Load:)/; // vor v5
                     const loadfarbe_pattern = /(?<=text-).*(?="\>\<\/i\>.*Load:&nbsp)/; // ab v5
                     if (body.match(loadfarbe_pattern) === null) log("gesuchter Quellcode (Farbe LOAD Pi-Hole) nicht gefunden", "error");
                     else {
                         let loadfarbe_arr =  body.match(loadfarbe_pattern);
                         if (logging) log("LOAD Farbe: " + loadfarbe_arr[0]);
                         setState(idLoadFarbe, loadfarbe_arr[0]);        
                     }
                     // Version Pihole zB 3.2.1 String
                     //const versionpi_pattern = /<b>Pi-hole Version \s*<\/b>\s*v\d*(\.\d*)*\.\d*/; // x.x.x oder x.x // vor v5
                     const versionpi_pattern = /(?<=pi-hole\/releases\/)v*v\d*(\.\d*)*\.\d*/; // x.x.x oder x.x // ab v5
                     if (body.match(versionpi_pattern) === null) log("gesuchter Quellcode (Pi-Hole Version) nicht gefunden", "error");
                     else {
                         let versionpi_arr =  body.match(versionpi_pattern);
                         let versionpi = versionpi_arr[0].replace(/<b>Pi-hole Version <\/b> v/,"");
                         if (logging) log("Version Pihole Server: " + versionpi);
                         setState(idVersionPihole, versionpi);        
                     }
                     // Version FTL zB 3.2.1 String
                     // const versionftl_pattern = /<b>FTL Version.*v\d*(\.\d*)*\.\d*/; // vor v5
                     const versionftl_pattern = /(?<=FTL\/releases\/)v*v\d*(\.\d*)*\.\d*/; // ab v5
                     if (body.match(versionftl_pattern) === null) log("gesuchter Quellcode (FTL Version) nicht gefunden", "error");
                     else {
                         let versionftl_arr =  body.match(versionftl_pattern);
                         let versionftl = versionftl_arr[0].replace(/<b>FTL Version.*v/,"");
                         if (logging) log("FTL Version Pihole Server: " + versionftl);
                         setState(idVersionFTL, versionftl);        
                     }
                     // Version Web Interface zB 3.2.1 String
                     //const versioninterface_pattern = /<b>Web Interface Version.*<\/b>v\d*(\.\d*)*\.\d*/; // vor v5
                     const versioninterface_pattern = /(?<=AdminLTE\/releases\/)v*v\d*(\.\d*)*\.\d*/; // ab v5
                     if (body.match(versioninterface_pattern) === null) log("gesuchter Quellcode (Web Interface Version) nicht gefunden", "error");
                     else {
                         let versioninterface_arr =  body.match(versioninterface_pattern);
                         let versioninterface = versioninterface_arr[0].replace(/<b>Web Interface Version.*<\/b>v/,"");
                         if (logging) log("Web Interface Version Pihole Server: " + versioninterface);
                         setState(idVersionInterface, versioninterface);        
                     }
                     // Aktiv zB true/false boolean holt das aus String
                     //const aktiv_pattern = /i>.*(?=<\/a><a id="temperature">)/; // vor v5
                     const aktiv_pattern = /(?<=\/i> ).*(?=\<\/span><span id="temperature">)/; // ab v5
                     if (body.match(aktiv_pattern) === null) log("gesuchter Quellcode (Pi-hole aktiv) nicht gefunden", "error");
                     else {
                         let aktiv_arr =  body.match(aktiv_pattern);
                         let aktiv = aktiv_arr[0].replace(/i>\s*/,"");
                         let aktiv_bool = (aktiv === "Active") ? true : false;
                         if (logging) log("Pihole Server aktiv? " + aktiv + "(" + aktiv_bool + ")");
                         setState(idAktiv, aktiv_bool);     
                     }
                     // Farbe Aktiv String / HEX-Wert
                     // const aktivfarbe_pattern = /.{7}(?="><\/i.*<\/a><a id="temperature">)/; // vor v5
                     const aktivfarbe_pattern = /(?<=text-).*(?="\>\<\/i> .*\<\/span><span id="temperature">)/; // ab v5
                     
                     if (body.match(aktivfarbe_pattern) === null) log("gesuchter Quellcode (Farbe Aktivität Pi-Hole) nicht gefunden", "error");
                     else {
                         let aktivfarbe_arr =  body.match(aktivfarbe_pattern);
                         if (logging) log("Aktivität Farbe: " + aktivfarbe_arr[0]);
                         setState(idAktivFarbe, aktivfarbe_arr[0]);        
                     }
                     // Update available // to be updated v5
                     const update_pattern = /Update available!/;
                     if (body.match(update_pattern) === null) setState(idUpdate, false); //log("gesuchter Quellcode (Update Warnung) nicht gefunden", "error");
                     else {
                         let update_arr =  body.match(update_pattern);
                         let update = update_arr[0];
                         let update_bool = update === ("Update available!") ? true : false;
                         if (logging) log("Pihole Softwareupdate möglich? (" + update_bool + ")");
                         setState(idUpdate, update_bool);          
                     }
                 } else {
                     log("StatusCode = " + response.statusCode);
                     log(error, "error");                               // Error beim Einlesen
                 }
             });
         } catch (e) {
             log("Fehler (try) leseWebseite (Pi-Hole Index.html): " + e, "error");
         }
         if (logging) log("Pi-Hole Webseite eingelesen, Temperatur und Speicherbelegung gespeichert");
      }
      
      
      function readPihole() {
         if (logging) log("Pi-hole: URL " + url + " wird abgefragt ...");
         let tabelle ="<table class=\"pihole_tabelle\"><caption>Pi-hole</caption><thead><tr><th>Admin Service: " + url + "</th></tr></thead><tbody>";
         request(url, function (error, response, body) {
             if (!error && response.statusCode == 200) {
                 let result;
                 let dnsblocked,
                     dnsqueries,
                     adsblocked,
                     adspercentage; 
                 try{
                     result = JSON.parse(body);
                     let data = JSON.stringify(result, null, 2);
                     if (logging) log(data);
                     if (logging) log(body);
                     setState(idJSON, data);
                     if (logging) log("JSON: "+ getState(idJSON).val);
                     
                     if (result) { // CHECK
                     
                         setState(idActive, true);
                         if (logging) log("Pi-hole liefert Daten und ist aktiv");
                         // http://forum.iobroker.net/viewtopic.php?f=24&t=6053&sid=65e9ec9396fe557147e535c5a4631982#p68823
                         dnsblocked = (result.domains_being_blocked)/*.replace(/,/, "")*/;
                         dnsqueries = (result.dns_queries_today)/*.replace(/,/, "")*/;
                         adsblocked = result.ads_blocked_today;
                         adspercentage = result.ads_percentage_today;
                         
                         if ( isNaN(parseFloat(adspercentage)) === false ) {
                             setState(idAdsPercentage, parseFloat(adspercentage));
                         } else setState(idAdsPercentage, 100);
                         setState(idDomains, parseFloat(dnsblocked));
                         setState(idDNSQueries, parseFloat(dnsqueries));
                         setState(idAdsBlocked, parseFloat(adsblocked));
                     
                         // Eintrag anfügen
                         tabelle += "<tr><td class=\"pihole_label\">Anzahl blockierter Domains:</td>"
                                 +  "<td class=\"pihole_data\">" + dnsblocked + "</td></tr>"
                                 
                                 +  "<tr><td class=\"pihole_label\">DNS-Abfragen (heute):</td>"
                                 +  "<td class=\"pihole_data\">" + dnsqueries + "</td></tr>"
                             
                                 +  "<tr><td class=\"pihole_label\">Blockierte Werbung (heute):</td>"
                                 +  "<td class=\"pihole_data\">" + adsblocked + "</td></tr>"
                             
                                 +  "<tr><td class=\"pihole_label\">Werbeanteil (heute in Prozent):</td>"
                                 +  "<td class=\"pihole_data\">" + adspercentage + "</td></tr>";
                     } else tabelle += "<tr><td class=\"pihole_data\">Pi-hole nicht gefunden!</td></tr>";
                     // Ende Teil,d er aus dem Try raus kann
                 } catch (fehler_try) {
                     log("Pi-hole - Parse Fehler: " + fehler_try, "error");
                 }    
             } else {
                 log("Pi-hole - Fehler: " + error, "warn");
             }
             tabelle += "</tbody></table>";  
             setState(idTabelle, tabelle);                     
             if (logging) log("HTML-Tabelle: " + tabelle);
         });   // Ende request 
      }
      
      function main() {
         readPihole();
         setTimeout(parseWebsite, 3000); // verzögertes Parsen
      }
      schedule(zeitplan_parse, parseWebsite);
      schedule(zeitplan, readPihole);
      setTimeout(main, 500);
      

      Vielleicht hilft es jemandem.

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    • RE: [Aufruf] Neuer DWD Pollenflug Adapter

      Ich habe die ganzen WIdgets nochmal etwas überarbeitet. Dabei habe ich darauf geachtet, die ! Ausrufezeichen im CSS-Reiter zu minimieren. Ausserden lassen sich nun die Farben alle per CCS zentral ändern. Fallbacks auf Standardfarben sollten da sein.

      Vielleicht schaffe ich es morgen im Zug nach KS, die Änderungen zu posten.Bildschirmfoto 2019-04-05 um 18.25.05.jpg

      Gruß
      Pix

      posted in Tester
      P
      pix
    • RE: Text in Widgets vertikal zentrieren

      Hallo,

      es geht so:

      Diesen Code ins den CSS-Tab kopieren:

      .vertikalzentrieren div {
          display: flex;
          align-items: center; /* vertikal*/
          justify-content: center; /* horizontal */
      }
      

      Das Widget ist ein HTML Text Widget. In HTML voranstellen kommt ein HTML Befehl zum erzeugen eines DIV-Containers, der 100% in Höhe und Breite das Widget ausfüllt. Innerhalb dieses Containers wird der Text dann zentriert.

      Widget:

      [{"tpl":"tplValueString","data":{"oid":"nothing_selected","g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":true,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","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,"class":"vertikalzentrieren","name":"Test","test_html":"Hallo","html_prepend":"","html_append":""},"style":{"left":"102px","top":"598px","z-index":"20","background":"green","width":"283px","height":"119px","color":"white"},"widgetSet":"basic"}]
      

      261_bildschirmfoto_2016-12-31_um_19.44.15.jpg
      261_bildschirmfoto_2016-12-31_um_19.41.20.jpg

      posted in Visualisierung
      P
      pix
    • [Anleitung] iCal Adapter mit iCloud Kalender

      Hallo,

      seit einigen Tagen/Wochen hat mein iCal Adapter meine zwei iCloud Kalender nicht mehr eingelesen.

      Das Log gab den Fehler

      [33mwarn: ical.1 Error reading "http://p03-calendarws.icloud.com/ca/subscribe/1/l-xxxxxxxxxxxxxxxxxxxx": Cannot read URL: "http://p03-calendarws.icloud.com/ca/subscribe/1/l-xxxxxxxxxxxxxxxxxxxx"
      

      aus. Ich habe in der OS X App immer wieder auf den Freigabe Link geklickt, um sicherzustellen, dass der Link korrekt ist -> kein Erfolg.

      Ich habe daher den Weg über die Browserapp des Kalenders genommen und den Kalender in www.icloud.com geöffnet. Dort wird der Link als ganzes angezeigt und lässt sich besser kopieren.
      Ich habe die Freigabe kurz gestoppt (Haken entfernt) und neu gesetzt. Dadurch wurde ein neuer Link erzeugt und dieser funktioniert nun nach dem Ersetzen von "webcal" durch "http" ohne Probleme.

      Kalender.png

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    • RE: [Aufruf] Neuer Adapter ioBroker.pi-hole

      Hallo,

      habe heute den Adapter installiert und bin sehr zufrieden. Tolle Arbeit.
      Bis nutze ich eine Skript:

      /* Pi-hole
      pi-hole JSON Leser und Statusseiten Parser
      InfluxDB Vorbereitung
      
      23.04.2017 von Pix erstellt
      28.05.2017 var tabelle umgestellt
      31.05.2017 forceCreation und common/influx
      11.02.2018 Parse Temperatur, LOAD, Mem, Aktivitität; jeweils mit Farbe
                 Code optimiert
                 Ablauf optimiert
      26.02.2018 Update der Serversoftware wird abgefragt
      01.03.2018 Muster zur Temperaturerkennung optimiert
                 
      todo: Reaktionen mit Optin und telegram bei Serverausfall, Temperatur zu hoch, etc.           
                 
      */
      
      const fC = false; // forceCreation
      const logging = false;
      const pfad = ".Pi-hole.";
      const zeitplan = "*/5 * * * *"; // alle 5 Minuten
      const zeitplan_parse = "*/1 * * * *"; // minütlich
      const ip_pihole = "192.168.XXX.XXX"; // IP eintragen
      
      
      // #############################################################################
      // ab hier nix mehr ändern
      
      const url = "http://" + ip_pihole + "/admin/api.php";
      const url_parse = "http://" + ip_pihole + "/admin/index.php";
      
      // Instanz des Javascript-Adapters ermitteln
      var instanz = "javascript." + instance;
      if (logging) log(instanz);
      
      // ID definieren
      const idJSON             = instanz + pfad + "JSON",
            idDomains          = instanz + pfad + "Domains_blocked",
            idDNSQueries       = instanz + pfad + "DNS_queries",
            idAdsBlocked       = instanz + pfad + "Ads_blocked",
            idAdsPercentage    = instanz + pfad + "Ads_percentage",
            idActive           = instanz + pfad + "aktiv",
            idTemp             = instanz + pfad + "Temperatur",
            idTempFarbe        = instanz + pfad + "Farbe.Temperatur",
            idMemory           = instanz + pfad + "Speicher",
            idMemoryFarbe      = instanz + pfad + "Farbe.Speicher",
            idVersionFTL       = instanz + pfad + "Version.FTL",
            idVersionPihole    = instanz + pfad + "Version.Pihole",
            idVersionInterface = instanz + pfad + "Version.Interface",
            idLoad             = instanz + pfad + "Load",
            idLoadFarbe        = instanz + pfad + "Farbe.Load",
            idAktiv            = instanz + pfad + "aktiv_parse",
            idAktivFarbe       = instanz + pfad + "Farbe.aktiv_parse",
            idTabelle          = instanz + pfad + "Tabelle",
            idUpdate           = instanz + pfad + "Update";
      
      // States erstellen
      createState(idJSON, "", fC, {
          name: "JSON Datei vom Pi-hole Server",
          desc: "Kopie der JSON Datei",
          type: "string",
          read: true,
          write: true,
          role: "json",
          custom: {
              "influxdb.0": {
                  "enabled": false,
                  "changesOnly": false,
                  "debounce": "",
                  "retention": 657000 // 1 Monat
              }
          }
      });
      createState(idDomains, 0, fC, {
          name: "Pi-hole Domains blocked today", 
          desc: "Heute blockierte Domains (API)",
          type: "number", 
          def:  0,
          read: true,
          write: true,
          role: "value",
          custom: {
              "influxdb.0": {
                  "enabled": true,
                  "changesOnly": true,
                  "debounce": "",
                  "retention": 657000 // 1 Monat
              }
          }
      });
      createState(idDNSQueries, 0, fC, {
          name: "Pi-hole DNS Queries today", 
          desc: "Heutige DOmain Name Server Anfragen (API)",
          type: "number", 
          def:  0,
          read: true,
          write: true,
          role: "value",
          custom: {
              "influxdb.0": {
                  "enabled": true,
                  "changesOnly": true,
                  "debounce": "",
                  "retention": 657000 // 1 Monat
              }
          }
      });
      createState(idAdsBlocked, 0, fC, {
          name: "Pi-hole Ads blocked today", 
          desc: "Heute blockierte Werbungen (API)",
          type: "number", 
          def:  0,
          read: true,
          write: true,
          role: "value",
          custom: {
              "influxdb.0": {
                  "enabled": true,
                  "changesOnly": true,
                  "debounce": "",
                  "retention": 657000 // 1 Monat
              }
          }
      });
      createState(idAdsPercentage, 0, fC, {
          name: "Pi-hole Ads percentage today", 
          desc: "Anteil heute blockierter Werbungen an allen Werbungen (API)", // weiß nicht, ob das korrekt übersetzt ist
          type: "number", 
          def:  0,
          read: true,
          write: true,
          min: 0,
          max: 100,
          role: "value",
          custom: {
              "influxdb.0": {
                  "enabled": true,
                  "changesOnly": true,
                  "debounce": "",
                  "retention": 63072000 // 2 Jahre
              }
          }
      });
      createState(idActive, false, fC, {
          name: "Ist der Pi-hole Server aktiv?", 
          desc: "Liefert das Webinterface pi.hole/admin/api.php Daten? (API)",
          type: "boolean", 
          read: true,
          write: true,
          role: "indicator",
          custom: {
              "influxdb.0": {
                  "enabled": false,
                  "changesOnly": false,
                  "debounce": "",
                  "retention": 657000 // 1 Monat
              }
          }
      });
      createState(idAktiv, false, fC, {
          name: "Ist der Pi-hole Server aktiv?", 
          desc: "Läuft der Server (Webseite)",
          type: "boolean", 
          read: true,
          write: true,
          role: "indicator",
          custom: {
              "influxdb.0": {
                  "enabled": false,
                  "changesOnly": false,
                  "debounce": "",
                  "retention": 657000 // 1 Monat
              }
          }
      });
      createState(idAktivFarbe, "#FFFFFFF", fC, {
          name: "Pi-hole Aktivität HEX-Farbwert", 
          desc: "Indikator Farbwert Aktivität des Pi-Hole Servers (Webseite)",
          type: "string",
          def:  "#FFFFFF",
          read: true,
          write: true,
          role: "text"
      });
      createState(idLoad, "0", fC, {
          name: "Pi-hole CPU Load", 
          desc: "CPU Belastung (Load) des Pi-Hole Servers (Webseite)",
          type: "string",
          def:  "0",
          read: true,
          write: true,
          role: "text"
      });
      createState(idLoadFarbe, "#FFFFFFF", fC, {
          name: "Pi-hole Load HEX-Farbwert", 
          desc: "Indikator Farbwert LOAD des Pi-Hole Servers (Webseite)",
          type: "string",
          def:  "#FFFFFF",
          read: true,
          write: true,
          role: "text"
      });
      createState(idTemp, 0, fC, {
          name: "Pi-hole Temperatur", 
          desc: "Wärmeentwicklung des Pi-Hole Servers (Webseite)",
          type: "number",
          unit: "°C",
          def:  0,
          read: true,
          write: true,
          role: "value.temperature",
          custom: {
              "influxdb.0": {
                  "enabled": true,
                  "changesOnly": true,
                  "debounce": "",
                  "retention": 63072000 // 2 Jahre
              }
          }
      });
      createState(idTempFarbe, "#FFFFFFF", fC, {
          name: "Pi-hole Temperatur HEX-Farbwert", 
          desc: "Indikator Farbwert des Pi-Hole Servers (Webseite)",
          type: "string",
          def:  "#FFFFFF",
          read: true,
          write: true,
          role: "text"
      });
      createState(idVersionPihole, "", fC, {
          name: "Pi-hole Version", 
          desc: "Software Version Pi-hole (Webseite)",
          type: "string",
          def:  "",
          read: true,
          write: true,
          role: "text"
      });
      createState(idVersionFTL, "", fC, {
          name: "FTL Version", 
          desc: "Software Version FTL (Webseite)",
          type: "string",
          def:  "",
          read: true,
          write: true,
          role: "text"
      });
      createState(idVersionInterface, "", fC, {
          name: "Web Interface Version", 
          desc: "Software Version Web Interface (Webseite)",
          type: "string",
          def:  "",
          read: true,
          write: true,
          role: "text"
      });
      createState(idMemory, 0, fC, {
          name: "Pi-hole Speichernutzung", 
          desc: "von Pi-Hole belegter Hauptspeicher (Webseite)",
          type: "number",
          unit: "%",
          def:  0,
          read: true,
          write: true,
          min: 0,
          max: 100,
          role: "value",
          custom: {
              "influxdb.0": {
                  "enabled": true,
                  "changesOnly": true,
                  "debounce": "",
                  "retention": 63072000 // 2 Jahre
              }
          }
      });
      createState(idMemoryFarbe, "#FFFFFFF", fC, {
          name: "Pi-hole Speichernutzung HEX-Farbwert", 
          desc: "Indikator Farbwert Speichernutzung des Pi-Hole Servers (Webseite)",
          type: "string",
          def:  "#FFFFFF",
          read: true,
          write: true,
          role: "text"
      });
      createState(idTabelle, "", true, {
          name: "Pi-hole HTML Tabelle",
          desc: "HMTL Tabelle mit den Daten der JSON-Datei",
          type: "string",
          read: true,
          write: true,
          role: "html",
          custom: {
              "influxdb.0": {
                  "enabled": false,
                  "changesOnly": false,
                  "debounce": "",
                  "retention": 63072000 // 2 Jahre
              }
          }
      });
      createState(idUpdate, false, fC, {
          name: "Ist ein Pi-hole Softwareupdate möglich?", 
          desc: "Gibt es eine neue Version der Serversoftware? (Webseite)",
          type: "boolean", 
          read: true,
          write: true,
          role: "indicator"
      });
       
      
      var request = require("request");
      
      function parseWebsite() { // für Version 3.3
          var options = {
              url: url_parse,
              headers: {
                  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'
              }
          }; 
          try {
              request(options, function (error, response, body) {
                  if (!error && response.statusCode == 200) {              // kein Fehler, Inhalt in body
                      // Temperatur Zahl
                      const temp_pattern = /\d{1,2}\.?\d*(?=&nbsp;&deg;C)/;
                      if (body.match(temp_pattern) === null) log('gesuchter Quellcode (Temperatur Pi-Hole) nicht gefunden', 'error');
                      else {
                          var temp_arr =  body.match(temp_pattern);
                          var temp = parseFloat(temp_arr[0]);
                          if (logging) log("Temperatur: " + temp + "°C");
                          setState(idTemp, temp);        
                      }
                      // Temperatur Farbe String
                      const tempfarbe_pattern = /.{7}(?="><\/i> Temp)/;
                      if (body.match(tempfarbe_pattern) === null) log('gesuchter Quellcode (Temperatur Farbe Pi-Hole) nicht gefunden', 'error');
                      else {
                          var tempfarbe_arr =  body.match(tempfarbe_pattern);
                          if (logging) log("Temperatur-Farbe (HEX-Wert): " + tempfarbe_arr[0]);
                          setState(idTempFarbe, tempfarbe_arr[0]);        
                      }
                      // Speicherbelegung Zahl
                      const mem_pattern = /\d{1,2}\.\d{1}(?=&thinsp;%<\/a>)/;
                      if (body.match(mem_pattern) === null) log('gesuchter Quellcode (Speicherbelegung Pi-Hole) nicht gefunden', 'error');
                      else {
                          var mem_arr =  body.match(mem_pattern);
                          var mem = parseFloat(mem_arr[0]);
                          if (logging) log("Speicherbelegung: " + mem + "%");
                          setState(idMemory, mem);        
                      }
                      // Farbe Speicherbelegung String / HEX-Wert
                      const memfarbe_pattern = /.{7}(?="><\/i> Memory)/;
                      if (body.match(memfarbe_pattern) === null) log('gesuchter Quellcode (Farbe Speicherbelegung Pi-Hole) nicht gefunden', 'error');
                      else {
                          var memfarbe_arr =  body.match(memfarbe_pattern);
                          if (logging) log("Speicherbelegung Farbe: " + memfarbe_arr[0]);
                          setState(idMemoryFarbe, memfarbe_arr[0]);        
                      }
                      // LOAD String zB 0 0 0 oder 10.4 1.45 0
                      const load_pattern = /Load:&nbsp;&nbsp;(\d*|\d*\.\d*)&nbsp;&nbsp;(\d*|\d*\.\d*)&nbsp;&nbsp;(\d*|\d*\.\d*)/;
                      if (body.match(load_pattern) === null) log('gesuchter Quellcode (LOAD Pi-Hole) nicht gefunden', 'error');
                      else {
                          var load_arr =  body.match(load_pattern);
                          var load0 = load_arr[0].replace(/Load:/i,"");
                          var load = load0.replace(/&nbsp;/g,"  ");
                          if (logging) log("CPU LOAD Server: " + load);
                          setState(idLoad, load);        
                      }
                      // Farbe LOAD String / HEX-Wert
                      const loadfarbe_pattern = /.{7}(?="><\/i>.*Load:)/;
                      if (body.match(loadfarbe_pattern) === null) log('gesuchter Quellcode (Farbe LOAD Pi-Hole) nicht gefunden', 'error');
                      else {
                          var loadfarbe_arr =  body.match(loadfarbe_pattern);
                          if (logging) log("LOAD Farbe: " + loadfarbe_arr[0]);
                          setState(idLoadFarbe, loadfarbe_arr[0]);        
                      }
                      // Version Pihole zB 3.2.1 String
                      const versionpi_pattern = /<b>Pi-hole Version \s*<\/b>\s*v\d*(\.\d*)*\.\d*/; // x.x.x oder x.x
                      if (body.match(versionpi_pattern) === null) log('gesuchter Quellcode (Pi-Hole Version) nicht gefunden', 'error');
                      else {
                          var versionpi_arr =  body.match(versionpi_pattern);
                          var versionpi = versionpi_arr[0].replace(/<b>Pi-hole Version <\/b> v/,"");
                          if (logging) log("Version Pihole Server: " + versionpi);
                          setState(idVersionPihole, versionpi);        
                      }
                      // Version FTL zB 3.2.1 String
                      const versionftl_pattern = /<b>FTL Version.*v\d*(\.\d*)*\.\d*/;
                      if (body.match(versionftl_pattern) === null) log('gesuchter Quellcode (FTL Version) nicht gefunden', 'error');
                      else {
                          var versionftl_arr =  body.match(versionftl_pattern);
                          var versionftl = versionftl_arr[0].replace(/<b>FTL Version.*v/,"");
                          if (logging) log("FTL Version Pihole Server: " + versionftl);
                          setState(idVersionFTL, versionftl);        
                      }
                      // Version Web Interface zB 3.2.1 String
                      const versioninterface_pattern = /<b>Web Interface Version.*<\/b>v\d*(\.\d*)*\.\d*/;
                      if (body.match(versioninterface_pattern) === null) log('gesuchter Quellcode (Web Interface Version) nicht gefunden', 'error');
                      else {
                          var versioninterface_arr =  body.match(versioninterface_pattern);
                          var versioninterface = versioninterface_arr[0].replace(/<b>Web Interface Version.*<\/b>v/,"");
                          if (logging) log("Web Interface Version Pihole Server: " + versioninterface);
                          setState(idVersionInterface, versioninterface);        
                      }
                      // Aktiv zB true/false boolean holt das aus String
                      const aktiv_pattern = /i>.*(?=<\/a><a id="temperature">)/;
                      if (body.match(aktiv_pattern) === null) log('gesuchter Quellcode (Pi-hole aktiv) nicht gefunden', 'error');
                      else {
                          var aktiv_arr =  body.match(aktiv_pattern);
                          var aktiv = aktiv_arr[0].replace(/i>\s*/,"");
                          var aktiv_bool = (aktiv === "Active") ? true : false;
                          if (logging) log("Pihole Server aktiv? " + aktiv + "(" + aktiv_bool + ")");
                          setState(idAktiv, aktiv_bool);     
                      }
                      // Farbe Aktiv String / HEX-Wert
                      const aktivfarbe_pattern = /.{7}(?="><\/i.*<\/a><a id="temperature">)/;
                      if (body.match(aktivfarbe_pattern) === null) log('gesuchter Quellcode (Farbe Aktivität Pi-Hole) nicht gefunden', 'error');
                      else {
                          var aktivfarbe_arr =  body.match(aktivfarbe_pattern);
                          if (logging) log("Aktivität Farbe: " + aktivfarbe_arr[0]);
                          setState(idAktivFarbe, aktivfarbe_arr[0]);        
                      }
                      // Update available
                      const update_pattern = /Update available!/;
                      if (body.match(update_pattern) === null) setState(idUpdate, false); //log('gesuchter Quellcode (Update Warnung) nicht gefunden', 'error');
                      else {
                          var update_arr =  body.match(update_pattern);
                          var update = update_arr[0];
                          var update_bool = update === ("Update available!") ? true : false;
                          if (logging) log("Pihole Softwareupdate möglich? (" + update_bool + ")");
                          setState(idUpdate, update_bool);          
                      }
                  } else {
                      log("StatusCode = " + response.statusCode);
                      log(error, 'error');                               // Error beim Einlesen
                  }
              });
          } catch (e) {
              log('Fehler (try) leseWebseite (Pi-Hole Index.html): ' + e, 'error');
          }
          if (logging) log('Pi-Hole Webseite eingelesen, Temperatur und Speicherbelegung gespeichert');
      }
      
      
      function readPihole() {
          if (logging) log("Pi-hole: URL " + url + " wird abgefragt ...");
          var tabelle ="<table class='pihole_tabelle'><caption>Pi-hole</caption><thead><tr><th>Admin Service: " + url + "</th></tr></thead><tbody>";
          request(url, function (error, response, body) {
              if (!error && response.statusCode == 200) {
                  var result;
                  var dnsblocked,
                      dnsqueries,
                      adsblocked,
                      adspercentage; 
                  try{
                      result = JSON.parse(body);
                      var data = JSON.stringify(result, null, 2);
                      if (logging) log(data);
                      if (logging) log(body);
                      setState(idJSON, data);
                      if (logging) log("JSON: "+ getState(idJSON).val);
                      
                      if (result) { // CHECK
                      
                          setState(idActive, true);
                          if (logging) log("Pi-hole liefert Daten und ist aktiv");
                          // http://forum.iobroker.net/viewtopic.php?f=24&t=6053&sid=65e9ec9396fe557147e535c5a4631982#p68823
                          dnsblocked = (result.domains_being_blocked)/*.replace(/,/, "")*/;
                          dnsqueries = (result.dns_queries_today)/*.replace(/,/, "")*/;
                          adsblocked = result.ads_blocked_today;
                          adspercentage = result.ads_percentage_today;
                          
                          if ( isNaN(parseFloat(adspercentage)) === false ) {
                              setState(idAdsPercentage, parseFloat(adspercentage));
                          } else setState(idAdsPercentage, 100);
                          setState(idDomains, parseFloat(dnsblocked));
                          setState(idDNSQueries, parseFloat(dnsqueries));
                          setState(idAdsBlocked, parseFloat(adsblocked));
                      
                          // Eintrag anfügen
                          tabelle += "<tr><td class='pihole_label'>Anzahl blockierter Domains:</td>"
                                  +  "<td class='pihole_data'>" + dnsblocked + "</td></tr>"
                                  
                                  +  "<tr><td class='pihole_label'>DNS-Abfragen (heute):</td>"
                                  +  "<td class='pihole_data'>" + dnsqueries + "</td></tr>"
                              
                                  +  "<tr><td class='pihole_label'>Blockierte Werbung (heute):</td>"
                                  +  "<td class='pihole_data'>" + adsblocked + "</td></tr>"
                              
                                  +  "<tr><td class='pihole_label'>Werbeanteil (heute in Prozent):</td>"
                                  +  "<td class='pihole_data'>" + adspercentage + "</td></tr>";
                      } else tabelle += "<tr><td class='pihole_data'>Pi-hole nicht gefunden!</td></tr>";
                      // Ende Teil,d er aus dem Try raus kann
                  } catch (fehler_try) {
                      log("Pi-hole - Parse Fehler: " + fehler_try, "error");
                  }    
              } else {
                  log("Pi-hole - Fehler: " + error, "warn");
              }
              tabelle += "</tbody></table>";  
              setState(idTabelle, tabelle);                     
              if (logging) log("HTML-Tabelle: " + tabelle);
          });   // Ende request 
      }
      
      function main() {
          readPihole();
          setTimeout(parseWebsite, 3000); // verzögertes Parsen
      }
      schedule(zeitplan_parse, parseWebsite);
      schedule(zeitplan, readPihole);
      setTimeout(main, 500);
      

      Bildschirmfoto 2019-06-25 um 14.48.06.jpg

      Bildschirmfoto 2019-06-25 um 14.46.51.jpg

      @SBorg sagte in [Aufruf] Neuer Adapter ioBroker.pi-hole:

      Danke und schade.
      Ich frage nur mal (sonst schreibe ich mir bei Gelegenheit ein kleines Bash-Skript dafür) wie es bei dir mit parsen von Webseiten aussieht, bzw. ob du es dir später vorstellen kannst.
      PI_Hole-IP/admin/index.php:
      Nach <!-- Version Infos --> oder <div class="pull-right hidden-xs hidden-sm"> kommen die Versions-Infos. Die könnte man speichern oder einfach nach Update (denke ich, bei mir steht gerade keins an) durchsuchen.

      @unltdnetworx Im Skript wird auch geparst, damit ich eine Warnung in VIS ausgeben kann, wenn ein Update ansteht. Kannst du für den Adapter gern kopieren.

      posted in Tester
      P
      pix
    • RE: [gelöst]Frage: Wer hat die "Tagesschau in 100s" eingebunden?

      Und wer auch noch den TagesschauStream sehen will, kann dieses (auf die Schnelle) erweiterte Skript nutzen.

      Es legt 2 Datenpunkte an:
      mp4 Datei für tagesschau in 100s
      html-Link für Stream

      /* VIS Tagesschau_Link
      parsed die Seite https://www.tagesschau.de/100sekunden/ und sucht nach der URL zum aktuellsten Video
      
      02.03.2016 erstellt von pix
      15.03.2016 zu Javascript Instanz 1 gewechselt
      24.09.2016 umbenannt in VIS_Link_Tagesschau
      11.11.2018 Skript angepasst und optimiert
      03.05.2021 Skript angepasst
             tagesschau 100s mp4
             tagesschau Stream HTML-Link
      
      todo: axios statt request() und etwas schöner machen
      
      
      */
      const fC = false; // forceCreation für createState()
      const logging = true;
      const instanz = 'javascript.1.';
      const idURL = instanz + 'VIS.URL.Tagesschau';
      const idURL100s = instanz + 'VIS.URL.Tagesschau100s';
      
      // ab hier nix mehr ändern
      createState(idURL,"", fC, {
         name: "HTML-Seite mit Tagesschau-Stream",
         desc: "geparster Link aus tagesschau.de",
         type: "string",
         role: "text.url"
      });
      
      createState(idURL100s,"", fC, {
         name: "Link zu Tagesschau in 100s",
         desc: "geparster Link aus tagesschau.de",
         type: "string",
         role: "text.url"
      });
      
      function findeURL () {   
         let request = require('request');
         let film_url;
         try {
             // Tagesschau in 100s
             const link = "http://www.tagesschau.de/100sekunden/";
             let regexp = /https:\/\/media\.tagesschau\.de\/video\/\d*\/\d*\/TV-\d*-\d*-\d*\.webxl\.h264\.mp4/gm;
             request(link, function (error, response, body) {
                 if (!error && response.statusCode == 200) {
                     let result_arr = regexp.exec(body);
                     film_url = result_arr[0];
                     setState(idURL100s, film_url);
                     if (logging) log ("URL: " + film_url);
                 } else  { // Error beim Einlesen
                     log(error, 'error'); 
                 }
             });   // Ende request 
         } catch (fehler) {
             log("Fehler (try): " + fehler, "error");
         }
      
      
         
         // nicht schön, aber nochmal für Stream
         let stream_url;
         try {
             //Tagesschau Stream als HTML
             const link = "https://www.tagesschau.de/multimedia/livestreams/";
             let regexp = /https:\/\/www\.tagesschau\.de\/multimedia\/livestreams\/livestream-\d*-\d*~player\.html/gm;
      
             request(link, function (error, response, body) {
                 if (!error && response.statusCode == 200) {
                     let result_arr = regexp.exec(body);
                     stream_url = result_arr[0];
                     setState(idURL, stream_url);
                     if (logging) log ("HTML: " + stream_url);
                 } else  { // Error beim Einlesen
                     log(error, 'error'); 
                 }
             });   // Ende request 
         } catch (fehler) {
             log("Fehler (try): " + fehler, "error");
         }
      } // Ende findeURL
      
      schedule("8 */1 * * *", findeURL); // jedeStunde um 8 nach voll
      setTimeout(findeURL, 2000);
      

      Dazu zwei Widgets für die Anzeige in VIS

      [{"tpl":"tplMetroTileDialogStatic","data":{"visibility-cond":"==","visibility-val":1,"hover":false,"transform":"true","bg_class":"bg-darkCyan","icon_class":"","icon_badge":"","badge_bg_class":"","brand_bg_class":"","dialog_draggable":"true","dialog_icon_class":"icon-film","gestures-offsetX":0,"gestures-offsetY":0,"name":"Tagesschau","label":"tagesschau in 100s","html":"<!-- Ration 1.77 d.h. bei eine Breite von 960px eine Höhe von etwa 543px -->\n<video src=\"{javascript.1.VIS.URL.Tagesschau100s}\" width=\"950\" height=\"543\" \nposter=\"video-standbild.jpg\" autobuffer autoplay \ncontrols>\n\n<div>Schade – hier käme ein Video, wenn Ihr \nBrowser HTML5 Unterstützung hätte, wie z.B. der \naktuelle Firefox</div>\n\n</video>","dialog_width":"960","dialog_height":"623","dialog_title":"Tagesschau in 100s","dialog_flat":true,"dialog_shadow":true,"dialog_modal":true,"icon_src":"/vis.0/iPad/img/tagesschau100_logo_base.png","icon_height":"22","icon_width":"96","icon_top":"50","icon_left":"24","dialog_icon_src":"","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,"visibility-groups-action":"hide","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},"style":{"left":"459px","top":"11px","z-index":"20","cursor":"pointer","height":"132px"},"widgetSet":"metro"},{"tpl":"tplMetroTileDialogStatic","data":{"visibility-cond":"==","visibility-val":1,"hover":false,"transform":"true","bg_class":"bg-darkCyan","icon_class":"","icon_badge":"","badge_bg_class":"","brand_bg_class":"","dialog_draggable":"true","dialog_icon_class":"icon-film","gestures-offsetX":0,"gestures-offsetY":0,"name":"Tagesschau Stream","label":"tagesschau Stream","html":"<iframe src={javascript.1.VIS.URL.Tagesschau} scrolling=\"no\" id=\"tagesschau-iframe\"></iframe>\n<style>\n#tagesschau-iframe\n{\n    width    : 960px;\n    height   : 823px;\n}\n</style>","dialog_width":"960","dialog_height":"623","dialog_title":"Tagesschau in 100s","dialog_flat":true,"dialog_shadow":true,"dialog_modal":true,"icon_src":"/vis.0/iPad/img/tagesschau100_logo_base.png","icon_height":"22","icon_width":"96","icon_top":"50","icon_left":"24","dialog_icon_src":"","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,"visibility-groups-action":"hide","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},"style":{"left":"608px","top":"11px","z-index":"20","cursor":"pointer","width":"142px","height":"132px"},"widgetSet":"metro"}]
      

      Bildschirmfoto 2021-05-03 um 18.52.42.jpg Bildschirmfoto 2021-05-03 um 18.52.54.jpg Bildschirmfoto 2021-05-03 um 18.50.19.jpg
      Bildschirmfoto 2021-05-03 um 18.53.48.jpg

      Gruß
      Pix

      EDIT: Ja, in der Modal-Box vom Stream steht noch 100s, kann man ja selbst ändern

      posted in Praktische Anwendungen (Showcase)
      P
      pix
    • RE: IP Adresse einlesen

      Eröffnungsthread angepasst, danke an alle.

      https://forum.iobroker.net/post/1017

      Gruß
      Pix

      posted in Skripten / Logik
      P
      pix

    Latest posts made by pix

    • RE: VOIP Client für IOBroker

      @funcarv3r

      Hallo,

      ist schon etwas älter, aber funktioniert noch immer:

      https://forum.iobroker.net/post/9985

      Sipgate.io bietet eine Schnittstelle, die alle Daten per Webhook meldet. Früher komplett kostenlos, jetzt 100 im Monat frei.

      https://www.sipgate.io/preise

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    • RE: Tvspielfilm.adapter TV Programm für VIS

      @haselchen
      Dazu hätte ich noch eine Quick'n'dirty-Lösung

      Sind Deine Tabellen in verschiedenen Views?
      Wie heißt Deine View fürs TV Programm?
      Wenn auf dieser View (bei mir heißt sie TV) keine andere Tabelle ist, kannst du mal probieren vor jedes CSS-Definition die id 'visview_TV' zu setzen.

      Also im obigen Falle statt

      .tclass-th { /* Headerzeilen */
          background-color: darkgrey;
          background-color: rgba(100,100,100,0.8);
          color: white;
      

      dann

      #visview_TV .tclass-th { /* Headerzeilen in der View TV */
          background-color: darkgrey;
          background-color: rgba(100,100,100,0.8);
          color: white;
      

      Wenn die View 'Fernsehen' heißt, dann eben

      #visview_Fernsehen .tclass-th { /* Headerzeilen in der View Fernsehen */
          background-color: darkgrey;
          background-color: rgba(100,100,100,0.8);
          color: white;
      

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    • RE: Tvspielfilm.adapter TV Programm für VIS

      @haselchen
      Hallo,

      die Spaltentitel kannst in diesem CSS (aus der mehrfach verlinkten Anleitung) ändern:

      .tclass-th { /* Headerzeilen */
          background-color: darkgrey;
          background-color: rgba(100,100,100,0.8);
          color: white;
      

      Du kannst recht einfach im VIS-Editor rechts im Feld CSS/Projekt/ den Code aus der Adapter-Anleitung einfügen. Einfach unter bestehenden drunter. Dann scrollst du zu den einzelnen Definitionen. Die oben genannte ist ziemlich am Anfang. Wenn du nun statt 'white' mal 'blue' eingibst, wirst du die Veränderung im Editor direkt sehen. Du musst kein Runtimefenster starten.

      Es kann fast nicht sein, dass andere Vis-Ansichten diese CSS-Anweisungen umsetzen. Die verwendeten Klassen sind extra für den Adapter erstellt und benannt (zum Beispiel 'tclass-th' statt nur 'th').

      Kleiner Überblick:
      th = Table Header (Überschrift)
      tr = Table Row (Reihe)
      td = Table Data (Element)

      .tv_tipps tr, /* eol 11/2022 */
      .tv_filme tr,
      .tv_jetzt tr,
      .tv_heute2015 tr,
      .tv_heute2200 tr {
          background-color: transparent;
          color: white;
      }
      

      Das 'white' kannste auch mal ändern und sehen, was passiert.

      Hilf dir das?

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    • RE: ioB träge und Absturz bei Skripten & Datenpunkten / macOS

      @mac89muc Hallo,

      ich hatte jahrelang auch iobroker auf einem Mac mini mit Intel Prozessor. Am Ende waren genau die feinen Unterschiede zum Debian System und das Basteln mit Homebrew und Co der Grund, auf einen reinen Linux Rechner (jetzt mit Proxmox) zu wechseln. Bin da mit Linux als Host sehr zufrieden, allerdings denke ich darüber nach, auf einen M1 mac mini zu wechseln. Denn darauf läuft Unbuntu nun auch ohne VM.

      Ich hatte mal ein Skript, dass ständig den Speicherverbrauch der Instanzen überprüft und beim Überschreiten eines Grenzwertes die Instanz neu startet. Das hat aber nur die Symptome behandelt.

      Wieviele Skripte hast du in deinen Javascript Instanzen laufen?
      Kannst du alle Skripte deaktivieren und dann nach und nach wieder anschalten?

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    • RE: IOBroker Installation auf MAC mit M1 Chip

      Der Thread ist schon etwas älter, aber die Suche nach "M1 apple" bringt keine relevanten Ergebnisse.

      Hat jemand mittlerweile auf der M1 Hardware Linux installiert und darüber Proxmox oder "nur" ioBroker laufen?

      Nach den ersten Versuchen mit Asahi Linux soll es nun auch recht einfach unter Ubuntu 23.04 laufen, wenn diese Quelle und diese auch recht behalten.

      Derzeit gibts einen m1 mac mini 8GB/256GB ab 300€ gebraucht. Leistung ist top und das absolut lautlos (weil lüfterlos).

      Ist schon jemand soweit gekommen?

      Gruß
      Pix

      posted in Error/Bug
      P
      pix
    • RE: Tvspielfilm.adapter TV Programm für VIS

      @driftkingisback Hallo,

      wenn Du - wie von Homoran geraten - die Dokumentaion des Adapters ansiehst, findest Du hier:

      https://github.com/iobroker-community-adapters/ioBroker.tvspielfilm/blob/master/docs/de/doc_tvspielfilm_de.md#css-konfiguration

      die entsprechenden CSS-Klassen, deren Parameter du ändern kannst, um die Erscheinung anzupassen. Dieses CSS bitte im Reiter Projekt (rehts im VIS Editor) einfügen.

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    • RE: Tankerkönig Adapter Komplett umbau

      @homoran 😀 ✋ Schön, wieder hier zu sein.

      Hab mir nicht wirklich Gedanken gemacht und einfach drüber installiert. Dann habe ich den Hinweis auf die nicht mehr benötigten / überflüssigen Datenpunkte gelesen und kurz überlegt, wo ich die StationIDs wegsichern kann (ich dachte an einen Screenshot in den Einstellungen). Naja, da waren sie nicht mehr. Aber da habe ich diese sensationelle Ansicht zur Eingabe neuer IDs gesehen und schnell einen Screenshot des Objektbaums gemacht (da stehen die alten IDs ja auch drin). Ob Adapter-Backup und Restore funktionieren weiß ich nicht. Aber die Reihenfolge der Stations sollte man beibehalten wenn man alte History-Charts nahtlos weiterführen will.

      Auch die neuen min/max-Werte habe ich nun gleich mitgeloggt. Jetzt, nach rund 12 Stunden, kann man schon eine schöne Varianz in den Preisen sehen. Danke für die Möglichkeit.

      posted in Tester
      P
      pix
    • RE: Tankerkönig Adapter Komplett umbau

      Ich habe den neuen Adapter eben um 13 Uhr erst installiert

      • erst drüber installiert
      • dann Stationen neu angelegt
      • dann Objektbaum gelöscht und neu aufbauen lassen
      • dann history in den feed-Objekten wieder eingeschaltet

      Ich merken keinen Unterschied, läuft einwandfrei durch (3.05) TOP!

      Bildschirm­foto 2022-11-20 um 14.26.46.jpg

      Gruß
      Pix

      posted in Tester
      P
      pix
    • RE: Tankerkönig Adapter Komplett umbau

      @tobrog Die Sortierung der Stationen in den eigenen Einstellung sollte auch die Reihefolge der Vorliebe widerpsiegeln (Liebste zuerst). Kann ja sein, dass Tanke XY oft die günstigste ist, aber man sich zB auf dem Weg dahin immer durch einen Stau kämpfen muss. Oder man will noch eine weitere Dienstleistung nutzen oder was kaufen. Oder oder oder. Das kann ein Adapter nicht alles abbilden.

      @Issi VIELEN DANK für die Übernahme. Ich freue mich sehr, dass der Adapter weiterentwickelt wird.

      Gruß
      Pix

      posted in Tester
      P
      pix
    • RE: Wert errechnen lassen und in VIS anzeigen

      Hallo,

      ich bin heute erst auf diesen Thread gestoßen und hab mir dann gedacht:

      Wenn es nur darum geht, das Ergebnis in VIS anzeigen zu lassen und nicht in ioBroker weiterzuverwenden, dann kann die Berechnung auch im Client-Browser erfolgen. Hier gibts einen von vielen Threads dazu.

      Das kostet zwar die Ressource des Clients (zB Wandtablet), ist aber leicht umzusetzen.

      Voraussetzung ist natürlich, dass der Wert EndeVorigerTag auch der Wert von Mitternacht ist. Dazu ist eventuell das das oben besprochene Skript nötig.

      Dort wo der Wert dann in VIS angezeigt werden soll muss ein Widget eingefügt werden. Zum Beispiel in Number-Widget, kann aber auch ein String-Widget oder ein HTML-Widget sein.

      Dann in geschweiften Klammern die Rechnung in OID einsetzen

      {EndeVorigerTag:0_userdata.0.Datenpunkte.0.fuellstand.voriger-fuellstand;Messung:device.fillLevelQuantity;EndeVorigerTag-Messung}
      

      Man könnte also in einem Skript jeweils um Mitternacht jeden Tag, jede Woche, jeden Monat, jedes Jahr den Füllstand speichern und in VIS den aktuellen Wert davon abziehen. Sollte zwischendurch getankt werden, ist für eine Periode der Wert falsch. Kann aber einfach durch die manuelle Anpassung des Datenpunktes um die Tankmenge korrigiert werden.

      Gruß
      Pix

      posted in ioBroker Allgemein
      P
      pix
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo