FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: juemuc am 01 Januar 2025, 20:38:12

Titel: FHEM und pihole V6
Beitrag von: juemuc am 01 Januar 2025, 20:38:12
Hallo zusammen,

hat sich schon jemand mit der neuen pihole-API in der Version pihole V6 beschäftigt? Da dort die API komplett neu und ohne php ist, funktioniert der Aufruf wie unter der Version 5 nicht mehr.

Ich habe aber leider keine Ahnung, wie man nun die neue API (trotz API-Doku) in FHEM einbinden kann. Wer kann helfen?

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 01 Januar 2025, 20:48:16
ZitatThe Pi-hole API is organized around REST. Our API has predictable resource-oriented URLs, accepts and returns reliable UTF-8 JavaScript Object Notation (JSON)-encoded data for all API responses, and uses standard HTTP response codes and verbs. Most (but not all) endpoints require authentication. API endpoints requiring authentication will fail with code 401 Unauthorized when used outside a valid session.

Quelle: https://ftl.pi-hole.net/development-v6/docs/

Ganz normal HTTP / REST, also mittels HTTPMOD. Was hast du denn bereits probiert?

Für AdGuard habe ich das so anhand des ursprünglichen Beispiels nachgebaut: https://forum.fhem.de/index.php?topic=132511.0 , sollte/dürfte daher für pihole v6 auch nur (d)eine Fleißaufgabe sein.
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 01 Januar 2025, 21:06:01
Hallo Ralli,

