Hauptmenü

Neueste Beiträge

#1
Sonstiges / Aw: Hilfe bei Webseite auslese...
Letzter Beitrag von Marko1976 - 08 Dezember 2025, 00:15:28
Genau das ist was ich seit Jahren mache. Jedes Jahr eine einfache Quelle suche und alles anpassen.
Doch genau davon möchte ich eigentlich weg.
Ich möchte gerne eine Quelle, die konstant bleibt und nicht ständig url und/oder Quellcode ändert.
Und da ist mir die Homepage der Haie halt aufgefallen, da diese jetzt schon im 3. Jahr nicht geändert wurde.
#2
Sonstiges / Aw: Hilfe bei Webseite auslese...
Letzter Beitrag von passibe - 07 Dezember 2025, 23:55:23
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:

Prompt:
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:
[...]

Antwort:
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** 👍😊
#3
Sonstiges / Aw: Hilfe bei Webseite auslese...
Letzter Beitrag von passibe - 07 Dezember 2025, 23:49:18
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 ...)
#4
Perl für FHEM-User / Aw: Mehrere curl-Abrufe "gleic...
Letzter Beitrag von TomLee - 07 Dezember 2025, 23:01:40
Ok, man muss nur mal den Kasper machen, um auf andere Gedanken zu kommen.

Wsl. ist es so, dass das holen der Daten, ein ganz anderes Thema ist, wie die spätere Verarbeitung.

Das bekomm ich auch ohne Hilfe hin.
#5
KNX/EIB / Aw: KNX - Probleme beim Schalt...
Letzter Beitrag von erwin - 07 Dezember 2025, 22:36:34
Das Problem liegt in der Kommunikation zwischen FHEM und dem KNX-GW.
...und zwar sowohl in Sende- als auch in Empfangsrichtung, das zeigt das Log:
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 connrequest

Die letzte empfangene msg von Gateway war:
2025-12-07 10:40:13   Status-get      off !!! Timestamp

ZitatDas war früher, bevor meine ganzen Schwierigkeiten mit KNX in FHEM begannen, anders und zuverlässig.
Was könnte bitte die Ursache sein?
Was war früher anders ? - evtl. die KNXIO definition passt nicht zum Gateway, oder ein anderes Modul blockiert FHEM für > 1sec?
Was ist das für ein Gateway, und bitte auch ein list vom KNXIO - device

Und versuche bei nächsten Test die set-cmds NICHT via Doif,at,notify,... sondern direkt aus dem KNX-device

Unabhängig von dem Problem würde ich die MSG push nicht in time-logik unterbringen sondern als notify auf das KNX-device:
define xxx_nf notify Licht_TH_Stufen:Status-get:.* msg push ... $EVENT
#6
Sonstiges / Hilfe bei Webseite auslesen
Letzter Beitrag von Marko1976 - 07 Dezember 2025, 22:19:12
Hallo, ich bräuchte mal wieder Hilfe beim Auslesen einer Webseite.
Dachte eigentlich das ich das Thema langsam verstanden hätte, aber bei dem Seitenquellcode weiß ich nicht mehr weiter.

Hier erst mal ein List des Device, das als Grundlage einer alten Version mit anderer Quelle dient (leider ändert sich jedesjahr die url weshalb ich jedesmal alles anpassen musste):
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

Habe schon mal angefangen bei Name und Matches, doch glaube nicht das das korrekt ist.

Hier der Seitenquelltext um den es geht (Auszug für einen Verein):
<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>

Mein Problem sind in erster Linie die fehlenden Tags und der quasi immer gleiche Codeblock. Muss dann bei der Regex tatsächlich etliche Male das <td></td> eingefügt werden?
#7
Perl für FHEM-User / Mehrere curl-Abrufe "gleichzei...
Letzter Beitrag von TomLee - 07 Dezember 2025, 22:01:16
Hi,

aus Unerfahrenheit beschäftigt mich die Frage, ob ich in einem Perl-Skript Pausen einlegen muss/sollte, wenn ich ich über curl mehrere API-Endpunkte (sagen wir etwa 20) der gleichen API abrufe.

Ich hab das noch nicht ausprobiert, die Funktionen in einer Schleife hintereinander auszuführen, weil ich mir unsicher bin.
Die Requests würd ich gerne in dem unten angeführten Skript mit einbauen.

Die Frage ist also wie man das richtig macht?

Aktuell bin ich bei 13 Abrufen, die Requests laufen direkt hintereinander in einer Schleife durch und es funzt wie ich es mir vorgestell habe.

So sieht das aktuell aus:


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");
}

Fertig, bin ich mit dem Code noch nicht, das unless mag ich noch ausbauen und mit encode_json beschäftigen, was damit der Vorteil ist und ob man auf eval dann verzichten kann. Der Zähler der doppelten Einträge ist auch noch um 1 falsch. Das ist aber ein anderes Thema, es funzt erstmal wie es gedacht war.

Gruß Thomas
#8
Verbrauchsmessung / Aw: shelly-em 50A
Letzter Beitrag von Hermann - 07 Dezember 2025, 21:28:13
Hallo taskill

Ich habe kein shelly em's im einsatz.

Aber ich denke das das Template shelly2em oder shelly3em funktionieren werden.
ausserdem wird das device ja mit autocreate angelegt und das mit allen möglichen readings.
Da muss man sich mal die passenden raus suchen und was selber zusammen basteln.
Ist ja beim shellypmminig3 auch so das gibs auch kein passendes Template.

Gruß
Hermann



 
#9
MQTT / Aw: How-to gesucht um komplexe...
Letzter Beitrag von Devender - 07 Dezember 2025, 21:17:21
Danke für deine Rückmeldung :-)
Ich habe es mit einigem probieren und resetten des Moduls hinbekommen.

Das erkannte MQTT Device darf man nicht mit einem Template erweitert werden, sondern direkt die Befehle konfigurieren.
Das setlist gilt in meinem Fall für Geräte von Mitsubishi und dem Protoart Modul (https://clima.protoart.net/)


Falls jemand ebenfalls das Modul einbinden möchte hier das setlist

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
#10
FHEMWEB / Aw: [ControlMiniDash]Fhemweb W...
Letzter Beitrag von appi - 07 Dezember 2025, 20:20:14
hallo Schwatter
das ist ja ein super Widget, endlich geht's mit Fhem in die richtige Richtung weiter.
Ich glaub langsam ich kann bei Fhem bleiben und muss mich nicht mit HA beschäftigen. 😁

Besten Dank