Pi-Hole : Statistiken in Fhem anzeigen

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

Vorheriges Thema - Nächstes Thema

Gisbert

Zitat von: Gisbert am 07 Januar 2023, 21:38:08
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

Hallo Joachim,

ich hab deine Ratschläge und die Zusammenstellung befolgt - und es läuft auf Anhieb.
Eine Klitzekleinigkeit hätte ich noch.
Kann man in der myUtils-Definition verhindern, dass der Text im Header <th>TEXT</th> nicht fett dargestellt wird? Also State Queries Blocked Disable nicht fett sondern in normaler dünner Schrift.

Wenn ich auf Disable (Minutes) drücke, poppt ein Fenster mit folgendem Inhalt auf:
Unknown argument Disable, choose one of interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue disable:10,60,180,300,600,900 enable:noArg  attrTemplate:?,General_Info_httpmod.template,---DIV---------------------------------,pharmacy_emergency_service_germany,aponet_pharmacy_emergency_service_germany,---FUEL--------------------------------,clever_tanken_single_station,clever_tanken_multi_station,fuel_oil_check_esyoil,fuel_oil_check_heizoel24,---RADAR-------------------------------,blitzer_atudo,---TECH-PRINTER------------------------,hp_printer_config,hp_printer_cartridge_status,hp_printer_statistics,hp_printer_status,epson_printer_cartridge_status,brother_printer_cartridge_status,brother_scanner_ads_status,---TECH-DIV----------------------------,homebridge_videodoorbell,pihole_statistics,resol_solar,hm_fw_check_v2,aculfw_fw_check,tasmota_firmware_updates,zigbee2mqtt_daemon_updates,ESPEasy_firmware_updates,dnscrypt-proxy_updates,---WEATHER-----------------------------,DWD_weather_warnings,pegelonline,ORF_weather,bergfex_weather

Ich hab die sub minimal verändert, aber mit deiner originalen sub erhalte die das gleiche pop-up-Fenster.
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'),0);
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';
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>';
}

#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><center>state</center></th>';
    $ret .= '<th><center>queries</center></th>';
    $ret .= '<th><center>blocked</center></th>';
    $ret .= '<th><center>'.($state eq 'enabled' ? 'disable (min)':'Disabled').'</center></th>';

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

return $ret;
}


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

binford6000

#46
ZitatWenn ich auf Disable (Minutes) drücke, poppt ein Fenster mit folgendem Inhalt auf:

Da musst du 'Disable' auf 'disable' in der der sub piholeDevStateIcon ändern.
Der Setter im HTTPMOD device heißt schließlich auch 'disable':
$cmd  =       $callMe.'disable 60">1min</a>';
$cmd .= ' | '.$callMe.'disable 300">5min</a>';
$cmd .= ' | '.$callMe.'disable 600">10min</a>';


Gleiches gilt fürs Enablen  ;)

VG Sebastian

Ralli

Danke @fh168 und @Benni. Ich nutze pi-hole schon länger in einem Container, zwischenzeitlich habe ich im Zuge der 2-DNS-Strategie auch noch AdGuard in einem anderen Container laufen. Funktioniert prächtig.

Dank eurer Codeschnipsel habe ich nun zumindest pi-hole auch in FHEM "sichtbarer" gemacht als mit einer einfachen Presence-Definition.
Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240420) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

MadMax-FHEM

@Gisbert: in meiner Variante war aber disable etc. schon immer klein geschrieben? (und hat bei mir funktioniert) ;)

Wenn du die Überschrift nicht dick haben willst, dann folgendes ändern:


if(!$noHeader) {    
    $ret .= '<th>State</th>';
    $ret .= '<th>Queries</th>';
    $ret .= '<th>Blocked</th>';
    $ret .= '<th>FTL versions</th>';
    $ret .= '<th>Core versions</th>';
    $ret .= '<th>'.($state eq 'enabled' ? 'Disable (Minutes)':'Disabled').'</th>';

    $ret .= '</tr><tr>';
}    


in