ich habe bisher die pihole-Daten wie im Thread pihole (https://forum.fhem.de/index.php?topic=84031.0) beschrieben, in FHEM zur Verfügung gestellt. Die Doku von der neuen APi habe ich schon gesehen, nur verstanden habe ich sie nicht  :-\

Ich würde ja gerne klein anfangen und verstehen, wie ich die "SID" erhalte, die wohl für die weiteren Schritte notwendig sind. Ich bitte noch um weitere Unterstützung. Danke

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 01 Januar 2025, 21:42:23
Du musst hier zweistufig vorgehen. Erst Login, um eine SID zu bekommen, und dann die SID bei jedem weiteren Aufruf mitgeben.

Beispiel: https://forum.fhem.de/index.php?msg=889015
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 01 Januar 2025, 22:20:25
Hallo Ralli,

das hilft mir leider nicht weiter, da ich die Info nicht verstehe. In dem Beispiel für die V5 musste ich halt nur die IP-Adresse und den API-Key ersetzen.

Auch die Testabfrage im Browser war mit den damaligen Infos möglich. Mit der http-Programmierung kenne ich mich nicht aus. Trotzdem danke für Deine Hilfe. Ich warte mal weiter ab. Vielleicht nutzt ja noch jemand die V6 und FHEM. 

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 04 Januar 2025, 12:27:03
Ich habe einmal für dich die Arbeit gemacht:

defmod pihole HTTPMOD none 60
attr pihole alias Pi-hole
attr pihole bodyDecode auto
attr pihole devStateIcon {piholeV6DevStateIcon($name)}
attr pihole enableControlSet 1
attr pihole enableCookies 1
attr pihole enforceGoodReadingNames 1
attr pihole event-on-change-reading .*
attr pihole extractAllJSON 1
attr pihole get01ExtractAllJSON 1
attr pihole get01Header X-FTL-SID: $sid
attr pihole get01Name FTL_summary
attr pihole get01Poll 1
attr pihole get01URL %%base_url%%/stats/summary
attr pihole get02ExtractAllJSON 1
attr pihole get02Header X-FTL-SID: $sid
attr pihole get02Name FTL_version
attr pihole get02Poll 1
attr pihole get02URL %%base_url%%/info/version
attr pihole get03ExtractAllJSON 1
attr pihole get03Header X-FTL-SID: $sid
attr pihole get03Name FTL_info
attr pihole get03Poll 1
attr pihole get03URL %%base_url%%/info/ftl
attr pihole get04Header X-FTL-SID: $sid
attr pihole get04Name FTL_status
attr pihole get04Poll 1
attr pihole get04URL %%base_url%%/dns/blocking
attr pihole get05Header X-FTL-SID: $sid
attr pihole get05Name FTL_messages
attr pihole get05Poll 1
attr pihole get05URL %%base_url%%/info/messages/count
attr pihole handleRedirects 1
attr pihole icon it_raspberry_logo
attr pihole reAuthRegex [Uu]nauthorized
attr pihole replacement01Mode text
attr pihole replacement01Regex %%base_url%%
attr pihole replacement01Value %%protocol%%://%%ip%%/api
attr pihole replacement02Mode text
attr pihole replacement02Regex %%ip%%
attr pihole replacement02Value DEINE_PIHOLE_IP_GGF_MIT_:PORT_WENN_NICHT_STANDARD
attr pihole replacement03Mode key
attr pihole replacement03Regex %%api_password%%
attr pihole replacement03Value api_password
attr pihole replacement04Mode text
attr pihole replacement04Regex %%protocol%%
attr pihole replacement04Value http
attr pihole set01Data {"blocking":false, "timer":$val}
attr pihole set01ExtractAllJSON 1
attr pihole set01Header X-FTL-SID: $sid
attr pihole set01Hint 10,60,180,300,600,900
attr pihole set01Max 900
attr pihole set01Min 10
attr pihole set01Name disable
attr pihole set01ParseResponse 1
attr pihole set01URL %%base_url%%/dns/blocking
attr pihole set02Data {"blocking":true}
attr pihole set02ExtractAllJSON 1
attr pihole set02Header X-FTL-SID: $sid
attr pihole set02Name enable
attr pihole set02NoArg 1
attr pihole set02ParseResponse 1
attr pihole set02URL %%base_url%%/dns/blocking
attr pihole sid1Data {"password": "%%api_password%%"}
attr pihole sid1IdJSON session_sid
attr pihole sidURL %%base_url%%/auth
attr pihole stateFormat blocking
attr pihole userReadings gravity_last_updated_abstime:gravity_last_update.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_update',0)))}
set pihole storeKeyValue api_password DEIN_PIHOLE_API_PASSWORT

Dazu passend die Routine für die 99_myUtils.pm:

sub piholeV6DevStateIcon
{
my $name = shift;
my $noHeader=shift;

$noHeader=0 if(!defined($noHeader));

#get %%base_url%% replacement from httpmod device (using HTTPMOD method)
# -> this is the url to the web-ui of Pi-Hole
my $baseURL= HTTPMOD::DoReplacement($defs{$name},'get','%%protocol%%')."://".HTTPMOD::DoReplacement($defs{$name},'get','%%ip%%')."/admin/";

#get required readings from pihole httpmod device
my $state =ReadingsVal($name,'blocking','unknown');
my $totalQueries = sprintf("%07d",ReadingsVal($name,'queries_total','0'));
my $blocked = sprintf("%06d",ReadingsVal($name,'queries_blocked','0'));
my $blockedPercentage = sprintf("%04.1f",ReadingsVal($name,'queries_percent_blocked','0'));
my $adListCount =ReadingsVal($name,'gravity_domains_being_blocked','0');
my $messageCount=ReadingsNum($name,'count','0');
   
        my  $ver_info = 'CORE: '.ReadingsVal($name,'version_core_local_version','unknown').' => '.ReadingsVal($name,'version_core_remote_version','unknown');
        $ver_info.= "\nFTL: ".ReadingsVal($name,'version_ftl_local_version','unknown').' => '.ReadingsVal($name,'version_ftl_remote_version','unknown');
        $ver_info.= "\nWEB: ".ReadingsVal($name,'version_web_local_version','unknown').' => '.ReadingsVal($name,'version_web_remote_version','unknown');
        $ver_info.= "\nDocker: ".ReadingsVal($name,'version_docker_local','').' => '.ReadingsVal($name,'version_docker_remote','') if (ReadingsVal($name,'version_docker_local','') ne "");
   
        my $core_upd = 1 if(ReadingsVal($name,'version_core_local_version','unknown') ne ReadingsVal($name,'version_core_remote_version','unknown'));
        my $ftl_upd = 1 if (ReadingsVal($name,'version_ftl_local_version','unknown') ne ReadingsVal($name,'version_ftl_remote_version','unknown'));
        my $web_upd = 1 if (ReadingsVal($name,'version_web_local_version','unknown') ne ReadingsVal($name,'version_web_remote_version','unknown'));
        my $docker_upd = 1 if ((ReadingsVal($name,'version_docker_local','') ne ReadingsVal($name,'version_docker_remote','')) and (ReadingsVal($name,'version_docker_remote','') ne ""));

        my $anyUpd=$ftl_upd+$core_upd+$web_upd+$docker_upd+0;
   

#prepare dedicated css
#hint: html of device overview is by default embedded in a <div> container
#      which has id attribute set to device's NAME
my  $styleClass ='<style>';
        $styleClass.='#'.$name.' svg {height:15px; width:15px; padding-right:1px;} ';
        $styleClass.='#'.$name.' td {padding-left:10px; padding-right:10px} ';
        $styleClass.='</style>';

#prepare images
my $imgQueries=FW_makeImage('it_i-net@cyan');
my $imgBlocked=FW_makeImage('time_manual_mode@red');
my $imgState  =FW_makeImage($state eq 'enabled' ? '15px-green' : '15px-red');
        $imgState = FW_makeImage('15px-orange') if ($state eq 'enabled' and $messageCount > 0);
        my $imgUpdate =FW_makeImage($anyUpd > 0 ? '15px-red' : '15px-green',$ver_info);   

        if ($anyUpd > 0) {
                # fhem("setreading ".$name." available_updates 1")
                readingsSingleUpdate($defs{$name},"available_updates","1",1)
        } else {
                # fhem("setreading ".$name." available_updates 0")
                readingsSingleUpdate($defs{$name},"available_updates","0",0)
        }

#prepare disable/enable command
my $cmd='';
my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name;
if($state eq 'disabled') {
$callMe .=' enable ';
$cmd =$callMe.'">Enable</a>';
} else {
$callMe .=' disable ';
$cmd  =       $callMe.'60">1</a>';
$cmd .= ' | '.$callMe.'300">5</a>';
$cmd .= ' | '.$callMe.'600">10</a>';
$cmd .= ' | '.$callMe.'900">15</a>';
}

#finally build the html for device overview
my $ret  = $styleClass;
    $ret .= '<table border=0"><tr>';
    #if second argument of this method call is true (=1)
#then do NOT create a table header. Defaults to false (=0)
if(!$noHeader) {    
    $ret .= '<th>State</th>';
    $ret .= '<th>Queries</th>';
    $ret .= '<th>Blocked</th>';
    #$ret .= '<th>Adlist</th>';    
    $ret .= '<th>'.($state eq 'enabled' ? 'Disable [Minutes]':'Disabled').'</th>';
    $ret .= '<th>Upd</th>';           

    $ret .= '</tr><tr>';
}    
        $ret .= '<td><a href="'.$baseURL.'?sid='.urlEncode(InternalVal("$name","sid","")).'" target="_blank">'.$imgState.'</a></td>';
        $ret .= '<td>'.$imgQueries.' '.$totalQueries.'</td>';
        $ret .= '<td>'.$imgBlocked.' '.$blocked.' ('.$blockedPercentage.'%)'.'</td>';
        #$ret .= '<td>'.$imgAdList.' '.$adListCount.'</td>';
        $ret .= '<td>'.$cmd.'</td>';
        $ret .= '<td>'.$imgUpdate.'</td>';
        $ret .= '</tr></table>';

return $ret;
}

Sollte was nicht funktionieren oder ergänzt werden müssen, darfst du das gerne nun übernehmen.
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 04 Januar 2025, 17:05:04
Hallo Ralli,

erst einmal vielen vielen Dank. Ich teste und versuche die einzelnen Codezeilen zu verstehen. Gibt es neben dieser Doku:httpmod (https://wiki.fhem.de/wiki/HTTPMOD) noch eine Doku zu den verwendeten Befehlen?
Ich finde direkt zu bodyDecode auto keine Erklärung.

Viele Grüße
Jürgen

Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 04 Januar 2025, 21:45:06
Hallo Ralli,

meine Tests waren erfolgreich. Also noch einmal vielen, vielen Dank. Ich habe noch ein paar Kleinigkeiten angepasst.


Die Änderungen kann ich gerne hier bereitstellen.

Ein paar Fragen habe ich habe dennoch:


Viele Grüße und Danke für Deine Geduld
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 04 Januar 2025, 23:00:13
Hallo Ralli,

das Thema "error_key" und "error_message" hat sich erledigt. Die Readings sind nicht mehr aufgetaucht, nachdem ich das ganze einmal gelöscht und wieder hinzugefügt habe. Ich vermute, dass ich einmal das PSW falsch eingegeben hatte und deshalb die Readings erzeugt wurden. Sie werden wohl nicht wieder gelöscht, wenn alles ok ist.

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 05 Januar 2025, 08:02:24
Zitat von: juemuc am 04 Januar 2025, 21:45:06
  • Da eine "sub" für die Version 5 in der 99_myUtils schon vorhanden war, habe ich Deine in piholeV6DevStateIcon umbenannt.
  • Für die absolute Zeitangabe von "gravity_last_update" habe ich noch eine userReadings mit einer lesbaren Darstellung (YY-MM-DD HH:MM:SS) angelegt.
  • Zusätzlich habe ich das Passwort mit StoreKeyValue "ausgelagert".


Das habe ich ebenfalls noch nachgezogen und ist oben im Beitrag nun auch enthalten.

Zitat
  • Dort habe ich auch die führenden Nullen für die Darstellung von "Querries" und "Blocked" entfernt.

Das wiederum ziehe ich nicht nach, da ich mehrere solche Devices im Web-Frontend untereinander stehen habe und so die Übersichtlichkeit bzw. Anschaulichkeit besser ist.
Titel: Aw: FHEM und pihole V6
Beitrag von: Hans-Ulrich Tag am 19 Februar 2025, 16:52:45
Zitat von: juemuc am 04 Januar 2025, 23:00:13Hallo Ralli,

das Thema "error_key" und "error_message" hat sich erledigt. Die Readings sind nicht mehr aufgetaucht, nachdem ich das ganze einmal gelöscht und wieder hinzugefügt habe. Ich vermute, dass ich einmal das PSW falsch eingegeben hatte und deshalb die Readings erzeugt wurden. Sie werden wohl nicht wieder gelöscht, wenn alles ok ist.

Viele Grüße
Jürgen

Hallo Jürgen, diese Fehler erscheinen auch bei mir. Welches Passwort muss ich eintragen? Der Password-Hash unter "Webserver und API" funktioniert nicht.

VG Hans-Ulrich
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 19 Februar 2025, 18:27:36
Hallo Hans-Ulrich,

ich habe für die Anmeldung am pihole ein PSW vergeben, welches auch für die API genutzt wird.

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: eisman am 20 Februar 2025, 21:37:50
hi,

danke für die Arbeit

ich würde das : set pihole storeKeyValue api_password DEIN_PIHOLE_API_PASSWORT

etwas absetzen, weil es nicht zum Code gehört.
hatte es die ganze zeit übersehen....

gruss
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 22 Februar 2025, 21:46:50
Hallo zusammen,

ich habe die sub in der 99_myUtils.pm noch einmal angepasst, da die Updateinformation noch nicht gepasst hat. Es wird nun (korrekt) geprüft ob eine neue Version (inkl. Docker) vorhanden ist.

sub piholeV6DevStateIcon
{
my $name = shift;
my $noHeader=shift;

$noHeader=0 if(!defined($noHeader));

#get %%base_url%% replacement from httpmod device (using HTTPMOD method)
# -> this is the url to the web-ui of Pi-Hole
my $baseURL= "https://".HTTPMOD::DoReplacement($defs{$name},'get','%%ip%%')."/admin/";

#get required readings from pihole httpmod device
my $presence =ReadingsVal($name,'presence','unknown');
        my $state =ReadingsVal($name,'blocking','unknown');
my $totalQueries = ReadingsVal($name,'queries_total','0');
my $blocked = ReadingsVal($name,'queries_blocked','0');
my $blockedPercentage = round(ReadingsVal($name,'queries_percent_blocked','0'),1);
my $adListCount =ReadingsVal($name,'gravity_domains_being_blocked','0');


        my $docker_jn = ReadingsVal($name,'version_docker_local','unknown');
        my $ver_info = 'unknown';
        my $ftl_upd=0;
        my $core_upd=0;
        my $web_upd=0;
        my $docker_upd=0;

        my $core_local_version=ReadingsVal($name,'version_core_local_version','unknown');
        my $core_remote_version=ReadingsVal($name,'version_core_remote_version','unknown');
        my $ftl_local_version=ReadingsVal($name,'version_ftl_local_version','unknown');
        my $ftl_remote_version=ReadingsVal($name,'version_ftl_remote_version','unknown');
        my $web_local_version=ReadingsVal($name,'version_web_local_version','unknown');
        my $web_remote_version=ReadingsVal($name,'version_web_remote_version','unknown');
        my $docker_version_lokal=ReadingsVal($name,'version_docker_local','unknown');
        my $docker_version_remote=ReadingsVal($name,'version_docker_remote','unknown');

        if($docker_jn eq 'unknown' or $docker_jn eq '') {
            $ver_info = 'CORE: '.$core_local_version.' => '.$core_remote_version;
            $ver_info.= "\nFTL: ".$ftl_local_version.' => '.$ftl_remote_version;
            $ver_info.= "\nWEB: ".$web_local_version.' => '.$web_remote_version;
            if($core_local_version ne $core_remote_version) {
                $core_upd=1;
              }
            if($ftl_local_version ne $ftl_remote_version) {
                $ftl_upd=1;
              }
            if($web_local_version ne $web_remote_version) {
                $web_upd=1;
              }
          }else{
            $ver_info = "Docker: ".$docker_version_lokal.' => '.$docker_version_remote;
            if($docker_version_lokal ne $docker_version_remote) {
                $docker_upd=1;
              }
          }

        my $anyUpd=$ftl_upd+$core_upd+$web_upd+$docker_upd+0;
         
#prepare dedicated css
#hint: html of device overview is by default embedded in a <div> container
#      which has id attribute set to device's NAME
my  $styleClass ='<style>';
        $styleClass.='#'.$name.' svg {height:15px; width:15px; padding-right:1px;} ';
        $styleClass.='#'.$name.' td {padding-left:10px; padding-right:10px} ';
        $styleClass.='</style>';

#prepare images
my $imgQueries  =FW_makeImage('it_i-net@cyan');
my $imgBlocked  =FW_makeImage('time_manual_mode@red');
my $imgState    =FW_makeImage($state eq 'enabled' ? '15px-green' : '15px-red');
        my $imgPresence =FW_makeImage($presence eq 'present' ? '15px-green' : '15px-red');
        my $imgUpdate   =FW_makeImage($anyUpd > 0 ? '15px-red' : '15px-green',$ver_info);   

        if ($anyUpd > 0) {
                # fhem("setreading ".$name." available_updates 1")
                readingsSingleUpdate($defs{$name},"available_updates","1",1)
        } else {
                # fhem("setreading ".$name." available_updates 0")
                readingsSingleUpdate($defs{$name},"available_updates","0",0)
        }

#prepare disable/enable command
my $cmd='';
my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name;
if($state eq 'disabled') {
$callMe .=' enable ';
$cmd =$callMe.'">Enable</a>';
} else {
$callMe .=' disable ';
$cmd  =       $callMe.'60">1</a>';
$cmd .= ' | '.$callMe.'300">5</a>';
$cmd .= ' | '.$callMe.'600">10</a>';
$cmd .= ' | '.$callMe.'900">15</a>';
}

#finally build the html for device overview
my $ret  = $styleClass;
    $ret .= '<table border=0"><tr>';
    #if second argument of this method call is true (=1)
#then do NOT create a table header. Defaults to false (=0)
if(!$noHeader) {    
    $ret .= '<th>Presence</th>';
                        $ret .= '<th>State</th>';
    $ret .= '<th>Queries</th>';
    $ret .= '<th>Blocked</th>';
    #$ret .= '<th>Adlist</th>';
                $ret .= '<th>'.($state eq 'enabled' ? 'Disable [Minutes]':'Disabled').'</th>';
    $ret .= '<th>Upd</th>';           

    $ret .= '</tr><tr>';
}    
        $ret .= '<td><a href="'.$baseURL.'" target="_blank">'.$imgPresence.'</a></td>';
        $ret .= '<td><a href="'.$baseURL.'" target="_blank">'.$imgState.'</a></td>';
        $ret .= '<td>'.$imgQueries.' '.$totalQueries.'</td>';
        $ret .= '<td>'.$imgBlocked.' '.$blocked.' ('.$blockedPercentage.'%)'.'</td>';
        #$ret .= '<td>'.$imgAdList.' '.$adListCount.'</td>';
        $ret .= '<td>'.$cmd.'</td>';
        $ret .= '<td>'.$imgUpdate.'</td>';
        $ret .= '</tr></table>';

return $ret;
}

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: bertl am 25 Februar 2025, 20:28:18
Zitat von: juemuc am 22 Februar 2025, 21:46:50Es wird nun (korrekt) geprüft ob eine neue Version (inkl. Docker) vorhanden ist.

Hast du das auch getestet?

Folgende Fehler sind mir aufgefallen:
1) Du definierst zwar die Variablen (my $ftl_upd=0; my $core_upd=0; my $web_upd=0;), verwendest aber dann nur $core_upd bei den Zuweisungen.
2) Bei der if-Abrage muss auch auf leer abgefragt werden: if($docker_jn eq 'unknown' or $docker_jn eq '')
Kein Fehler aber fraglich:
Wenn du schon die Readings in Variablen schreibst, dann verwende doch anschließend die Variablen und lies diese nicht nochmals ein!
            $ver_info = 'CORE: '.ReadingsVal($name,'version_core_local_version','unknown').' => '.ReadingsVal($name,'version_core_remote_version','unknown');
            $ver_info.= "\nFTL: ".ReadingsVal($name,'version_ftl_local_version','unknown').' => '.ReadingsVal($name,'version_ftl_remote_version','unknown');
            $ver_info.= "\nWEB: ".ReadingsVal($name,'version_web_local_version','unknown').' => '.ReadingsVal($name,'version_web_remote_version','unknown');

