Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Skript zum PiHole Version 6 an- und ausschalten

    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

    Skript zum PiHole Version 6 an- und ausschalten

    This topic has been deleted. Only users with topic management privileges can see it.
    • grrfield
      grrfield last edited by 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 Berg David G. 2 Replies Last reply Reply Quote 1
      • Marc Berg
        Marc Berg Most Active @grrfield last edited by Marc Berg

        @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.

        1 Reply Last reply Reply Quote 0
        • David G.
          David G. @grrfield last edited by

          @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 Mopper 1 Reply Last reply Reply Quote 0
          • Meister Mopper
            Meister Mopper @David G. last edited by

            @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.

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

              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

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

              Support us

              ioBroker
              Community Adapters
              Donate

              896
              Online

              31.8k
              Users

              80.0k
              Topics

              1.3m
              Posts

              5
              5
              223
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo