Pi-Hole : Statistiken in Fhem anzeigen

Begonnen von fh168, 08 Februar 2018, 16:46:32

Vorheriges Thema - Nächstes Thema

draddy

moin,

findest du im pihole Installationsverzeichnis.

Standardmäßig unter: /etc/pihole/setupVars.conf in der Datei gibts "WEBPASSWORD=" und daneben eine lange wurscht aus Zahlen und Buchstaben - diese  wurscht brauchst du komplett ;)
OMV5@AsRock j3455 8GB RAM
FHEM@Docker, Shelly "starter pack" 4x PlugS, 2x Bulb Duo RGB, Shelly 2.5, Shelly Plus 1, DoorBird 2103V

Hackstall

Hi,

Dein Codeextract finde ich echt gut. Ich habe es auch schon nach SmartVisu sortiert.

Eine Frage hätte ich noch:
Gibt es auch ein Reading für die Remaining Non-Blocking Zeit.
Im Dashboard für PiHole wir diese angezeigt.

Danke Andreas

draddy

also ich hab wenigstens keins gefunden ^^

kA ob man  eventuell irgendwie nen countdown bauen kann, den man zeitgleich starten könnte, so
"wenn disable 300 sec --> start countdown 300 sec"

eventuell hat da jemand ne idee oder findet gar ein uns unbekanntes reading ^^
OMV5@AsRock j3455 8GB RAM
FHEM@Docker, Shelly "starter pack" 4x PlugS, 2x Bulb Duo RGB, Shelly 2.5, Shelly Plus 1, DoorBird 2103V

Benni

Nachdem ich mir gestern mal kurz 'n Pi-Hole aufgesetzt und in mein Netzwerk integriert habe, wollte der natürlich auch für das statistische Grundbedürfnis in FHEM integriert werden.

Dabei bin ich direkt über diesen Thread hier gestolpert und konnte das damit auch fix umsetzen. Danke dafür!

Ich habe das ganze aber inzwischen noch etwas verfeinert und ein wenig generalisert und stelle das hier mal kurz zur Verfügung:

Das HTTPMOD-Device habe ich so erweitert, das nur an einer Stelle die IP-Adresse des PI-Hole eingetragen werden muss und der Token für die Authentifizierung im Device nicht mehr sichtbar ist.

Die verwendete devStateIcon-Perl-Funktion habe ich in die 99_myUtils.pm ausgelagert und so erweitert, dass keine CommandAlias mehr benötigt um Disable/Enable auszuführen Das geht direkt über set/get am HTTPMOD-Device

Zunächst mal das Raw-Listing meines HTTPMOD-Devices:


defmod pihole HTTPMOD none 60
attr pihole alias Pi-Hole
attr pihole devStateIcon {piholeDevStateIcon($name)}
attr pihole enforceGoodReadingNames 1
attr pihole event-on-change-reading .*
attr pihole extractAllJSON 1
attr pihole get01Name statistics
attr pihole get01Poll 1
attr pihole get01URL %%api_url%%
attr pihole getURL %%api_url%%
attr pihole icon it_raspberry_logo
attr pihole replacement01Mode key
attr pihole replacement01Regex %%pihole-token%%
attr pihole replacement01Value pihole-token
attr pihole replacement02Mode text
attr pihole replacement02Regex %%api_url%%
attr pihole replacement02Value %%base_url%%/api.php
attr pihole replacement03Mode text
attr pihole replacement03Regex %%base_url%%
attr pihole replacement03Value http://%%ip%%/admin
attr pihole replacement04Mode text
attr pihole replacement04Regex %%ip%%
attr pihole replacement04Value 192.168.3.123
attr pihole room Allgemein->Netzwerk
attr pihole set01FollowGet statistics
attr pihole set01Hint 10,60,180,300,600,900
attr pihole set01Max 900
attr pihole set01Min 10
attr pihole set01Name PiHoleDisable
attr pihole set01URL %%api_url%%?disable=$val&auth=%%pihole-token%%
attr pihole set02FollowGet statistics
attr pihole set02Name PiHoleEnable
attr pihole set02NoArg 1
attr pihole set02URL %%api_url%%?enable&auth=%%pihole-token%%
attr pihole stateFormat gravity_last_updated_absolute