$docker_jn und $docker_version_lokal sind ident und somit einmal überflüssig
my $docker_jn = ReadingsVal($name,'version_docker_local','unknown');
my $docker_version_lokal=ReadingsVal($name,'version_docker_local','unknown');

Gruß, Robert
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 26 Februar 2025, 20:43:21
Hallo Robert,

danke für die Hinweise. Da ich nur die Dockerversion verwende, ist mir der Fehler nicht aufgefallen. Das Verwenden der Variablen macht natürlich auch Sinn. Ich habe oben eine korrigierte Version bereitgestellt.

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: JoWiemann am 27 Februar 2025, 10:49:16
Hallo Jürgen,

wann wird den das Reading presence gebildet?

my $presence =ReadingsVal($name,'presence','unknown');

Grüße Jörg
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 27 Februar 2025, 11:52:42
Hallo Jörg,

das wird im Userreading mit erzeugt:
gravity_last_update_abstime:gravity_last_update.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_update',0)))}, presence {sleep 1;ReadingsVal("pihole_ds920_check","state","")}

Hierzu nutze ich ein eigenes Device, welches über Dein "presence2-Modul" den Status ermittelt.

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: JoWiemann am 27 Februar 2025, 11:54:33
Hallo Jürgen,

danke. Und, gute Idee.

Grüße Jörg
Titel: Aw: FHEM und pihole V6
Beitrag von: Reinschki am 27 Februar 2025, 12:48:01
Klasse! Kann ich gut gebrauchen und habe es direkt erfolgreich übernommen. Vielen Dank dafür!

Frage: Wie könnte ich den Pi-Hole jetzt per Befehl in einer Automation ein- und ausschalten?

VG
Reiner
Titel: Aw: FHEM und pihole V6
Beitrag von: bertl am 27 Februar 2025, 12:54:19
set pihole disable 0
set pihole enable
Titel: Aw: FHEM und pihole V6
Beitrag von: JoWiemann am 27 Februar 2025, 13:44:33
Zitat von: juemuc am 27 Februar 2025, 11:52:42Hallo Jörg,

