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

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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Skript zum PiHole Version 6 an- und ausschalten

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Skript zum PiHole Version 6 an- und ausschalten

Geplant Angeheftet Gesperrt Verschoben JavaScript
5 Beiträge 5 Kommentatoren 486 Aufrufe 6 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • grrfieldG Offline
    grrfieldG Offline
    grrfield
    schrieb am zuletzt editiert von grrfield
    #1

    Ich nutze einen PiHole-Werbeblocker, der auch sehr zuverlässig funktioniert. Manchmal werden allerdings nützliche Seiten blockiert, und ich möchte ihn schnell abschalten können. Ich habe das bisher über den PiHole-Adapter gemacht, der aber ab der neuen Version 6 nicht mehr funktioniert, da die Authentifizierung geändert wurde. Ich habe mir daher ein Javaskript erstellt, das den Werbeblocker für eine festgelegte Zeit ausschaltet oder wieder einschaltet. Gesteuert wird das über zwei angelegte States:
    '0_userdata.0.PiHole' true|false - schaltet den Werbeblocker ein oder aus
    '0_userdata.0.PiHoleOffTime' time - Ausschaltzeit time Minuten
    Dem State '0_userdata.0.PiHole' habe ich über den iot-Adapter den Alexabefehl "Werbeblocker" zugewiesen und kann nun mit "Alexa - schalt den Werbeblocker an/aus" den PiHole steuern. Über das angesprochene Echo-Gerät kommt dann eine Bestätigung über den Alexa-Adapter; diese läßt sich im Skript mit der Einstellung useAlexa ein- oder ausschalten.
    Für die Funktion müssen im Skript die IP-Adresse des PiHole-Servers unter piHoleIP sowie das PiHiole-API-Token unter apiToken eingetragen werden. Das API-Token erhält man über die Weboberfläche des PiHole unter "Settings - Web interface / API - Advanced Settings - Configure app password".

    Hier ist das Skript versteckt:

    /**
     * PiHole 2.0
     * Schaltet PiHole (ab Version 6) für eine vorgegebene Zeit (120 min) aus und dann wieder ein.
     * Das Ein- und Aussachalten erfolgt über den State '0_userdata.0.PiHole', 
     * dem über den iot-Adapter ein Alexa-Befehl zugewiesen werden kann - 
     * z. B. "Alexa, schalt den Werbeblocker an/aus"
     * Die Ausschaltzeit kann über den State '0_userdata.0.PiHoleOffTime' eingestellt werden.
     * 
     * log:     PH006
     */
    
    const fetch = require('node-fetch');
    
    
    /**
     * Einstellungen                                                //Defaults
     */
    
    // IP-Adresse des PiHole Servers ['IP']
    // hier eigene PiHole-Adresse eintragen
    const piHoleIP='192.168.1.199';                                 //'192.168.1.199'
    
    // API-Token [string]
    // hier eigenes API-Token eintragen - wird generiert unter
    // "PiHole - Settings - Web interface / API - Advanced Settings - Configure app password"
    const apiToken='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
    
    // Nutzung mit Alexa-Adapter [true|false]
    const useAlexa=true;					        //true
    
    // Verzögerung der Echoansage bis History-State geschrieben ist
    const EchoDelay=500;                                            //500
    
    
    /**
     * States
     */
    
    createState('0_userdata.0.PiHole', {name: 'PiHole', type: 'boolean'});
    createState('0_userdata.0.PiHoleOffTime', 120, {name: 'Ausschaltzeit', type: 'number', unit: 'min'});
    
    
    /**
     * Main
     */
    
    on({id: Trigger+'PiHole', change: 'any'}, (obj) => {
        if(obj.state.val) {
            disablePiHole(0, piHoleIP, apiToken); 
    		if(useAlexa) {
    			setTimeout(() => {
    				setState(getEcho()+'.Commands.speak', 'Der Werbeblocker ist wieder aktiviert.');
    			}, EchoDelay);
    		}
        } else {
            disablePiHole(getState(Verwaltung+'PiHoleOffTime').val, piHoleIP, apiToken); 
    		if(useAlexa) {
    			setTimeout(() => {
    				setState(getEcho()+'.Commands.speak', 'Der Werbeblocker wird für '+getState(Verwaltung+'PiHoleOffTime').val+' Minuten abgeschaltet.');
    			}, EchoDelay);
    		}
        }
    });
    
    
    /**
     * Funktionen
     */
    
    /**
     * Generiert eine Session ID
     * @param   {string}            ip  IP-Adresse des PiHole-Servers
     * @param   {string}            password    API-Token
     * @returns {Promise<string>}   SID
     */
    async function getSessionID(ip, password) {
        const url=`http://${ip}/api/auth`;
        const data={password};
    
        try {
            const response=await fetch(url, {
                method: 'POST',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify(data)
            });
    
            if(response.ok) {
                const result=await response.json();
                return result.session.sid; // Session ID zurückgeben
            } else {
                console.error('PH005 Fehler beim Abrufen der Session ID: '+await response.json());
                return null;
            }
        } catch(error) {
            console.error('PH006 Netzwerkfehler: ', error);
            return null;
        }
    }
    
    
    /**
     * Schaltet PiHole für duration min ab, bei duration == 0 wieder an.
     * @param   {number}    duration    Dauer [min]
     * @param   {string}    ip          IP-Adresse des PiHole-Servers
     * @param   {string}    password    API-Token
     */
    async function disablePiHole(duration, ip, password) {
        const sid=await getSessionID(ip, password);
        if (!sid) {
            console.error(' PH004 Authentifizierung fehlgeschlagen');
            return;
        }
    
        const url=`http://${ip}/api/dns/blocking`;
        const headers={
            'Content-Type': 'application/json',
            'X-FTL-SID': sid
        };
        const data={blocking: duration != 0 ? false: true, timer: duration*60};
    
        try {
            const response=await fetch(url, {
                method: 'POST',
                headers,
                body: JSON.stringify(data)
            });
    
            if(response.ok) {
                console.log(`PH001 Pi-hole wurde für ${duration} Minuten deaktiviert.`);
            } else {
                console.error('PH002 Fehler beim Deaktivieren von Pi-hole');
            }
        } catch(error) {
            console.error('PH003 Netzwerkfehler:', error);
        }
    }
    
    
    /**
     * Gibt die ID des Echos EchoName zurück
     * Bei mehreren Übereinstimmungen wird nur die erste berücksichtigt
     * @param   {string}    EchoName        Name des Echos - wenn leer, dann letzter Echo
     * @returns {string}    ID des Echos; undefined, wenn nicht gefunden
     */
    function getEcho(EchoName)
    {
        if(EchoName === undefined) {
            EchoName=getState('alexa2.0.History.name'/*Echo Device name*/).val;
        }
        let EchoID;
        let IDs=(getIdByName(EchoName, true));
        if(IDs == undefined) {
            log('getEcho: '+EchoName+' not registered!');
            return;
        }
        for (let i=0; i < IDs.length; i++) {
            if (IDs[i].search('Echo-Devices') != -1) {
                EchoID=IDs[i];
                i=IDs.length;       // Abbruch nach erstem gefundenen Echo
            }
        }
        return EchoID;
    }
    
    
    // ___|\/|
    //  |
    
    

    Marc BergM David G.D 2 Antworten Letzte Antwort
    1
    • grrfieldG grrfield

      Ich nutze einen PiHole-Werbeblocker, der auch sehr zuverlässig funktioniert. Manchmal werden allerdings nützliche Seiten blockiert, und ich möchte ihn schnell abschalten können. Ich habe das bisher über den PiHole-Adapter gemacht, der aber ab der neuen Version 6 nicht mehr funktioniert, da die Authentifizierung geändert wurde. Ich habe mir daher ein Javaskript erstellt, das den Werbeblocker für eine festgelegte Zeit ausschaltet oder wieder einschaltet. Gesteuert wird das über zwei angelegte States:
      '0_userdata.0.PiHole' true|false - schaltet den Werbeblocker ein oder aus
      '0_userdata.0.PiHoleOffTime' time - Ausschaltzeit time Minuten
      Dem State '0_userdata.0.PiHole' habe ich über den iot-Adapter den Alexabefehl "Werbeblocker" zugewiesen und kann nun mit "Alexa - schalt den Werbeblocker an/aus" den PiHole steuern. Über das angesprochene Echo-Gerät kommt dann eine Bestätigung über den Alexa-Adapter; diese läßt sich im Skript mit der Einstellung useAlexa ein- oder ausschalten.
      Für die Funktion müssen im Skript die IP-Adresse des PiHole-Servers unter piHoleIP sowie das PiHiole-API-Token unter apiToken eingetragen werden. Das API-Token erhält man über die Weboberfläche des PiHole unter "Settings - Web interface / API - Advanced Settings - Configure app password".

      Hier ist das Skript versteckt:

      /**
       * PiHole 2.0
       * Schaltet PiHole (ab Version 6) für eine vorgegebene Zeit (120 min) aus und dann wieder ein.
       * Das Ein- und Aussachalten erfolgt über den State '0_userdata.0.PiHole', 
       * dem über den iot-Adapter ein Alexa-Befehl zugewiesen werden kann - 
       * z. B. "Alexa, schalt den Werbeblocker an/aus"
       * Die Ausschaltzeit kann über den State '0_userdata.0.PiHoleOffTime' eingestellt werden.
       * 
       * log:     PH006
       */
      
      const fetch = require('node-fetch');
      
      
      /**
       * Einstellungen                                                //Defaults
       */
      
      // IP-Adresse des PiHole Servers ['IP']
      // hier eigene PiHole-Adresse eintragen
      const piHoleIP='192.168.1.199';                                 //'192.168.1.199'
      
      // API-Token [string]
      // hier eigenes API-Token eintragen - wird generiert unter
      // "PiHole - Settings - Web interface / API - Advanced Settings - Configure app password"
      const apiToken='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
      
      // Nutzung mit Alexa-Adapter [true|false]
      const useAlexa=true;					        //true
      
      // Verzögerung der Echoansage bis History-State geschrieben ist
      const EchoDelay=500;                                            //500
      
      
      /**
       * States
       */
      
      createState('0_userdata.0.PiHole', {name: 'PiHole', type: 'boolean'});
      createState('0_userdata.0.PiHoleOffTime', 120, {name: 'Ausschaltzeit', type: 'number', unit: 'min'});
      
      
      /**
       * Main
       */
      
      on({id: Trigger+'PiHole', change: 'any'}, (obj) => {
          if(obj.state.val) {
              disablePiHole(0, piHoleIP, apiToken); 
      		if(useAlexa) {
      			setTimeout(() => {
      				setState(getEcho()+'.Commands.speak', 'Der Werbeblocker ist wieder aktiviert.');
      			}, EchoDelay);
      		}
          } else {
              disablePiHole(getState(Verwaltung+'PiHoleOffTime').val, piHoleIP, apiToken); 
      		if(useAlexa) {
      			setTimeout(() => {
      				setState(getEcho()+'.Commands.speak', 'Der Werbeblocker wird für '+getState(Verwaltung+'PiHoleOffTime').val+' Minuten abgeschaltet.');
      			}, EchoDelay);
      		}
          }
      });
      
      
      /**
       * Funktionen
       */
      
      /**
       * Generiert eine Session ID
       * @param   {string}            ip  IP-Adresse des PiHole-Servers
       * @param   {string}            password    API-Token
       * @returns {Promise<string>}   SID
       */
      async function getSessionID(ip, password) {
          const url=`http://${ip}/api/auth`;
          const data={password};
      
          try {
              const response=await fetch(url, {
                  method: 'POST',
                  headers: {'Content-Type': 'application/json'},
                  body: JSON.stringify(data)
              });
      
              if(response.ok) {
                  const result=await response.json();
                  return result.session.sid; // Session ID zurückgeben
              } else {
                  console.error('PH005 Fehler beim Abrufen der Session ID: '+await response.json());
                  return null;
              }
          } catch(error) {
              console.error('PH006 Netzwerkfehler: ', error);
              return null;
          }
      }
      
      
      /**
       * Schaltet PiHole für duration min ab, bei duration == 0 wieder an.
       * @param   {number}    duration    Dauer [min]
       * @param   {string}    ip          IP-Adresse des PiHole-Servers
       * @param   {string}    password    API-Token
       */
      async function disablePiHole(duration, ip, password) {
          const sid=await getSessionID(ip, password);
          if (!sid) {
              console.error(' PH004 Authentifizierung fehlgeschlagen');
              return;
          }
      
          const url=`http://${ip}/api/dns/blocking`;
          const headers={
              'Content-Type': 'application/json',
              'X-FTL-SID': sid
          };
          const data={blocking: duration != 0 ? false: true, timer: duration*60};
      
          try {
              const response=await fetch(url, {
                  method: 'POST',
                  headers,
                  body: JSON.stringify(data)
              });
      
              if(response.ok) {
                  console.log(`PH001 Pi-hole wurde für ${duration} Minuten deaktiviert.`);
              } else {
                  console.error('PH002 Fehler beim Deaktivieren von Pi-hole');
              }
          } catch(error) {
              console.error('PH003 Netzwerkfehler:', error);
          }
      }
      
      
      /**
       * Gibt die ID des Echos EchoName zurück
       * Bei mehreren Übereinstimmungen wird nur die erste berücksichtigt
       * @param   {string}    EchoName        Name des Echos - wenn leer, dann letzter Echo
       * @returns {string}    ID des Echos; undefined, wenn nicht gefunden
       */
      function getEcho(EchoName)
      {
          if(EchoName === undefined) {
              EchoName=getState('alexa2.0.History.name'/*Echo Device name*/).val;
          }
          let EchoID;
          let IDs=(getIdByName(EchoName, true));
          if(IDs == undefined) {
              log('getEcho: '+EchoName+' not registered!');
              return;
          }
          for (let i=0; i < IDs.length; i++) {
              if (IDs[i].search('Echo-Devices') != -1) {
                  EchoID=IDs[i];
                  i=IDs.length;       // Abbruch nach erstem gefundenen Echo
              }
          }
          return EchoID;
      }
      
      
      // ___|\/|
      //  |
      
      

      Marc BergM Offline
      Marc BergM Offline
      Marc Berg
      Most Active
      schrieb am zuletzt editiert von Marc Berg
      #2

      @grrfield

      Danke dafür!

      Ich habe deinen Input genommen und als Node Red Flow umgesetzt.

      4d9bc098-8685-4eb9-ba5d-e7ab5b288e26-grafik.png

      Der Eingang ist der Datenpunkt "0_userdata.0.Pihole.block". Setzt man diesen auf einen Wert größer 0, so wird diese Dauer (in Sekunden) das Blockieren ausgesetzt. Wird "0" übergeben, so wird das Blockieren sofort wieder aktiviert.

      Der Token steckt in einer Umgebungsvariablen der Gruppe.

      [
          {
              "id": "c41d478141b3cc65",
              "type": "group",
              "z": "82142b07174514f4",
              "name": "pihole Block",
              "style": {
                  "label": true,
                  "fill": "#d1d1d1",
                  "fill-opacity": "0.46",
                  "color": "#000000"
              },
              "nodes": [
                  "202493c6e72a7aee",
                  "550c71b80775b3b3",
                  "0ad3f04cf36bfa33",
                  "e8cfad6116fde136",
                  "47f00106a239a89a",
                  "97ec5dde765c16b3"
              ],
              "env": [
                  {
                      "name": "token",
                      "value": "G667sdjpetE7WSBnsrJN0c35lMTkM2seO8Uil8V5Btg=",
                      "type": "str"
                  }
              ],
              "x": 34,
              "y": 59,
              "w": 792,
              "h": 82
          },
          {
              "id": "202493c6e72a7aee",
              "type": "http request",
              "z": "82142b07174514f4",
              "g": "c41d478141b3cc65",
              "name": "SID",
              "method": "POST",
              "ret": "obj",
              "paytoqs": "ignore",
              "url": "http://pihole/api/auth",
              "tls": "",
              "persist": false,
              "proxy": "",
              "insecureHTTPParser": false,
              "authType": "",
              "senderr": false,
              "headers": [
                  {
                      "keyType": "other",
                      "keyValue": "Content-Type",
                      "valueType": "other",
                      "valueValue": "application/json"
                  }
              ],
              "x": 370,
              "y": 100,
              "wires": [
                  [
                      "0ad3f04cf36bfa33"
                  ]
              ]
          },
          {
              "id": "550c71b80775b3b3",
              "type": "change",
              "z": "82142b07174514f4",
              "g": "c41d478141b3cc65",
              "name": "Token",
              "rules": [
                  {
                      "t": "set",
                      "p": "payload",
                      "pt": "msg",
                      "to": "{ \"password\": $env(\"token\") }",
                      "tot": "jsonata"
                  }
              ],
              "action": "",
              "property": "",
              "from": "",
              "to": "",
              "reg": false,
              "x": 250,
              "y": 100,
              "wires": [
                  [
                      "202493c6e72a7aee"
                  ]
              ]
          },
          {
              "id": "0ad3f04cf36bfa33",
              "type": "change",
              "z": "82142b07174514f4",
              "g": "c41d478141b3cc65",
              "name": "change",
              "rules": [
                  {
                      "t": "set",
                      "p": "SID",
                      "pt": "msg",
                      "to": "payload.session.sid",
                      "tot": "jsonata"
                  },
                  {
                      "t": "set",
                      "p": "payload",
                      "pt": "msg",
                      "to": "blocktime=0 ? {\"blocking\": true, \"timer\": blocktime} : {\"blocking\": false, \"timer\": blocktime}",
                      "tot": "jsonata"
                  }
              ],
              "action": "",
              "property": "",
              "from": "",
              "to": "",
              "reg": false,
              "x": 500,
              "y": 100,
              "wires": [
                  [
                      "e8cfad6116fde136"
                  ]
              ]
          },
          {
              "id": "e8cfad6116fde136",
              "type": "http request",
              "z": "82142b07174514f4",
              "g": "c41d478141b3cc65",
              "name": "block",
              "method": "POST",
              "ret": "obj",
              "paytoqs": "ignore",
              "url": "http://pihole/api/dns/blocking",
              "tls": "",
              "persist": false,
              "proxy": "",
              "insecureHTTPParser": false,
              "authType": "",
              "senderr": false,
              "headers": [
                  {
                      "keyType": "other",
                      "keyValue": "Content-Type",
                      "valueType": "other",
                      "valueValue": "application/json"
                  },
                  {
                      "keyType": "other",
                      "keyValue": "X-FTL-SID",
                      "valueType": "msg",
                      "valueValue": "SID"
                  }
              ],
              "x": 630,
              "y": 100,
              "wires": [
                  [
                      "47f00106a239a89a"
                  ]
              ]
          },
          {
              "id": "47f00106a239a89a",
              "type": "http request",
              "z": "82142b07174514f4",
              "g": "c41d478141b3cc65",
              "name": "delete",
              "method": "DELETE",
              "ret": "obj",
              "paytoqs": "ignore",
              "url": "http://pihole/api/auth",
              "tls": "",
              "persist": false,
              "proxy": "",
              "insecureHTTPParser": false,
              "authType": "",
              "senderr": false,
              "headers": [
                  {
                      "keyType": "other",
                      "keyValue": "Content-Type",
                      "valueType": "other",
                      "valueValue": "application/json"
                  },
                  {
                      "keyType": "other",
                      "keyValue": "X-FTL-SID",
                      "valueType": "msg",
                      "valueValue": "SID"
                  }
              ],
              "x": 750,
              "y": 100,
              "wires": [
                  []
              ]
          },
          {
              "id": "97ec5dde765c16b3",
              "type": "ioBroker in",
              "z": "82142b07174514f4",
              "g": "c41d478141b3cc65",
              "name": "blocktime",
              "attrname": "blocktime",
              "topic": "0_userdata.0.Pihole.block",
              "payloadType": "value",
              "onlyack": "",
              "func": "all",
              "gap": "",
              "fireOnStart": "false",
              "outFormat": "MQTT",
              "x": 120,
              "y": 100,
              "wires": [
                  [
                      "550c71b80775b3b3"
                  ]
              ]
          }
      ]
      

      Zusätzlich wird zum Schluss noch die Session zerstört.

      NUC10I3+Ubuntu+Docker+ioBroker+influxDB2+Node Red+EMQX+Grafana

      Pi-hole, Traefik, Checkmk, Conbee II+Zigbee2MQTT, ESPSomfy-RTS, LoRaWAN, Arduino, KiCad

      Benutzt das Voting im Beitrag, wenn er euch geholfen hat.

      1 Antwort Letzte Antwort
      0
      • grrfieldG grrfield

        Ich nutze einen PiHole-Werbeblocker, der auch sehr zuverlässig funktioniert. Manchmal werden allerdings nützliche Seiten blockiert, und ich möchte ihn schnell abschalten können. Ich habe das bisher über den PiHole-Adapter gemacht, der aber ab der neuen Version 6 nicht mehr funktioniert, da die Authentifizierung geändert wurde. Ich habe mir daher ein Javaskript erstellt, das den Werbeblocker für eine festgelegte Zeit ausschaltet oder wieder einschaltet. Gesteuert wird das über zwei angelegte States:
        '0_userdata.0.PiHole' true|false - schaltet den Werbeblocker ein oder aus
        '0_userdata.0.PiHoleOffTime' time - Ausschaltzeit time Minuten
        Dem State '0_userdata.0.PiHole' habe ich über den iot-Adapter den Alexabefehl "Werbeblocker" zugewiesen und kann nun mit "Alexa - schalt den Werbeblocker an/aus" den PiHole steuern. Über das angesprochene Echo-Gerät kommt dann eine Bestätigung über den Alexa-Adapter; diese läßt sich im Skript mit der Einstellung useAlexa ein- oder ausschalten.
        Für die Funktion müssen im Skript die IP-Adresse des PiHole-Servers unter piHoleIP sowie das PiHiole-API-Token unter apiToken eingetragen werden. Das API-Token erhält man über die Weboberfläche des PiHole unter "Settings - Web interface / API - Advanced Settings - Configure app password".

        Hier ist das Skript versteckt:

        /**
         * PiHole 2.0
         * Schaltet PiHole (ab Version 6) für eine vorgegebene Zeit (120 min) aus und dann wieder ein.
         * Das Ein- und Aussachalten erfolgt über den State '0_userdata.0.PiHole', 
         * dem über den iot-Adapter ein Alexa-Befehl zugewiesen werden kann - 
         * z. B. "Alexa, schalt den Werbeblocker an/aus"
         * Die Ausschaltzeit kann über den State '0_userdata.0.PiHoleOffTime' eingestellt werden.
         * 
         * log:     PH006
         */
        
        const fetch = require('node-fetch');
        
        
        /**
         * Einstellungen                                                //Defaults
         */
        
        // IP-Adresse des PiHole Servers ['IP']
        // hier eigene PiHole-Adresse eintragen
        const piHoleIP='192.168.1.199';                                 //'192.168.1.199'
        
        // API-Token [string]
        // hier eigenes API-Token eintragen - wird generiert unter
        // "PiHole - Settings - Web interface / API - Advanced Settings - Configure app password"
        const apiToken='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
        
        // Nutzung mit Alexa-Adapter [true|false]
        const useAlexa=true;					        //true
        
        // Verzögerung der Echoansage bis History-State geschrieben ist
        const EchoDelay=500;                                            //500
        
        
        /**
         * States
         */
        
        createState('0_userdata.0.PiHole', {name: 'PiHole', type: 'boolean'});
        createState('0_userdata.0.PiHoleOffTime', 120, {name: 'Ausschaltzeit', type: 'number', unit: 'min'});
        
        
        /**
         * Main
         */
        
        on({id: Trigger+'PiHole', change: 'any'}, (obj) => {
            if(obj.state.val) {
                disablePiHole(0, piHoleIP, apiToken); 
        		if(useAlexa) {
        			setTimeout(() => {
        				setState(getEcho()+'.Commands.speak', 'Der Werbeblocker ist wieder aktiviert.');
        			}, EchoDelay);
        		}
            } else {
                disablePiHole(getState(Verwaltung+'PiHoleOffTime').val, piHoleIP, apiToken); 
        		if(useAlexa) {
        			setTimeout(() => {
        				setState(getEcho()+'.Commands.speak', 'Der Werbeblocker wird für '+getState(Verwaltung+'PiHoleOffTime').val+' Minuten abgeschaltet.');
        			}, EchoDelay);
        		}
            }
        });
        
        
        /**
         * Funktionen
         */
        
        /**
         * Generiert eine Session ID
         * @param   {string}            ip  IP-Adresse des PiHole-Servers
         * @param   {string}            password    API-Token
         * @returns {Promise<string>}   SID
         */
        async function getSessionID(ip, password) {
            const url=`http://${ip}/api/auth`;
            const data={password};
        
            try {
                const response=await fetch(url, {
                    method: 'POST',
                    headers: {'Content-Type': 'application/json'},
                    body: JSON.stringify(data)
                });
        
                if(response.ok) {
                    const result=await response.json();
                    return result.session.sid; // Session ID zurückgeben
                } else {
                    console.error('PH005 Fehler beim Abrufen der Session ID: '+await response.json());
                    return null;
                }
            } catch(error) {
                console.error('PH006 Netzwerkfehler: ', error);
                return null;
            }
        }
        
        
        /**
         * Schaltet PiHole für duration min ab, bei duration == 0 wieder an.
         * @param   {number}    duration    Dauer [min]
         * @param   {string}    ip          IP-Adresse des PiHole-Servers
         * @param   {string}    password    API-Token
         */
        async function disablePiHole(duration, ip, password) {
            const sid=await getSessionID(ip, password);
            if (!sid) {
                console.error(' PH004 Authentifizierung fehlgeschlagen');
                return;
            }
        
            const url=`http://${ip}/api/dns/blocking`;
            const headers={
                'Content-Type': 'application/json',
                'X-FTL-SID': sid
            };
            const data={blocking: duration != 0 ? false: true, timer: duration*60};
        
            try {
                const response=await fetch(url, {
                    method: 'POST',
                    headers,
                    body: JSON.stringify(data)
                });
        
                if(response.ok) {
                    console.log(`PH001 Pi-hole wurde für ${duration} Minuten deaktiviert.`);
                } else {
                    console.error('PH002 Fehler beim Deaktivieren von Pi-hole');
                }
            } catch(error) {
                console.error('PH003 Netzwerkfehler:', error);
            }
        }
        
        
        /**
         * Gibt die ID des Echos EchoName zurück
         * Bei mehreren Übereinstimmungen wird nur die erste berücksichtigt
         * @param   {string}    EchoName        Name des Echos - wenn leer, dann letzter Echo
         * @returns {string}    ID des Echos; undefined, wenn nicht gefunden
         */
        function getEcho(EchoName)
        {
            if(EchoName === undefined) {
                EchoName=getState('alexa2.0.History.name'/*Echo Device name*/).val;
            }
            let EchoID;
            let IDs=(getIdByName(EchoName, true));
            if(IDs == undefined) {
                log('getEcho: '+EchoName+' not registered!');
                return;
            }
            for (let i=0; i < IDs.length; i++) {
                if (IDs[i].search('Echo-Devices') != -1) {
                    EchoID=IDs[i];
                    i=IDs.length;       // Abbruch nach erstem gefundenen Echo
                }
            }
            return EchoID;
        }
        
        
        // ___|\/|
        //  |
        
        

        David G.D Online
        David G.D Online
        David G.
        schrieb am zuletzt editiert von
        #3

        @grrfield

        Nur so aus Interesse.
        Kann man das nicht auch mit dem PiHole Adapter machen?

        Ich nutze Adguard und steuer diesen über den entsprechenden Adapter.

        Zeigt eure Lovelace-Visualisierung klick
        (Auch ideal um sich Anregungen zu holen)

        Meine Tabellen für eure Visualisierung klick

        Meister MopperM 1 Antwort Letzte Antwort
        0
        • David G.D David G.

          @grrfield

          Nur so aus Interesse.
          Kann man das nicht auch mit dem PiHole Adapter machen?

          Ich nutze Adguard und steuer diesen über den entsprechenden Adapter.

          Meister MopperM Online
          Meister MopperM Online
          Meister Mopper
          schrieb am zuletzt editiert von
          #4

          @david-g sagte in Skript zum PiHole Version 6 an- und ausschalten:

          @grrfield

          Nur so aus Interesse.
          Kann man das nicht auch mit dem PiHole Adapter machen?

          Ich nutze Adguard und steuer diesen über den entsprechenden Adapter.

          Der Pihole-Adapter läuft in der jetzigen Form nicht mit der v6.x.

          Die v6.x arbeitet offenbar mit SessionID, mit denen der Adapter (noch) nichts anfangen kann.
          Aus diesem Grund bin ich noch auf v5.x und hoffe, dass der Adapter bald eine Frischkur erfährt.

          Proxmox und HA

          1 Antwort Letzte Antwort
          0
          • OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von
            #5

            Zum Test steht nun der neue pi-hole2 Adapter zur Verfügung
            https://forum.iobroker.net/topic/81472/neuer-adapter-pi-hole2-für-pihole-v6?_=1750927226913

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

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


            Support us

            ioBroker
            Community Adapters
            Donate

            819

            Online

            32.6k

            Benutzer

            82.1k

            Themen

            1.3m

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

            • Du hast noch kein Konto? Registrieren

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