Angepasst werden müssen im Device jetzt eigentlich nur 2 Dinge, damit das bei euch funktioniert.

Das ist zum einen die IP-Adresse des Pi-Hole, die muss im Attribut replacement04Value angeben werden:


attr pihole replacement04Value <ip-addresse-des-pihole>


Zum anderen muss der Token (WEBPASSWORD) für die Authentifizierung per set storeKeyValue als pihole-token gespeichert werden:


set pihole storeKeyValue pihole-token <WEBPASSWORD>


Das WEBPASSWORD findet man, wie weiter oben schon beschrieben in der Datei /etc/pihole/setupVars.conf auf dem Pi-Hole Rechner

Damit funktioniert jetzt auf jeden Fall schon mal die Abfrage der aktuellen Daten. Als Intervall habe ich 60 Sekunden gewählt. Das kann man bei Bedarf natürlich auch verlängern.

Die Abfrage kann auch jederzeit mit


get pihole statistics


manuell angestoßen werden.

Damit die Anzeige für devStateIcon auch korrekt funktioniert, braucht es in der 99_myUtils.pm noch folgende Funktion:


sub piholeDevStateIcon
{
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','%%base_url%%');

#get required readings from pihole httpmod device
my $state =ReadingsVal($name,'status','unknown');
my $totalQueries = ReadingsVal($name,'dns_queries_all_types','0');
my $blocked = ReadingsVal($name,'ads_blocked_today','0');
my $blockedPercentage = round(ReadingsVal($name,'ads_percentage_today','0'),1);
my $adListCount =ReadingsVal($name,'domains_being_blocked','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 $imgAdList =FW_makeImage('edit_delete@green');
my $imgState  =FW_makeImage($state eq 'enabled' ? '15px-green' : '15px-red');

#prepare disable/enable command
my $cmd='';
my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name.' PiHole';
if($state eq 'disabled') {
$cmd =$callMe.'Enable">Enable</a>';
} else {
$cmd  =       $callMe.'Disable 60">1min</a>';
$cmd .= ' | '.$callMe.'Disable 300">5min</a>';
$cmd .= ' | '.$callMe.'Disable 600">10min</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>'.($state eq 'enabled' ? 'Disable (Minutes)':'Disabled').'</th>';

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

return $ret;
}


(Ja, das ist bewußt etwas ausführlicher ausgestaltet!  ;) )

Das ergibt dann die Anzeige der Device-Overview, wie in den angehängten Screenshots zu sehen.

Wem die Kopfzeile in der generierten Tabelle zu viel ist kann sie bei Bedarf auch per zusätzlichem Parameter beim Funktionsaufruf abschalten:


attr pihole devStateIcon {piholeDevStateIcon($name,1)}


Ach ja, falls die Frage auftaucht, wieso das bei mir so aussieht, wie auf den Screenshots zu sehen: Ich verwende das S18-Theme mit eigenem CSS.
Dementsprechend sind auch die styles, die in der piholeDevStateIcon-Funktion in das html eingebaut werden darauf angepasst.

Die Anzahl der Einträge aus der AdList habe ich bei mir aus der Übersicht rausgeschmissen, das ist keine Information, die ich so präsent brauche. Das schaue ich dann bei Bedarf im entsprechenden Reading oder auf dem Pi-Hole-UI direkt an.

Apropos Pi-Hole-UI: Das kann natürlich auch direkt aus der Device-Overview, per Klick auf das (grüne oder rote) Status-Icon aufgerufen werden.

Viel Spaß damit!

gb#

mcp

#34
damit das mit Pi-hole FTL >= v5.20 und Web >= v5.18 funktioniert, ist eine Änderung zum Post 33 (https://forum.fhem.de/index.php/topic,84031.msg1249306.html#msg1249306) nötig, da die API Zugriffe weiter eingeschränkt wurden:


attr pihole get01URL %%api_url%%?summaryRaw&auth=%%pihole-token%%


Siehe auch:
https://pi-hole.net/blog/2022/12/21/pi-hole-ftl-v5-20-and-web-v5-18-released/
https://pi-hole.net/blog/2022/11/17/upcoming-changes-authentication-for-more-api-endpoints-required/#page-content

weiterhin denke ich, daß im Post 33 die Zeile:


attr pihole getURL %%api_url%%


zu viel ist :)
Maintainer: 98_vitoconnect.pm
Raspberry Pi 4B, 4 GB RAM, 32 GB SD Karte
Raspbian Bullseye 32-bit, FHEM up2date

Benni

Ja, das ist beides korrekt und in meiner laufenden Variante auch bereits inkludiert, bzw. bereinigt:


defmod pihole HTTPMOD none 60
attr pihole alias Pi-Hole
attr pihole devStateIcon {piholeDevStateIcon($name)}
attr pihole enforceGoodReadingNames 1
attr pihole event-on-change-reading .*
attr pihole get01ExtractAllJSON 1
attr pihole get01Name summary
attr pihole get01Poll 1
attr pihole get01URL %%api_url%%?summaryRaw&%%auth%%
attr pihole get02ExtractAllJSON 1
attr pihole get02Name versions
attr pihole get02Poll 1
attr pihole get02PollDelay 3600
attr pihole get02URL %%api_url%%?versions&%%auth%%
attr pihole get03JSON status
attr pihole get03Name FTL_status
attr pihole get03URL %%api_url%%?status&%%auth%%
attr pihole get04JSON type
attr pihole get04Name FTL_type
attr pihole get04URL %%api_url%%?type&%%auth%%
attr pihole get05JSON version
attr pihole get05Name FTL_version
attr pihole get05URL %%api_url%%?version&%%auth%%
attr pihole group System
attr pihole icon it_raspberry_logo
attr pihole replacement01Mode text
attr pihole replacement01Regex %%auth%%
attr pihole replacement01Value auth=%%pihole-token%%
attr pihole replacement02Mode key
attr pihole replacement02Regex %%pihole-token%%
attr pihole replacement02Value pihole-token
attr pihole replacement03Mode text
attr pihole replacement03Regex %%api_url%%
attr pihole replacement03Value %%base_url%%/api.php
attr pihole replacement04Mode text
attr pihole replacement04Regex %%base_url%%
attr pihole replacement04Value http://%%ip%%/admin
attr pihole replacement05Mode text
attr pihole replacement05Regex %%ip%%
attr pihole replacement05Value 192.168.3.123
attr pihole set01ExtractAllJSON 1
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 %%api_url%%?disable=$val&%%auth%%
attr pihole set02ExtractAllJSON 1
attr pihole set02Name enable
attr pihole set02NoArg 1
attr pihole set02ParseResponse 1
attr pihole set02URL %%api_url%%?enable&%%auth%%
attr pihole stateFormat status
attr pihole userReadings gravity_last_updated_abstime:gravity_last_updated_absolute.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_updated_absolute',0)))}


Weiterhin braucht es die FollowGets in den set-Commands (enable/disable) nicht, da der neue Status direkt als Anttwort zurückgeliefert wird und entsprechend geparsed werden kann.

Ich habe auch noch mit anderen API-Teilen (FTL_.*) experimentiert, weiß aber nicht, ob man das wirklich braucht, bzw. in wie weit das sinnvoll ist. Egal ... es ist jetzt mal drin! :)

gb#

MadMax-FHEM

Bin aktuell dabei meine Doku zu vervollständigen (also habe ich schon vollständig aber ich will alles bei entspr. Devices in comment dokumentieren :)  ).

Was mir noch gefehlt hat war piHole (gut unbound fehlt auch noch aber das packe ich bei piHole mit dazu ;)  )...

Habe mich an diesen Thread erinnert :)

@Benni: vielen DANK! Ist echt prima!

ich hatte zunächst das "nackte" HTTPMOD, dann das attrTemplate (spricht etwas dagegen, das von dir, Benni, als attrTemplate zu nehmen? Zugegeben ohne, dass ich auch nur annähernd wüsste wie man das da rein kriegen würde :-\  )...
...und aktuell das von Benni :)

Allerdings haben bei mir die web-cmds zum Deaktivieren nicht funktioniert.

Ich musste folgendes ändern:

# my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name.' PiHole';
my $callMe='<a href="/fhem?cmd.'.$name.'=set '.$name . ' ';


Gutes neues Jahr, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Gisbert

Hallo zusammen,

ich hab entsprechend dieser Seite: https://pi-hole.net/blog/2022/11/17/upcoming-changes-authentication-for-more-api-endpoints-required/#page-content die Definition geändert und dieses Attribut gelöscht:
attr PiHoleInfo getURL http://127.0.0.1/admin/api.php

Ich komme aber nicht weiter und bekomme keine neuen Readings.

Hier ein list meines Devices:
define PiHoleInfo HTTPMOD geheim 1800
attr PiHoleInfo event-on-change-reading .*
attr PiHoleInfo extractAllJSON 1
attr PiHoleInfo group Performance
attr PiHoleInfo icon it_internet
attr PiHoleInfo room Network
attr PiHoleInfo stateFormat DNS-Anfragen: dns_queries_today<br/>geblockt: ads_blocked_today (ads_percentage_today_round%)
attr PiHoleInfo userReadings ads_percentage_today_round {round(ReadingsVal('PiHoleInfo','ads_percentage_today',''),1)}
#   BUSY       0
#   CFGFN      ./FHEM/NetzwerkServerTV.cfg
#   DEF        http://127.0.0.1/admin/api.php?status&auth=geheim 1800
#   FUUID      5d3ff28a-f33f-e986-ddb4-c82c89992d7c2681
#   Interval   1800
#   MainURL    http://127.0.0.1/admin/api.php?status&auth=geheim
#   ModuleVersion 4.1.14 - 19.8.2022
#   NAME       PiHoleInfo
#   NOTIFYDEV  global
#   NR         1217
#   NTFY_ORDER 50-PiHoleInfo
#   STATE      DNS-Anfragen: 23721<br/>geblockt: 9436 (39.8%)
#   TYPE       HTTPMOD
#   eventCount 4
#   value     
#   HTTPCookieHash:
#     PHPSESSID;/:
#       Name       PHPSESSID
#       Options    path=/; HttpOnly; SameSite=Strict
#       Path       /
#       Value      uq2bps8pkvdcdnu7sb0u3fq9kl
#   HttpUtils:
#     NAME       
#     addr       http://127.0.0.1:80
#     auth       0
#     buf       
#     code       200
#     compress   1
#     conn       
#     data       
#     displayurl http://127.0.0.1/admin/api.php?status&auth=geheim
#     header     Cookie: PHPSESSID=uq2bps8pkvdcdnu7sb0u3fq9kl
#     host       127.0.0.1
#     httpheader HTTP/1.0 200 OK
#Expires: Thu, 19 Nov 1981 08:52:00 GMT
#Cache-Control: no-store, no-cache, must-revalidate
#Pragma: no-cache
#Set-Cookie: PHPSESSID=uq2bps8pkvdcdnu7sb0u3fq9kl; path=/; HttpOnly; SameSite=Strict
#Content-type: application/json
#X-Pi-hole: The Pi-hole Web interface is working!
#X-Frame-Options: DENY
#X-XSS-Protection: 1; mode=block
#X-Content-Type-Options: nosniff
#Content-Security-Policy: default-src 'self' 'unsafe-inline';
#X-Permitted-Cross-Domain-Policies: none
#Referrer-Policy: same-origin
#Content-Length: 20
#Connection: close
#Date: Sat, 07 Jan 2023 19:52:48 GMT
#Server: lighttpd/1.4.59
#     httpversion 1.0
#     hu_blocking 0
#     hu_filecount 1
#     hu_port    80
#     hu_portSfx
#     ignoreredirects 1
#     loglevel   4
#     path       /admin/api.php?status&auth=geheim
#     protocol   http
#     redirects  0
#     timeout    2
#     url        http://127.0.0.1/admin/api.php?status&auth=geheim
#     sslargs:
#   QUEUE:
#   READINGS:
#     2023-01-04 13:39:45   ads_blocked_today 9436
#     2023-01-04 13:39:45   ads_percentage_today 39.779099
#     2023-01-07 20:52:48   ads_percentage_today_round 39.8
#     2023-01-04 13:39:45   clients_ever_seen 6
#     2023-01-04 13:39:45   dns_queries_all_replies 23721
#     2023-01-04 13:39:45   dns_queries_all_types 23721
#     2023-01-04 13:39:45   dns_queries_today 23721
#     2023-01-04 13:39:45   domains_being_blocked 177450
#     2023-01-04 13:39:45   gravity_last_updated_absolute 1672541109
#     2023-01-04 13:39:45   gravity_last_updated_file_exists 1
#     2023-01-04 13:39:45   gravity_last_updated_relative_days 3
#     2023-01-04 13:39:45   gravity_last_updated_relative_hours 9
#     2023-01-04 13:39:45   gravity_last_updated_relative_minutes 54
#     2023-01-04 13:39:45   privacy_level   0
#     2023-01-04 13:39:45   queries_cached  4333
#     2023-01-04 13:39:45   queries_forwarded 9685
#     2023-01-04 13:39:45   reply_BLOB      81
#     2023-01-04 13:39:45   reply_CNAME     7640
#     2023-01-04 13:39:45   reply_DNSSEC    0
#     2023-01-04 13:39:45   reply_DOMAIN    0
#     2023-01-04 13:39:45   reply_IP        13655
#     2023-01-04 13:39:45   reply_NODATA    1004
#     2023-01-04 13:39:45   reply_NONE      0
#     2023-01-04 13:39:45   reply_NOTIMP    0
#     2023-01-04 13:39:45   reply_NXDOMAIN  1007
#     2023-01-04 13:39:45   reply_OTHER     0
#     2023-01-04 13:39:45   reply_REFUSED   0
#     2023-01-04 13:39:45   reply_RRNAME    24
#     2023-01-04 13:39:45   reply_SERVFAIL  0
#     2023-01-04 13:39:45   reply_UNKNOWN   310
#     2023-01-07 20:52:48   status          enabled
#     2023-01-04 13:39:45   unique_clients  6
#     2023-01-04 13:39:45   unique_domains  3272
#   REQUEST:
#     context    reading
#     data       
#     header     
#     ignoreredirects 0
#     num        unknown
#     retryCount 0
#     type       update
#     url        http://127.0.0.1/admin/api.php?status&auth=geheim
#   defptr:
#     readingBase:
#       status     reading
#     readingNum:
#       status     unknown
#     readingOutdated:
#     requestReadings:
#       update:
#         status     reading unknown
#   helper:
#     bm:
#       CODE(0x559147fa7450):
#         cnt        129
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        07.01. 20:40:13
#         max        0.0275039672851562
#         tot        0.106866836547852
#         mAr:
#           HASH(0x55914fd60ea8)
#           PiHoleInfo
#           attrTemplate
#           ?
#       CODE(0x559147fa8930):
#         cnt        18
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        07.01. 20:53:26
#         max        0.000211000442504883
#         tot        0.00150442123413086
#         mAr:
#           HASH(0x55914fd60ea8)
#           PiHoleInfo
#           ?
#       CODE(0x55914811a870):
#         cnt        6
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        07.01. 20:37:28
#         max        0.00323605537414551
#         tot        0.0158782005310059
#         mAr:
#           HASH(0x55914fd60ea8)
#           PiHoleInfo HTTPMOD http://127.0.0.1/admin/api.php?auth=geheim 1800
#       CODE(0x55914811aa20):
#         cnt        40
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        07.01. 20:42:32
#         max        2.19345092773438e-05
#         tot        0.000459194183349609
#         mAr:
#           HASH(0x55914fd60ea8)
#           HASH(0x559142812940)
#       CODE(0x55914811be88):
#         cnt        24
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        07.01. 20:42:32
#         max        0.00948500633239746
#         tot        0.0834879875183105
#         mAr:
#           set
#           PiHoleInfo
#           group
#           Performance
#
setstate PiHoleInfo DNS-Anfragen: 23721<br/>geblockt: 9436 (39.8%)
setstate PiHoleInfo 2023-01-04 13:39:45 ads_blocked_today 9436
setstate PiHoleInfo 2023-01-04 13:39:45 ads_percentage_today 39.779099
setstate PiHoleInfo 2023-01-07 20:52:48 ads_percentage_today_round 39.8
setstate PiHoleInfo 2023-01-04 13:39:45 clients_ever_seen 6
setstate PiHoleInfo 2023-01-04 13:39:45 dns_queries_all_replies 23721
setstate PiHoleInfo 2023-01-04 13:39:45 dns_queries_all_types 23721
setstate PiHoleInfo 2023-01-04 13:39:45 dns_queries_today 23721
setstate PiHoleInfo 2023-01-04 13:39:45 domains_being_blocked 177450
setstate PiHoleInfo 2023-01-04 13:39:45 gravity_last_updated_absolute 1672541109
setstate PiHoleInfo 2023-01-04 13:39:45 gravity_last_updated_file_exists 1
setstate PiHoleInfo 2023-01-04 13:39:45 gravity_last_updated_relative_days 3
setstate PiHoleInfo 2023-01-04 13:39:45 gravity_last_updated_relative_hours 9
setstate PiHoleInfo 2023-01-04 13:39:45 gravity_last_updated_relative_minutes 54
setstate PiHoleInfo 2023-01-04 13:39:45 privacy_level 0
setstate PiHoleInfo 2023-01-04 13:39:45 queries_cached 4333
setstate PiHoleInfo 2023-01-04 13:39:45 queries_forwarded 9685
setstate PiHoleInfo 2023-01-04 13:39:45 reply_BLOB 81
setstate PiHoleInfo 2023-01-04 13:39:45 reply_CNAME 7640
setstate PiHoleInfo 2023-01-04 13:39:45 reply_DNSSEC 0
setstate PiHoleInfo 2023-01-04 13:39:45 reply_DOMAIN 0
setstate PiHoleInfo 2023-01-04 13:39:45 reply_IP 13655
setstate PiHoleInfo 2023-01-04 13:39:45 reply_NODATA 1004
setstate PiHoleInfo 2023-01-04 13:39:45 reply_NONE 0
setstate PiHoleInfo 2023-01-04 13:39:45 reply_NOTIMP 0
setstate PiHoleInfo 2023-01-04 13:39:45 reply_NXDOMAIN 1007
setstate PiHoleInfo 2023-01-04 13:39:45 reply_OTHER 0
setstate PiHoleInfo 2023-01-04 13:39:45 reply_REFUSED 0
setstate PiHoleInfo 2023-01-04 13:39:45 reply_RRNAME 24
setstate PiHoleInfo 2023-01-04 13:39:45 reply_SERVFAIL 0
setstate PiHoleInfo 2023-01-04 13:39:45 reply_UNKNOWN 310
setstate PiHoleInfo 2023-01-07 20:52:48 status enabled
setstate PiHoleInfo 2023-01-04 13:39:45 unique_clients 6
setstate PiHoleInfo 2023-01-04 13:39:45 unique_domains 3272


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

MadMax-FHEM

Also ich habe das hier https://forum.fhem.de/index.php/topic,84031.msg1253950.html#msg1253950 (2 Posts weiter oben ;)  ) laufen mit meiner Änderung von hier https://forum.fhem.de/index.php/topic,84031.msg1255307.html#msg1255307 (1 Post über deinem).
piHole ist aktuell, heute ein Update gemacht und bei mir tut es (zumindest soweit ich das sehen kann)...

Du hast eine relativ simple HTTPMOD-Variante?
(Vom Beginn des Threads?)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Gisbert

Hallo Joachim,

vielen Dank für deine Hilfe.
Ist dein Rat, deine Definition zu benutzen? Das mache ich dann gerne. Ich war nur etwas irritiert über das "none" in deiner Definition. Ist das das WEBPASSWORD"?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

MadMax-FHEM

#40
Ist ja nicht meine DEF ;) sondern die von Benni 8)

Das none wird dann durch das ErsetzteRegex -> IP mit der IP geändert.
PW ist dann ein set Irgendwas...

Steht aber doch alles in meinen Links bzw. in den Links meiner Links ;)

Also ein paar Posts weiter oben ist die erste (neue) DEF von Benni mit Erläuterung: dort die Erläuterungen lesen
EDIT: Erläuterungen und myUtils für devStateIcon https://forum.fhem.de/index.php/topic,84031.msg1249306.html#msg1249306