das wird im Userreading mit erzeugt:
gravity_last_update_abstime:gravity_last_update.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_update',0)))}, presence {sleep 1;ReadingsVal("pihole_ds920_check","state","")}

Hierzu nutze ich ein eigenes Device, welches über Dein "presence2-Modul" den Status ermittelt.

Viele Grüße
Jürgen

Hallo Jürgen,

da Du ja auch einen Container verwendest habe ich 73_PRESENCE2 um 'netcat' erweiter. Damit kann man dann die Erreichbarkeit des Ports prüfen.

define PiHolePresence PRESENCENCE2 192.168.x.x:8080 (8080 ist bei mir der PiHole Port)

Läuft das NAS noch und schmirt nur der Container ab, bekommt man das so mit.

Grüße Jörg

PS: netcat muss natürlich auf dem Fhem Server verfügbar sein.
Titel: Aw: FHEM und pihole V6
Beitrag von: Reinschki am 27 Februar 2025, 15:04:23
set pihole disable 0
Liefert: set value 0 is not within defined range
Titel: Aw: FHEM und pihole V6
Beitrag von: JoWiemann am 27 Februar 2025, 15:41:00
Zitat von: Reinschki am 27 Februar 2025, 15:04:23set pihole disable 0
Liefert: set value 0 is not within defined range

Hallo,

ändere das Attribut set01Min von 10 auf 0 und ergänze im Attribut set01Hint am Anfang die 0.

Wenn Du es komfortabel anklicken möchtest, dann musst Du noch im Code $cmd .= ' | ' .$callMe. '0">disable</a>'; ergänzen:
    $callMe .=' disable ';
    $cmd  =        $callMe. '60">1</a>';
    $cmd .= ' | ' .$callMe. '300">5</a>';
    $cmd .= ' | ' .$callMe. '600">10</a>';
    $cmd .= ' | ' .$callMe. '900">15</a>';
    $cmd .= ' | ' .$callMe. '0">disable</a>';

Grüße Jörg
Titel: Aw: FHEM und pihole V6
Beitrag von: Reinschki am 27 Februar 2025, 15:51:37
ZitatHallo,

ändere das Attribut set01Min von 10 auf 0 und ergänze im Attribut set01Hint am Anfang die 0.

Wenn Du es komfortabel anklicken möchtest, dann musst Du noch im Code $cmd .= ' | ' .$callMe. '0">disable</a>'; ergänzen:
Perfekt!

Herzlichen Dank!
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 27 Februar 2025, 16:33:35
Zitat von: JoWiemann am 27 Februar 2025, 13:44:33Hallo Jürgen,

da Du ja auch einen Container verwendest habe ich 73_PRESENCE2 um 'netcat' erweiter. Damit kann man dann die Erreichbarkeit des Ports prüfen.

define PiHolePresence PRESENCENCE2 192.168.x.x:8080 (8080 ist bei mir der PiHole Port)

Läuft das NAS noch und schmirt nur der Container ab, bekommt man das so mit.

Grüße Jörg

PS: netcat muss natürlich auf dem Fhem Server verfügbar sein.

Hallo Jörg,

danke für die Info, aber bei mir läuft pihole über eine eigene IP-Adresse. Ich nutze im Docker macvlan, sodass jeder Container eine eigene IP-Adresse hat.

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Rudi_Hirsch am 01 März 2025, 13:02:49
Zitat von: eisman am 20 Februar 2025, 21:37:50api_password

api_password = user - admin???
Habe seit ich bei pi-hole ein PW vergeben eine Fehlermeldung und die Daten werden nicht mehr aktualisiert!"session_message password incorrect"
ich habe bei storeKeyValue admin xxxxx eingegeben xxxxx ist das gleiche wie bei der GUI von pi-hole. Muss man sich das verschlüsselte PW irgendwo abholen?
Titel: Aw: FHEM und pihole V6
Beitrag von: bertl am 01 März 2025, 13:07:10
Du musst folgenden Befehl eingeben:

set pihole storeKeyValue api_password <DEIN_PIHOLE_API_PASSWORT>
Titel: Aw: FHEM und pihole V6
Beitrag von: Rudi_Hirsch am 01 März 2025, 14:46:04
Zitat von: bertl am 01 März 2025, 13:07:10Du musst folgenden Befehl eingeben:

set pihole storeKeyValue api_password <DEIN_PIHOLE_API_PASSWORT>
Danke  readings werden aktualisiert!
Aha, also "set pi-hole storeKeyValue api_password XXXXXX" und nicht "set pi-hole storeKeyValue admin XXXXXX"

