Hauptmenü

Neueste Beiträge

#1
FHEM Code changes / Revision 31068: 76_SolarForeca...
Letzter Beitrag von System - 03 April 2026, 01:10:35
Revision 31068: 76_SolarForecast: contrib Version 2.5.0

76_SolarForecast: contrib Version 2.5.0

Source: Revision 31068: 76_SolarForecast: contrib Version 2.5.0
#2
FHEM Code changes / Revision 31067: 76_SolarForeca...
Letzter Beitrag von System - 03 April 2026, 00:00:18
Revision 31067: 76_SolarForecast: contrib Version 2.5.0

76_SolarForecast: contrib Version 2.5.0

Source: Revision 31067: 76_SolarForecast: contrib Version 2.5.0
#3
FHEM Code changes / Revision 31066: 76_SolarForeca...
Letzter Beitrag von System - 03 April 2026, 00:00:18
Revision 31066: 76_SolarForecast: contrib Version 2.5.0

76_SolarForecast: contrib Version 2.5.0

Source: Revision 31066: 76_SolarForecast: contrib Version 2.5.0
#4
Solaranlagen / Aw: 76_SolarForecast - Informa...
Letzter Beitrag von DS_Starter - 02 April 2026, 23:26:23
In meinem contrib liegt ein Update der 2.5.0.

@300P,
ich konnte die Warnung bei mir nichtbeobachten, habe aber den Anzeigecode etwas abgeändert. Damit sollte die Warnung nicht mehr kommen bzw. einen Hinweis ausdrucken falls etwas undefiniert ist.

@all,
in dem Code sind bereits viele Elemente zur Integration von BEV-Consumer eingebaut. Da es aber noch nicht fertig ist, gibt es noch keine Doku dazu. Wird aber in Kürze freigegeben.

LG,
Heiko
#5
Sonstiges / Aw: Google Authenticator geht ...
Letzter Beitrag von mistepke - 02 April 2026, 22:29:05
Danke für die Hinweise, ich werde die abarbeiten. Bin gerade im Urlaub und das mache ich dann doch lieber in Ruhe wenn ich wieder zuhause bin.
Melde mich wieder und nochmals danke!
#6
Sonstiges / Aw: regex101 findet 12 Treffer...
Letzter Beitrag von RalfRog - 02 April 2026, 22:27:10
Zitat von: Marko1976 am 02 April 2026, 13:00:57Frage: Wieviel Code hast du im Test String eingegeben? Den ganzen Seitenquelltext oder nur einen Ausschnitt?

Das kann man doch ganz gut in dem Screenshot sehen was ich als Text eingegeben habe und was dann als "gefunden" markiert ist.

<div class="col text-center gameentry">
<span class="teamshorts">SWW:KEC</span><br>
<a href="/statistik/spieldetails/29032026_schwenninger-wild-wings_gg_koelner-haie_4347">
2:4
</a>
<br>
</div>
text                                                               
text

                                                           
<div class="col text-center gameentry">
<span class="teamshorts">KEC:SWW</span><br>
31.03.<br>
19:30</div>



Quasi als Fingerübung (ohne die ganzen Leerzeichen) um zu sehen, ob ich mit etwas Trial&Error die beiden Fundstellen in regex101.com hinbekomme. Ging!  ;D


Nachtrag:
Genau was @passibe in #27 vorgeschlagen hat "Im Prinzip waren die Ergebnisse von ChatGPT 1:1 verwendbar", meinte ich in Nummer #12 mit meinem Hinweis auf letzten Dezember:
https://forum.fhem.de/index.php?msg=1353234
#7
Sprachsteuerung / Aw: Alexa Verbindung fehlerhaf...
Letzter Beitrag von MadMax-FHEM - 02 April 2026, 22:17:46
Zitat von: Burny4600 am 02 April 2026, 12:24:10Image wird bei mir mit ssh Login auf SSD installiert.
Zugriffe für Installationsergänzungen werden über PuTTY Konsole mit sudo su gemacht.