Dann die DEF aus meinem Link zu Bennis neuester (neuen) DEF: dort dann die DEF nehmen
EDIT: dann von hier die DEF https://forum.fhem.de/index.php/topic,84031.msg1253950.html#msg1253950

Und (wenn du willst ;)  ) dann bei  mir die Korrektur bzgl. der WEB-cmds mit "disable 1min 5min 10min"...
EDIT: und meine Korrektur in der myUtils https://forum.fhem.de/index.php/topic,84031.msg1255307.html#msg1255307

Du brauchst ja auch die myUtils-Sub für das defSateIcon (auch erster Beitrag von Benni ein paar Posts weiter oben)...
EDIT: oben verlinkt... .)

P.S.: kein Rat ;) Aber so läuft es bei mir (immer noch)... 8)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Gisbert

Hallo Joachim,

ich werde die Posts morgen studieren und melde mich dann hoffentlich mit einer Erfolgsmeldung, oder falls nicht, dann mit Fragen - so oder so, melde ich mich.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

GoldenAmerican

Hallo Benny,

nachdem ich aus dem Beitrag #33 die Definition und den myUtils-Teil übernommen habe läuft es auf Anhieb. Super Leistung -> vielen Dank.
Aber: Lässt sich nicht der FTL/WEB/CORE - Status mit in die Übersicht integrieren? Dann muss man nicht immer in das Device oder in die WebUI vom Pihole schauen ob es Updates gibt. Nur als Text in ROT/GRÜN würde ja schon reichen, um zu sehen, ob alles aktuell ist. Leider ist das zu hoch für mich, daher die Frage an dich.

