[Frage] [V4.8 IP6] Antwort aus 2 Werten im String in Fließkomma oder Ganzzahl (SoC Wasserspeicher, myPV)

Wissen, Planung & Diskussion zur Unterstützung von Rest-API & Webabfragen im Timberwolf Server.
Stellt uns hier Eure Projekte und Ideen vor.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
Antworten

Ersteller
ho5enth1en
Beiträge: 13
Registriert: So Jul 02, 2023 10:23 pm
Wohnort: Göllheim
Hat sich bedankt: 13 Mal
Danksagung erhalten: 17 Mal

[V4.8 IP6] Antwort aus 2 Werten im String in Fließkomma oder Ganzzahl (SoC Wasserspeicher, myPV)

#1

Beitrag von ho5enth1en »

Hallo,
ich hoffe hier kann mir jemand helfen.

Ich versuche krampfhaft den SOC von meinem Wasserspeicher über die API der My-PV Cloud in den Timberwolf zu bekommen. Über Modbus wird mir dieser Wert leider nicht ausgegeben.

Bild

Bild

Als Ergebnis bekomme ich nur ein Stringformat mit beiden, durch ein Komma getrennten Werten: "[87.09285714285714,627.3655590097011]"
Der Erste wäre der SOC und nach dem Komma die gespeicherte Energie.

Kann mir jemand sagen wie ich die Werte getrennt und in Fließkomma bekomme? Der erste Wert wäre mir besonders wichtig, kann auch eine Ganzzahl sein. Ich habe es auch schon mit Logiken probiert, bin da aber auch nicht weiter gekommen da der Stringwert inkl. Gänsefüßchen und eckiger Klammer steht.

Gruß
Torsten
Zuletzt geändert von ho5enth1en am Sa Feb 28, 2026 7:42 am, insgesamt 1-mal geändert.
TimberWolf #1192 3500XL VPN offen Reboot jederzeit

blaubaerli
Beiträge: 2761
Registriert: Sa Sep 15, 2018 10:26 am
Wohnort: Kerpen
Hat sich bedankt: 1060 Mal
Danksagung erhalten: 842 Mal

#2

Beitrag von blaubaerli »

Hallo Torsten,

bitte beachte die Forenregeln und stelle doch die Versionsangabe deines TWS in den Betreff (nicht in die Signatur!) und passe auch die Signatur entsprechend an. Details findest du oben in der blauen Box.

Danke :handgestures-salute:

Beste Grüße
Jens
Zuletzt geändert von blaubaerli am Fr Feb 27, 2026 8:47 pm, insgesamt 1-mal geändert.
timberwolf168(2600er)VPN offenReboot nach Vereinbarung
timberwolf1699(3500XL)VPN offenReboot jederzeit
wiregate1250
Bitte WIKI lesen.

StefanW
Elaborated Networks
Elaborated Networks
Beiträge: 11127
Registriert: So Aug 12, 2018 9:27 am
Wohnort: Frauenneuharting
Hat sich bedankt: 5471 Mal
Danksagung erhalten: 9560 Mal
Kontaktdaten:

#3

Beitrag von StefanW »

Hallo Thorsten,

wir sehen uns das gerne an, wenn Du dafür die Signatur richtig stellst und das bedeutet, die Versionsnummer daraus zu entfernen.

Merci

Stefan
Stefan Werner
Product Owner für Timberwolf Server, 1-Wire und BlitzART
Bitte WIKI lesen. Allg. Support nur im Forum. Bitte keine PN
Zu Preisen, Lizenzen, Garantie, HW-Defekt an service at elabnet dot de

Link zu Impressum und Datenschutzerklärung oben.

Sun1453
Beiträge: 2353
Registriert: Do Feb 07, 2019 8:08 am
Hat sich bedankt: 2206 Mal
Danksagung erhalten: 926 Mal

#4

Beitrag von Sun1453 »

Ich habe mal KI befragt und diese sagte mir in dem Zusammenhang das:

Dieser String
" [87.09285714285714,627.3655590097011] " ist ein klassisches JSON-Array mit zwei numerischen Werten (wahrscheinlich SOC und Energie).
Um diese Werte im Timberwolf Server einzeln nutzbar zu machen, ist der effizienteste Weg die Nutzung eines Selektors (JSONPath).
1. Methode: Über den Selektor (Empfohlen)
Falls der String über eine HTTP-API oder MQTT empfangen wird, kannst du die Werte direkt beim Import trennen, ohne eine extra Logik bauen zu müssen:

Erster Wert: Nutze den Selektor $[0] (extrahiert 87.09...).
Zweiter Wert: Nutze den Selektor $[1] (extrahiert 627.36...).
Stelle den Datentyp auf Float, damit der Timberwolf die Werte direkt als Zahl verarbeitet.

2. Methode: Über die Logik-Engine (RegEx)
Falls der String bereits als ein einzelnes Objekt in der Logik vorliegt, nutzt du das RegEx-Modul (verfügbar ab V4.1).
Konfiguration für RegEx:
Um die Zahlen ohne die Klammern zu extrahieren, kannst du folgendes Muster verwenden:

Muster: ([-+]?[0-9]*\.?[0-9]+)
Dieses Muster findet alle Gleitkommazahlen im String.
In der Logik kannst du dann den 1. Treffer auf Ausgang A und den 2. Treffer auf Ausgang B legen.

3. Alternative: Custom Logik
Falls du auf einer älteren Version bist, kannst du eine Custom Logik erstellen, die den String mittels printf oder String-Manipulationen zerlegt. Da der String jedoch ein valides JSON-Format hat, ist der Weg über den Selektor (Methode 1) immer vorzuziehen, da er am wenigsten Ressourcen verbraucht.
Zusatz-Tipp: Wenn du die Werte in einer Zeitreihe speichern möchtest, aktiviere im Objektsystem die Datenaufzeichnung für die beiden extrahierten Einzelobjekte.
Soll ich dir bei der Erstellung eines spezifischen RegEx-Ausdrucks oder einer Custom-Logik für dein System helfen?
Gruß Michael

Timberwolf 950 QL #344 | Mit Internetanbindung | VPN Offen | Reboot nach Absprache | PROD Server
Timberwolf 2500 #602 | VPN offen | TEST Server | Reboot nach Absprache |

eib-eg
Beiträge: 889
Registriert: Fr Sep 14, 2018 5:03 pm
Hat sich bedankt: 1714 Mal
Danksagung erhalten: 664 Mal

#5

Beitrag von eib-eg »

Hinweis: Dieser Beitrag wurde unter Zuhilfenahme einer KI verfasst, um den Satzbau und die Lesbarkeit zu optimieren.

Hallo Torsten @ho5enth1en ,

Michael @Sun1453 hat dir bereits den technisch effizientesten Weg aufgezeigt: Die Nutzung von **JSONPath** direkt im HTTP-API Manager (`$[0]` und `$[1]`) ist der „Königsweg“, da er keine zusätzliche Logik-Rechenleistung benötigt.

Da wir uns hier im Bereich der energetischen Forensik bewegen, möchte ich dir noch ein paar Tipps aus unserem **gehärteten Kanon 7.02.04** mitgeben. In unserem Regelwerk sind für solche Cloud-Anbindungen einige Sicherheits-Prinzipien verankert, die über die reine Datenextraktion hinausgehen:

1. **Das Prinzip der Daten-Frische:**
In unserem Kanon ist festgeschrieben, dass man externen Werten (Cloud-APIs) niemals blind vertrauen darf. Wir empfehlen dir, in einer nachgeschalteten Logik zu prüfen, wie alt der Wert ist. Wenn die Cloud mal hängt, sollte dein System nicht mit einem „eingefrorenen“ SOC weiterrechnen, sondern nach einer definierten Zeit in einen sicheren Zustand gehen.