Code Auswählen Erweitern
Do not use these procedures for updates/upgrades!Dann fange ich schon komplett anders an.
Darum kann ich mittels sudo apt install fhem FHEM nicht in dieser Form installieren.
Berechtigung des Verzeichnisses fehlte. chmod -R 0777 /usr/share/keyrings
FHEM Installation nach Vorgabe: https://debian.fhem.de/  => The easy way: Use apt to install FHEM and all dependencies
Jedenfalls gibt es nach diesen Schritten kein Verzechnis .ssh.

Ich weiß ja immer noch nicht, warum du denkst, dass eine fhem ERSTINSTALLATION (und dann Einspielen eines Backups oder meinetwegen auch fhem.cfg und weitere Dinge) nicht gehen soll?
Mache ich, wie geschrieben, schon immer so.

Oder hast du das nun doch so gemacht?
Ich blicke langsam auch nicht mehr durch...

Und ja: bei einer reinen fhem Installation wird auch kein /opt/fhem/.ssh angelegt.
Das gibt es nur, wenn du (oder ein Programm) z.B. ssh-Schlüssel anlegst...

sudo su kann man machen...
...wenn man GENAU weiß was man tut und nicht vergisst wieder zurückzuschalten.
Weil manche Sachen kein sudo/root brauchen bzw. eben auch schlecht ist, weil es dann u.U. eben nur für root zur Verfügung steht...

Drum (darum sind die Berechtigungen unter Linux wie sie sind) gibt es ja "sudo Kommando" damit man eben Kommandos die root benötigen ausgeführt werden können...
...andere aber eben nicht.

Meine Meinung dazu.

Zitat von: Burny4600 am 02 April 2026, 12:24:10FHEM wird ganz zum Schluss bei einer Neukonfiguration installiert. Zuletzt dann Alexa. Anschließend wird die gesicherte fhem.cfg und gewisse Datein auf das System kopiert. Die fhem.cfg besitzt die Verknüpfungen zu den Geräten und Programme die auf einer ausgelagerten Festplatte liegen.
Jeder Pi hat seine eigenen Schlüssel die gespeichert werden, und bei einer Neuinstallation wieder auf das neu errichtet System in das Verzeichnis /opt/fhem/cert zurück kopiert.

Naja, kann schon sein, dass du die Zertifikate dort liegen hast.
Wenn aber Programme (wie alexa-fhem) die Zertifikate unter /home-dir-des-users/.ssh sucht, dann wird es die halt in deinem "cert" nicht finden...
...oder verstehe ich hier was falsch?

Und auch schon geschrieben: wenn du neue Schlüssel erzeugst (oder alexa-fhem / Alexa-Device), dann klappt das auch mit der bereits bestehenden Registrierung beim Vereinsserver nicht.
Hatte ich auch, bis ich eben die Schlüüsel unter /opt/fhem/.ssh mitumgezogen habe.
Und das nicht nur wegen alxea-fhem, sondern eben auch wegen Zugriffen auf andere Systeme ohne Passworteingabe...

Ausgelagert auf externe Festplatte?
Sicher, dass die immer gemountet ist, wenn benötigt?
Oder nur zum Kopieren von Schlüssel/Daten/Programmen?


Zitat von: Burny4600 am 02 April 2026, 12:24:10
ZitatOS aktualisiert und meine gewohnten Einstellungen...
Wie machst die Aktualisierungen ohne update und upgrade?

Naja, wie geschrieben bzw. halt so:

ERST-Installation fhem mittels apt (easy-way).
Updates fhem: wie üblich eben per update-Kommando in fhem-Web
Updates OS: apt update / apt upgrade

Und wie passibe geschrieben hat alexa-fhem != echodevice

ich bin mir nicht sicher, ob die Probleme tatsächlich mit Trixie zu tun haben...
...außer eben das zuerst gemeldete bzgl. "veralteter" Verschlüsselungs-Algorithmen.
Das ja.