Grüße Ralf

MadMax-FHEM

#43
Zitat von: GoldenAmerican am 03 März 2023, 21:50:06
Hallo Benny,

nachdem ich aus dem Beitrag #33 die Definition und den myUtils-Teil übernommen habe läuft es auf Anhieb. Super Leistung -> vielen Dank.
Aber: Lässt sich nicht der FTL/WEB/CORE - Status mit in die Übersicht integrieren? Dann muss man nicht immer in das Device oder in die WebUI vom Pihole schauen ob es Updates gibt. Nur als Text in ROT/GRÜN würde ja schon reichen, um zu sehen, ob alles aktuell ist. Leider ist das zu hoch für mich, daher die Frage an dich.

Grüße Ralf

Ich weiß nicht genau was du meinst, habe aber mal was "gebastelt":


sub piholeDevStateIcon
{
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','%%base_url%%');

#get required readings from pihole httpmod device
my $state = ReadingsVal($name,'status','unknown');
my $totalQueries = ReadingsVal($name,'dns_queries_all_types','0');
my $blocked = ReadingsVal($name,'ads_blocked_today','0');
my $blockedPercentage = round(ReadingsVal($name,'ads_percentage_today','0'),1);
my $adListCount = ReadingsVal($name,'domains_being_blocked','0');
# start extension
my $FTL_latest = ReadingsVal($name,'FTL_latest','0');
my $FTL_current = ReadingsVal($name,'FTL_current','0');
my $core_current = ReadingsVal($name,'core_current','0');
my $core_latest = ReadingsVal($name,'core_latest','0');
my $web_latest = ReadingsVal($name,'web_latest','0');
my $web_current = ReadingsVal($name,'web_current','0');
# end extension

#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 $imgAdList =FW_makeImage('edit_delete@green');
my $imgState  =FW_makeImage($state eq 'enabled' ? '15px-green' : '15px-red');

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

# start extension
  # check for version mismatch/update
  if($FTL_current ne $FTL_latest)
  {
    $FTL_current = "<span style=\"color:red\">".$FTL_current."</span>";
  }
 
  if($core_current ne $core_latest)
  {
    $core_current = "<span style=\"color:red\">".$core_current."</span>";
  }

  if($web_current ne $web_latest)
  {
    $web_current = "<span style=\"color:red\">".$web_current."</span>";
  }
# end extension

#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>';
# start extension
    $ret .= '<th>Core versions</th>';
    $ret .= '<th>FTL versions</th>';
    $ret .= '<th>Web versions</th>';
# end extension
    $ret .= '<th>'.($state eq 'enabled' ? 'Disable (Minutes)':'Disabled').'</th>';

    $ret .= '</tr><tr>';
}    
   $ret .= '<td><a href="'.$baseURL.'" target="_blank">'.$imgState.'</a></td>';
   $ret .= '<td>'.$imgQueries.' '.$totalQueries.'</td>';
   $ret .= '<td>'.$imgBlocked.' '.$blocked.' ('.$blockedPercentage.' %)'.'</td>';