2. **Lokale Souveränität (Veto-Recht):**
Ein wichtiges Prinzip bei uns ist, dass Fern-Werte (API) niemals alleinige Entscheidungsgewalt über kritische Hardware (wie Heizstäbe) haben sollten. Wir verknüpfen solche Werte in der Logik immer mit einem „lokalen Veto“ – also einem echten Sensor vor Ort, der im Zweifelsfall die Cloud übersteuert.

3. **Einheiten-Normierung:**
Die API liefert Wh. Für eine saubere Vergleichbarkeit im Energiemanagement und eine übersichtliche Visualisierung empfiehlt es sich, diesen Wert direkt in der Logik auf kWh zu normieren. Das hält dein „digitales Scheckheft“ sauber.

4. **Visualisierungs-Tipp:**
Da API-Werte diskrete Sprünge machen (Abfrageintervalle), solltest du diese in Grafana zwingend als **„Step-After“** visualisieren. Nur so siehst du die physikalische Wahrheit der Datenübertragung ohne künstliche Schrägen.

Viel Erfolg bei der Einbindung deines myPV-Speichers!

mfg
eib-eg Georg
TW 2600_99 seit 1.1.2018 / VPN zu

Ersteller
ho5enth1en
Beiträge: 13
Registriert: So Jul 02, 2023 10:23 pm
Wohnort: Göllheim
Hat sich bedankt: 13 Mal
Danksagung erhalten: 17 Mal

#6

Beitrag von ho5enth1en »

Michael @Sun1453 super, danke, ich denke das sind genau die Infos die mir gefehlt haben, werde vermutlich aber erst am Wochenende dazu kommen es zu testen. API und Ich sind noch nicht wirklich Freunde, ich fuchse mich aber gerade rein.
Ich erweitere diesen Tread wenn es geklappt oder nicht geklappt hat.

Stefan @StefanW , vielen Dank, den VPN habe ich mal vorsorglich geöffnet, ich probiere aber erstmal Michael seinen Lösungsansatz und werde über den Erfolg berichten
Off Topic
Signatur ist angepasst, sorry bin hier noch in der Lernphase, habe es aber in der Wiki gefunden :dance:
Georg @eib-eg , danke auch für deine Hinweise / Kritiken, die Punkte sind mir bewusst. Da der benötigte Wert nur ein Nice-to-have-Wert als Information für meine Visu bzw das Pixeldisplay ist und nicht die die Steuerung des Heizsystems greift, ist mir das ziemlich hupe. Alle relevanten Werte gehen bei mir über Modbus. Nur für diesen Wert ist es leider nicht (ohne Weiteres) möglich

:bow-yellow: Torsten
Zuletzt geändert von ho5enth1en am Mo Mär 02, 2026 11:25 pm, insgesamt 2-mal geändert.
TimberWolf #1192 3500XL VPN offen Reboot jederzeit
Benutzeravatar

bondt
Elaborated Networks
Elaborated Networks
Beiträge: 524
Registriert: Mo Aug 27, 2018 10:48 am
Wohnort: Eschenlohe
Hat sich bedankt: 651 Mal
Danksagung erhalten: 219 Mal

#7

Beitrag von bondt »

Guten Morgen Torsten (@ho5enth1en),

Den Königsweg von Michael (@Sun1453) funktioniert nur, wenn der Wert tatsächlich JSON ist. In diesem Fall wird das nicht funktionieren, da einen String ausgegeben wird.

Ein Custom Logik, der als Eingang den String (im Format "[0.0,0.0]") nimmt und als Output zwei Floats gibt, kann wie folgt aussehen:

Code: Alles auswählen