Jetzt habe ich noch zweiProbleme:
1. Das presence-Symbol bleibt rot
2. Beim symbol Upd wird "Docker: =>" angezeigt
Ich habe keine Docker-Installation sondern eine raspi 3B-Installation
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 01 März 2025, 15:55:25
Dann versuche mal die Routine aus meinem Beitrag (https://forum.fhem.de/index.php?msg=1329416).
Titel: Aw: FHEM und pihole V6
Beitrag von: bertl am 01 März 2025, 16:34:30
Zitat von: Ralli am 01 März 2025, 15:55:25Dann versuche mal die Routine aus meinem Beitrag (https://forum.fhem.de/index.php?msg=1329416).
Hallo Ralli,
wenn du in deinem originalen Post noch die Änderungen von Jörg (https://forum.fhem.de/index.php?msg=1335309) einbauen würdest, könnten zukünftig Verwender/Anwender diesen 'out of the box' nehmen  ;)
Gruß Robert
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 01 März 2025, 16:43:50
Zitat von: Rudi_Hirsch am 01 März 2025, 14:46:04
Zitat von: bertl am 01 März 2025, 13:07:10Du musst folgenden Befehl eingeben:

set pihole storeKeyValue api_password <DEIN_PIHOLE_API_PASSWORT>
Danke  readings werden aktualisiert!
Aha, also "set pi-hole storeKeyValue api_password XXXXXX" und nicht "set pi-hole storeKeyValue admin XXXXXX"

Jetzt habe ich noch zweiProbleme:
1. Das presence-Symbol bleibt rot
2. Beim symbol Upd wird "Docker: =>" angezeigt
Ich habe keine Docker-Installation sondern eine raspi 3B-Installation

Damit der "Presence-Status" korrekt angezeigt wird, musst du vorher auch den pihole-status mit dem "Presece-Modul" als eigenes Device definieren.

Was liefert denn
{ my $docker_jn=ReadingsVal('pihole','version_docker_local','unknown')}

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 01 März 2025, 17:31:05
Zitat von: bertl am 01 März 2025, 16:34:30
Zitat von: Ralli am 01 März 2025, 15:55:25Dann versuche mal die Routine aus meinem Beitrag (https://forum.fhem.de/index.php?msg=1329416).
Hallo Ralli,
wenn du in deinem originalen Post noch die Änderungen von Jörg (https://forum.fhem.de/index.php?msg=1335309) einbauen würdest, könnten zukünftig Verwender/Anwender diesen 'out of the box' nehmen  ;)
Gruß Robert

Nö, so passt das alles. Ansonsten darf jeder selbst Hand anlegen. Ich habe extra kein dauerhaftes Disable eingebaut.
Titel: Aw: FHEM und pihole V6
Beitrag von: Sebastian84 am 01 März 2025, 23:59:37
Guten Abend

Bei mir klappt die Anmeldung mit pihole und fhem nicht.
Ich hab das Password und die ip eingegeben.
Die code habe ich von der ersten Seite.
Internals:
   BUSY       0
   DEF        none 60
   FUUID      65551717-f33f-cdd4-92ce-9186b03dde4b4b6d
   GetChainLength 1
   Interval   60
   MainURL   
   ModuleVersion 4.1.12 - 19.4.2022
   NAME       pihole
   NOTIFYDEV  global
   NR         433
   NTFY_ORDER 50-pihole
   STATE      blocking
   TYPE       HTTPMOD
   eventCount 2
   value     
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       https://192.168.0.115:443
     auth       0
     data       
     displayurl https://192.168.0.115/api/info/messages/count
     header     X-FTL-SID: $sid
     host       192.168.0.115
     httpversion 1.0
     ignoreredirects 1
     loglevel   4
     path       /api/info/messages/count
     protocol   https
     redirects  0
     timeout    2
     url        https://192.168.0.115/api/info/messages/count
     sslargs:
   QUEUE:
   READINGS:
     2025-03-01 19:58:38   FTL_branch      master
     2025-03-01 19:58:38   FTL_current     v5.25.2
     2025-03-01 19:58:38   FTL_latest      v6.0.3
     2025-03-01 19:58:38   FTL_update      1
     2023-11-16 12:01:04   FTL_version     3
     2025-03-01 19:58:37   ads_blocked_today 316
     2025-03-01 19:58:37   ads_percentage_today 35.909092
     2025-03-01 23:57:37   available_updates 0
     2025-03-01 19:58:37   clients_ever_seen 2
     2025-03-01 19:58:38   core_branch     master
     2025-03-01 19:58:38   core_current    v5.18.4
     2025-03-01 19:58:38   core_latest     v6.0.4
     2025-03-01 19:58:38   core_update     1
     2025-03-01 19:58:37   dns_queries_all_replies 880
     2025-03-01 19:58:37   dns_queries_all_types 880
     2025-03-01 19:58:37   dns_queries_today 880
     2025-03-01 19:58:37   domains_being_blocked 1997680
     2025-03-01 19:58:37   gravity_last_updated_absolute 1740850603
     2025-03-01 18:36:59   gravity_last_updated_abstime 2025-03-01 18:36:43
     2025-03-01 19:58:37   gravity_last_updated_file_exists 1
     2025-03-01 19:58:37   gravity_last_updated_relative_days 0
     2025-03-01 19:58:37   gravity_last_updated_relative_hours 1
     2025-03-01 19:58:37   gravity_last_updated_relative_minutes 21
     2025-03-01 19:58:37   privacy_level   0
     2025-03-01 19:58:37   queries_cached  26
     2025-03-01 19:58:37   queries_forwarded 511
     2025-03-01 19:58:37   reply_BLOB      3
     2025-03-01 19:58:37   reply_CNAME     272
     2025-03-01 19:58:37   reply_DNSSEC    1
     2025-03-01 19:58:37   reply_DOMAIN    16
     2025-03-01 19:58:37   reply_IP        426
     2025-03-01 19:58:37   reply_NODATA    116
     2025-03-01 19:58:37   reply_NONE      0
     2025-03-01 19:58:37   reply_NOTIMP    0
     2025-03-01 19:58:37   reply_NXDOMAIN  20
     2025-03-01 19:58:37   reply_OTHER     0
     2025-03-01 19:58:37   reply_REFUSED   0
     2025-03-01 19:58:37   reply_RRNAME    0
     2025-03-01 19:58:37   reply_SERVFAIL  0
     2025-03-01 19:58:37   reply_UNKNOWN   26
     2025-03-01 19:58:37   status          enabled
     2025-03-01 19:58:37   unique_clients  2
     2025-03-01 19:58:37   unique_domains  233
     2023-11-16 12:01:04   version         3
     2025-03-01 19:58:38   web_branch      master
     2025-03-01 19:58:38   web_current     v5.21
     2025-03-01 19:58:38   web_latest      v6.0.1
     2025-03-01 19:58:38   web_update      1
   REQUEST:
     context    get
     data       
     header     X-FTL-SID: $sid
     ignoreredirects 0
     num        05
     retryCount 0
     type       get05
     url        %%base_url%%/info/messages/count
   lastpoll:
     FTL_info   1740869867.94052
     FTL_messages 1740869867.94052
     FTL_status 1740869867.94052
     FTL_summary 1740869867.94052
     FTL_version 1740869867.94052
Attributes:
   alias      Pi-hole
   bodyDecode auto
   devStateIcon {piholeV6DevStateIcon($name)}
   enableControlSet 1
   enableCookies 1
   enforceGoodReadingNames 1
   event-on-change-reading .*
   extractAllJSON 1
   get01ExtractAllJSON 1
   get01Header X-FTL-SID: $sid
   get01Name  FTL_summary
   get01Poll  1
   get01URL   %%base_url%%/stats/summary
   get02ExtractAllJSON 1
   get02Header X-FTL-SID: $sid
   get02Name  FTL_version
   get02Poll  1
   get02PollDelay 1
   get02URL   %%base_url%%/info/version
   get03ExtractAllJSON 1
   get03Header X-FTL-SID: $sid
   get03JSON  status
   get03Name  FTL_info
   get03Poll  1
   get03URL   %%base_url%%/info/ftl
   get04Header X-FTL-SID: $sid
   get04JSON  type
   get04Name  FTL_status
   get04Poll  1
   get04URL   %%base_url%%/dns/blocking
   get05Header X-FTL-SID: $sid
   get05JSON  version
   get05Name  FTL_messages
   get05Poll  1
   get05URL   %%base_url%%/info/messages/count
   getURL     %%api_url%%
   group      Pi-Hole
   handleRedirects 1
   icon       it_raspberry_logo
   reAuthRegex [Uu]nauthorized
   replacement01Mode text
   replacement01Regex %%base_url%%
   replacement01Value https://%%ip%%/api
   replacement02Mode text
   replacement02Regex %%ip%%
   replacement02Value 192.168.0.115
   replacement03Mode key
   replacement03Regex %%api_password%%
   replacement03Value api_password
   replacement04Mode text
   replacement04Regex %%ip%%
   replacement04Value 192.168.0.115
   replacement05Mode text
   replacement05Value 192.168.0.115
   room       0_System
   set01Data  {"blocking":false, "timer":$val}
   set01ExtractAllJSON 1
   set01FollowGet statistics
   set01Header X-FTL-SID: $sid
   set01Hint  10,60,180,300,600,900
   set01Max   900
   set01Min   10
   set01Name  disable
   set01ParseResponse 1
   set01URL   %%base_url%%/dns/blocking
   set02Data  {"blocking":true}
   set02ExtractAllJSON 1
   set02FollowGet statistics
   set02Header X-FTL-SID: $sid
   set02Name  enable
   set02NoArg 1
   set02ParseResponse 1
   set02URL   %%base_url%%/dns/blocking
   sid1Data   {"password": "%%api_password%%"}
   sid1IdJSON session_sid
   sidURL     %%base_url%%/auth
   stateFormat blocking
Titel: Aw: FHEM und pihole V6
Beitrag von: Sebastian84 am 02 März 2025, 00:18:04
Ich habe eigentlich die 192.168.0.115:8080/admin. Muss ich den Port angeben und wo trage ich das Passwort ein?
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 02 März 2025, 07:23:57
Ist dein Pi-hole bereits auf V6.x? Die Readings zeigen 5.x .

Wenn dein Pi-hole für die Web-Schnittstelle auf Port 8080 erreichbar ist, musst du für %%ip%% 192.168.0.115:8080 setzen, also

attr phiole replacement02Value 192.168.0.115:8080
Titel: Aw: FHEM und pihole V6
Beitrag von: Sebastian84 am 02 März 2025, 07:50:36
Das hab ich gemacht. Ja meine Pihole ist auf Version 6 und Debian 12.
Was muss ich noch eingeben das er sich in Fhem aktiviert?

Die Readings sind noch vom alten Version 5
Hab im Device gelöscht und die neuen von hier von der ersten Seite eingefügt.
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 02 März 2025, 08:11:50
Es steht alles in diesem Thread, was man braucht, um das Ding zum Fliegen zu bringen.

Ggf. musst du noch einmal

set pihole storeKeyValue api_password DEIN_PIHOLE_API_PASSWORT

ausführen. Das API-Passwort ist das gleiche, welches du für dein Webfrontend, die Admin-Oberfläche, benötigst.
Titel: Aw: FHEM und pihole V6
Beitrag von: Sebastian84 am 02 März 2025, 08:37:58
Wenn ich in Fhem auf pihole auf state drücke geht er auf die Adresse:https://192.168.0.115:8080/admin/

Dann kommt Seite nicht gefunden  weil ich nur über die Seite http://192.168.0.115:8080/admin/
auf pihole komme. Wie kann ich das ändern?
Warscheinlich verbindet er sich deshalb nicht mit der Pihole Oberfläche.
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 02 März 2025, 08:48:07
Dann verwendest du http statt https für diesen Port. Indem du in der Routine

sub piholeV6DevStateIcon

die Zeile

    my $baseURL= "https://".HTTPMOD::DoReplacement($defs{$name},'get','%%ip%%')."/admin/";

ersetzt durch

    my $baseURL= "http://".HTTPMOD::DoReplacement($defs{$name},'get','%%ip%%')."/admin/";
Titel: Aw: FHEM und pihole V6
Beitrag von: Sebastian84 am 02 März 2025, 09:15:13
Super. Danke hat geklappt
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 02 März 2025, 09:19:41
Fein.

Ich habe in meinem Beitrag (https://forum.fhem.de/index.php?msg=1329416) die Definition und die Routine so abgeändert, dass in der Definition das Protokoll entsprechend angepasst werden kann.

attr pihole replacement04Value http

Dort ist entweder http oder https eintragen.
Titel: Aw: FHEM und pihole V6
Beitrag von: Rudi_Hirsch am 02 März 2025, 16:55:06
Zitat von: juemuc am 01 März 2025, 16:43:50{ my $docker_jn=ReadingsVal('pihole','version_docker_local','unknown')}
liefert gar nix.
presence2-modul installiert und funktioniert
PS habe alles korrekt nach Anleitung incl. "sub piholeV6DevStateIcon" installiert. Alte Version wurde vorher komplett entfernt.
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 02 März 2025, 18:15:39
Du musst "pihole" durch den Namen Deiner Installation ersetzen. Wenn ich richtig nachgeschaut habe, heißt Dein Device "pi-hole".

{ my $docker_jn=ReadingsVal('pi-hole','version_docker_local','unknown')} Dies gilt natürlich auch für die Info in der 99_myUtils.

Was liefert dies?

Ich erhalte immer "unknown". Sehr merkwürdig.
Titel: Aw: FHEM und pihole V6
Beitrag von: Rudi_Hirsch am 05 März 2025, 15:53:59
mein name: pihole ->  { my $docker_jn=ReadingsVal('pihole','version_docker_local','unknown')} ->
leere Antwort.
Macht nix, funktioniert ja sonst alles
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 05 März 2025, 16:11:19
Zitat von: Rudi_Hirsch am 01 März 2025, 14:46:04Ich habe keine Docker-Installation sondern eine raspi 3B-Installation

Zitatmein name: pihole ->  { my $docker_jn=ReadingsVal('pihole','version_docker_local','unknown')} ->
leere Antwort.

:-\

Dann ist das das erwartete Verhalten.
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 05 März 2025, 17:14:56
Zitat von: Rudi_Hirsch am 05 März 2025, 15:53:59mein name: pihole ->  { my $docker_jn=ReadingsVal('pihole','version_docker_local','unknown')} ->
leere Antwort.
Macht nix, funktioniert ja sonst alles

Gibt es denn bei Dir das Reading "version_docker_local"? Amsonsten verstehe ich das Verhalten nicht.

IM Bedarfsfall kannst Du ja die Abfrage in der 99_myUtils anpassen.

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 05 März 2025, 17:30:57
Schau gerne in die API-Dokumentation. Wird /info/version abgefragt, kommt ein JSON mit eben all diesen Werten zurück, inkl. Docker-Version(en) obwohl ggf. gar keine Docker-Image genutzt wird.

Ich verweise ein letztes mal auf meinen Beitrag (https://forum.fhem.de/index.php?msg=1329416), in dem ich die Docker-Versionen ausblende, wenn der Rückgabewert "" ist.
Titel: Aw: FHEM und pihole V6
Beitrag von: Rudi_Hirsch am 07 März 2025, 00:31:52
Gibt es denn bei Dir das Reading "version_docker_local"? Ansonsten verstehe ich das Verhalten nicht.
->
Alle Updateinfos sind aktuell vorhanden. Nur die beiden readings sind vorhanden aber leer

version_docker_local                     2025-03-07 00:13:33
version_docker_remote                    2025-03-07 00:13:33
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 07 März 2025, 12:56:45
Du hast aber schon - wie Ralli auch schon geschrieben hat - die Abfrage auf "leer" in Deinem Coding?

if($docker_jn eq 'unknown' or $docker_jn eq '') oder das Coding von Ralli.

Viele Grüße
Jürgen
Titel: Aw: FHEM und pihole V6
Beitrag von: Rudi_Hirsch am 08 März 2025, 16:08:38
Habe alles exakt nach RALLI gemacht (importiert). Nur bei 99_myUtils habe ich die Deaktivierungs-Zeiten nach Forum angepasst
Titel: Aw: FHEM und pihole V6
Beitrag von: Gisbert am 14 März 2025, 18:13:39
Hallo Jürgen,

ich hatte das Device und die Definition in 99_myUtils.pm geändert, teils nach meinen Vorstellungen, und alles sah sehr vernünftig und funktional aus.

Heute bekomme ich den im angehängten Bild gezeigten Zustand. Irgendetwas bei state scheint nicht mehr zu funktionieren, ohne dass ich mir irgendeiner Änderung bewusst bin.

Hier ist die Definition in 99_myUtils.pm:
sub piholeV6DevStateIcon
{
    my $name = shift;
    my $noHeader=shift;
   
    $noHeader=0 if(!defined($noHeader));
   
    #get %%base_url%% replacement from httpmod device (using HTTPMOD method)
    # -> this is the url to the web-ui of Pi-Hole
    my $baseURL= "https://".HTTPMOD::DoReplacement($defs{$name},'get','%%ip%%')."/admin/";

    #get required readings from pihole httpmod device
    my $state =ReadingsVal($name,'blocking','unknown');
    my $totalQueries = ReadingsVal($name,'queries_total','0');
    my $blocked = ReadingsVal($name,'queries_blocked','0');
    my $blockedPercentage = round(ReadingsVal($name,'queries_percent_blocked','0'),1);
    my $adListCount =ReadingsVal($name,'gravity_domains_being_blocked','0');
    my $messageCount=ReadingsNum($name,'count','0');
  
    my $ver_info = 'CORE: '.ReadingsVal($name,'version_core_local_version','unknown').' => '.ReadingsVal($name,'version_core_remote_version','unknown');
       $ver_info.= "\nFTL: ".ReadingsVal($name,'version_ftl_local_version','unknown').' => '.ReadingsVal($name,'version_ftl_remote_version','unknown');
       $ver_info.= "\nWEB: ".ReadingsVal($name,'version_web_local_version','unknown').' => '.ReadingsVal($name,'version_web_remote_version','unknown');
  
    my $ftl_upd=ReadingsNum($name,'FTL_update',0);
    my $core_upd=ReadingsNum($name,'core_update',0);
    my $web_upd=ReadingsNum($name,'web_update',0);

    my $anyUpd=$ftl_upd+$core_upd+$web_upd+0;
  

    #prepare dedicated css
    #hint: html of device overview is by default embedded in a <div> container
    #      which has id attribute set to device's NAME
    my $styleClass ='<style>';
       $styleClass.='#'.$name.' svg {height:15px; width:15px; padding-right:1px;} ';
       $styleClass.='#'.$name.' td {padding-left:10px; padding-right:10px} ';
       $styleClass.='</style>';
   
    #prepare images
    #ist schön bunt, wird aber nicht benötigt
    #my $imgQueries=FW_makeImage('it_i-net@cyan');
    #ist schön bunt, wird aber nicht benötigt   
    #my $imgBlocked=FW_makeImage('time_manual_mode@red');
    my $imgState  =FW_makeImage($state eq 'enabled' ? '15px-green' : '15px-red');
       $imgState  =FW_makeImage('15px-orange') if ($state eq 'enabled' and $messageCount > 0);
    my $imgUpdate =FW_makeImage($anyUpd > 0 ? '15px-red' : '15px-green',$ver_info);  

        if ($anyUpd > 0) {
                # fhem("setreading ".$name." available_updates 1")
                readingsSingleUpdate($defs{$name},"available_updates","1",1)
        } else {
                # fhem("setreading ".$name." available_updates 0")
                readingsSingleUpdate($defs{$name},"available_updates","0",0)
        }

    #prepare disable/enable command
    my $cmd='';
    #my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name.' PiHole';
    my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name . ' ';
    if($state eq 'disabled') {
        $cmd =$callMe.'enable">enable</a>';   
    } else {
        $cmd  =       $callMe.'disable 60">1</a>';
        $cmd .= ' | '.$callMe.'disable 300">5</a>';       
        $cmd .= ' | '.$callMe.'disable 600">10</a>';
       #$cmd .= ' | '.$callMe.'disable 900">15</a>';
    }

    #finally build the html for device overview
    my $ret  = $styleClass;
       $ret .= '<table border=0"><tr>';
       #if second argument of this method call is true (=1)
       #then do NOT create a table header. Defaults to false (=0)
       if(!$noHeader) {      
               $ret .= '<td><center>state</center></td>';
               $ret .= '<td><center>queries</center></td>';
               $ret .= '<td><center>blocked</center></td>';
               #$ret .= '<th>Adlist</th>';      
               $ret .= '<td><center>'.($state eq 'enabled' ? 'disabled':'disabled').'</center></td>';
            $ret .= '<td><center>update</center></td>';
               $ret .= '</tr><tr>';
       }      
       $ret .= '<td><center><a href="'.$baseURL.'?sid='.urlEncode(InternalVal("$name","sid","")).'" target="_blank">'.$imgState.'</a></center></td>';
       #$imgQueries und $imgBlocked entfernt
       #$ret .= '<td><center>'.$imgQueries.' '.$totalQueries.'</center></td>';
       #$ret .= '<td><center>'.$imgBlocked.' '.$blocked.' ('.$blockedPercentage.'%)'.'</center></td>';
       $ret .= '<td><center>'.$totalQueries.'</center></td>';
       $ret .= '<td><center>'.$blocked.' ('.$blockedPercentage.'%)'.'</center></td>';
       #$ret .= '<td>'.$imgAdList.' '.$adListCount.'</td>';
       $ret .= '<td><center>'.$cmd.'</center></td>';
       $ret .= '<td><center>'.$imgUpdate.'</center></td>';
       $ret .= '</tr></table>';

    return $ret;
}

Hab ich unwissentlich was geändert, oder woran könnte es liegen?

Viele Grüße Gisbert
Titel: Aw: FHEM und pihole V6
Beitrag von: bertl am 14 März 2025, 18:41:23
Hallo Gisbert,

das Bild/Icon "15px-orange.png" gibt es bei dir nicht (bei mir übrigens auch nicht).
Nimm einfach "15px-yellow" das ist vorhanden  ;)

Oder du kopierst dir unter "/opt/fhem/www/images/default" eines hin!

Gruß Robert
Titel: Aw: FHEM und pihole V6
Beitrag von: buzzmain am 17 April 2025, 17:39:48
Moin ihr Lieben,
für einen nicht so scriptversierten User (also z.B. Ich  ;D  ) ist das echt kompliziert.
Wie aufwendig wäre es, PiHole als Funktion (nennt man das so?) ins Repository mit zu übernehmen.
Als so in der Art:
Define Pihole pihole IP-Adresse Passwort
Würde vielen vieles leichter machen.
Ist vermutlich zu aufwendig oder?
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 18 April 2025, 09:52:47
Was ist bei Copy& Paste so schwierig?

Ist doch nur kopieren und eigene Daten eintragen.
Titel: Aw: FHEM und pihole V6
Beitrag von: Jewe am 06 Juli 2025, 23:26:50
Hallo zusammen,

ich bekomme diesen fehler

error_hint   The API is hosted at pi.hole/api, not pi.hole/admin/api
Was ist das Problem? Ich bekomme es nicht gefixed.

Danke, Jens
Titel: Aw: FHEM und pihole V6
Beitrag von: juemuc am 07 Juli 2025, 15:03:08
Hallo Jens,

die Info ist sehr spärlich.

Ich vermurte, Du nutz pihole v6 mit einer alten FHEM-Abfrage.

Viele Grüße
Jürgen

PS.: Ein paar zusätzliche Infos wären hilfreich (z. B. die Definition der "sub" und des Devices.
Titel: Aw: FHEM und pihole V6
Beitrag von: Jewe am 07 Juli 2025, 18:45:17
Hallo Jürgen,

ja die Info´s fehlen und haätte ich gleich einfügen können.
Die definitionen hab ich hier aus dem threat.


Device:
[code]define pihole HTTPMOD none 60
attr pihole DbLogExclude .*
attr pihole alias Pi-hole
attr pihole bodyDecode auto
attr pihole devStateIcon {piholeV6DevStateIcon($name)}
attr pihole enableControlSet 1
attr pihole enableCookies 1
attr pihole enforceGoodReadingNames 1
attr pihole event-on-change-reading .*
attr pihole extractAllJSON 1
attr pihole get01ExtractAllJSON 1
attr pihole get01Header X-FTL-SID: $sid
attr pihole get01Name FTL_summary
attr pihole get01Poll 1
attr pihole get01URL %%base_url%%/stats/summary
attr pihole get02ExtractAllJSON 1
attr pihole get02Header X-FTL-SID: $sid
attr pihole get02Name FTL_version
attr pihole get02Poll 1
attr pihole get02PollDelay 3600
attr pihole get02URL %%base_url%%/info/version
attr pihole get03ExtractAllJSON 1
attr pihole get03Header X-FTL-SID: $sid
attr pihole get03JSON status
attr pihole get03Name FTL_info
attr pihole get03Poll 1
attr pihole get03URL %%base_url%%/info/ftl
attr pihole get04Header X-FTL-SID: $sid
attr pihole get04JSON type
attr pihole get04Name FTL_status
attr pihole get04Poll 1
attr pihole get04URL %%base_url%%/dns/blocking
attr pihole get05Header X-FTL-SID: $sid
attr pihole get05JSON version
attr pihole get05Name FTL_messages
attr pihole get05Poll 1
attr pihole get05URL %%base_url%%/info/messages/count
attr pihole group System
attr pihole handleRedirects 1
attr pihole icon it_raspberry_logo
attr pihole reAuthRegex [Uu]nauthorized
attr pihole replacement01Mode text
attr pihole replacement01Regex %%base_url%%
attr pihole replacement01Value %%protocol%%://%%ip%%/api
attr pihole replacement02Mode text
attr pihole replacement02Regex %%ip%%
attr pihole replacement02Value DEINE_PIHOLE_IP_GGF_MIT_:PORT_WENN_NICHT_STANDARD
attr pihole replacement03Mode key
attr pihole replacement03Regex %%api_password%%
attr pihole replacement03Value api_password
attr pihole replacement04Mode text
attr pihole replacement04Regex %%protocol%%
attr pihole replacement04Value https
attr pihole replacement05Mode text
attr pihole replacement05Regex %%ip%%
attr pihole replacement05Value 192.168.6.2
attr pihole room Allgemein->Netzwerk,x_System
attr pihole set01Data {"blocking":false, "timer":$val}
attr pihole set01ExtractAllJSON 1
attr pihole set01Header X-FTL-SID: $sid
attr pihole set01Hint 10,60,180,300,600,900
attr pihole set01Max 900
attr pihole set01Min 10
attr pihole set01Name disable
attr pihole set01ParseResponse 1
attr pihole set01URL %%base_url%%/dns/blocking
attr pihole set02Data {"blocking":true}
attr pihole set02ExtractAllJSON 1
attr pihole set02Header X-FTL-SID: $sid
attr pihole set02Name enable
attr pihole set02NoArg 1
attr pihole set02ParseResponse 1
attr pihole set02URL %%base_url%%/dns/blocking
attr pihole sid1Data {"password": "%%api_password%%"}
attr pihole sid1IdJSON session_sid
attr pihole sidURL %%base_url%%/auth
attr pihole stateFormat blocking
attr pihole userReadings gravity_last_updated_abstime:gravity_last_update.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_update',0)))}
#   BUSY       0
#   DEF        none 60
#   FUUID      68698e2b-f33f-3201-1771-56e9e9d1dc5cad32
#   FVERSION   98_HTTPMOD.pm:0.291590/2024-09-23
#   Interval   60
#   MainURL   
#   ModuleVersion 4.2.0 - 11.8.2023
#   NAME       pihole
#   NOTIFYDEV  global
#   NR         816
#   NTFY_ORDER 50-pihole
#   STATE      blocking
#   TYPE       HTTPMOD
#   value     
#   CompiledRegexes:
#   HttpUtils:
#     data       
#     displayurl https://DEINE_PIHOLE_IP_GGF_MIT_:PORT_WENN_NICHT_STANDARD/api/info/messages/count
#     header     X-FTL-SID: $sid
#     httpversion 1.0
#     hu_blocking 0
#     ignoreredirects 1
#     loglevel   4
#     redirects  0
#     timeout    2
#     url        https://DEINE_PIHOLE_IP_GGF_MIT_:PORT_WENN_NICHT_STANDARD/api/info/messages/count
#     sslargs:
#   QUEUE:
#   READINGS:
#     2025-07-07 18:39:44   available_updates 0
#     2025-07-05 22:42:41   error_hint      The API is hosted at pi.hole/api, not pi.hole/admin/api
#     2025-07-05 22:42:41   error_key       bad_request
#     2025-07-05 22:42:41   error_message   Bad request
#     2025-07-05 22:42:41   took            6.53266906738281e-05
#   REQUEST:
#     context    get
#     data       
#     header     X-FTL-SID: $sid
#     ignoreredirects 0
#     num        05
#     retryCount 0
#     type       get05
#     url        %%base_url%%/info/messages/count
#   lastpoll:
#     FTL_info   1751906572.2516
#     FTL_messages 1751906572.2516
#     FTL_status 1751906572.2516
#     FTL_summary 1751906572.2516
#     FTL_version 1751906332.17786
#
setstate pihole blocking
setstate pihole 2025-07-07 18:39:44 available_updates 0
setstate pihole 2025-07-05 22:42:41 error_hint The API is hosted at pi.hole/api, not pi.hole/admin/api
setstate pihole 2025-07-05 22:42:41 error_key bad_request
setstate pihole 2025-07-05 22:42:41 error_message Bad request
setstate pihole 2025-07-05 22:42:41 took 6.53266906738281e-05

[/code]

in der 99_myutils:
######################################################################################
#### PiHole piholeV6DevStateIcon
#
sub piholeV6DevStateIcon
{
    my $name = shift;
    my $noHeader=shift;
   
    $noHeader=0 if(!defined($noHeader));
   
    #get %%base_url%% replacement from httpmod device (using HTTPMOD method)
    # -> this is the url to the web-ui of Pi-Hole
    my $baseURL= "https://".HTTPMOD::DoReplacement($defs{$name},'get','%%ip%%')."/admin/";

    #get required readings from pihole httpmod device
    my $state =ReadingsVal($name,'blocking','unknown');
    my $totalQueries = ReadingsVal($name,'queries_total','0');
    my $blocked = ReadingsVal($name,'queries_blocked','0');
    my $blockedPercentage = round(ReadingsVal($name,'queries_percent_blocked','0'),1);
    my $adListCount =ReadingsVal($name,'gravity_domains_being_blocked','0');
    my $messageCount=ReadingsNum($name,'count','0');
 
    my $ver_info = 'CORE: '.ReadingsVal($name,'version_core_local_version','unknown').' => '.ReadingsVal($name,'version_core_remote_version','unknown');
       $ver_info.= "\nFTL: ".ReadingsVal($name,'version_ftl_local_version','unknown').' => '.ReadingsVal($name,'version_ftl_remote_version','unknown');
       $ver_info.= "\nWEB: ".ReadingsVal($name,'version_web_local_version','unknown').' => '.ReadingsVal($name,'version_web_remote_version','unknown');
 
    my $ftl_upd=ReadingsNum($name,'FTL_update',0);
    my $core_upd=ReadingsNum($name,'core_update',0);
    my $web_upd=ReadingsNum($name,'web_update',0);

    my $anyUpd=$ftl_upd+$core_upd+$web_upd+0;
 

    #prepare dedicated css
    #hint: html of device overview is by default embedded in a <div> container
    #      which has id attribute set to device's NAME
    my $styleClass ='<style>';
       $styleClass.='#'.$name.' svg {height:15px; width:15px; padding-right:1px;} ';
       $styleClass.='#'.$name.' td {padding-left:10px; padding-right:10px} ';
       $styleClass.='</style>';
   
    #prepare images
    #ist schön bunt, wird aber nicht benötigt
    #my $imgQueries=FW_makeImage('it_i-net@cyan');
    #ist schön bunt, wird aber nicht benötigt   
    #my $imgBlocked=FW_makeImage('time_manual_mode@red');
    my $imgState  =FW_makeImage($state eq 'enabled' ? '15px-green' : '15px-red');
       $imgState  =FW_makeImage('15px-orange') if ($state eq 'enabled' and $messageCount > 0);
    my $imgUpdate =FW_makeImage($anyUpd > 0 ? '15px-red' : '15px-green',$ver_info); 

        if ($anyUpd > 0) {
                # fhem("setreading ".$name." available_updates 1")
                readingsSingleUpdate($defs{$name},"available_updates","1",1)
        } else {
                # fhem("setreading ".$name." available_updates 0")
                readingsSingleUpdate($defs{$name},"available_updates","0",0)
        }

    #prepare disable/enable command
    my $cmd='';
    #my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name.' PiHole';
    my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name . ' ';
    if($state eq 'disabled') {
        $cmd =$callMe.'enable">enable</a>';   
    } else {
        $cmd  =       $callMe.'disable 60">1</a>';
        $cmd .= ' | '.$callMe.'disable 300">5</a>';       
        $cmd .= ' | '.$callMe.'disable 600">10</a>';
       #$cmd .= ' | '.$callMe.'disable 900">15</a>';
    }

    #finally build the html for device overview
    my $ret  = $styleClass;
       $ret .= '<table border=0"><tr>';
       #if second argument of this method call is true (=1)
       #then do NOT create a table header. Defaults to false (=0)
       if(!$noHeader) {     
               $ret .= '<td><center>state</center></td>';
               $ret .= '<td><center>queries</center></td>';
               $ret .= '<td><center>blocked</center></td>';
               #$ret .= '<th>Adlist</th>';     
               $ret .= '<td><center>'.($state eq 'enabled' ? 'disabled':'disabled').'</center></td>';
            $ret .= '<td><center>update</center></td>';
               $ret .= '</tr><tr>';
       }     
       $ret .= '<td><center><a href="'.$baseURL.'?sid='.urlEncode(InternalVal("$name","sid","")).'" target="_blank">'.$imgState.'</a></center></td>';
       #$imgQueries und $imgBlocked entfernt
       #$ret .= '<td><center>'.$imgQueries.' '.$totalQueries.'</center></td>';
       #$ret .= '<td><center>'.$imgBlocked.' '.$blocked.' ('.$blockedPercentage.'%)'.'</center></td>';
       $ret .= '<td><center>'.$totalQueries.'</center></td>';
       $ret .= '<td><center>'.$blocked.' ('.$blockedPercentage.'%)'.'</center></td>';
       #$ret .= '<td>'.$imgAdList.' '.$adListCount.'</td>';
       $ret .= '<td><center>'.$cmd.'</center></td>';
       $ret .= '<td><center>'.$imgUpdate.'</center></td>';
       $ret .= '</tr></table>';

    return $ret;
}
Titel: Aw: FHEM und pihole V6
Beitrag von: Ralli am 07 Juli 2025, 21:06:37
Zitat von: Jewe am 07 Juli 2025, 18:45:17attr pihole replacement02Value DEINE_PIHOLE_IP_GGF_MIT_:PORT_WENN_NICHT_STANDARD

Dein Ernst?
Titel: Aw: FHEM und pihole V6
Beitrag von: Jewe am 08 Juli 2025, 19:00:14
Dein Ernst?
[/quote]

Hallo Ralli,

jaein, ich hatte auch noch den replacement05Value mit der IP drin und das wohl übersehen. Mein Fehler und auch dass ich die Vorlage auf das alte Define übernommen hatte war auch nicht so wirklich klug. Hatte gedacht ich mache es mir einfach, stattdessen viel Arbeit auch für Euch. Sorry.

Habe das gerät nun gelöscht und komplett neu gemacht und so funkttioniert es auch.

LG, Jens