NEWS
Werte aus Text und Mittelwert berechnen
-
Guten Morgen,
ich habe einen DP in dem ich mir die Core Temperaturen meines Intel NUC schreiben lasse. Die Daten sehen so aus:
Package id 0: Core 0: +59.0°C Core 1: +58.0°C Core 2: +64.0°C Core 3: +62.0°C Core 4: +58.0°C Core 5: +54.0°C
Also habe ich Blockly erstellt, welches mir die Werte da rausholt und in Variablen schreibt. Ich mache das über "im Text * nimm Teil ab * bis* Buchstabe", keine Ahnung ob es eleganter geht? Das sieht dann so aus:
Die Debug Ausgabe sieht dann so aus:Core Temp:, 64, 77, 69, 64, 64, 59
Ich habe also nur glatte Werte. Wie bekomme ich da jetzt den Mittelwert raus? Einfach alle Werte addieren und dann durch 6 teilen? Oder muss/sollte man das anders machen?
Wenn ich den Mittelwert habe, möchte ich mir eine Nachricht schicken lassen, wenn dieser 10 Minuten am Stück über 80 liegt. Da der DP jede Minute aktualisiert wird, würde ich einen Zähler setzen, der jedes mal wenn der Wert über 80 geht, erhöht wird und wenn dann 10 erreicht ist, bekomme ich die Nachricht. Sollte der Wert zwischendurch wieder unter 80 sein, wird der Zähler natürlich wieder auf 0 gesetzt. Ist das so okay, oder gibt es da bessere Varianten?
Und im letzten Stepp dann noch eine JSON erstellen, so das ich die aktuellen Werte inklusive Mittelwert in VIS darstellen kann. Das müsste ich aber hinkriegen.
Gruß, Johannes
-
@jojo58 So z.B.
Geht aber bestimmt auch eleganter
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="0qMo2W}Kq_]r}pKv?1vm">text</variable> <variable id="x7~jx3L$wieq,D+zr=!(">temps</variable> <variable id="MLf-it[+Dt[|c@mAEe4(">zeile</variable> </variables> <block type="variables_set" id="7Ucg_OX_*N)bq0%Kl_a)" x="163" y="63"> <field name="VAR" id="0qMo2W}Kq_]r}pKv?1vm">text</field> <value name="VALUE"> <block type="text_multiline" id="cy;o?qx~`eF^UN]UqZul"> <field name="TEXT">Package id 0:&#10;Core 0: +59.0°C&#10;Core 1: +58.0°C&#10;Core 2: +64.0°C&#10;Core 3: +62.0°C&#10;Core 4: +58.0°C&#10;Core 5: +54.0°C</field> </block> </value> <next> <block type="variables_set" id="IH)|e{lmuaE)T]`@I^?a"> <field name="VAR" id="x7~jx3L$wieq,D+zr=!(">temps</field> <value name="VALUE"> <block type="lists_create_with" id="=|s:yEwawraI%,*eZ9H/"> <mutation items="0"></mutation> </block> </value> <next> <block type="controls_forEach" id="J_ad`K%~~2dNftid)]P)"> <field name="VAR" id="MLf-it[+Dt[|c@mAEe4(">zeile</field> <value name="LIST"> <block type="lists_split" id="~F$]Wk0FMe,c)^2h3@K?"> <mutation mode="SPLIT"></mutation> <field name="MODE">SPLIT</field> <value name="INPUT"> <block type="variables_get" id="=o8Hj9[I8fwhA:o_lf+z"> <field name="VAR" id="0qMo2W}Kq_]r}pKv?1vm">text</field> </block> </value> <value name="DELIM"> <shadow type="text" id="c%6LCj4K8ve~$$wD$m|X"> <field name="TEXT">,</field> </shadow> <block type="text_newline" id="n~rV|d@73=w?eZH2gnra"> <field name="Type">\n</field> </block> </value> </block> </value> <statement name="DO"> <block type="controls_if" id="v]2Q`|tZh4mqq%7=-h-)"> <value name="IF0"> <block type="text_contains" id="fm:,r?W2bP3^!SDLwOKN"> <value name="VALUE"> <block type="variables_get" id="R|}r:]vxm8.]0_d/`tVx"> <field name="VAR" id="MLf-it[+Dt[|c@mAEe4(">zeile</field> </block> </value> <value name="FIND"> <shadow type="text" id="B;Qv*h90:L8HiNMh#*W("> <field name="TEXT">Core </field> </shadow> </value> </block> </value> <statement name="DO0"> <block type="lists_setIndex" id="eMS@W;3A2[OeDKBTII!B"> <mutation at="false"></mutation> <field name="MODE">INSERT</field> <field name="WHERE">LAST</field> <value name="LIST"> <block type="variables_get" id="K6K?kt4G_-$McHeXdr1b"> <field name="VAR" id="x7~jx3L$wieq,D+zr=!(">temps</field> </block> </value> <value name="TO"> <block type="convert_tonumber" id="K`iJtTg^1c%cbK?=Rl)0"> <value name="VALUE"> <block type="text_getSubstring" id="pm7jmow)[[g=`U^Sv2ZA" inline="false"> <mutation at1="true" at2="true"></mutation> <field name="WHERE1">FROM_START</field> <field name="WHERE2">FROM_START</field> <value name="STRING"> <block type="variables_get" id="LC[^)s9n=+eRjpY$$m73"> <field name="VAR" id="MLf-it[+Dt[|c@mAEe4(">zeile</field> </block> </value> <value name="AT1"> <block type="math_arithmetic" id="C_=(CgSmAJLu}7^q%.=q"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id=",@QKm_VOfV.Smev`PfNS"> <field name="NUM">1</field> </shadow> <block type="text_indexOf" id="6+agAoxdPGQr15}plp|g"> <field name="END">FIRST</field> <value name="VALUE"> <block type="variables_get" id="9TfSPs[3$eFU=@Fi`v6*"> <field name="VAR" id="MLf-it[+Dt[|c@mAEe4(">zeile</field> </block> </value> <value name="FIND"> <shadow type="text" id=";aX65G3Gjkzv}4t^vIrk"> <field name="TEXT">+</field> </shadow> </value> </block> </value> <value name="B"> <shadow type="math_number" id="19L}i~!w}b%7(p^$aY+w"> <field name="NUM">1</field> </shadow> </value> </block> </value> <value name="AT2"> <block type="math_arithmetic" id="WqSv1/!M4VF=h,po@jzT"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="6f#D0qeMn7wuECIxM+o0"> <field name="NUM">1</field> </shadow> <block type="text_indexOf" id="ZC!j*$!D(SQ(B1?`M({c"> <field name="END">FIRST</field> <value name="VALUE"> <block type="variables_get" id="/8m[T=GWFR99Z=|*+tH#"> <field name="VAR" id="MLf-it[+Dt[|c@mAEe4(">zeile</field> </block> </value> <value name="FIND"> <shadow type="text" id="3:oJ2zHC}31[^9jGLs{i"> <field name="TEXT">°C</field> </shadow> </value> </block> </value> <value name="B"> <shadow type="math_number" id="_sHFhGfp6/o-k7UvGy$s"> <field name="NUM">1</field> </shadow> </value> </block> </value> </block> </value> </block> </value> </block> </statement> </block> </statement> <next> <block type="debug" id="%Yk%{UA$F03t$BnC3FWE"> <field name="Severity">info</field> <value name="TEXT"> <shadow type="text" id="FhVtLn]]J=wJtP`=tv]9"> <field name="TEXT">test</field> </shadow> <block type="math_rndfixed" id="hZ8W0k{Jt/ICe_9Ab5Ui"> <field name="n">2</field> <value name="x"> <shadow type="math_number" id="]80=H[TgUUt[jq:Z2whZ"> <field name="NUM">3.1234</field> </shadow> <block type="math_on_list" id="I7Z)L3kX|jp@uzt~|;9L"> <mutation op="AVERAGE"></mutation> <field name="OP">AVERAGE</field> <value name="LIST"> <block type="variables_get" id="He)C|$TZ3m*3Ll_?)3C="> <field name="VAR" id="x7~jx3L$wieq,D+zr=!(">temps</field> </block> </value> </block> </value> </block> </value> </block> </next> </block> </next> </block> </next> </block> </xml>
-
Per JavaScript natürlich deutlich kürzer:
const text = ` Package id 0: Core 0: +59.0°C Core 1: +58.0°C Core 2: +64.0°C Core 3: +62.0°C Core 4: +58.0°C Core 5: +54.0°C `; const temps = [...text.matchAll(/Core \d+: \+([\d.]+)°C/g)].map(match => parseFloat(match[1])); const average = temps.reduce((sum, temp) => sum + temp, 0) / temps.length; console.log(`Durchschnittstemperatur: ${average.toFixed(2)}`);
-
-
@haus-automatisierung sagte in Werte aus Text und Mittelwert berechnen:
Geht aber bestimmt auch eleganter
warum dann nicht doch
@jojo58 sagte in Werte aus Text und Mittelwert berechnen:
Einfach alle Werte addieren und dann durch 6 teilen
ich halte das Arbeiten mit der Liste in diesem Fall für zu umständlich.
EDIT:
Wenn ich auf die Lösung von @Paul53 gekommen wäte, sähe die Aussage anders aus -
@homoran sagte in Werte aus Text und Mittelwert berechnen:
ich halte das Arbeiten mit der Liste in diesem Fall für zu umständlich.
Vorteil ist halt, dass man die Länge / Anzahl der Elemente auch direkt kennt und nicht noch eine Zähl-Variable mitschleppen muss. Also einfach zur Liste hinzufügen und am Ende mit dem Baustein den Mittelwert holen...
Meine Variante funktioniert immer. Egal ob 2 oder 24 Cores. Und ob die erste Zeile des Textes enthalten ist oder nicht spielt auch keine Rolle.
-
Das Blockly von dir verstehe ich nach kurzem Nachdenken sogar
(und es funktioniert), bei dem von @paul53 sieht es schon anders aus, das wird bestimmt auch funktionieren, aber ich verstehe nicht wie?
@haus-automatisierung Kann ich die Liste "temps" auch direkt nutzen um daraus den JSON DP zu erzeugen?
EDIT:
Ist Quatsch, das geht nicht so einfach, da ich dann nur die Spalte mit Werte ohne Zuordnung zu Core oder Mittelwert habe. Sorry, zu kurz gedacht. -
Mitt JSONATA und Blockly gehts noch kürzer, aber bevor ich dann wieder Kritik ernte, werde ich die Lösung nur auf Wunsch vorstellen.
-
Wüßte nicht, warum ich deinen Vorschlag kritisieren sollte? Oder war das allgemein gemeint?
Ich habe es jetzt mit der Version von @haus-automatisierung gelöst und das läuft erst mal.
Danke für die schnelle Hilfe und eure Vorschläge. Hab gerade gesehen das @paul53 das noch mal angepasst hat, ich baue das auch noch nach, alleine schon um etwas zu lernen.
-
@jojo58 sagte: JSON erstellen, so das ich die aktuellen Werte inklusive Mittelwert in VIS darstellen kann.
Vorschlag:
-
@jojo58 sagte in Werte aus Text und Mittelwert berechnen:
Wüßte nicht, warum ich deinen Vorschlag kritisieren sollte? Oder war das allgemein gemeint?
Dann hier mal meine Lösung - ein neues Objekt zu erstellen ist damit auch sehr einfach, aber keine Ahnung, wie Du das haben willst.
Hier das JSONATA:
$match($,/\d+\.\d/).$number(match)~>$average()~>$round(2)
und hier das Blockly zum Import:
-
Danke, werde ich auch ausprobieren.
-
@paul53 sagte in Werte aus Text und Mittelwert berechnen:
Vorschlag:
Das wird ja immer besser. Danke...
Ich sage Bescheid, sobald ich es nachgebaut habe. Werde aber wohl erst Montag dazu kommen, da wir ab morgen früh für ein paar Tage weg sind.
-
Moin, bin eben erst dazu gekommen, das aus deinem Post nachzubauen. Es hat auf Anhieb funktioniert und hier mal das Blockly und das Ergebnis:
Danke für die Vorlage. Wieder etwas dazugelernt.