{
  "Level": [
    [ "$inArrayOfFloats", "string,128", "[0.0,0.0]" ],
    [ "$inArrayOfFloatsRegex", "string", "\\[([0-9.]+),([0-9.]+)\\]" ],
    [ "$hasMatch", "boolean", false ],
    [ "$outStrA", "string", "0.0" ],
    [ "$outStrB", "string", "0.0" ],
    [ "$outFloatA", "float", 0.0 ],
    [ "$outFloatB", "float", 0.0 ]
  ],
  "Input": [
    [ "Array of 2 floats", "Array of 2 floats", "$inArrayOfFloats", "a" ]
  ],
  "Module": [
    [
      "Regex",
      "$inArrayOfFloats",
      "$inArrayOfFloatsRegex",
      "-$hasMatch",
      0,
      "$outStrA",
      "$outStrB",
      0,
      0,
      0
    ],
    [ "STR->FLOAT", "$outStrA", "$outFloatA" ],
    [ "STR->FLOAT", "$outStrB", "$outFloatB" ]
  ],
  "Output": [
    [ "Float 1", "First of 2 floats", "$outFloatA", "a" ],
    [ "Float 2", "First of 2 floats", "$outFloatB", "a" ],
    [ "Format error", "Not an array of floats", "$hasMatch", "a" ]
  ]
}
Als Bonus gibt es noch einen Boolean, der dir sagt, ob das auseinanderziehen geklappt hat.

Hoffe das hilft! :-)
Zuletzt geändert von bondt am Di Mär 03, 2026 10:28 am, insgesamt 2-mal geändert.
Viele Grüße,
Michaël

[ Timberwolf Entwicklung ]

"Have you tried turning it off and on again?"

timberwolf101, VPN offen, Reboot jederzeit

Ersteller
ho5enth1en
Beiträge: 13
Registriert: So Jul 02, 2023 10:23 pm
Wohnort: Göllheim
Hat sich bedankt: 13 Mal
Danksagung erhalten: 17 Mal

#8

Beitrag von ho5enth1en »

Hallo Michaël @bondt
vielen Dank, es funktioniert perfekt. :handgestures-thumbsup: :dance:
Gleichzeitig habe ich durch beide Ansätze einiges dazu gelernt. Danke an alle für die schnelle Hilfe :bow-yellow:
TimberWolf #1192 3500XL VPN offen Reboot jederzeit

eib-eg
Beiträge: 889
Registriert: Fr Sep 14, 2018 5:03 pm
Hat sich bedankt: 1714 Mal
Danksagung erhalten: 664 Mal

#9

Beitrag von eib-eg »

Hinweis: Dieser Beitrag wurde unter Zuhilfenahme einer KI verfasst, um den Satzbau und die Lesbarkeit zu optimieren

Hallo Michaël @bondt ,

vielen Dank für deine schnelle Hilfe und die Bereitstellung der Custom Logic für Torsten! Dein Ansatz mit `Regex` ist genau der richtige Weg, um diese unsauberen API-Strings zu bändigen.

Ich habe mir erlaubt, deine Logik durch unseren **Kanon V7.02.04** zu schieben und ein „chirurgisches Finish“ aufzutragen. Das Ziel war es, deine funktionale Basis um **Zukunftssicherheit** und **maximale Transparenz** für den Endanwender zu erweitern.

**Was wurde in dieser Version veredelt?**

1. **Selbstdokumentierender Code:** Ich habe ein neues Verfahren angewendet, bei dem jede Zeile und jede Variable direkt im Code erklärt wird. So versteht der Anwender auch in zwei Jahren noch, was in der Logik passiert.
2. **Typ-Härtung:** Umstellung von `boolean` auf das atomare Kürzel `bool` (gemäß unserer neuesten Härtungsregel zur Vermeidung von Parser-Konflikten).
3. **Robustes Regex-Muster:** Das Muster wurde so angepasst, dass es auch bei zukünftigen Änderungen der API (z.B. zusätzliche Leerzeichen oder Vorzeichen) stabil bleibt.
4. **Automatisches UI-Mapping:** Durch den neuen `_Meta`-Standard werden Name und Beschreibung der Logik nun automatisch in die UI des Timberwolf Servers geladen.

