Ich habe in meinem Blog https://blog.moneybag.de/fhem-pi-hole-statistiken-auslesen/ (https://blog.moneybag.de/fhem-pi-hole-statistiken-auslesen/) drüber geschrieben, aber vielleicht ist es hier passender:
Wer Pi-Hole benutzt, kann auf Fhem sich die Statistiken anzeigen lassen. Anzahl der geblockten Sites usw.
Die IP muss noch auf die Pi-Hole IP geändert werden. Die Werte liegen dann als Readings vor.
define pihole HTTPMOD http://192.168.178.152/admin/api.php?summary 60
attr pihole userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex reading07Name reading07Regex reading08Name reading08Regex reading09Name reading09Regex reading10Name reading10Regex
attr pihole reading01Name domains_being_blocked
attr pihole reading01Regex "domains_being_blocked":"(.*?)"
attr pihole reading02Name dns_queries_today
attr pihole reading02Regex "dns_queries_today":"(.*?)"
attr pihole reading03Name ads_blocked_today
attr pihole reading03Regex "ads_blocked_today":"(.*?)"
attr pihole reading04Name ads_percentage_today
attr pihole reading04Regex "ads_percentage_today":"(.*?)"
attr pihole reading05Name unique_domains
attr pihole reading05Regex "unique_domains":"(.*?)"
attr pihole reading06Name queries_forwarded
attr pihole reading06Regex "queries_forwarded":"(.*?)"
attr pihole reading07Name queries_cached
attr pihole reading07Regex "queries_cached":"(.*?)"
attr pihole reading08Name clients_ever_seen
attr pihole reading08Regex "clients_ever_seen":"(.*?)"
attr pihole reading09Name unique_clients
attr pihole reading09Regex "unique_clients":"(.*?)"
attr pihole reading10Name status
attr pihole reading10Regex "status":"(.*?)"
attr pihole verbose 0
Es geht sogar noch einfacher:
defmod PiHoleInfo HTTPMOD http://127.0.0.1/admin/api.php 300
attr PiHoleInfo userattr getURL
attr PiHoleInfo extractAllJSON 1
attr PiHoleInfo getURL http://127.0.0.1/admin/api.php
Die IP st natürlich anzupassen. Das hatte ich vor einiger Zeit mal irgendwo aufgeschnappt.
Dann noch einfach:
attr PiHoleInfo stateFormat <p align="left"><b>DNS Anfragen:</b>  ; ; ; ; dns_queries_today <br> <b>Geblockte Seiten:</b>  ; ads_blocked_today (ads_percentage_today %)
Und du hast eine übersichtliche Anzeige der wichtigsten Werte.
Gruß, Thomas
Moin,
muss den alten Thread mal hervorkramen..
Einbindung von PiHole klappt einwandfrei, aber ein Problem habe ich:
Wenn der FasterThanLight (FTL) DNS aus irgendeinem Grund down ist liefert PiHole per JSON "FTLnotrunning 1" zurück.
Wenn der FTL läuft allerdings keine "0" sondern einfach gar nichts.
Wie bringe ich FHEM bzw Httpmod bei wenn "gar nichts" kommt das Reading FTLnotrunning auf "0" zu setzen?
Danke.
ZitatWenn der FasterThanLight (FTL) DNS aus irgendeinem Grund down ist liefert PiHole per JSON "FTLnotrunning 1" zurück.
Wenn der FTL läuft allerdings keine "0" sondern einfach gar nichts.
Ich habe dieses Reading überhaupt nicht; was hat es mit diesem Reading auf sich?
Viele Grüße Gisbert
Zitat von: Gisbert am 30 Juli 2019, 09:58:17
Ich habe dieses Reading überhaupt nicht; was hat es mit diesem Reading auf sich?
FTLnotrunning kommt nur wenn FTL nicht läuft, sonst existiert der Wert nicht und wenn dein FTL noch nie
nicht funktioniert hat, hast du den auch noch nie bekommen.
Zitat von: C0mmanda am 30 Juli 2019, 07:09:35
Wie bringe ich FHEM bzw Httpmod bei wenn "gar nichts" kommt das Reading FTLnotrunning auf "0" zu setzen?
userReadings?
attr PiHoleInfo userReadings myFTLnotrunning {ReadingsVal($name,"FTLnotrunning","0")}
Zitat von: JoWiemann am 30 Juli 2019, 17:27:11
attr PiHoleInfo userReadings myFTLnotrunning {ReadingsVal($name,"FTLnotrunning","0")}
Vielen Dank!
Manchmal kommt man auf die einfachsten Lösungen nicht... meine ist etwas aufwändiger und weniger elegant geworden :-\
FTL_aktive:status:.* {my $FTL = ReadingsVal($name,"FTLnotrunning",0); ($FTL == 1) ? 'on' : 'off'; }
Man kann den Werbeblocker über die API übrigens (auch temporär) deaktivieren, was seltsamerweise eine ganz wichtige Anforderung meiner Liebsten darstellt... ::))
GetHttpFile("pi.hole", "/admin/api.php?disable=3600&auth=PASSWORDHASH_aus_setupVars.conf");
Mit dem Satz "Computer, Werbeblocker aus" können bei uns nun eine Stunde lang wieder Payback Punkte gesammelt werden...
Zitat von: FHEMAN am 29 August 2019, 00:02:47
Man kann den Werbeblocker über die API übrigens (auch temporär) deaktivieren, was seltsamerweise eine ganz wichtige Anforderung meiner Liebsten darstellt... ::))
GetHttpFile("pi.hole", "/admin/api.php?disable=3600&auth=PASSWORDHASH_aus_setupVars.conf");
Mit dem Satz "Computer, Werbeblocker aus" können bei uns nun eine Stunde lang wieder Payback Punkte gesammelt werden...
Super, genau danach habe ich gesucht!!!
Danke...
Zitat von: FHEMAN am 29 August 2019, 00:02:47
Man kann den Werbeblocker über die API übrigens (auch temporär) deaktivieren, was seltsamerweise eine ganz wichtige Anforderung meiner Liebsten darstellt... ::))
GetHttpFile("pi.hole", "/admin/api.php?disable=3600&auth=PASSWORDHASH_aus_setupVars.conf");
Hallo FHEMAN,
ich weiß hiermit:
PASSWORDHASH_aus_setupVars.conf
noch nichts anzufangen. Ist das das Passwort, was man zum login bei pi-hole benutzt?
Wo wird "GetHttpFile..." eingegeben. Im Browser, in der Kommandozeile in Fhem?
Viele Grüße Gisbert
Es gibt wohl auf dem PiHole eine Datei setupVars.conf dort steht ein Passwort Hash drin. Der soll wohl an die Stelle.
Hallo CoolTux,
die Datei setupVars.conf in /etc/pihole habe ich gefunden. Dort steht folgendes drin:
WEBPASSWORD=d846802.... (ca. 30-40 Stellen lang)
Ist damit der Passwort Hash gemeint?
Bleibt noch die Frage, an welcher Stelle ich GetHttpFile... eintragen muss.
So wie er geschrieben ist, funktioniert er weder in der Fhem-Kommandozeile noch im Webbrowser.
Viele Grüße Gisbert
Moin Gisbert,
es ist genau diese lange Zahlen-/Buchstabenkonfiguration in der setupVars.conf im pihole Verzeichnis.
Das GetHttpFile müsste laut https://wiki.fhem.de/wiki/HTML_Aufruf_senden eigentlich schon so funktionieren.
Hier mein notify:
Pihole.Off:off {
GetHttpFile("pi.hole", "/admin/api.php?disable=3600&auth=2345645634523456345634567345");
sayex("Werbeblocker aus", "SB.Essen");
}
//edit: Denk dran, im ersten Parameter kein HTTP(S) voranzusetzen.
//edit2: oder besser noch nicht blockierend:
HttpUtils_NonblockingGet( { url=>"http://pi.hole/admin/api.php?disable=3600&auth=123456789123456782345678", callback=>sub() { } });
Schönen Sonntag!
Ronny
Zitat von: Gisbert am 01 September 2019, 10:47:38
Bleibt noch die Frage, an welcher Stelle ich GetHttpFile... eintragen muss.
So wie er geschrieben ist, funktioniert er weder in der Fhem-Kommandozeile noch im Webbrowser.
Ich hab mir einfach ein notify erstellt:
defmod Pi_Hole_deaktivieren notify Pi_Hole_dummy:off { GetHttpFile("pi.hole", "/admin/api.php?disable=3600&auth=XXX") }
Bei XXX natürlich den Passwort Hash aus der Datei eintragen. Der Dummy wird dann durch Alexa getriggert
Hallo zusammen
Ich habe bei mir einen Dummy "Werbeblocker" definierte. Dieser wird durch folgendes DOIF gesteuert:
defmod di_Werbeblocker DOIF ([Werbeblocker] eq "off") ({GetHttpFile("192.168.17.17", "/admin/api.php?disable=3600&auth=PasswortHash")})(setstate Werbeblocker on) DOELSEIF \
([Werbeblocker] eq "on") ({GetHttpFile("192.168.17.17", "/admin/api.php?enable&auth=PasswortHash")})
attr di_Werbeblocker DbLogExclude .*
attr di_Werbeblocker wait 0,3600
Der Dummy ist Standardmässig auf On und damit der Werbeblocker eingeschaltet. Bei Bedarf kann ich ihn deaktivieren durch den Schalter oder mittels Alexa. Nach einer Stude wird er automatisch wieder aktiviert oder ich stelle ihn vorher wieder auf On.
Gruss
Zitat von: Mumpitz am 03 September 2019, 19:09:57
Ich habe bei mir einen Dummy "Werbeblocker" definierte. Dieser wird durch folgendes DOIF gesteuert:
Alles was du mit dem Dummy+DOIF machst, kannst du auch mit einem einzeln DOIF erledigen.
Zitat von: Christoph Morrison am 03 September 2019, 20:47:49
Alles was du mit dem Dummy+DOIF machst, kannst du auch mit einem einzeln DOIF erledigen.
...und das DOELSEIF kann auch weg, da der Timer (3600 Sek) schon im Aufruflink steckt.
Zitat von: Christoph Morrison am 03 September 2019, 20:47:49
Alles was du mit dem Dummy+DOIF machst, kannst du auch mit einem einzeln DOIF erledigen.
Hallo
Da bin ich auf deine Lösung gespannt!
Nice2Know: Habe eben einen Button programmiert, damit PiHole für 10 Minuten ausgeschaltet werden kann. Geht per httpmod:
define pihole1 HTTPMOD none 0
attr pihole1 userattr set01URL
attr pihole1 set01Hint 6,100,200,600
attr pihole1 set01Max 600
attr pihole1 set01Min 6
attr pihole1 set01Name PiHoleDisable
attr pihole1 set01URL http://piholeadresse/admin/api.php?disable=$val&auth=hiermussderpasswordstringaus/etc/pihole/setupVars.confhin
Und manuell Enable (zum Beispiel, wenn man es sich anders überlegt) mit:
attr pihole1 set02Name PiHoleEnable
attr pihole1 set02NoArg 1
attr pihole1 set02URL http://piholeadresse/admin/api.php?enable&auth=hiermussderpasswordstringaus/etc/pihole/setupVars.confhin
Ich habe das ganze mal abgeleitet, das man auch per alexa-fhem den Pihole für eine stunden aus stellen kann.
Was mir noch fehlt das wenn ich es auf on oder of stelle das device einmal "set PiHole reread macht". Hat da einer eine Idee?
defmod PiHole HTTPMOD http://IP/admin/api.php?summary 300
attr PiHole alexaName Webung
attr PiHole event-on-change-reading state
attr PiHole genericDeviceType switch
attr PiHole homebridgeMapping On=state,valueOn=enabled,valueOff=disabled,cmdOn=on,cmdOff=off
attr PiHole reading01Name state
attr PiHole reading01Regex "status":"(.*?)"
attr PiHole room IT
attr PiHole set01Name off
attr PiHole set01NoArg 1
attr PiHole set01URL http://IP/admin/api.php?disable=3600&auth=hiermussderpasswordstringaus/etc/pihole/setupVars.confhin
attr PiHole set02Name on
attr PiHole set02NoArg 1
attr PiHole set02URL http://IP/admin/api.php?enable&auth=hiermussderpasswordstringaus/etc/pihole/setupVars.confhin
attr PiHole webCmd on:off
notify auf on/off und dann rearead...
Oder als weiteres Kommando bei alexa-fhem...
Gruß, Joachim
Zitat von: MadMax-FHEM am 29 Januar 2022, 19:29:08
notify auf on/off und dann rearead...
Oder als weiteres Kommando bei alexa-fhem...
Gruß, Joachim
kannst du mir für beides die befehle nennen?
bin noch nicht ganz so fit.
Zitat von: SeriousPat am 30 Januar 2022, 13:10:50
kannst du mir für beides die befehle nennen?
bin noch nicht ganz so fit.
Eventmonitor aufmachen (Filter auf das Device setzen), on/off stellen und dann die entsprechende Zeile markieren und notify anlegen lassen und dann anpassen...
sowas in der Art:
define nNotify notify Device:on set httpmod reread
https://wiki.fhem.de/wiki/Event_monitor
https://wiki.fhem.de/wiki/Notify
Oder eben im homebridgeMapping mehrere Kommandos angeben, also:
cmdOn=on+set+reread (geht so nat. nicht! Soll nur zeigen was ich meine)
Konnte allerdings leider nichts finden wie man mehrere Kommandos angibt.
Evtl. mal selber suchen oder vielleicht finde ich noch was...
EDIT: aber ganz generell hat das nichts mit piHole an sich zu tun (außer, dass du ein "alexa-fhem Problem" mit deinem piHole-HTTPMOD hast ;) ) ! Ist also eigentlich in DIESEM THREAD (total) falsch! Besser (wenn es weiter geht/gehen soll) einen eigenen/neuen Thread aufmachen im PASSENDEN Unterforum (Sprachsteuerung)! Dann gibt es bestimmt auch "bessere" Hilfe ;)Gruß, Joachim
moin
würde gern das ganze als cmdalias machen, damit ich leicht sagen kann 5 min off, 10 min off etc ...
set PiHoleInfo pioff.* AS {GetHttpFile("192.168.177.101", "/admin/api.php?disable=$EVTPART2&auth=pw#gedönse")}; setreading $EVTPART0 status disabled
funktioniert auch problemlos, einzig störend - nach ausführen von set PiHoleInfo pioff 30 bekomme ich eine rückmeldung alla "{"status":"disabled"}" <-- kann ich das irgendwie unterdrücken? so das der befehl einfach ausgeführt wird und ruhe ist (wegen mir darf er ins log spammen, aber sonst will ich nix) ^^
thx
Jens
@draddy
Wird wohl die Rückgabe von GetHttpFile sein. Weil das Ergebnis "uninteressant" scheint, kann man die Perl-Klammer (ungetestet) mit "return undef;" oder "return '';" (vor dem Semikolon sind 2 einfache Anführungszeichen) verlassen - somit sollte keine Meldung mehr nach außen dringen und "nerven" ...
Da ein GetHttpFile FHEM blockiert und Dich das Ergebnis nicht interessiert, warum verwendest Du dann nicht ein HttpUtils_NonblockingGet?
Siehe https://wiki.fhem.de/wiki/HttpUtils
HttpUtils_NonblockingGet erwartet zwanghaft die Angabe einer callback-Routine ... vermutlich zu kompliziert ? ...
danke euch beiden, probier ich aus :)
set PiHoleInfo pioff.* AS {HttpUtils_NonblockingGet({url=>"192.168.177.101/admin/api.php?disable=$EVTPART2&auth=pw#gedönse", callback=>sub() { }})}; setreading $EVTPART0 status disabled
hmmm
also, ich bekomme keine rückgabe ... aber ... es wird auch nix geschaltet ^^ auch wenn ich $EVTPART2 durch feste zahl ersetze ...
gebe ich die url im browser ein, (mit zahl) klappts
also, mit einfach nur ,return gehts ...
set PiHoleInfo pioff.* AS {GetHttpFile("192.168.177.101", "/admin/api.php?disable=$EVTPART2&auth=pw#gedönse"), return}; setreading $EVTPART0 status disabled
soo, habe da mal etwas gebastelt, vll. kanns wer brauchen ... ;)
Status öffnet Pihole in neuem tab, der switch deaktiviert für 12h, gewohnte Infos wie im Webinterface von Pihole, und 4 Verschiedene Zeiten fürs Disable
raw vom PiInfo
defmod PiHoleInfo HTTPMOD http://192.168.177.101/admin/api.php 30
attr PiHoleInfo extractAllJSON 1
attr PiHoleInfo getURL http://192.168.177.101/admin/api.php
attr PiHoleInfo devStateIcon {my $state = ReadingsVal($name,'status','enabled') eq 'enabled'?'ios-on-green':'ios-off';; $state = FW_makeImage($state);;\
my $tq = '<style>.mysvg {height:15px;;;; width:15px}</style>'.FW_makeImage('it_i-net','','mysvg');; \
my $block =FW_makeImage('time_manual_mode','','mysvg');; \
my $bList = FW_makeImage('edit_delete','','mysvg');; \
my $tquer = ReadingsVal($name,'dns_queries_all_types','0');;\
my $blDay = ReadingsVal($name,'ads_blocked_today','0');;\
my $blDaypct = round(ReadingsVal($name,'ads_percentage_today','0'),1);;\
my $dList =ReadingsVal($name,'domains_being_blocked','0');;\
\
my $stateCMD = ReadingsVal($name,'status','enabled') eq 'enabled'?'<a href="/fhem?cmd.dummy=set '.$name.' pioff 43200">'.$state.'</a>':'<a href="/fhem?cmd.dummy=set '.$name.' pion">'.$state.'</a>';;\
my $dis1 = '<a href="/fhem?cmd.dummy=set '.$name.' pioff 60">1min</a>';;\
my $dis5 = '<a href="/fhem?cmd.dummy=set '.$name.' pioff 300">5min</a>';;\
my $dis15 = '<a href="/fhem?cmd.dummy=set '.$name.' pioff 900">15min</a>';;\
my $dis60 = '<a href="/fhem?cmd.dummy=set '.$name.' pioff 3600">60min</a>';;\
\
qq\
\
(<table border="0">\
<tr>\
<th><a style="color: yellow;;" href="http://192.168.177.101/admin" target="_blank">Status</a></th><th>Queries</th><th>Blocked today</th><th>Adlist</th><th><a style="color: yellow;;">Disable for:</a></th> \
</tr>\
<tr>\
<td>${stateCMD} </td><td>${tq} ${tquer}</td><td>${block} ${blDay} | ${blDaypct}%</td><td>${bList} ${dList}</td><td>${dis1} ${dis5} ${dis15} ${dis60}</td>\
</tr>\
</table>)\
}
dazu 2 cmdAlias für off
defmod caPiholeoff cmdalias set PiHoleInfo pioff.* AS {GetHttpFile("192.168.177.101", "/admin/api.php?disable=$EVTPART2&auth=HIER_DER_PW_HASH"),return };; setreading $EVTPART0 status disabled
setstate caPiholeoff defined
und on
defmod caPiholeon cmdalias set PiHoleInfo pion.* AS {my $nix=GetHttpFile("192.168.177.101", "/admin/api.php?enable&auth=HIER_DER_PW_HASH"), return};; setreading $EVTPART0 status enabled;;\
setstate caPiholeon defined
hf
Jens
p.s. ihr müsste natürlich EURE pihole IP überall eintragen, ist klar :D
Wo genau bekomme ich den hash vom Passwort her? Könntest du das bitte auch kurz beschreiben?
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 ;)
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
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 ^^
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. (https://forum.fhem.de/index.php/topic,125119.msg1198432.html#msg1198432)
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#
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 (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/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 (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 :)
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#
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
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 (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
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
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
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
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 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
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
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
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
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
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.
@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
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#
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
Top. Die neueste Version funktioniert jetzt auch auf Anhieb. Die aus #35 oder so ging irgendwie gar nicht.
Vielen Dank!
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
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#
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#
Hallo MadMax,
ja, das war genau das was ich gesucht habe. Eine einfache Anzeige, ob Updates verfügbar sind.
Vielen Dank.
Ralf
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
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
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
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
Danke für Eure schnelle Antwort.
Gehe ich korrekt in der Annahme, dass der Zugriff auf die API per http erfolgt? Wenn ja, wo kann ich das auf https ändern?
Hintergrund: Der Pi mit pi-hole ist in einem anderen VLAN und iich möchte nicht noch einen Port zwischen den VLANs frei geben.
Viele Grüße
Jürgen
Zitat von: juemuc am 04 März 2023, 20:15:06
Gehe ich korrekt in der Annahme, dass der Zugriff auf die API per http erfolgt? Wenn ja, wo kann ich das auf https ändern?
Ich würde mal schätzen hierrüber:
replacement04Regex %%base_url%%
replacement04Value http://%%ip%%/admin
Gruß, Joachim
Danke.
Ich sollte mal meine Brille putzen ::)
Viele Grüße
Jürgen
Für AdGuard habe ich aus den hier geposteten Codeschnipsel eine Adaption gebastelt:
https://forum.fhem.de/index.php/topic,132511.0.html
Für die FhemApp-User hat binford6000 übrigens noch ein entsprechendes Template erstellt:
https://forum.fhem.de/index.php/topic,132508.msg1266744.html#msg1266744 (https://forum.fhem.de/index.php/topic,132508.msg1266744.html#msg1266744)
Danke dafür! ;)
gb#
Hallo zusammen,
ich habe aktuell eine Fragen zur Darstellung. Bei mir wird aktuell eine neue Version angezeigt, aber der "Update-Botton" ist weiterhin grün. Ausserdem sind die Readings ".._update" auf "0". Das passt aus meiner Sicht nicht. Wo ist der Denkfehler?
Viele Grüße
Jürgen
Zitat von: juemuc am 23 März 2023, 16:37:49ich habe aktuell eine Fragen zur Darstellung. Bei mir wird aktuell eine neue Version angezeigt, aber der "Update-Botton" ist weiterhin grün. Ausserdem sind die Readings ".._update" auf "0". Das passt aus meiner Sicht nicht. Wo ist der Denkfehler?
Der Denkfehler ist die Aktualisierungsrate der einzelnen gets.
Wenn du den Code 1:1 übernommen hast (ein list des Device wäre schön gewesen), dann steht bei Versions im get2PollDelay 3600 drin, damit werden die Versionsdaten nicht alle 60 Sekunden abgerufen, wie der rest, sondern frühestens nach 3600 Sekunden, also in etwa jede Stunde.
get02ExtractAllJSON 1
get02Name versions
get02Poll 1
get02PollDelay 3600
get02URL %%api_url%%?versions&%%auth%%
Du kannst die Versionsinformationen auch jederzeit über get versions am HTTPMOD-Device abrufen und aktualisieren lassen.
Alternativ kannst du auch statt 3600 hier 1 eintragen, dann werden die Versionsinformationen auch alle 60 Sekunden abgerufen .... allerdings ändern die sich eher alle paar Wochen, als alle paar Minuten. ;)
gb#
Hallo Benni,
das ist es leider nicht. Die Werte waren auch am nächsten Tag so. Eventuell liegt es aber an der "Docker-Installation". Bei der "Pi-Installation" war alles ok.
Da ich mittlerweile beide Installationen aktuallisiert habe, ist das Thema erst einmal erledigt.
Viele Grüße
Jürgen
Hallo Jürgen,
ich nehme an, ein manuelles "get versions" hattest du nicht versucht?
Das kannst du dann das nächste mal machen, damit müssen die Versionsinformationen sofort aktualisiert werden, sonst ist wirklich was faul. Andernfalls liegt es doch am PollDelay. Den kann man wie gesagt auch auf 1 setzen, es ist im Falle von pihole nicht Last-relevant.
Mit der Dockerinstallation kann es eigenltich nichts zu tun haben, die restlichen Informationen kommen auf dem selben "Weg"!
gb#
Hi Benni,
doch. Ich hatte alle "get"-Aufrufe durchgeführt. Ich warte jetzt auf das nächste Update, dann sehen wir weiter.
Viele Grüße
Jürgen
Hallo Benni,
jetzt gibt es wieder ein Update und das "Problem" tritt wieder auf. core_update steht auf "0".
Hier das list:
Internals:
BUSY 0
DEF none 60
FUUID 641c69cc-f33f-4885-8c2d-bc4699b620bc05f0
Interval 60
MainURL
ModuleVersion 4.1.15 - 17.12.2022
NAME pihole2
NOTIFYDEV global
NR 388
NTFY_ORDER 50-pihole2
STATE enabled
TYPE HTTPMOD
eventCount 376
value
CompiledRegexes:
HTTPCookieHash:
PHPSESSID;/:
Name PHPSESSID
Options path=/; HttpOnly; SameSite=Strict
Path /
Value omvqrmgphtrksoccho86odrrs3
HttpUtils:
NAME
addr https://ds415:8883
auth 0
data
displayurl https://ds415:8883/admin/api.php?summaryRaw&auth=14b26dc36b54dc301d95ff0273230c405056cf6cc3e7c252725d827d4315cd7b
header Cookie: PHPSESSID=omvqrmgphtrksoccho86odrrs3
host ds415
httpversion 1.0
ignoreredirects 1
loglevel 4
path /admin/api.php?summaryRaw&auth=14b26dc36b54dc301d95ff0273230c405056cf6cc3e7c252725d827d4315cd7b
protocol https
redirects 0
timeout 2
url https://ds415:8883/admin/api.php?summaryRaw&auth=14b26dc36b54dc301d95ff0273230c405056cf6cc3e7c252725d827d4315cd7b
sslargs:
QUEUE:
READINGS:
2023-03-31 21:25:29 FTL_branch master
2023-03-31 21:25:29 FTL_current v5.22
2023-03-31 21:25:29 FTL_latest v5.22
2023-03-23 18:33:27 FTL_status enabled
2023-03-31 21:25:29 FTL_update 0
2023-03-31 22:11:29 ads_blocked_today 424
2023-03-31 22:11:29 ads_percentage_today 3.317424
2023-03-31 22:11:29 clients_ever_seen 18
2023-03-31 21:25:29 core_branch master
2023-03-31 21:25:29 core_current v5.16.1
2023-03-31 21:25:29 core_latest v5.16.2
2023-03-31 21:25:29 core_update 0
2023-03-31 22:11:29 dns_queries_all_replies 12781
2023-03-31 22:11:29 dns_queries_all_types 12781
2023-03-31 22:11:29 dns_queries_today 12781
2023-03-31 22:11:29 domains_being_blocked 194506
2023-03-31 22:11:29 gravity_last_updated_absolute 1679801531
2023-03-26 05:32:34 gravity_last_updated_abstime 2023-03-26 05:32:11
2023-03-31 22:11:29 gravity_last_updated_file_exists 1
2023-03-31 22:11:29 gravity_last_updated_relative_days 5
2023-03-31 22:11:29 gravity_last_updated_relative_hours 16
2023-03-31 22:11:29 gravity_last_updated_relative_minutes 39
2023-03-31 22:11:29 privacy_level 3
2023-03-31 22:11:29 queries_cached 1833
2023-03-31 22:11:29 queries_forwarded 10451
2023-03-31 22:11:29 reply_BLOB 20
2023-03-31 22:11:29 reply_CNAME 3931
2023-03-31 22:11:29 reply_DNSSEC 338
2023-03-31 22:11:29 reply_DOMAIN 165
2023-03-31 22:11:29 reply_IP 1495
2023-03-31 22:11:29 reply_NODATA 970
2023-03-31 22:11:29 reply_NONE 0
2023-03-31 22:11:29 reply_NOTIMP 0
2023-03-31 22:11:29 reply_NXDOMAIN 67
2023-03-31 22:11:29 reply_OTHER 0
2023-03-31 22:11:29 reply_REFUSED 0
2023-03-31 22:11:29 reply_RRNAME 19
2023-03-31 22:11:29 reply_SERVFAIL 22
2023-03-31 22:11:29 reply_UNKNOWN 5754
2023-03-31 22:11:29 status enabled
2023-03-31 22:11:29 unique_clients 14
2023-03-31 22:11:29 unique_domains 4560
2023-03-31 21:25:29 web_branch master
2023-03-31 21:25:29 web_current v5.19
2023-03-31 21:25:29 web_latest v5.19
2023-03-31 21:25:29 web_update 0
REQUEST:
context get
data
header
ignoreredirects 0
num 01
retryCount 0
type get01
url %%api_url%%?summaryRaw&%%auth%%
defptr:
readingBase:
FTL_branch get
FTL_current get
FTL_latest get
FTL_update get
ads_blocked_today get
ads_percentage_today get
clients_ever_seen get
core_branch get
core_current get
core_latest get
core_update get
dns_queries_all_replies get
dns_queries_all_types get
dns_queries_today get
domains_being_blocked get
gravity_last_updated_absolute get
gravity_last_updated_file_exists get
gravity_last_updated_relative_days get
gravity_last_updated_relative_hours get
gravity_last_updated_relative_minutes get
privacy_level get
queries_cached get
queries_forwarded get
reply_BLOB get
reply_CNAME get
reply_DNSSEC get
reply_DOMAIN get
reply_IP get
reply_NODATA get
reply_NONE get
reply_NOTIMP get
reply_NXDOMAIN get
reply_OTHER get
reply_REFUSED get
reply_RRNAME get
reply_SERVFAIL get
reply_UNKNOWN get
status get
unique_clients get
unique_domains get
web_branch get
web_current get
web_latest get
web_update get
readingNum:
FTL_branch 02
FTL_current 02
FTL_latest 02
FTL_update 02
ads_blocked_today 01
ads_percentage_today 01
clients_ever_seen 01
core_branch 02
core_current 02
core_latest 02
core_update 02
dns_queries_all_replies 01
dns_queries_all_types 01
dns_queries_today 01
domains_being_blocked 01
gravity_last_updated_absolute 01
gravity_last_updated_file_exists 01
gravity_last_updated_relative_days 01
gravity_last_updated_relative_hours 01
gravity_last_updated_relative_minutes 01
privacy_level 01
queries_cached 01
queries_forwarded 01
reply_BLOB 01
reply_CNAME 01
reply_DNSSEC 01
reply_DOMAIN 01
reply_IP 01
reply_NODATA 01
reply_NONE 01
reply_NOTIMP 01
reply_NXDOMAIN 01
reply_OTHER 01
reply_REFUSED 01
reply_RRNAME 01
reply_SERVFAIL 01
reply_UNKNOWN 01
status 01
unique_clients 01
unique_domains 01
web_branch 02
web_current 02
web_latest 02
web_update 02
readingOutdated:
requestReadings:
get01:
FTL_branch get 01
FTL_current get 01
FTL_latest get 01
FTL_update get 01
ads_blocked_today get 01
ads_percentage_today get 01
clients_ever_seen get 01
core_branch get 01
core_current get 01
core_latest get 01
core_update get 01
dns_queries_all_replies get 01
dns_queries_all_types get 01
dns_queries_today get 01
domains_being_blocked get 01
gravity_last_updated_absolute get 01
gravity_last_updated_file_exists get 01
gravity_last_updated_relative_days get 01
gravity_last_updated_relative_hours get 01
gravity_last_updated_relative_minutes get 01
privacy_level get 01
queries_cached get 01
queries_forwarded get 01
reply_BLOB get 01
reply_CNAME get 01
reply_DNSSEC get 01
reply_DOMAIN get 01
reply_IP get 01
reply_NODATA get 01
reply_NONE get 01
reply_NOTIMP get 01
reply_NXDOMAIN get 01
reply_OTHER get 01
reply_REFUSED get 01
reply_RRNAME get 01
reply_SERVFAIL get 01
reply_UNKNOWN get 01
status get 01
unique_clients get 01
unique_domains get 01
web_branch get 01
web_current get 01
web_latest get 01
web_update get 01
get02:
FTL_branch get 02
FTL_current get 02
FTL_latest get 02
FTL_update get 02
core_branch get 02
core_current get 02
core_latest get 02
core_update get 02
web_branch get 02
web_current get 02
web_latest get 02
web_update get 02
lastpoll:
summary 1680352953.57898
versions 1680351933.51767
Attributes:
alias Pi-Hole-2
devStateIcon {piholeDevStateIcon($name)}
enforceGoodReadingNames 1
event-on-change-reading .*
get01ExtractAllJSON 1
get01Name summary
get01Poll 1
get01URL %%api_url%%?summaryRaw&%%auth%%
get02ExtractAllJSON 1
get02Name versions
get02Poll 1
get02PollDelay 3600
get02URL %%api_url%%?versions&%%auth%%
get03JSON status
get03Name FTL_status
get03URL %%api_url%%?status&%%auth%%
get04JSON type
get04Name FTL_type
get04URL %%api_url%%?type&%%auth%%
get05JSON version
get05Name FTL_version
get05URL %%api_url%%?version&%%auth%%
group pi-hole
icon it_raspberry_logo@black
replacement01Mode text
replacement01Regex %%auth%%
replacement01Value auth=%%pihole-token%%
replacement02Mode key
replacement02Regex %%pihole-token%%
replacement02Value pihole-token
replacement03Mode text
replacement03Regex %%api_url%%
replacement03Value %%base_url%%/api.php
replacement04Mode text
replacement04Regex %%base_url%%
replacement04Value https://%%ip%%/admin
replacement05Mode text
replacement05Regex %%ip%%
replacement05Value ds415:8883
room Systemdaten
set01ExtractAllJSON 1
set01Hint 10,60,180,300,600,900
set01Max 900
set01Min 10
set01Name disable
set01ParseResponse 1
set01URL %%api_url%%?disable=$val&%%auth%%
set02ExtractAllJSON 1
set02Name enable
set02NoArg 1
set02ParseResponse 1
set02URL %%api_url%%?enable&%%auth%%
stateFormat status
userReadings gravity_last_updated_abstime:gravity_last_updated_absolute.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_updated_absolute',0)))}
Hast Du eine Idee. Bei der Pi-Installation ist alles ok. Hier sind alle Werte korrekt vorhanden.
Viele Grüße
Jürgen
Das Reading core_update wird doch durch den entsprechenden von pihole abgefragten Wert von pihole gefüllt. Das "Problem" liegt hier m.E. nicht in der Def oder in der myUtils-Funktion sondern in einem "fehlerhaften" Wert seitens pihole.
Zitat von: juemuc am 01 April 2023, 14:45:56Hast Du eine Idee. Bei der Pi-Installation ist alles ok. Hier sind alle Werte korrekt vorhanden.
Bist du sicher?
Mein pihole weiß aktuell nix von einem update:
Bildschirm�foto 2023-04-01 um 16.05.30.png
Wenn da keine aktuellen Werte stehen, können sie in FHEM natürlich auch nicht besser sein. ;)
Bildschirm�foto 2023-04-01 um 16.09.34.png
gb#
Ja 8)
Hier die Info aus der "API"
core_update false
web_update false
FTL_update false
core_current "v5.16.1"
web_current "v5.19"
FTL_current "v5.22"
core_latest "v5.16.2"
web_latest "v5.19"
FTL_latest "v5.22"
core_branch "master"
web_branch "master"
FTL_branch "master"
Die API scheint wirklich im Docker einen falschen Wert zu liefern.
Viele Grüße
Jürgen
Zitat von: juemuc am 01 April 2023, 16:14:34Die API scheint wirklich im Docker einen falschen Wert zu liefern.
Da kann ich dir leider nicht weiterhelfen. Ich habe pihole "nativ" unter debian in einem LXC-Container auf proxmox laufen.
gb#
Ich habe nun im "pihole"-Forum eine Anfrage gestellt und werden dann hier über das Ergebnis informieren.
Viele Grüße
Jürgen
Da ich pihole auch im Docker laufen habe, aber nicht mit FHEM verbunden, hast Du auf die schnelle den Code, um die Werte so abzufragen wie bei FHEM? Dann würde ich es bei mir nachstellen ...
Wenn, dann liegt es nicht an Docker, sondern das der Container von PiHole etwas komisch gebaut wurde ... teoretisch dürfte es kein Unterschied geben (abgesehen vom genannten bauen)
Der letzte Stand des HTTPMOD-Device findet sich hier:
https://forum.fhem.de/index.php?topic=84031.msg1266579#msg1266579
Die aktuellste Funktion für das devStateIcon findet sich hier:
https://forum.fhem.de/index.php?topic=84031.msg1266595#msg1266595
Und die grundsätzlichen Infos zur Einrichtung, v.a. bzgl. Passwort finden sich hier:
https://forum.fhem.de/index.php?topic=84031.msg1266595#msg1266595
und hier:
https://forum.fhem.de/index.php?topic=84031.msg1266622#msg1266622
(... könnte man eigentlich auch mal in einen Wiki-Eintrag gießen)
gb#
Hallo Wernieman,
was liefert bei Dir im Browser "https://DNS:PORT/admin/api.php?versions"? "DNS:PORT" musst Du durch Deine Daten ersetzen und Du musst mit "admin" angemeldet sein.
Ich bekomme dann ein fehlerhaftes Ergebnis:
core_update false
web_update false
FTL_update false
core_current "v5.16.1"
web_current "v5.19"
FTL_current "v5.22"
core_latest "v5.16.2"
web_latest "v5.19"
FTL_latest "v5.22"
core_branch "master"
web_branch "master"
FTL_branch "master"
Hier meine Definition:
defmod pihole2 HTTPMOD none 60
attr pihole2 alias Pi-Hole-2
attr pihole2 devStateIcon {piholeDevStateIcon($name)}
attr pihole2 enforceGoodReadingNames 1
attr pihole2 event-on-change-reading .*
attr pihole2 get01ExtractAllJSON 1
attr pihole2 get01Name summary
attr pihole2 get01Poll 1
attr pihole2 get01URL %%api_url%%?summaryRaw&%%auth%%
attr pihole2 get02ExtractAllJSON 1
attr pihole2 get02Name versions
attr pihole2 get02Poll 1
attr pihole2 get02PollDelay 3600
attr pihole2 get02URL %%api_url%%?versions&%%auth%%
attr pihole2 get03JSON status
attr pihole2 get03Name FTL_status
attr pihole2 get03URL %%api_url%%?status&%%auth%%
attr pihole2 get04JSON type
attr pihole2 get04Name FTL_type
attr pihole2 get04URL %%api_url%%?type&%%auth%%
attr pihole2 get05JSON version
attr pihole2 get05Name FTL_version
attr pihole2 get05URL %%api_url%%?version&%%auth%%
attr pihole2 group pi-hole
attr pihole2 icon it_raspberry_logo@black
attr pihole2 replacement01Mode text
attr pihole2 replacement01Regex %%auth%%
attr pihole2 replacement01Value auth=%%pihole-token%%
attr pihole2 replacement02Mode key
attr pihole2 replacement02Regex %%pihole-token%%
attr pihole2 replacement02Value pihole-token
attr pihole2 replacement03Mode text
attr pihole2 replacement03Regex %%api_url%%
attr pihole2 replacement03Value %%base_url%%/api.php
attr pihole2 replacement04Mode text
attr pihole2 replacement04Regex %%base_url%%
attr pihole2 replacement04Value https://%%ip%%/admin
attr pihole2 replacement05Mode text
attr pihole2 replacement05Regex %%ip%%
attr pihole2 replacement05Value DNS:PORT
attr pihole2 room Systemdaten
attr pihole2 set01ExtractAllJSON 1
attr pihole2 set01Hint 10,60,180,300,600,900
attr pihole2 set01Max 900
attr pihole2 set01Min 10
attr pihole2 set01Name disable
attr pihole2 set01ParseResponse 1
attr pihole2 set01URL %%api_url%%?disable=$val&%%auth%%
attr pihole2 set02ExtractAllJSON 1
attr pihole2 set02Name enable
attr pihole2 set02NoArg 1
attr pihole2 set02ParseResponse 1
attr pihole2 set02URL %%api_url%%?enable&%%auth%%
attr pihole2 stateFormat status
attr pihole2 userReadings gravity_last_updated_abstime:gravity_last_updated_absolute.* {strftime('%Y-%m-%d %H:%M:%S', localtime(ReadingsNum($name,'gravity_last_updated_absolute',0)))}
Du musst hier Deine Daten eintragen: "attr pihole2 replacement05Value DNS:PORT" und natürlich die anderen Punkte hier aus dem Forum beachten.
Viele Grüße
Jürgen
Ich möchte es eben nicht in FHEM direkt eintragen, deshalb hatte ich nach dem Web-Link gefragt ....
core_update false
web_update false
FTL_update false
core_current "v5.16.2"
web_current "v5.19"
FTL_current "v5.22"
core_latest "v5.16.2"
web_latest "v5.19"
FTL_latest "v5.22"
core_branch "master"
web_branch "master"
FTL_branch "master"
Scheinbar ist im Offiziellen Container wirklich etwas "komisch" gebaut. Welches Image verwendest Du?
Ich habe bei mir in der docker-compose.yml
image: pihole/pihole:latest
Ich nutze auch image: pihole/pihole:latest
auf einem Synology-NAS. Allerdings habe ich noch "Docker Tag 2023.03.0"
Bei Dir sind die Werte ja ok. Du hast wahrscheinlich in den letzten Tagen ein Update durchgeführt.
Viele Grüße
Jürgen
Es läuft bei mir ein WatchTower ... ja, es sollte aktuell sein ...
Und nein, es ist keine Standard Installation. Sitzt z.B. hinter einem http-Proxy ....
Laut pi-hole-Forum liefert die pi-hole-API für die Docker-Installation keine korrekten Werte. Dies sei auch nicht sinnvoll. pi-hole-Forum (https://discourse.pi-hole.net/t/wrong-api-information-versions/62215/4)
@Wernieman: wie fragst Du ab, ob es eine neue Docker-Version gibt?
Viele Grüße
Jürgen
s.o. WatchTower .... macht gleich die Aktuallisierungen.
Hallo zusammen,
ich bin dabei einen neuen Server mit Proxmox aufzusetzen. Ich hab für Pi-hole einen Container erstellt, Pi-hole installiert. Es läuft, d.h. ich kann mich auf die Weboberfläche einloggen.
In Fhem habe die URL des neuen Pi-hole-Servers eingetragen:
attr pihole replacement05Value 192.168.1.70
sowie das Passwort mit
set pihole storeKeyValue <Webpasswort>
geändert.
Ich bekomme aber keine Updates in Fhem. Irgendwo muss ich mich wohl verheddert haben, nur wo?
Im LX-Container, den ich für Pi-hole nutze, ist nur ein root-User vorhanden. Kann es daran liegen. Wie gesagt komme ich auf die Weboberfläche und kann dort alles sehen, auch kann ich disablen oder enablen.
Viele Grüße
Gisbert
Hier noch ein list, die ganzen Readings stammen noch von Pi-hole auf dem vorherigen Server:
define pihole HTTPMOD none 60
attr pihole userattr
attr pihole alias Pi-Hole
attr pihole comment Neue IP-Adresse: 192.168.1.70\
Update Pi-hole: pihole -up
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 Performance
attr pihole icon it_internet
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.1.70
attr pihole room Network
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)))}
# BUSY 0
# CFGFN ./FHEM/NetzwerkServerTV.cfg
# DEF none 60
# FUUID 64030a7d-f33f-e986-ee58-2856209bf6c10a9b
# Interval 60
# MainURL
# ModuleVersion 4.1.15 - 17.12.2022
# NAME pihole
# NOTIFYDEV global
# NR 1194
# NTFY_ORDER 50-pihole
# STATE enabled
# TYPE HTTPMOD
# eventCount 1591
# value
# CompiledRegexes:
# HTTPCookieHash:
# PHPSESSID;/:
# Name PHPSESSID
# Options path=/; HttpOnly; SameSite=Strict
# Path /
# Value gob67lbesi66df0o86ceini4vf
# HttpUtils:
# NAME
# addr http://192.168.1.70:80
# auth 0
# buf
# code 200
# compress 1
# conn
# data
# displayurl http://192.168.1.70/admin/api.php?summaryRaw&auth=7IjQB_6D
# header Cookie: PHPSESSID=gob67lbesi66df0o86ceini4vf
# host 192.168.1.70
# 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=gob67lbesi66df0o86ceini4vf; 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: 0
#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: 2
#Connection: close
#Date: Wed, 21 Jun 2023 10:23:55 GMT
#Server: lighttpd/1.4.69
# httpversion 1.0
# hu_blocking 0
# hu_filecount 1
# hu_port 80
# hu_portSfx
# ignoreredirects 1
# loglevel 4
# path /admin/api.php?summaryRaw&auth=7IjQB_6D
# protocol http
# redirects 0
# timeout 2
# url http://192.168.1.70/admin/api.php?summaryRaw&auth=7IjQB_6D
# sslargs:
# QUEUE:
# READINGS:
# 2023-06-21 11:51:26 FTL_branch master
# 2023-06-21 11:51:26 FTL_current v5.23
# 2023-06-21 11:51:26 FTL_latest v5.23
# 2023-03-04 10:12:39 FTL_status enabled
# 2023-06-21 11:51:26 FTL_update 0
# 2023-03-04 10:12:35 FTL_version 3
# 2023-06-21 11:48:50 ads_blocked_today 10753
# 2023-06-21 11:48:50 ads_percentage_today 54.37949
# 2023-06-21 11:48:50 clients_ever_seen 6
# 2023-06-21 11:51:26 core_branch master
# 2023-06-21 11:51:26 core_current v5.17.1
# 2023-06-21 11:51:26 core_latest v5.17.1
# 2023-06-21 11:51:26 core_update 0
# 2023-06-21 11:48:50 dns_queries_all_replies 19774
# 2023-06-21 11:48:50 dns_queries_all_types 19774
# 2023-06-21 11:48:50 dns_queries_today 19774
# 2023-06-21 11:48:50 domains_being_blocked 205771
# 2023-06-21 11:48:50 gravity_last_updated_absolute 1687054748
# 2023-06-18 04:19:22 gravity_last_updated_abstime 2023-06-18 04:19:08
# 2023-06-21 11:48:50 gravity_last_updated_file_exists 1
# 2023-06-21 11:48:50 gravity_last_updated_relative_days 3
# 2023-06-21 11:48:50 gravity_last_updated_relative_hours 7
# 2023-06-21 11:48:50 gravity_last_updated_relative_minutes 29
# 2023-06-21 11:48:50 privacy_level 0
# 2023-06-21 11:48:50 queries_cached 2204
# 2023-06-21 11:48:50 queries_forwarded 6679
# 2023-06-21 11:48:50 reply_BLOB 64
# 2023-06-21 11:48:50 reply_CNAME 3370
# 2023-06-21 11:48:50 reply_DNSSEC 0
# 2023-06-21 11:48:50 reply_DOMAIN 0
# 2023-06-21 11:48:50 reply_IP 14138
# 2023-06-21 11:48:50 reply_NODATA 667
# 2023-06-21 11:48:50 reply_NONE 0
# 2023-06-21 11:48:50 reply_NOTIMP 0
# 2023-06-21 11:48:50 reply_NXDOMAIN 1349
# 2023-06-21 11:48:50 reply_OTHER 0
# 2023-06-21 11:48:50 reply_REFUSED 0
# 2023-06-21 11:48:50 reply_RRNAME 25
# 2023-06-21 11:48:50 reply_SERVFAIL 25
# 2023-06-21 11:48:50 reply_UNKNOWN 136
# 2023-06-21 11:48:50 status enabled
# 2023-06-21 11:48:50 unique_clients 6
# 2023-06-21 11:48:50 unique_domains 3092
# 2023-06-21 11:51:26 web_branch master
# 2023-06-21 11:51:26 web_current v5.20.1
# 2023-06-21 11:51:26 web_latest v5.20.1
# 2023-06-21 11:51:26 web_update 0
# REQUEST:
# context get
# data
# header
# ignoreredirects 0
# num 01
# retryCount 0
# type get01
# url %%api_url%%?summaryRaw&%%auth%%
# defptr:
# readingBase:
# FTL_branch get
# FTL_current get
# FTL_latest get
# FTL_update get
# ads_blocked_today get
# ads_percentage_today get
# clients_ever_seen get
# core_branch get
# core_current get
# core_latest get
# core_update get
# dns_queries_all_replies get
# dns_queries_all_types get
# dns_queries_today get
# domains_being_blocked get
# gravity_last_updated_absolute get
# gravity_last_updated_file_exists get
# gravity_last_updated_relative_days get
# gravity_last_updated_relative_hours get
# gravity_last_updated_relative_minutes get
# privacy_level get
# queries_cached get
# queries_forwarded get
# reply_BLOB get
# reply_CNAME get
# reply_DNSSEC get
# reply_DOMAIN get
# reply_IP get
# reply_NODATA get
# reply_NONE get
# reply_NOTIMP get
# reply_NXDOMAIN get
# reply_OTHER get
# reply_REFUSED get
# reply_RRNAME get
# reply_SERVFAIL get
# reply_UNKNOWN get
# status get
# unique_clients get
# unique_domains get
# web_branch get
# web_current get
# web_latest get
# web_update get
# readingNum:
# FTL_branch 02
# FTL_current 02
# FTL_latest 02
# FTL_update 02
# ads_blocked_today 01
# ads_percentage_today 01
# clients_ever_seen 01
# core_branch 02
# core_current 02
# core_latest 02
# core_update 02
# dns_queries_all_replies 01
# dns_queries_all_types 01
# dns_queries_today 01
# domains_being_blocked 01
# gravity_last_updated_absolute 01
# gravity_last_updated_file_exists 01
# gravity_last_updated_relative_days 01
# gravity_last_updated_relative_hours 01
# gravity_last_updated_relative_minutes 01
# privacy_level 01
# queries_cached 01
# queries_forwarded 01
# reply_BLOB 01
# reply_CNAME 01
# reply_DNSSEC 01
# reply_DOMAIN 01
# reply_IP 01
# reply_NODATA 01
# reply_NONE 01
# reply_NOTIMP 01
# reply_NXDOMAIN 01
# reply_OTHER 01
# reply_REFUSED 01
# reply_RRNAME 01
# reply_SERVFAIL 01
# reply_UNKNOWN 01
# status 01
# unique_clients 01
# unique_domains 01
# web_branch 02
# web_current 02
# web_latest 02
# web_update 02
# readingOutdated:
# requestReadings:
# get01:
# ads_blocked_today get 01
# ads_percentage_today get 01
# clients_ever_seen get 01
# dns_queries_all_replies get 01
# dns_queries_all_types get 01
# dns_queries_today get 01
# domains_being_blocked get 01
# gravity_last_updated_absolute get 01
# gravity_last_updated_file_exists get 01
# gravity_last_updated_relative_days get 01
# gravity_last_updated_relative_hours get 01
# gravity_last_updated_relative_minutes get 01
# privacy_level get 01
# queries_cached get 01
# queries_forwarded get 01
# reply_BLOB get 01
# reply_CNAME get 01
# reply_DNSSEC get 01
# reply_DOMAIN get 01
# reply_IP get 01
# reply_NODATA get 01
# reply_NONE get 01
# reply_NOTIMP get 01
# reply_NXDOMAIN get 01
# reply_OTHER get 01
# reply_REFUSED get 01
# reply_RRNAME get 01
# reply_SERVFAIL get 01
# reply_UNKNOWN get 01
# status get 01
# unique_clients get 01
# unique_domains get 01
# get02:
# FTL_branch get 02
# FTL_current get 02
# FTL_latest get 02
# FTL_update get 02
# core_branch get 02
# core_current get 02
# core_latest get 02
# core_update get 02
# web_branch get 02
# web_current get 02
# web_latest get 02
# web_update get 02
# helper:
# bm:
# CODE(0x5583ce7df4b0):
# cnt 187
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 20.06. 09:48:16
# max 0.0160360336303711
# tot 0.270743131637573
# mAr:
# HASH(0x5583d4c0e568)
# pihole
# ?
# CODE(0x5583ce8c2700):
# cnt 1
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 21.06. 11:48:49
# max 0.00338411331176758
# tot 0.00338411331176758
# mAr:
# HASH(0x5583d4c0e568)
# pihole HTTPMOD none 60
# CODE(0x5583ce8c28b0):
# cnt 71
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 21.06. 11:48:50
# max 3.09944152832031e-05
# tot 0.00143766403198242
# mAr:
# HASH(0x5583d4c0e568)
# HASH(0x5583c8fc5168)
# CODE(0x5583ce8c4af8):
# cnt 58
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 21.06. 11:48:50
# max 0.0158441066741943
# tot 0.28801965713501
# mAr:
# set
# pihole
# devStateIcon
# {piholeDevStateIcon($name)}
# CODE(0x5583ce8c4bd0):
# cnt 31
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 21.06. 11:51:26
# max 0.0112020969390869
# tot 0.0244996547698975
# mAr:
# HASH(0x5583d4c0e568)
# pihole
# versions
# lastpoll:
# summary 1687343035.76795
# versions 1687340929.92065
#
setstate pihole enabled
setstate pihole 2023-06-21 11:51:26 FTL_branch master
setstate pihole 2023-06-21 11:51:26 FTL_current v5.23
setstate pihole 2023-06-21 11:51:26 FTL_latest v5.23
setstate pihole 2023-03-04 10:12:39 FTL_status enabled
setstate pihole 2023-06-21 11:51:26 FTL_update 0
setstate pihole 2023-03-04 10:12:35 FTL_version 3
setstate pihole 2023-06-21 11:48:50 ads_blocked_today 10753
setstate pihole 2023-06-21 11:48:50 ads_percentage_today 54.37949
setstate pihole 2023-06-21 11:48:50 clients_ever_seen 6
setstate pihole 2023-06-21 11:51:26 core_branch master
setstate pihole 2023-06-21 11:51:26 core_current v5.17.1
setstate pihole 2023-06-21 11:51:26 core_latest v5.17.1
setstate pihole 2023-06-21 11:51:26 core_update 0
setstate pihole 2023-06-21 11:48:50 dns_queries_all_replies 19774
setstate pihole 2023-06-21 11:48:50 dns_queries_all_types 19774
setstate pihole 2023-06-21 11:48:50 dns_queries_today 19774
setstate pihole 2023-06-21 11:48:50 domains_being_blocked 205771
setstate pihole 2023-06-21 11:48:50 gravity_last_updated_absolute 1687054748
setstate pihole 2023-06-18 04:19:22 gravity_last_updated_abstime 2023-06-18 04:19:08
setstate pihole 2023-06-21 11:48:50 gravity_last_updated_file_exists 1
setstate pihole 2023-06-21 11:48:50 gravity_last_updated_relative_days 3
setstate pihole 2023-06-21 11:48:50 gravity_last_updated_relative_hours 7
setstate pihole 2023-06-21 11:48:50 gravity_last_updated_relative_minutes 29
setstate pihole 2023-06-21 11:48:50 privacy_level 0
setstate pihole 2023-06-21 11:48:50 queries_cached 2204
setstate pihole 2023-06-21 11:48:50 queries_forwarded 6679
setstate pihole 2023-06-21 11:48:50 reply_BLOB 64
setstate pihole 2023-06-21 11:48:50 reply_CNAME 3370
setstate pihole 2023-06-21 11:48:50 reply_DNSSEC 0
setstate pihole 2023-06-21 11:48:50 reply_DOMAIN 0
setstate pihole 2023-06-21 11:48:50 reply_IP 14138
setstate pihole 2023-06-21 11:48:50 reply_NODATA 667
setstate pihole 2023-06-21 11:48:50 reply_NONE 0
setstate pihole 2023-06-21 11:48:50 reply_NOTIMP 0
setstate pihole 2023-06-21 11:48:50 reply_NXDOMAIN 1349
setstate pihole 2023-06-21 11:48:50 reply_OTHER 0
setstate pihole 2023-06-21 11:48:50 reply_REFUSED 0
setstate pihole 2023-06-21 11:48:50 reply_RRNAME 25
setstate pihole 2023-06-21 11:48:50 reply_SERVFAIL 25
setstate pihole 2023-06-21 11:48:50 reply_UNKNOWN 136
setstate pihole 2023-06-21 11:48:50 status enabled
setstate pihole 2023-06-21 11:48:50 unique_clients 6
setstate pihole 2023-06-21 11:48:50 unique_domains 3092
setstate pihole 2023-06-21 11:51:26 web_branch master
setstate pihole 2023-06-21 11:51:26 web_current v5.20.1
setstate pihole 2023-06-21 11:51:26 web_latest v5.20.1
setstate pihole 2023-06-21 11:51:26 web_update 0
Hast du das Passwort oder das API-Token gestezt. Letzteres ist dasd richtige.
Zu finden unter Settings -> API -> Show API Token
VG Sebastian
Hallo binford6000,
bingo - das war's. Ich hatte das Webpasswort eingetragen, nicht aber den (sehr langen) API Token.
Jetzt läuft es wieder.
Vielen Dank
Gisbert
Hallo binford6000,
ich hab Pi-hole in Proxmox auf einem Fujitsu Futro S740 installiert. Fhem läuft derzeit noch auf einem HP T610. Ich hab Pi-hole und unbound vom HP T610 deinstalliert.
Zeitgleich sehe ich, dass folgende Module nicht mehr funktionieren, d.h. keine Readings erneuert werden.
Pushover
Signal -> funktioniert wieder nach Perl-Update (sudo cpan install Protocol::DBus)
HTTPMOD
Netatmo
Im log-file gibt es viele Einträge von verschiedenen Devices in der Art:
http request error: DNS: short DNS answer
Was kann denn hier schief gelaufen sein? Ich bin ratlos.
Viele Grüße Gisbert
Evtl. hilft das hier: https://forum.fhem.de/index.php?topic=108266.0
Nutzt du piHole als DNS (vermutlich ja)...
Evtl. da was "verkonfiguriert"?
Hat aber nur bedingt mit diesem Thread zu tun? 8)
Gruß, Joachim
Hallo Joachim,
ich halte mich kurz, da es in diesem Thread off-topic ist; den Link hatte ich auch noch gefunden, wollte aber keinen Doppel-Post machen.
Das Problem war, dass Pi-hole und Fhem jetzt auf unterschiedlichen Servern laufen, aber das Attribut dnsServer in global 127.0.0.1 war. Nachdem ich dort die IP-Adresse des neuen Pi-hole-Servers eingetragen hab, läuft alles wieder wie am Schnürchen. Das ganze hat mich 3 Stunden gekostet, war nahe am Rand der Verzweifelung ::) >:(
Viele Grüße Gisbert
Bei mir wurde die Eingabe des Passwortes im Device nicht angezeigt.
Durch zusätzliche Eintrag von
attr <NAME> enableControlSet 1
konnte ich nun den Token eingeben.
Hallo zusammen,
ich benötige Eure Hilfe. Ich habe mein FHEM komplett neu aufgebaut und wollte nun auch die pi-hole-Daten wieder integrieren. Allerdings bekomme ich diesen Fehler:
2023.09.20 20:22:04 5: pihole: Replace called for type get, regex (?^:%%auth%%), mode text, value auth=%%pihole-token%% input: %%base_url%%
2023.09.20 20:22:04 5: pihole: Replace called for type get, regex (?^:%%pihole-token%%), mode key, value pihole-token input: %%base_url%%
2023.09.20 20:22:04 5: pihole: ReadKeyValue tries to read value for pihole-token from file
2023.09.20 20:22:04 4: pihole: ReadKeyValue could not find key pihole-token in file
Ich habe schon gefühlt 1000-mal den Key abgespeichert. Es ist auch der richtige, da es im Browser mit
https://pi-hole.lan/admin/api.php?summary&auth=xxxxxxxxxxx
funktioniert. Auch löschen und neu anlegen funktioniert nicht. FHEM ist auf dem aktuellesten Stand. Als Betriebssystem nutze ich Ubuntu.
Wer kann helfen?
Viele Grüße
Jürgen
Hallo zusammen,
ich habe herausgefunden, dass aktuell keine "pihole-token" mehr in die Datei "u..." geschrieben werden. Wer hat eine Idee? Ich vermute, dass das Problem mit "setKeyValue" zusammenhängt.
Viele Grüße
Jürgen
Hallo,
In der JSON-Liste werden nun auch die Docker-Versionen übergeben.
core_update false
web_update false
FTL_update false
docker_update true
core_current "v5.17.1"
web_current "v5.20.1"
FTL_current "v5.23"
docker_current "2023.05.2"
core_latest "v5.17.2"
web_latest ""
FTL_latest "v5.23"
docker_latest "2023.10.0"
core_branch "master"
web_branch "master"
FTL_branch "master"
Ich habe nun die Anzeige wie folgt angepasst:
my $docker_jn = ReadingsVal($name,'docker_current','unknown');
my $ver_info = 'unknown';
if($docker_jn eq 'unknown') {
$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');
}else{
$ver_info = "Docker: ".ReadingsVal($name,'docker_current','unknown').' => '.ReadingsVal($name,'docker_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 $docker_upd=ReadingsNum($name,'docker_update',0);
my $anyUpd=$ftl_upd+$core_upd+$web_upd+$docker_upd+0;
Handelt es sich um eine Docker-Version, wird nur diese angezeigt. Ansonsten die Werte für FTL, Core und Web.
Jürgen
Guten Tag
Bekomme das mit den Pihole in fhem anzeigen nicht hin.
[code] Internals:
CFGFN
DEF 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
FUUID 6554afd4-f33f-cdd4-7255-4ae072aed851b70b
Interval 60
MainURL
ModuleVersion 4.1.12 - 19.4.2022
NAME pihole
NOTIFYDEV global
NR 154697
NTFY_ORDER 50-pihole
STATE ???
TYPE HTTPMOD
eventCount 1
Attributes:
replacement04Value 192.168.0.115
[/code]
Habe auch in device set storeKeyValue pihole-token und dann das lange Passwort aus der setup vras.conf eingeben.
Über den Explorer ist Pihol über http://192.168.0.115/admin/index.php mit Passwort ereichbar.
Aber trotzdem wird nix in fhem angezeigt.
Wie hast du denn das Device definiert?
Deine DEF ist doch "Müll"?
Die Attribute, die bei dir in DEF stehen ghören doch als Attribute INS/ANS Device NICHT in DEF des Devices!?
Diese Sub "piholeDevStateIcon" hast du auch "angelegt" (in deiner myUtils o.ä.)?
Gruß, Joachim
Oh ja
Ich hab das jetzt ordentlich gemacht ;D
ZitatInternals:
BUSY 0
CFGFN
DEF http://192.168.0.115/admin/api.php?summary 60
FUUID 6554e0eb-f33f-cdd4-5bc1-a5a6eeb6437c5de9
Interval 60
MainURL http://192.168.0.115/admin/api.php?summary
ModuleVersion 4.1.12 - 19.4.2022
NAME pihole
NOTIFYDEV global
NR 162452
NTFY_ORDER 50-pihole
STATE <p align="left"><b>DNS Anfragen:</b>  ; ; ; ; dns_queries_today <br> <b>Geblockte Seiten:</b>  ; ads_blocked_today (ads_percentage_today %)
TYPE HTTPMOD
eventCount 1
value
HTTPCookieHash:
PHPSESSID;/:
Name PHPSESSID
Options path=/; HttpOnly; SameSite=Strict
Path /
Value hmlq7u1im8lqarpiu7dhqt6ge8
HttpUtils:
NAME
addr http://192.168.0.115:80
auth 0
buf
code 200
compress 1
conn
data
displayurl http://192.168.0.115/admin/api.php?summary
header Cookie: PHPSESSID=hmlq7u1im8lqarpiu7dhqt6ge8
host 192.168.0.115
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=hmlq7u1im8lqarpiu7dhqt6ge8; 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: 0
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: 2
Connection: close
Date: Wed, 15 Nov 2023 16:02:00 GMT
Server: lighttpd/1.4.53
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 80
hu_portSfx
ignoreredirects 1
loglevel 4
path /admin/api.php?summary
protocol http
redirects 0
timeout 2
url http://192.168.0.115/admin/api.php?summary
sslargs:
QUEUE:
READINGS:
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url http://192.168.0.115/admin/api.php?summary
Attributes:
extractAllJSON 1
getURL http://192.168.0.115/admin/api.php
stateFormat <p align="left"><b>DNS Anfragen:</b>  ; ; ; ; dns_queries_today <br> <b>Geblockte Seiten:</b>  ; ads_blocked_today (ads_percentage_today %)
Das passwort habe ich über set pihole storeKeyValue pihole-token und dann das lange Passwort aus der setup vras.conf eingeben.
Nein, das ist noch nicht ordentlich. Da fehlen immer noch alle Attribute.
Die DEF ist doch auch falsch!
Bei mir: none 60
Weil die Abfrage geht doch über die Attribute...
Warum fügst du nicht einfach eines der letzten Raw-Defs aus dem Thread per Raw-Def ein und gut!?
Nicht vergessen die Sub piholeDevStateIcon in die myUtils einzufügen...
Gruß, Joachim
Danke hat super geklappt
Bei mir klappt soweit alles auser das upd wird nicht angezeigt.
Owohl ich
Zitatsub 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;
}
ZitatSave config
anyViews
0_System
1_UG
2_EG
3_1.OG
4_2.OG
Wecker.Aus 5_Klingel
6_Heizung
7_Muelltonne
8_Zuhause
9_Batterie
FBDECT
Garten
HUEDevice
ge_wht_steckdose Keller
Plots
Unsorted
icoEverything Everything
Commandref
Remote doc
Edit files
Select style
Event monitor
Internals:
BUSY 0
DEF none 60
FUUID 65551717-f33f-cdd4-92ce-9186b03dde4b4b6d
Interval 60
MainURL
ModuleVersion 4.1.12 - 19.4.2022
NAME pihole
NOTIFYDEV global
NR 460
NTFY_ORDER 50-pihole
STATE 1699758585
TYPE HTTPMOD
eventCount 38
value
CompiledRegexes:
HTTPCookieHash:
PHPSESSID;/:
Name PHPSESSID
Options path=/; HttpOnly; SameSite=Strict
Path /
Value 1b74aecqmi6q5ptddp1mipg20g
HttpUtils:
NAME
addr http://192.168.0.115:80
auth 0
buf
code 200
compress 1
conn
data
displayurl http://192.168.0.115/admin/api.php?summaryRaw&auth=c5946a8f72cb3c3b4458732d6776bd39516e5be00f611e86916ff169cf61600b
header Cookie: PHPSESSID=1b74aecqmi6q5ptddp1mipg20g
host 192.168.0.115
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=1b74aecqmi6q5ptddp1mipg20g; 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: 0
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: 686
Connection: close
Date: Wed, 15 Nov 2023 22:33:09 GMT
Server: lighttpd/1.4.53
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 80
hu_portSfx
ignoreredirects 1
loglevel 4
path /admin/api.php?summaryRaw&auth=c5946a8f72cb3c3b4458732d6776bd39516e5be00f611e86916ff169cf61600b
protocol http
redirects 0
timeout 2
url http://192.168.0.115/admin/api.php?summaryRaw&auth=c5946a8f72cb3c3b4458732d6776bd39516e5be00f611e86916ff169cf61600b
sslargs:
QUEUE:
READINGS:
2023-11-15 23:33:09 ads_blocked_today 4144
2023-11-15 23:33:09 ads_percentage_today 30.888491
2023-11-15 23:33:09 clients_ever_seen 2
2023-11-15 23:33:09 dns_queries_all_replies 13416
2023-11-15 23:33:09 dns_queries_all_types 13416
2023-11-15 23:33:09 dns_queries_today 13416
2023-11-15 23:33:09 domains_being_blocked 1563469
2023-11-15 23:33:09 gravity_last_updated_absolute 1699758585
2023-11-15 23:33:09 gravity_last_updated_file_exists 1
2023-11-15 23:33:09 gravity_last_updated_relative_days 3
2023-11-15 23:33:09 gravity_last_updated_relative_hours 19
2023-11-15 23:33:09 gravity_last_updated_relative_minutes 23
2023-11-15 23:33:09 privacy_level 0
2023-11-15 23:33:09 queries_cached 263
2023-11-15 23:33:09 queries_forwarded 8642
2023-11-15 23:33:09 reply_BLOB 43
2023-11-15 23:33:09 reply_CNAME 3449
2023-11-15 23:33:09 reply_DNSSEC 0
2023-11-15 23:33:09 reply_DOMAIN 106
2023-11-15 23:33:09 reply_IP 7234
2023-11-15 23:33:09 reply_NODATA 2189
2023-11-15 23:33:09 reply_NONE 0
2023-11-15 23:33:09 reply_NOTIMP 0
2023-11-15 23:33:09 reply_NXDOMAIN 49
2023-11-15 23:33:09 reply_OTHER 0
2023-11-15 23:33:09 reply_REFUSED 0
2023-11-15 23:33:09 reply_RRNAME 0
2023-11-15 23:33:09 reply_SERVFAIL 0
2023-11-15 23:33:09 reply_UNKNOWN 346
2023-11-15 23:33:09 status enabled
2023-11-15 23:33:09 unique_clients 2
2023-11-15 23:33:09 unique_domains 1426
REQUEST:
context get
data
header
ignoreredirects 0
num 01
retryCount 0
type get01
url %%api_url%%?summaryRaw&auth=%%pihole-token%%
defptr:
readingBase:
ads_blocked_today get
ads_percentage_today get
clients_ever_seen get
dns_queries_all_replies get
dns_queries_all_types get
dns_queries_today get
domains_being_blocked get
gravity_last_updated_absolute get
gravity_last_updated_file_exists get
gravity_last_updated_relative_days get
gravity_last_updated_relative_hours get
gravity_last_updated_relative_minutes get
privacy_level get
queries_cached get
queries_forwarded get
reply_BLOB get
reply_CNAME get
reply_DNSSEC get
reply_DOMAIN get
reply_IP get
reply_NODATA get
reply_NONE get
reply_NOTIMP get
reply_NXDOMAIN get
reply_OTHER get
reply_REFUSED get
reply_RRNAME get
reply_SERVFAIL get
reply_UNKNOWN get
status get
unique_clients get
unique_domains get
readingNum:
ads_blocked_today 01
ads_percentage_today 01
clients_ever_seen 01
dns_queries_all_replies 01
dns_queries_all_types 01
dns_queries_today 01
domains_being_blocked 01
gravity_last_updated_absolute 01
gravity_last_updated_file_exists 01
gravity_last_updated_relative_days 01
gravity_last_updated_relative_hours 01
gravity_last_updated_relative_minutes 01
privacy_level 01
queries_cached 01
queries_forwarded 01
reply_BLOB 01
reply_CNAME 01
reply_DNSSEC 01
reply_DOMAIN 01
reply_IP 01
reply_NODATA 01
reply_NONE 01
reply_NOTIMP 01
reply_NXDOMAIN 01
reply_OTHER 01
reply_REFUSED 01
reply_RRNAME 01
reply_SERVFAIL 01
reply_UNKNOWN 01
status 01
unique_clients 01
unique_domains 01
readingOutdated:
requestReadings:
get01:
ads_blocked_today get 01
ads_percentage_today get 01
clients_ever_seen get 01
dns_queries_all_replies get 01
dns_queries_all_types get 01
dns_queries_today get 01
domains_being_blocked get 01
gravity_last_updated_absolute get 01
gravity_last_updated_file_exists get 01
gravity_last_updated_relative_days get 01
gravity_last_updated_relative_hours get 01
gravity_last_updated_relative_minutes get 01
privacy_level get 01
queries_cached get 01
queries_forwarded get 01
reply_BLOB get 01
reply_CNAME get 01
reply_DNSSEC get 01
reply_DOMAIN get 01
reply_IP get 01
reply_NODATA get 01
reply_NONE get 01
reply_NOTIMP get 01
reply_NXDOMAIN get 01
reply_OTHER get 01
reply_REFUSED get 01
reply_RRNAME get 01
reply_SERVFAIL get 01
reply_UNKNOWN get 01
status get 01
unique_clients get 01
unique_domains get 01
lastpoll:
statistics 1700087589.78745
Attributes:
alias Pi-Hole
devStateIcon {piholeDevStateIcon($name)}
enforceGoodReadingNames 1
event-on-change-reading .*
extractAllJSON 1
get01Name statistics
get01Poll 1
get01URL %%api_url%%?summaryRaw&auth=%%pihole-token%%
getURL %%api_url%%
group Pi-Hole
icon it_raspberry_logo
replacement01Mode key
replacement01Regex %%pihole-token%%
replacement01Value pihole-token
replacement02Mode text
replacement02Regex %%api_url%%
replacement02Value %%base_url%%/api.php
replacement03Mode text
replacement03Regex %%base_url%%
replacement03Value http://%%ip%%/admin
replacement04Mode text
replacement04Regex %%ip%%
replacement04Value 192.168.0.115
room 0_System
set01FollowGet statistics
set01Hint 10,60,180,300,600,900
set01Max 900
set01Min 10
set01Name PiHoleDisable
set01URL %%api_url%%?disable=$val&auth=%%pihole-token%%
set02FollowGet statistics
set02Name PiHoleEnable
set02NoArg 1
set02URL %%api_url%%?enable&auth=%%pihole-token%%
stateFormat gravity_last_updated_absolute
:-*
Welche Version hast du denn genommen?
Du hast keine Readings bzgl. Version...
Z.B. FTL_version usw.
Es fehlen (so ich das überflogen habe / auf dem Handy nicht so einfach) die Reading-Attribute dafür...
EDIT: hier sind diese z.B. enthalten https://forum.fhem.de/index.php?topic=84031.msg1270613#msg1270613
Gruß, Joachim
Habe die von Benni aus Beitrag 49 gennommen. Wo sind denn die readings dafür?
Die Version hab ich jetzt. Qird aber nicht über upd mint grünen Punkt angezeigt.
ZitatSave config
anyViews
0_System
1_UG
2_EG
3_1.OG
4_2.OG
Wecker.Aus 5_Klingel
6_Heizung
7_Muelltonne
8_Zuhause
9_Batterie
FBDECT
Garten
HUEDevice
ge_wht_steckdose Keller
Plots
Unsorted
icoEverything Everything
Commandref
Remote doc
Edit files
Select style
Event monitor
Internals:
BUSY 0
DEF none 60
FUUID 65551717-f33f-cdd4-92ce-9186b03dde4b4b6d
Interval 60
MainURL
ModuleVersion 4.1.12 - 19.4.2022
NAME pihole
NOTIFYDEV global
NR 460
NTFY_ORDER 50-pihole
STATE 1699758585
TYPE HTTPMOD
eventCount 480
value
CompiledRegexes:
HTTPCookieHash:
PHPSESSID;/:
Name PHPSESSID
Options path=/; HttpOnly; SameSite=Strict
Path /
Value 1b74aecqmi6q5ptddp1mipg20g
HttpUtils:
NAME
addr http://192.168.0.115:80
auth 0
buf
code 200
compress 1
conn
data
displayurl http://192.168.0.115/admin/api.php?summaryRaw&auth=c5946a8f72cb3c3b4458732d6776bd39516e5be00f611e86916ff169cf61600b
header Cookie: PHPSESSID=1b74aecqmi6q5ptddp1mipg20g
host 192.168.0.115
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=1b74aecqmi6q5ptddp1mipg20g; 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: 0
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: 685
Connection: close
Date: Thu, 16 Nov 2023 05:54:14 GMT
Server: lighttpd/1.4.53
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 80
hu_portSfx
ignoreredirects 1
loglevel 4
path /admin/api.php?summaryRaw&auth=c5946a8f72cb3c3b4458732d6776bd39516e5be00f611e86916ff169cf61600b
protocol http
redirects 0
timeout 2
url http://192.168.0.115/admin/api.php?summaryRaw&auth=c5946a8f72cb3c3b4458732d6776bd39516e5be00f611e86916ff169cf61600b
sslargs:
QUEUE:
READINGS:
2023-11-16 06:41:15 FTL_branch master
2023-11-16 06:41:15 FTL_current v5.23
2023-11-16 06:41:15 FTL_latest v5.23
2023-11-16 06:41:15 FTL_update 0
2023-11-16 06:54:14 ads_blocked_today 4728
2023-11-16 06:54:14 ads_percentage_today 31.543131
2023-11-16 06:54:14 clients_ever_seen 2
2023-11-16 06:41:15 core_branch master
2023-11-16 06:41:15 core_current v5.17.2
2023-11-16 06:41:15 core_latest v5.17.2
2023-11-16 06:41:15 core_update 0
2023-11-16 06:54:14 dns_queries_all_replies 14989
2023-11-16 06:54:14 dns_queries_all_types 14989
2023-11-16 06:54:14 dns_queries_today 14989
2023-11-16 06:54:14 domains_being_blocked 1563469
2023-11-16 06:54:14 gravity_last_updated_absolute 1699758585
2023-11-16 06:54:14 gravity_last_updated_file_exists 1
2023-11-16 06:54:14 gravity_last_updated_relative_days 4
2023-11-16 06:54:14 gravity_last_updated_relative_hours 2
2023-11-16 06:54:14 gravity_last_updated_relative_minutes 44
2023-11-16 06:54:14 privacy_level 0
2023-11-16 06:54:14 queries_cached 262
2023-11-16 06:54:14 queries_forwarded 9579
2023-11-16 06:54:14 reply_BLOB 46
2023-11-16 06:54:14 reply_CNAME 3925
2023-11-16 06:54:14 reply_DNSSEC 0
2023-11-16 06:54:14 reply_DOMAIN 106
2023-11-16 06:54:14 reply_IP 8204
2023-11-16 06:54:14 reply_NODATA 2275
2023-11-16 06:54:14 reply_NONE 0
2023-11-16 06:54:14 reply_NOTIMP 0
2023-11-16 06:54:14 reply_NXDOMAIN 49
2023-11-16 06:54:14 reply_OTHER 0
2023-11-16 06:54:14 reply_REFUSED 0
2023-11-16 06:54:14 reply_RRNAME 0
2023-11-16 06:54:14 reply_SERVFAIL 0
2023-11-16 06:54:14 reply_UNKNOWN 384
2023-11-16 06:54:14 status enabled
2023-11-16 06:54:14 unique_clients 2
2023-11-16 06:54:14 unique_domains 1595
2023-11-16 06:41:15 web_branch master
2023-11-16 06:41:15 web_current v5.20.2
2023-11-16 06:41:15 web_latest v5.20.2
2023-11-16 06:41:15 web_update 0
REQUEST:
context get
data
header
ignoreredirects 0
num 01
retryCount 0
type get01
url %%api_url%%?summaryRaw&auth=%%pihole-token%%
defptr:
readingBase:
FTL_branch get
FTL_current get
FTL_latest get
FTL_update get
ads_blocked_today get
ads_percentage_today get
clients_ever_seen get
core_branch get
core_current get
core_latest get
core_update get
dns_queries_all_replies get
dns_queries_all_types get
dns_queries_today get
domains_being_blocked get
gravity_last_updated_absolute get
gravity_last_updated_file_exists get
gravity_last_updated_relative_days get
gravity_last_updated_relative_hours get
gravity_last_updated_relative_minutes get
privacy_level get
queries_cached get
queries_forwarded get
reply_BLOB get
reply_CNAME get
reply_DNSSEC get
reply_DOMAIN get
reply_IP get
reply_NODATA get
reply_NONE get
reply_NOTIMP get
reply_NXDOMAIN get
reply_OTHER get
reply_REFUSED get
reply_RRNAME get
reply_SERVFAIL get
reply_UNKNOWN get
status get
unique_clients get
unique_domains get
web_branch get
web_current get
web_latest get
web_update get
readingNum:
FTL_branch 02
FTL_current 02
FTL_latest 02
FTL_update 02
ads_blocked_today 01
ads_percentage_today 01
clients_ever_seen 01
core_branch 02
core_current 02
core_latest 02
core_update 02
dns_queries_all_replies 01
dns_queries_all_types 01
dns_queries_today 01
domains_being_blocked 01
gravity_last_updated_absolute 01
gravity_last_updated_file_exists 01
gravity_last_updated_relative_days 01
gravity_last_updated_relative_hours 01
gravity_last_updated_relative_minutes 01
privacy_level 01
queries_cached 01
queries_forwarded 01
reply_BLOB 01
reply_CNAME 01
reply_DNSSEC 01
reply_DOMAIN 01
reply_IP 01
reply_NODATA 01
reply_NONE 01
reply_NOTIMP 01
reply_NXDOMAIN 01
reply_OTHER 01
reply_REFUSED 01
reply_RRNAME 01
reply_SERVFAIL 01
reply_UNKNOWN 01
status 01
unique_clients 01
unique_domains 01
web_branch 02
web_current 02
web_latest 02
web_update 02
readingOutdated:
requestReadings:
get01:
ads_blocked_today get 01
ads_percentage_today get 01
clients_ever_seen get 01
dns_queries_all_replies get 01
dns_queries_all_types get 01
dns_queries_today get 01
domains_being_blocked get 01
gravity_last_updated_absolute get 01
gravity_last_updated_file_exists get 01
gravity_last_updated_relative_days get 01
gravity_last_updated_relative_hours get 01
gravity_last_updated_relative_minutes get 01
privacy_level get 01
queries_cached get 01
queries_forwarded get 01
reply_BLOB get 01
reply_CNAME get 01
reply_DNSSEC get 01
reply_DOMAIN get 01
reply_IP get 01
reply_NODATA get 01
reply_NONE get 01
reply_NOTIMP get 01
reply_NXDOMAIN get 01
reply_OTHER get 01
reply_REFUSED get 01
reply_RRNAME get 01
reply_SERVFAIL get 01
reply_UNKNOWN get 01
status get 01
unique_clients get 01
unique_domains get 01
get02:
FTL_branch get 02
FTL_current get 02
FTL_latest get 02
FTL_update get 02
core_branch get 02
core_current get 02
core_latest get 02
core_update get 02
web_branch get 02
web_current get 02
web_latest get 02
web_update get 02
lastpoll:
statistics 1700114054.32762
versions 1700113274.30733
Attributes:
alias Pi-Hole
devStateIcon {piholeDevStateIcon($name)}
enforceGoodReadingNames 1
event-on-change-reading .*
extractAllJSON 1
get01Name statistics
get01Poll 1
get01URL %%api_url%%?summaryRaw&auth=%%pihole-token%%
get02ExtractAllJSON 1
get02Name versions
get02Poll 1
get02PollDelay 3600
get02URL %%api_url%%?versions&%%auth%%
get03JSON status
get03Name FTL_status
get03URL %%api_url%%?status&%%auth%%
get04JSON type
get04Name FTL_type
get04URL %%api_url%%?type&%%auth%%
get05JSON version
get05Name FTL_version
get05URL %%api_url%%?version&%%auth%%
getURL %%api_url%%
group Pi-Hole
icon it_raspberry_logo
replacement01Mode key
replacement01Regex %%pihole-token%%
replacement01Value pihole-token
replacement02Mode text
replacement02Regex %%api_url%%
replacement02Value %%base_url%%/api.php
replacement03Mode text
replacement03Regex %%base_url%%
replacement03Value http://%%ip%%/admin
replacement04Mode text
replacement04Regex %%ip%%
replacement04Value 192.168.0.115
room 0_System
set01FollowGet statistics
set01Hint 10,60,180,300,600,900
set01Max 900
set01Min 10
set01Name PiHoleDisable
set01URL %%api_url%%?disable=$val&auth=%%pihole-token%%
set02FollowGet statistics
set02Name PiHoleEnable
set02NoArg 1
set02URL %%api_url%%?enable&auth=%%pihole-token%%
stateFormat gravity_last_updated_absolute
Vergleiche doch mal was du hast mit dem wo ich verlinkt habe...
Das passt doch immer noch nicht...
EDIT:
Zitat von: Sebastian84 am 16 November 2023, 03:21:50Habe die von Benni aus Beitrag 49 gennommen. Wo sind denn die readings dafür?
-> das ist doch nur die erweiterte Sub...
EDIT: evtl. mal hier einsteigen?
https://forum.fhem.de/index.php?topic=84031.msg1270612#msg1270612
Und dann mal lesen, ob es seit dem Anpassungen gegeben hat (die dich betreffen/interessieren)...
EDIT: ich weiß ja nicht mit was du arbeitest (sieht nach Tablet aus so wie deine lists aussehen?) aber evtl. passieren da bei copy&paste von RAW etc. auch "komische Dinge"...
Und besser lists etc. in code-Tags...
Gruß, Joachim