Zitat von: passibe am 07 Dezember 2025, 23:49:18(Vermutlich kannst du sogar einfach den ganzen Quellcode in ChatGPT kopieren, ihm sagen, welche Elemente du alle haben willst und das erstellt dir sämtliche Regexes ...)War neugierig, ob das klappt. Und ja, es klappt tatsächlich:
Kannst du das für mich erstellen? Habe in einem Forum gefragt und folgende Antwort bekommen:
Würde mir das Leben nicht schwer machen und das von der Sportschau beziehen, die labeln die Elemente mit der entsprechenden class und der Bereich ist im Quellcode sogar entsprechend eingegrenzt, dass man sich easy mit preprocess den relevanten Teil der Seite vorab rausfiltern kann.
Mal als Beispiel:
```
defmod eishockey_test HTTPMOD https://www.sportschau.de/live-und-ergebnisse/eishockey/deutschland-del/tabelle
attr eishockey_test preProcessRegex <!--start module standing-->(.*)<!--end module standing-->
attr eishockey_test reading01Name team
attr eishockey_test reading01RegOpt g
attr eishockey_test reading01Regex <td class="team-shortname team-shortname-"><a href=".*?">(.*?)<\/a>
attr eishockey_test reading02Name spiele
attr eishockey_test reading02RegOpt g
attr eishockey_test reading02Regex <td class="standing-games_played">(\d+)
```
Habe jetzt nicht alles implementiert, der Rest ist nur noch Fleißarbeit, das kannst du dir selbst zusammenstellen.
Bitte Tools wie regex101.com und ChatGPT o.ä. nutzen. Hab dir den relevanten Teil des Quellcodes, weil ich ihn sowieso in der Zwischenablage hatte, mal angehängt. Den kannst du as-is in regex101.com einfügen und die entsprechenden regexes erstellen.
Natürlich im Browser auch Rechtsklick->Element untersuchen nicht vergessen.
(Vermutlich kannst du sogar einfach den ganzen Quellcode in ChatGPT kopieren, ihm sagen, welche Elemente du alle haben willst und das erstellt dir sämtliche Regexes ...)
---
Hier noch der Code aus dem Anhang:
[...]Alles klar — ich baue dir das **fertige FHEM‐HTTPMOD-Modul** daraus, sodass du folgende Werte bekommst:
| Wert | Spalte |
| -------- | ------------------- |
| rank | Platz |
| team | Team-Kurzname |
| games | Spiele |
| win_reg | Siege regulär |
| win_ot | Siege OT |
| win_pen | Siege Penalty |
| lost_reg | Niederlagen regulär |
| lost_ot | Niederlagen OT |
| lost_pen | Niederlagen Penalty |
| goals | Tore z.B. 91:50 |
| diff | Tor-Differenz |
| points | Punkte |
---
### **➡ FERTIGER HTTPMOD-CODE FÜR FHEM**
> Du kannst ihn *so wie er ist* in FHEM einfügen
> (nur `defmod NAME` ggf. anpassen)
```
defmod eishockey_del HTTPMOD https://www.sportschau.de/live-und-ergebnisse/eishockey/deutschland-del/tabelle 300
attr eishockey_del preProcessRegex <!--start module standing-->(.*)<!--end module standing-->
attr eishockey_del reading01Name rank
attr eishockey_del reading01RegOpt g
attr eishockey_del reading01Regex <td class="standing-rank">(\d+)
attr eishockey_del reading02Name team
attr eishockey_del reading02RegOpt g
attr eishockey_del reading02Regex <td class="team-shortname team-shortname-"><a href=".*?">(.*?)<\/a>
attr eishockey_del reading03Name games
attr eishockey_del reading03RegOpt g
attr eishockey_del reading03Regex <td class="standing-games_played">(\d+)
attr eishockey_del reading04Name win_reg
attr eishockey_del reading04RegOpt g
attr eishockey_del reading04Regex <td class="standing-win-regular">(\d+)
attr eishockey_del reading05Name win_ot
attr eishockey_del reading05RegOpt g
attr eishockey_del reading05Regex <td class="standing-win-on-extra-time">(\d+)
attr eishockey_del reading06Name win_pen
attr eishockey_del reading06RegOpt g
attr eishockey_del reading06Regex <td class="standing-win-on-penalty">(\d+)
attr eishockey_del reading07Name lost_reg
attr eishockey_del reading07RegOpt g
attr eishockey_del reading07Regex <td class="standing-lost-regular">(\d+)
attr eishockey_del reading08Name lost_ot
attr eishockey_del reading08RegOpt g
attr eishockey_del reading08Regex <td class="standing-lost-on-extra-time">(\d+)
attr eishockey_del reading09Name lost_pen
attr eishockey_del reading09RegOpt g
attr eishockey_del reading09Regex <td class="standing-lost-on-penalty">(\d+)
attr eishockey_del reading10Name goals
attr eishockey_del reading10RegOpt g
attr eishockey_del reading10Regex <td class="standing-goaldiff">(\d+:\d+)
attr eishockey_del reading11Name diff
attr eishockey_del reading11RegOpt g
attr eishockey_del reading11Regex <td class="standing-difference">(-?\d+)
attr eishockey_del reading12Name points
attr eishockey_del reading12RegOpt g
attr eishockey_del reading12Regex <td class="standing-points">(\d+)
```
---
### Ergebnis
Du bekommst **14 Werte pro Reading-Gruppe** — also `rank_1`, `rank_2`, etc.
Perfekt für:
* Telegram Ausgabe
* DOIF Tabellen
* SVG Display
* MQTT Weitergabe
---
Wenn du möchtest, kann ich dir **eine formattierte Telegram-Tabelle**, **HTML-Tabelle**, **SVG-Visualisierung** oder **MQTT-JSON Export** daraus generieren.
➡ Sag einfach, **wie du die Ergebnisse später anzeigen möchtest** 👍😊
defmod eishockey_test HTTPMOD https://www.sportschau.de/live-und-ergebnisse/eishockey/deutschland-del/tabelle
attr eishockey_test preProcessRegex <!--start module standing-->(.*)<!--end module standing-->
attr eishockey_test reading01Name team
attr eishockey_test reading01RegOpt g
attr eishockey_test reading01Regex <td class="team-shortname team-shortname-"><a href=".*?">(.*?)<\/a>
attr eishockey_test reading02Name spiele
attr eishockey_test reading02RegOpt g
attr eishockey_test reading02Regex <td class="standing-games_played">(\d+)Habe jetzt nicht alles implementiert, der Rest ist nur noch Fleißarbeit, das kannst du dir selbst zusammenstellen.2025.12.07 16:15:24 5: DevIo_SimpleWrite myKNXGW: 061004200015046e00001100bce0fff21300010081
2025.12.07 16:15:24 5: myKNXGW [KNXIO_Write2 702]: Mode=H buf=061004200015046e00001100bce0fff21300010081 rc=0
2025.12.07 16:15:24 3: msg rr_: STATUS=OK PRIORITY=0 TITLE='' MSG='Stufenbeleuchtung an.'
2025.12.07 16:15:25 3: myKNXGW [KNXIO_TunnelRequestTO 1360]: timeout - attempt resend #Timeout beim Senden
2025.12.07 16:15:25 5: DevIo_SimpleWrite myKNXGW: 061004200015046e00001100bce0fff21300010081
2025.12.07 16:15:27 3: myKNXGW [KNXIO_TunnelRequestTO 1368]: timeout - sending disconnect request
2025.12.07 16:15:27 5: DevIo_SimpleWrite myKNXGW: 0610020900106e000801000000000000
2025.12.07 16:15:27 5: myKNXGW [KNXIO_Read 307]: buf=0610020a00086e21
2025.12.07 16:15:27 4: myKNXGW [KNXIO_ReadH 499]: DisconnectResponse received - sending connrequest2025-12-07 10:40:13 Status-get off !!! TimestampZitatDas war früher, bevor meine ganzen Schwierigkeiten mit KNX in FHEM begannen, anders und zuverlässig.Was war früher anders ? - evtl. die KNXIO definition passt nicht zum Gateway, oder ein anderes Modul blockiert FHEM für > 1sec?
Was könnte bitte die Ursache sein?
define xxx_nf notify Licht_TH_Stufen:Status-get:.* msg push ... $EVENT Internals:
BUSY 0
DEF https://www.haie.de/saison/tabelle/ 86400
FUUID 671e62d1-f33f-7706-01ec-89182b86d32be66e
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 86400
MainURL https://www.haie.de/saison/tabelle/
ModuleVersion 4.2.0 - 11.8.2023
NAME DEL_table
NOTIFYDEV global
NR 404
NTFY_ORDER 50-DEL_table
STATE name-1
TYPE HTTPMOD
eventCount 2
value
CompiledRegexes:
HTTPCookieHash:
PHPSESSID;/:
Name PHPSESSID
Options path=/; HttpOnly
Path /
Value 7sqhm4ld377n963fpk8dp7lpv6
HttpUtils:
NAME
addr https://www.haie.de:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.haie.de/saison/tabelle/
header Cookie: PHPSESSID=7sqhm4ld377n963fpk8dp7lpv6
host www.haie.de
httpheader HTTP/1.1 200 OK
Server: nginx
Date: Sun, 07 Dec 2025 21:10:09 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 15182
Connection: close
vary: X-Forwarded-Proto,Accept-Encoding
last-modified: Sun, 07 Dec 2025 21:02:50 GMT
etag: "3b4e-6456300595dd4"
referrer-policy: no-referrer-when-downgrade
content-encoding: gzip
X-Varnish: 22137547 22786412
Age: 38
Via: 1.1 haie00 (Varnish/7.7)
Accept-Ranges: bytes
x-cache: hit cached
Strict-Transport-Security: max-age=31536000
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 443
hu_portSfx
ignoreredirects 1
loglevel 4
path /saison/tabelle/
protocol https
redirects 0
timeout 30
url https://www.haie.de/saison/tabelle/
sslargs:
OLDREADINGS:
QUEUE:
READINGS:
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.haie.de/saison/tabelle/
Attributes:
alias DEL Tabelle
enableControlSet 1
group Eishockey
icon Wunderlist
preProcessRegex s/<thead>.*<\/thead>//s
reading01Name name
reading01RegOpt g
reading01Regex <tr class=""><td><div class="data-table__index-column"></div></td><td>(.*)</td></tr>
reading02Name matches
reading02RegOpt g
reading02Regex <tr class=""><td><div class="data-table__index-column"></div></td><td>(.*)</td><td>(.*)</td></tr>
reading03Name points
reading03RegOpt g
reading03Regex <span title="PUNKTE">(.*)<\/span>
reading04Name goals
reading04RegOpt g
reading04Regex <span title="TORE">(.*)<\/span>
reading05Name goalsDiff
reading05RegOpt g
reading05Regex <span title="DIFF">(.*)<\/span>
reading06Name platz
reading06RegOpt g
reading06Regex <td data-headline="PLATZ" style=".*">(.*)<\/td>
reading07Name logo
reading07RegOpt g
reading07Regex <div style="height: 4rem;background: (.*) no-repeat center center / contain"><\/div>
readingOExpr $val =~ s/<[\d\D]+>//;;$val
room Information->Sport
stateFormat name-1
timeout 30
userattr .*
verbose 0<tr class="">
<td>
<div class="data-table__index-column">
<div class="data-table__index">2.</div>
<div class="team-icon" data-tippy-content="ERC Ingolstadt"><img loading="lazy" decoding="async" src="https://www.haie.de/wp-content/themes/haie/dist/img/del-teams/ing.svg?version=2023-09" alt="Logo ERC Ingolstadt" width="48" height="48"></div>
</div>
</td>
<td>
ERC Ingolstadt
</td>
<td>
26
</td>
<td class="hidden-desktop">
19
</td>
<td class="hidden-desktop">
7
</td>
<td class="hidden-mobile">
16
</td>
<td class="hidden-mobile">
3
</td>
<td class="hidden-mobile">
0
</td>
<td class="hidden-mobile">
7
</td>
<td>
41
</td>
<td>
54
</td>
</tr>sub mergegooglelocations {
my $sub = sub {
my $filename = shift // return;
my ($error, @content) = FileRead($filename);
Debug "Fehler beim Lesen von $filename: $error\n" if $error;
my $json = join "", @content;
return decode_json($json);
};
my $path = '/opt/fhem/www/googlelocations';
my %seen; # id => Place-HashRef
my $total = 0; # alle Einträge gezählt
my $dupes = 0; # doppelte IDs gezählt
my @dupe_ids; # Liste der doppelten IDs
for (sort glob("$path/location*.json")) {
my $json = $sub->($_);
next if !$json || !exists $json->{places};
for (@{ $json->{places} }) {
# Nur Einträge mit definierter ID
next unless defined $_->{id} && length $_->{id};
$total++;
# Prüfen auf Duplikat
if ( exists $seen{ $_->{id} } ) {
$dupes++;
push @dupe_ids, $_->{id};
Debug "Doppelter Eintrag: $_->{id} - " . ($_->{displayName}{text} // 'unbekannt');
next;
}
# Speichern – flache Kopie, um Referenzprobleme zu vermeiden
$seen{ $_->{id} } = { %$_ };
}
Debug "Verarbeitete Datei: $_";
}
# Werte aus Hash extrahieren
my @merged_places = values %seen;
# JSON schreiben
FileWrite("$path/merged.json",
JSON->new->utf8->pretty->encode({ places => \@merged_places })
);
# Debug-Ausgabe
Debug "Gesamt-Einträge gelesen: $total";
Debug "Einzigartige Einträge: " . scalar(@merged_places);
Debug "Doppelte Einträge: $dupes";
Debug "IDs der doppelten Einträge: " . join(", ", @dupe_ids) if $dupes;
# Datei per scp kopieren
return system("scp $path/merged.json telekom-hosting:/home/www/public_html/assets/src/locations.json");
}

attr setlist Restart:restart climacontrol/HVAC_0C8BE0/device/command/restart
Power:on,off climacontrol/HVAC_0C8BE0/heatpump/power/set
Modus:auto,cool,fan,dry,heat climacontrol/HVAC_0C8BE0/heatpump/mode/set
Temperatur:slider,19.00,1.00,30.00 climacontrol/HVAC_0C8BE0/heatpump/set_temperature/set
Luefter:quiet,low,medium,high,superhigh,auto climacontrol/HVAC_0C8BE0/heatpump/fan/set
↑↓:1,2,3,4,auto climacontrol/HVAC_0C8BE0/heatpump/vane/set
↔:farleft,left,middle,right,farright,wide,swing climacontrol/HVAC_0C8BE0/heatpump/widevane/set