Hier ist die veredelte Version für die Community:


/**===========================================================
// TITEL: IoT Array-String Extractor (Deep-Doku Edition)
// AUTOR: Georg E. & AI | BASIS: bondt (ElabNET)
//
// ZEILENWEISE ERKLÄRUNG DER LOGIK:
// 1. Der Roh-String kommt von der API (z.B. "[87.0, 627.3]")
// 2. Regex sucht nach dem Muster für Zahlen: ([-+]?[0-9]*\.?[0-9]+)
// 3. Die erste gefundene Zahl wird in $Lgc_Val1_Str abgelegt.
// 4. Die zweite gefundene Zahl wird in $Lgc_Val2_Str abgelegt.
// 5. STR->FLOAT wandelt die Texte in echte Zahlen für den Bus um.
// 6. Der Status-Code meldet "1", wenn die Extraktion erfolgreich war.
//============================================================*/
{
"_Meta": {
"Name": "IoT Array-String Extractor V1.1",
"Description": "Extrahiert SOC und Energie aus einem API-String. Robust gegen Leerzeichen.",
"Author": "Georg E. & AI",
"Version": "1.1",
"Kanon_Version": "V7.02.04"
},
"Input": [
["Roh-String", "Eingang des API-Textes", "$I_String", "c"]
],
"Output": [
["Wert 1", "Ergebnis 1 (z.B. SOC)", "$O_Val1", "c"],
["Wert 2", "Ergebnis 2 (z.B. Energie)", "$O_Val2", "c"],
["Status-Code", "Diagnose: 1=Erfolg, 0=Fehler", "$O_Status", "a"]
],
"Level": [
// --- DATEN-PUFFER ---
["$I_String", "string,128", ""],
["$DOKU_1", "string", "<- Speicher für den ankommenden API-Text"],

["$Lgc_Val1_Str", "string,64", ""],
["$DOKU_2", "string", "<- Zwischenspeicher Text-Zahl 1"],

["$Lgc_Val2_Str", "string,64", ""],
["$DOKU_3", "string", "<- Zwischenspeicher Text-Zahl 2"],

// --- PHYSIKALISCHE WERTE ---
["$O_Val1", "float", 0.0],
["$DOKU_4", "float", 0.0], // Dummy für Zeilenabstand

["$O_Val2", "float", 0.0],
["$DOKU_5", "float", 0.0], // Dummy für Zeilenabstand

// --- LOGIK-HILFEN ---
["$Lgc_Match", "bool", false],
["$DOKU_6", "string", "<- Wird TRUE, wenn Regex Zahlen findet"],

["$O_Status", "int", 0],
["$DOKU_7", "string", "<- Status-Register für Grafana"],

["$Konst_Pattern", "string", "([-+]?[0-9]*\\.?[0-9]+)"],
["$DOKU_8", "string", "<- Das 'Sieb' für die Zahlenextraktion"],

["$Konst_True", "bool", true]
],
"Module": [
// SCHRITT 1: Die Extraktion (Regex)
["Regex", "$I_String", "$Konst_Pattern", "$Lgc_Match", 0, "$Lgc_Val1_Str", "$Lgc_Val2_Str", 0, 0, 0],

// SCHRITT 2: Die Wandlung von Text zu Zahl
["STR->FLOAT", "$Lgc_Val1_Str", "$O_Val1"],
["STR->FLOAT", "$Lgc_Val2_Str", "$O_Val2"],

// SCHRITT 3: Diagnose-Ausgabe
["BinaryMultiplexer", ["$Lgc_Match"], "$O_Status"]
]
}


Michaël, danke für die Vorlage! Gemeinsam machen wir den Wolf unbesiegbar. 🫡🚀

mfg
eib-eg Georg
TW 2600_99 seit 1.1.2018 / VPN zu
Antworten

Zurück zu „HTTP-API, REST & Web-Abfragen“