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
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.
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
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
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
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.
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
Hallo Ralli,
meine Tests waren erfolgreich. Also noch einmal vielen, vielen Dank. Ich habe noch ein paar Kleinigkeiten angepasst.
- Da eine "sub" für die Version 5 in der 99_myUtils schon vorhanden war, habe ich Deine in piholeV6DevStateIcon umbenannt.
- Dort habe ich auch die führenden Nullen für die Darstellung von "Querries" und "Blocked" entfernt.
- 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".
Die Änderungen kann ich gerne hier bereitstellen.
Ein paar Fragen habe ich habe dennoch:
- Unter "error_key" und "error_message" steht jeweils "unauthorized" bzw. "Unauthorized". Die Daten werden aber korrekt ausgelesen.
- Kann ich die Abfragen in der Browser-Eingabezeile auch direkt testen? in der V5 waren es ja einfach nur https-Aufrufe.
Viele Grüße und Danke für Deine Geduld
Jürgen
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
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.
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
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
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
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
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
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
Hallo Jürgen,
wann wird den das Reading presence gebildet?
my $presence =ReadingsVal($name,'presence','unknown');
Grüße Jörg
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
Hallo Jürgen,
danke. Und, gute Idee.
Grüße Jörg
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
set pihole disable 0
set pihole enable
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.
set pihole disable 0
Liefert: set value 0 is not within defined range
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
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!
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
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?
Du musst folgenden Befehl eingeben:
set pihole storeKeyValue api_password <DEIN_PIHOLE_API_PASSWORT>
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
Dann versuche mal die Routine aus meinem Beitrag (https://forum.fhem.de/index.php?msg=1329416).
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
Zitat von: Rudi_Hirsch am 01 März 2025, 14:46:04Zitat 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
Zitat von: bertl am 01 März 2025, 16:34:30Zitat 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.
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
Ich habe eigentlich die 192.168.0.115:8080/admin. Muss ich den Port angeben und wo trage ich das Passwort ein?
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
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.
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.
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.
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/";
Super. Danke hat geklappt
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.
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.
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.
mein name: pihole -> { my $docker_jn=ReadingsVal('pihole','version_docker_local','unknown')} ->
leere Antwort.
Macht nix, funktioniert ja sonst alles
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.
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
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.
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
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
Habe alles exakt nach RALLI gemacht (importiert). Nur bei 99_myUtils habe ich die Deaktivierungs-Zeiten nach Forum angepasst
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
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
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?
Was ist bei Copy& Paste so schwierig?
Ist doch nur kopieren und eigene Daten eintragen.
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
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.
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;
}
Zitat von: Jewe am 07 Juli 2025, 18:45:17attr pihole replacement02Value DEINE_PIHOLE_IP_GGF_MIT_:PORT_WENN_NICHT_STANDARD
Dein Ernst?
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