if(!$noHeader) {    
    $ret .= '<td>State</td>';
    $ret .= '<td>Queries</td>';
    $ret .= '<td>Blocked</td>';
    $ret .= '<td>FTL versions</td>';
    $ret .= '<td>Core versions</td>';
    $ret .= '<td>'.($state eq 'enabled' ? 'Disable (Minutes)':'Disabled').'</td>';

    $ret .= '</tr><tr>';
}    


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

Meine devStateIcon-Funkton hat sich inzwischen natürlich auch etwas wieterentwickelt.

Ich habe jetzt eben noch das Versions/Update-Thema in die Übersicht eingebaut (s. Screenshot im Anhang):


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');
   
    my  $ver_info = 'CORE: '.ReadingsVal($name,'core_current','unknown').' => '.ReadingsVal($name,'core_latest','unknown');
        $ver_info.= "\nFTL: ".ReadingsVal($name,'FTL_current','unknown').' => '.ReadingsVal($name,'FTL_latest','unknown');
        $ver_info.= "\nWEB: ".ReadingsVal($name,'web_current','unknown').' => '.ReadingsVal($name,'web_latest','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
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 $imgUpdate =FW_makeImage($anyUpd > 0 ? '15px-red' : '15px-green',$ver_info);   

#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.'" 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;
}


Der Indikator für Upd ist grün, wenn keine Updates vorhanden sind, sonst rot. Beim Hover über dem Update-Indikator werden die aktuellen und die Ausstehenden Versionen als Tooltip angezeigt (s. Screenshot)

gb#




MadMax-FHEM

Zitat von: Benni am 04 März 2023, 11:28:42
Meine devStateIcon-Funkton hat sich inzwischen natürlich auch etwas wieterentwickelt.

Ich habe jetzt eben noch das Versions/Update-Thema in die Übersicht eingebaut (s. Screenshot im Anhang):


Der Indikator für Upd ist grün, wenn keine Updates vorhanden sind, sonst rot. Beim Hover über dem Update-Indikator werden die aktuellen und die Ausstehenden Versionen als Tooltip angezeigt (s. Screenshot)

gb#

Das ist nat. schicker als meine Variante...
...von eben: https://forum.fhem.de/index.php/topic,84031.msg1266578.html#msg1266578

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)

mumpitzstuff

Top. Die neueste Version funktioniert jetzt auch auf Anhieb. Die aus #35 oder so ging irgendwie gar nicht.

Vielen Dank!

Gisbert

Hallo Joachim,
hallo Bennie,
hallo Sebastian,

ich hab die neusten Änderungen übernommen, alles funktioniert perfekt.
Mit Disable und disable habe ich mich wohl verheddert.

Die Information über eine neue Version hab ich ausgelagert, da ansonsten der Platz zur Anzeige auf dem Handy nicht ausreicht.
Ich hab ein weiteres userReading definiert:
update_available {if ((ReadingsNum($name,'FTL_update','') + ReadingsNum($name,'core_update','') + ReadingsNum($name,'web_update','')) > 0) {1} else {0}}
Mit einem notify werde ich dann über ein anstehendes update informiert:
defmod pihole_notify notify pihole:update_available: 1 \
{fhem "set Pushover.Nachricht msg 'Pi-hole' 'new version available !!';; \
set PushNotifier.Nachricht message Pi-hole _new version available !!;; \
set Pushbullet.Nachricht message new version available !! | Pi-hole";;}


Wenn so ein ausgelagtere Information per Push-Nachrichten noch eleganter zu lösen ist, dann bin ich slebstverständlich daran interessiert.

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

Benni

Zitat von: Gisbert am 04 März 2023, 12:48:24
Wenn so ein ausgelagtere Information per Push-Nachrichten noch eleganter zu lösen ist, dann bin ich slebstverständlich daran interessiert.

Na ja, das Userreading kannst du dir auch sparen und direkt auf die Update-Readings triggern:


defmod pihole_notify notify pihole:.*_update:.1 \
{fhem "set Pushover.Nachricht msg 'Pi-hole' 'new version available !!';; \
set PushNotifier.Nachricht message Pi-hole _new version available !!;; \
set Pushbullet.Nachricht message new version available !! | Pi-hole";;}



gb#

Benni

#54
Ich habe übrigens noch folgendes festgestellt:

Wenn man für Pi-Hole kein Passwort gesetzt hat, dann gibt es auch keinen Token, den man übergeben könnte.
Im Web-UI von Pi-Hole bekommt man dann auch statt des Tokens "NO PASSWORD SET" angezeigt.

Das ist nicht schlimm. Wenn man bisher noch keinen pihole-token Wert mit storeKeyValue für das entsprechende HTTPMOD-Device abgelegt hat. Dann wird an das API einfach ein leeres auth="" übergeben. Was in dem Fall auch das korrekte vorgehen ist.

Hatte man allerdings bereits einmal einen pihole-token mit storeKeyValue abgelegt, so lässt sich dieser nicht mehr so einfach löschen oder leeren. Wenn man nun das Passwort für den Pi-Hole rausnimmt (pihole -a -p), dann wird bei den API-Aufrufen der alte pihole-token als auth mitgegeben und da API funktioniert nicht, wg. fehlerhafter Authorization.

Der Schlüssel lässt sich löschen, allerdings nicht über einen einfachen set am HTTPMOD-Device, aber mit der setKeyValue() Funktion, die von fhem.pl bereitgestellt wird.

Dazu braucht man den Schlüssel, unter dem der Token abgelegt wird. Der setzt sich im Falle von HTTPMOD zusammen aus dem Device-Typ (also HTTPMOD), dem Device-Namen (in meinem Fall also pihole) und dem Key (hier pihole-token) in der Form TYPE_NAME_Key .

Daraus ergibt sich dann (bei mir) folgender Schlüsselname:

HTTPMOD_pihole_pihole-token

der lässt sich nun in der FHEM-Kommandozeile durch folgenden Aufruf löschen:


{setKeyValue('HTTPMOD_pihole_pihole-token',undef)}


Die zuvor genannten Methoden funktionieren natürlich auch, aber das Löschen des Schlüssels aus dem Store ist die sauberste Methode.


Möglichkeit 1:
im Attribut, wo der Key aus dem "geheimen" Store gelesen wird, einfach einen Key angeben, den es dort nicht gibt:


attr pihole replacement02Value pihole-token-HAS_NO_PASSWORD

-> hier muss man halt daran denken, dass man das auch wieder zurückändert, falls wieder ein Passwort vergeben wird.

Möglichkeit 2:

Das Pihole-Device umbenennen.
Der Name des Device ist Bestandteil des gespeicherten Keys des Key-Value-Pairs im "geheimen" Store.

Möglichkeit 3:
Den "geheimen" Store direkt bearbeiten ..... ich erklär's mal lieber nicht ;)


gb#



GoldenAmerican

#55
Hallo MadMax,

ja, das war genau das was ich gesucht habe. Eine einfache Anzeige, ob Updates verfügbar sind.
Vielen Dank.

Ralf

MadMax-FHEM

Zitat von: GoldenAmerican am 04 März 2023, 16:08:55
Hallo MadMax,

ja, das war genau das was ich gesucht habe. Eine einfache Anzeige, ob Updates verfügbar sind.
Vielen Dank.

Ralf

Gerne!

Wobei das hier schicker (und "kürzer") ist: https://forum.fhem.de/index.php/topic,84031.msg1266595.html#msg1266595

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)

juemuc

Hallo zusammen,

super Arbeit. Vielen Dank. Ich habe noch eine Fragee zu den Internals "MainURL" und "value". Diese sind bei mir leer. Ist das so ok? Für was sind diese Internals?

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

binford6000

ZitatIst das so ok?
Die Definition enthält keine URL - daher bleibt MainURL auch leer.
value ist bei meinen 12 HTTPMOD-devices überall leer. Gehört wohl so...

VG Sebastian

MadMax-FHEM

Zitat von: juemuc am 04 März 2023, 19:45:21
Hallo zusammen,

super Arbeit. Vielen Dank. Ich habe noch eine Fragee zu den Internals "MainURL" und "value". Diese sind bei mir leer. Ist das so ok? Für was sind diese Internals?

Viele Grüße
Jürgen

Sind bei mir auch leer.

Verwendet wird ja das Modul HTTPMOD, dieses wird normalerweise mit einer url definiert, dafür sind wohl diese Internals.
Hier wird das Device ja mit "none" also ohne url definiert, daher wohl dann leer...

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)