Gruß, Joachim
#8
Sonstiges / Aw: regex101 findet 12 Treffer...
Letzter Beitrag von passibe - 02 April 2026, 21:58:05
Sorry, ich war jetzt faul und habe das einfach mal mit ChatGPT gebaut.
Keine Ahnung, ob das weiterhilft oder überhaupt das ist, was du willst, aber es extrahiert jedenfalls die Teams (Heim/Gast) und Ergebnisse und stellt diese als Tabelle dar.

Ich will damit eigentlich nur zeigen, dass heutzutage und bei Projekten, wo es maßgeblich auf das Ergebnis ankommt und nicht darauf, dass alles wie aus dem Lehrbuch ist, das Verständnis der RegEx im Einzelnen ein bisschen egal ist. So kommt man mit recht geringem Aufwand zum Ziel. Diesen HTML-Wust von dieser Seite nachzuvollziehen und sich die RegEx irgendwie mühsam auszudenken, macht doch auch nicht so richtig Spaß (mir zumindest macht es keinen Spaß).

Im Prinzip waren die Ergebnisse von ChatGPT 1:1 verwendbar, außer, dass es / nicht escaped hat (habe das vorher in regex101 validiert, da ist das aufgefallen). Beim devStateIcon nur eine kleine Anpassung, weil man dort kein return braucht.

Hier das Ergebnis:

HTTPMOD-Device:
defmod delspiele HTTPMOD https://www.penny-del.org/spiele 300
attr delspiele devStateIcon {\
    my $counter = 1;;\
    my $html = "<table border='1' style='border-collapse: collapse;;'>";;\
\
    # header row\
    $html .= "<tr><th>Home</th><th>Guest</th><th>Score</th></tr>";;\
\
    while (1) {\
        my $home  = ReadingsVal($name, "homeTeam-$counter",  "na");;\
        my $guest = ReadingsVal($name, "guestTeam-$counter", "na");;\
        my $score = ReadingsVal($name, "score-$counter",     "na");;\
\
        last if ($home eq "na" || $guest eq "na" || $score eq "na");;\
\
        $html .= "<tr>";;\
        $html .= "<td>$home</td>";;\
        $html .= "<td>$guest</td>";;\
        $html .= "<td>$score</td>";;\
        $html .= "</tr>";;\
\
        $counter++;;\
    }\
\
    $html .= "</table>";;\
    "<div>$html</div>"\
}
attr delspiele reading01Name score
attr delspiele reading01RegOpt g
attr delspiele reading01Regex <div class="col-12">\s*<div class="row">[\s\S]*?<h3>\s*(\d+:\d+)\s*<\/h3>
attr delspiele reading02Name homeTeam
attr delspiele reading02RegOpt g
attr delspiele reading02Regex <div class="col-12">\s*<div class="row">\s*<div class="col-5[^"]*">[\s\S]*?<\/div>\s*([^<\n][^<]*)
attr delspiele reading03Name guestTeam
attr delspiele reading03RegOpt g
attr delspiele reading03Regex <div class="col-12">\s*<div class="row">[\s\S]*?<h3>[\s\S]*?<\/h3>\s*<\/div>\s*<div class="col-5[^"]*">[\s\S]*?<\/div>\s*([^<\n][^<]*)

Der ChatGPT-Chatverlauf:
1. Mein Prompt (Habe das html hier mal rausgelassen, Post wäre sonst zu lang. Habe aber einfach das html gefüttert, so wie es aus einem blanken HTTPMOD mit verbose 5 rauskam; minus den ganzen unnötigen Kram (also head und alles, was zur Navigation gehört, habe bei <div class="site-content"> angefangen).)
Given the following html, I need three regexes that:
1. Match all scores (only those in col-12, not those in col-12 mt-3)
2. Match the "home" teams
3. Match the "visitor" teams

<html-code wie oben ausgeführt>

Antwort:
You *can* do this with regex, but fair warning: this HTML is structured enough that a parser (BeautifulSoup, etc.) would be much more robust. That said, here are solid regexes tailored to your exact structure.