# start extension
   $ret .= '<td>current: '.$core_current.' latest: '.$core_latest.'</td>';
   $ret .= '<td>current: '.$FTL_current.' latest: '.$FTL_latest.'</td>';
   $ret .= '<td>current: '.$web_current.' latest: '.$web_latest.'</td>';
# end extension
   $ret .= '<td>'.$cmd.'</td>';
   $ret .= '</tr></table>';

return $ret;
}


Sieht dann aus wie im Anhang...

EDIT: erweitert mit "update-check", wenn aktuelle Version ungleich der latest ist, dann wird die Version in Rot angezeigt...

EDIT: ergänzt mit web_current/web_latest (hatte ich zunächst gar nicht gesehen ;) Danke Benni ) und Reihenfolge an die Anzeige von piHole (unten) angepasst... 8)

EDIT: meine Erweiterungen/Änderungen sind zwischen # start extension und # end extension


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Benni

Versuch's mal damit, das ist der Stand (w.i.p.), so wie er im Moment Läuft:


defmod pihole HTTPMOD none 60
attr pihole alias Pi-Hole
attr pihole devStateIcon {piholeDevStateIcon($name)}
attr pihole enforceGoodReadingNames 1
attr pihole event-on-change-reading .*
attr pihole get01ExtractAllJSON 1
attr pihole get01Name summary
attr pihole get01Poll 1
attr pihole get01URL %%api_url%%?summaryRaw&%%auth%%
attr pihole get02ExtractAllJSON 1
attr pihole get02Name versions
attr pihole get02Poll 1
attr pihole get02PollDelay 3600
attr pihole get02URL %%api_url%%?versions&%%auth%%
attr pihole get03JSON status
attr pihole get03Name FTL_status
attr pihole get03URL %%api_url%%?status&%%auth%%
attr pihole get04JSON type
attr pihole get04Name FTL_type
attr pihole get04URL %%api_url%%?type&%%auth%%
attr pihole get05JSON version
attr pihole get05Name FTL_version
attr pihole get05URL %%api_url%%?version&%%auth%%
attr pihole group System
attr pihole icon it_raspberry_logo
attr pihole replacement01Mode text
attr pihole replacement01Regex %%auth%%
attr pihole replacement01Value auth=%%pihole-token%%
attr pihole replacement02Mode key
attr pihole replacement02Regex %%pihole-token%%
attr pihole replacement02Value pihole-token
attr pihole replacement03Mode text
attr pihole replacement03Regex %%api_url%%
attr pihole replacement03Value %%base_url%%/api.php
attr pihole replacement04Mode text
attr pihole replacement04Regex %%base_url%%
attr pihole replacement04Value http://%%ip%%/admin
attr pihole replacement05Mode text
attr pihole replacement05Regex %%ip%%
attr pihole replacement05Value <IP-ADDRESS-OF-PIHOLE>
attr pihole room Allgemein->Netzwerk,Uebersicht
attr pihole set01ExtractAllJSON 1
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 %%api_url%%?disable=$val&%%auth%%
attr pihole set02ExtractAllJSON 1
attr pihole set02Name enable
attr pihole set02NoArg 1
attr pihole set02ParseResponse 1
attr pihole set02URL %%api_url%%?enable&%%auth%%
attr pihole stateFormat status
attr pihole userReadings gravity_last_updated_abstime:gravity_last_updated_absolute.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_updated_absolute',0)))}


Damit gibt es auf alle Fälle folgende Readings:


FTL_current v5.21
FTL_latest v5.21
FTL_update 0
core_current v5.15.5
core_latest v5.15.5
core_update 0
web_current v5.18.4
web_latest v5.18.4
web_update 0


Die .*_update springen jeweils auf 1, wenn ein Update vorhanden ist.

Gruß Benni