Hallo zusammen,
verstehe leider die Optionen von Regex nicht. Ich möchte aus einer Webseite IPv6 und IPv4 rausholen. Mein Code, der sicher falsch ist, da er nicht funktioniert. Brauche Hilfe.
define IP HTTPMOD https://www.wieistmeineip.de/ipv6-test/ 300
setuuid IP 6548ae69-f33f-9284-8080-72ceb1d34bbc6494
attr IP alias IP
attr IP reading01Name IPv6
attr IP reading01Regex title"><strong>(\d+\:\d+)</strong></div>
attr IP reading02Name IPv4
attr IP reading02Regex ipv4-value">(\d+\.\d+)<\/span>
attr IP room IP
attr IP stateFormat IPv6, IPv4
attr IP timeout 5
Danke für die Hilfe!!!
defmod test HTTPMOD https://www.wieistmeineip.de/ipv6-test/
attr test reading01Name ipv4
attr test reading01Regex lautet[\s\S]+>(\d+\.\d+\.\d+\.\d+)
attr test reading02Name ipv6
attr test reading02Regex lautet[\s\S]+>([0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+)
Für ipv6 konnte ich das nicht testen, in der Antwort, die mein FHEM bekommt, sind keine Werte für ipv6 enthalten, weder hier lokal, noch auf einem externen Server.
Danke für deine Hilfe, aber ich mache bestimmt noch etwas fasch, denn es funktioniert leider nicht. Mein Code:
define IP HTTPMOD https://www.wieistmeineip.de/ipv6-test/ 300
setuuid IP 6548ae69-f33f-9284-8080-72ceb1d34bbc6494
attr IP alias IP
attr IP reading01Name IPv6
attr IP reading01Regex title"><strong>[\s\S]+>([0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+)</strong></div>
attr IP reading02Name IPv4
attr IP reading02Regex ipv4-value">[\s\S]+>(\d+\.\d+\.\d+\.\d+)<\/span>
attr IP room IP
attr IP stateFormat IPv6, IPv4
attr IP timeout 5
attr IP userReadings holeInOne {ReadingsVal($NAME,"IPv6","")." ".ReadingsVal($NAME,"IPv4","")}
Zitat von: LotharRappsilber am 06 November 2023, 13:18:14aber ich mache bestimmt noch etwas fasch, denn es funktioniert leider nicht.
Ja, Du doktorst immer noch an Deinem nicht funktionierenden Code rum, anstatt mein Beispiel als Basis zu verwenden. Mein Beispiel liefert zumindest für ipv4 korrekte Werte.
Außerdem wäre interessant zu sehen, was denn bei Dir als Ergebnis kommt. "funktioniert nicht" ist als Fehlerbeschreibung wenig hilfreich.
IPv4 funktioniert, an IPv6 arbeite ich noch! Verstehe den Code trotzdem nicht, da nach keinem String gesucht wird wie in meinem vorigem Code.
Jetzt kann ich bestimmt gleich auch noch was lernen...
Zitat von: LotharRappsilber am 06 November 2023, 13:36:03da nach keinem String gesucht wird
reading01Regex lautet[\s\S]+>(\d+\.\d+\.\d+\.\d+)
Was ist denn "lautet" sonst, wenn es kein String ist?
Zitat von: LotharRappsilber am 06 November 2023, 13:36:03an IPv6 arbeite ich noch
Schau doch im HTTPMOD device mal im Inhalt des body, ob da überhaupt eine IPv6 auftaucht, bei mir ist der Wert nicht vorhanden. Auf der Webseite sehe ich aber eine IPv6.
Beim Inhalt der Seite taucht natürlich ipv6 auf.
<div id="ipv6" class="ip">
<div>Ihre IP-Adresse lautet:</div>
<div class="title"><strong>2a00:6020:b304:f700:5015:754c:62f6:52bc</strong></div>
</div>
Hier der Code für die externe ipv6:
var wimip = wimip || [];
wimip.ip = "2a00:6020:b304:f700:5015:754c:62f6:52bc";
Woher kopierst Du den HTML Code?
Aus dem Seitenquelltext im Browser oder aus dem body im HTTPMOD device?
Aus dem Seitenquelltext!
Das dachte ich mir. Deshalb hatte ich ja schon vor fast einer Stunde geschrieben:
Zitat von: betateilchen am 06 November 2023, 13:43:37Schau doch im HTTPMOD device mal im Inhalt des body, ob da überhaupt eine IPv6 auftaucht, bei mir ist der Wert nicht vorhanden. Auf der Webseite sehe ich aber eine IPv6.
Aber Du machst halt lieber Deinen eigenen Stiefel...
Ich dachte ich muss immer nach einem String suchen, wie soll das auch anders sein?
Trotz das ich meinen Code abgeändert habe, geht es nicht. Nicht mal ipv6 wird bei den Readings angezeigt.
attr IP reading02Name IPv6
attr IP reading02Regex wimip.ip = "[\s\S]+>([0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+)";
Bitte nochmals um Hilfe!
@Lothar, du bist irgendwie sehr spärlich mit deinen Informationen.
Nimm dir doch mal die response aus dem HTTPMOD Device, wie von betateilchen beschrieben, geh damit auf regex101.com und probiere die IP6-Adresse zu extrahieren. Wenn dir das nicht gelingt, poste die den HTTPMOD body und deinen besten deinen "nahe dran" Versuch.
Grüße,
Oli
Der Inhalt der Webseite, der an den Browser geliefert wird, ist nicht automatisch identisch zu dem Inhalt, der in HTTPMOD ankommt, wenn die gleiche URL aufgerufen wird.
Im HTTPMOD body ist die IPv6 nicht enthalten.
Deshalb kann die ip darin nicht gefunden werden.
Das versuche ich seit mehr als zwei Stunden zu erklären...
ZitatIm HTTPMOD body
ich denke hier fehlt schon das "wissen", was hier mit body gemeint ist.
attr showBody
ZitatshowBody
if set to 1 then the body of http responses will be visible as internal httpbody.
Hab ich verstanden, aber wie bekomme ich ipv6 anders?
Das geht auch ganz ohne HTTPMOD.
sub ip_test {
use Net::Address::IP::Local;
my $address = eval {Net::Address::IP::Local->public};
if ($@) {
Debug "Could not determine IP address";
} else {
Debug $address;
}
my $address_ipv4 = eval {Net::Address::IP::Local->public_ipv4};
if ($@) {
Debug 'Failed via IPv4';
} else {
Debug $address_ipv4;
}
my $address_ipv6 = eval { Net::Address::IP::Local->public_ipv6};
if ($@) {
Debug 'Failed via IPv6';
} else {
Debug $address_ipv6;
}
}
Das Ganze läßt sich problemlos so einbinden, dass z.B. per at regelmäßig die readings in einem dummy beschrieben werden.
Oder man stellt die Daten einfach systemweit in %data zur Verfügung und braucht überhaupt kein extra device zur Ablage.
Oder oder oder...
Danke das Du Dir so viel Mühe gemacht hast, aber wo soll ich Deine Datei in der cfg einbinden?
Perl code in Form von Funktionen gehört nicht in die Konfiguration, sondern in die 99_myUtils.pm.
Das war auch nur ein grobes Schema, um zu zeigen, wie man an die IPs kommen könnte.
Im Beispiel landen die ip-Adressen als Debug-Ausgabe im Logfile, auch das müsste man noch anpassen.
Hallo LotharRappsilber,
ich möchte mich nicht groß einmischen, aber eine Adressermittlung habe ich z.B. in einem AT so umgesetzt.
(als RAW einfügen)
defmod myIP at *04:00:00 { \
readingsSingleUpdate( $defs{ $SELF }, 'IPv4', GetFileFromURL( 'http://checkip4.spdyn.de/' ), 1 );;\
readingsSingleUpdate( $defs{ $SELF }, 'IPv6', GetFileFromURL( 'http://checkip6.spdyn.de/' ), 1 )\
}
Gruß,
JudgeDredd
Danke für den Tipp, aber was bedeutet RAW?
Danke für den Tipp, aber was bedeutet RAW und wo sollte ich den Code einfügen?
Bildschirmfoto 2023-11-07 um 15.18.54.png
Da oben auf das Pluszeichen klicken und dann den Code in das Fenster eingeben.
Mit "Execute" ausführen.
Danke!!!