---

## 1) Scores (only in `col-12`, NOT `col-12 mt-3`)

These are inside:

```html
<div class="col-12">
    ...
    <h3>4:0</h3>
```

### Regex:

```regex
<div class="col-12">\s*<div class="row">[\s\S]*?<h3>\s*(\d+:\d+)\s*</h3>
```

### Why it works:

* Anchors specifically to `div class="col-12"` (no `mt-3`)
* Lazily scans until `<h3>`
* Captures only scores like `4:0`, `3:1`, etc.

---

## 2) Home teams

These are always the **first `col-5` block** inside that same `col-12`.

### Regex:

```regex
<div class="col-12">\s*<div class="row">\s*<div class="col-5[^"]*">[\s\S]*?</div>\s*([^<\n][^<]*)
```

### Captured group:

* Group 1 = **home team name**

### Example match:

```
Kölner Haie
Adler Mannheim
```

---

## 3) Visitor teams

These are the **second `col-5` block** after the score.

### Regex:

```regex
<div class="col-12">\s*<div class="row">[\s\S]*?<h3>[\s\S]*?</h3>\s*</div>\s*<div class="col-5[^"]*">[\s\S]*?</div>\s*([^<\n][^<]*)
```

### Captured group:

* Group 1 = **visitor team name**

---

## Cleaner alternative (recommended)

If your regex engine supports it, a more structured approach:

### Extract each matchup block first:

```regex
<div class="col-12">\s*<div class="row">([\s\S]*?)</div>\s*</div>
```

Then run inside each block:

* **Home team:**

  ```regex
  <div class="col-5[^"]*">[\s\S]*?</div>\s*([^<]+)
  ```

* **Score:**

  ```regex
  <h3>\s*(\d+:\d+)\s*</h3>
  ```

* **Visitor team:**

  ```regex
  <h3>[\s\S]*?</h3>\s*</div>\s*<div class="col-5[^"]*">[\s\S]*?</div>\s*([^<]+)
  ```

---

If you tell me your language (Python, JS, etc.), I can give you a **ready-to-run extraction snippet**, which is honestly the safer route here.

2. Prompt zur Visualisierung im devStateIcon:
Now write some perl code that iteratively does something like

my $game = ReadingsVal($name,"homeTeam-$counter","na")." vs ".ReadingsVal($name,"guestTeam-$counter","na").": ".ReadingsVal($name,"score-$counter","na")

and loops over $counter until one value encounters na

then return everything formatted as a simple html table (or just a list, i guess? but also make a version where the three components are separated into a table)

Antwort:
Here's a clean Perl approach that does exactly what you described: iterate over `$counter` until one of the readings returns `"na"`, then build output.

I'll give you **two versions**:

1. Simple list
2. Proper HTML table

---

# ✅ 1) Simple list version

```perl
my $counter = 1;
my @games;

while (1) {
    my $home  = ReadingsVal($name, "homeTeam-$counter",  "na");
    my $guest = ReadingsVal($name, "guestTeam-$counter", "na");
    my $score = ReadingsVal($name, "score-$counter",     "na");

    # stop if any value is "na"
    last if ($home eq "na" || $guest eq "na" || $score eq "na");

    push @games, "$home vs $guest: $score";

    $counter++;
}

# build HTML list
my $html = "<ul>";
$html .= "<li>$_</li>" for @games;
$html .= "</ul>";

return $html;
```

---

# ✅ 2) HTML table version (separate columns)

```perl
my $counter = 1;
my $html = "<table border='1' style='border-collapse: collapse;'>";

# header row
$html .= "<tr><th>Home</th><th>Guest</th><th>Score</th></tr>";

while (1) {
    my $home  = ReadingsVal($name, "homeTeam-$counter",  "na");
    my $guest = ReadingsVal($name, "guestTeam-$counter", "na");
    my $score = ReadingsVal($name, "score-$counter",     "na");

    last if ($home eq "na" || $guest eq "na" || $score eq "na");

    $html .= "<tr>";
    $html .= "<td>$home</td>";
    $html .= "<td>$guest</td>";
    $html .= "<td>$score</td>";
    $html .= "</tr>";

    $counter++;
}

$html .= "</table>";

return $html;
```

---

# 💡 Optional improvements (worth considering)

### 1. Safer HTML (escaping)

If team names could contain special chars:

```perl
use HTML::Entities;
$home  = encode_entities($home);
$guest = encode_entities($guest);
$score = encode_entities($score);
```

---

### 2. Skip incomplete entries instead of stopping

If your data might have gaps:

```perl
last if ($home eq "na" && $guest eq "na" && $score eq "na");
next if ($home eq "na" || $guest eq "na" || $score eq "na");
```

---

### 3. Limit loop (safety guard)

```perl
last if $counter > 100;
```

Übrigens finde ich den Hinweis von ChatGPT auf Beautiful Soup gar nicht so verkehrt, vielleicht wäre es einfacher, das in Python auszulagern ...
#9
Solaranlagen / Aw: Modul für Ecoflow-Komponen...
Letzter Beitrag von KölnSolar - 02 April 2026, 21:53:17
schon klar, das kommt ja so vom Modul.
Denis hatte zwar geschrieben, dass ohne Angabe von timestamps der aktuelle Tag ausgelesen wird, aber vielleicht musst Du ja Zeiten mitgeben
ZitatbeginTime   dateTime   Query start time, formatted as 'yyyy-MM-dd HH:mm:ss', in UTC timezone. The effective range refers to the query latitude column.
endTime   dateTime   Query end time, formatted as 'yyyy-MM-dd HH:mm:ss', in UTC timezone. The effective range refers to the query latitude column.
z.B.
get Ecoflow_Ultra1 BatteryChargingDischargingPower 2026-04-02 07:00:00 2026-04-02 21:00:00 Sonst müssen wir auf Denis warten...

Edit: wenn ich Denis's code richtig interpretiert habe, wird ohne Angabe von timestamps der aktuelle Tag in den request generiert. Kannst ja auch mal ein get bei verbose=5 machen und das Log posten.
#10
Solaranlagen / Aw: 76_SolarForecast - Informa...
Letzter Beitrag von diebels - 02 April 2026, 20:54:03
Guten Abend,

Mit Update auf Version 2.5.0 ist der Fehler weg! Vielen Dank!

LG


Zitat von: diebels am 31 März 2026, 08:48:43
Zitat von: 300P am 30 März 2026, 09:23:10Hier meine:
attr Forecast setupBatteryDev01 SBS37 pin=-pout:kW pout=total_pac:kW pinmax=3600 poutmax=3600 intotal=bat_loadtotal:kWh outtotal=bat_unloadtotal:kWh cap=16000 charge=chargestatus show=3:top icon=@dyn:@dyn:@dyn:@dyn asynchron=0 label=beside
attr Forecast setupBatteryDev02 SBS25_2 pin=-pout:kW pout=total_pac:kW pinmax=2500 poutmax=2500 intotal=bat_loadtotal:kWh outtotal=bat_unloadtotal:kWh cap=bat_residual_cap:Wh charge=chargestatus show=3:top icon=@dyn:@dyn:@dyn:@dyn asynchron=0 label=below



Hallo,

hier ist meine Config (nicht so spannend  ;D ):

attr Forecast setupBatteryDev01 BatteryDummy pin=-pout:W pout=total_pac:W intotal=bat_loadtotal:kWh outtotal=bat_unloadtotal:kWh charge=chargestatus cap=9000
attr Forecast setupBatteryDev02 BatteryDummy2 pin=-pout:W pout=total_pac:W intotal=bat_loadtotal:kWh outtotal=bat_unloadtotal:kWh charge=chargestatus cap=7800

Heute Nacht wieder der gleiche Fehler. Wie gesagt, war nur als Hinweis gedacht :). Ich teste jetzt die 2.5.0 aus dem Trunk. Danke!

VG