NEWS
Suche Script zur Konvertierung von Unicode auf UTF-8
-
@hg6806 Also:
- funktion definieren
- Trigger auf den Datenpunkt wo der String ankommt.
- Im Trigger, den "wert" des Triggers in die JS Funktion stecken.
- Den Rückgabewert in einen 'setState' Baustein stecken.
Das sind die Bausteine die du brauchst. Zusammenbauen solltest du das mit der Anleitung selber können.
Den Funktionseditor (bild weiter unten) bekommst du auf wenn du auf den
...
in der Funktion clickst.Nun kommst Du.
A.
Nachtrag: nachdem du die JS Funktion 'erzeugt' hast, sprich den Block oben in dein Skript gesteckt, bekommst du unter Funktionen einen Andockbaren Baustein für Deine Funktion. -
Danke, aber das war soweit klar.
Das Einzige was ich nicht verstehe ist, wie der Code in der JS Funktion aussieht, sprich, den Datenpunkt auslesen und durch @Codierknecht 's Funktion zurückgibt.
-
@hg6806 sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
wie der Code in der JS Funktion aussieht,
hat @Codierknecht dir doch hier gezeigt
@codierknecht sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
-
@hg6806 sagte: Wie bringe ich den Datenpunkt der umgewandelt werden soll dort hinein?
-
In der Funktion steht lediglich:
return unescape(text);
Passiert aber nichts bei Aktualisierung des Status.
Ich hätte jetzt eher damit gerechnet, dass im Code von der Funktion eher sowas stehen muss (mal von JSON abgesehen)
//Datenpunkt mit MQTT-Informationen im json-Format auslesen json = (function () { try {return JSON.parse(getState("mqtt.0.home.OMG_ESP32_BLE.BTtoMQTT.E72E00D32042").val);} catch(e) {return {};}})(); //json auslesen und Datenpunkte für Temperatur, Luftfeuchte und Batterie setState("0_userdata.0.OpenMQTTGateway_BLE.E72E00D32042.Temperature", getAttr(json, 'tempc')); setState("0_userdata.0.OpenMQTTGateway_BLE.E72E00D32042.Humidity", getAttr(json, 'hum')); setState("0_userdata.0.OpenMQTTGateway_BLE.E72E00D32042.Battery", getAttr(json, 'batt')); setState("0_userdata.0.OpenMQTTGateway_BLE.E72E00D32042.RSSI", getAttr(json, 'rssi')); //Log Ausgabe als return der Funktion return "MQTT MI_E72E00D32042 aktualisiert";
-
@hg6806 sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
Ich hätte jetzt eher damit gerechnet, dass im Code von der Funktion eher sowas stehen muss (mal von JSON abgesehen)
Die Funktion nimmt lediglich den codierten Text entgegen und liefert das umcodierte Ergebnis zurück.
Bau doch statt (oder zusätzlich) dem "aktualisiere" mal einen Debug-Block ein. Der schreibt das Ergebnis dann auch ins Log um das mal zu überprüfen. -
@codierknecht sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
@hg6806 sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
Ich hätte jetzt eher damit gerechnet, dass im Code von der Funktion eher sowas stehen muss (mal von JSON abgesehen)
Die Funktion nimmt lediglich den codierten Text entgegen und liefert das umcodierte Ergebnis zurück.
Bau doch statt (oder zusätzlich) dem "aktualisiere" mal einen Debug-Block ein. Der schreibt das Ergebnis dann auch ins Log um das mal zu überprüfen.Du hast geschrieben das der State den Text beinhaltet, der in UTF8 wieder heraus geschrieben werden soll.
Bau bitte 2 debug Bausteine ein:
einmal vor dem Aktualisiere, und häng da den 'wert' rein
einmal nach dem Aktualisiere, und häng da den gleichen Baustein rein wie im aktualisiere.Dann lass laufen, warte bis sich der Datenpunkt geändert hat und poste das hier. Dann können wir sehen:
- was kommt im DP rein
- was kommt aus der Funktion raus.
A.
-
OK, ich danke euch!
11.3.2025, 07:28:10.209 [info ]: javascript.0 (157280) Stopping script script.js.common.Auto+OpenWB.Charge-Werte_auslesen 11.3.2025, 07:28:10.311 [info ]: javascript.0 (157280) Start JavaScript script.js.common.Auto+OpenWB.Charge-Werte_auslesen (Blockly) 11.3.2025, 07:28:10.320 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: registered 5 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 11.3.2025, 07:28:32.169 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Die Ladung kann nicht gestartet werden, da die Einschaltschwelle nicht erreicht wird." 11.3.2025, 07:28:32.169 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Die Ladung kann nicht gestartet werden, da die Einschaltschwelle nicht erreicht wird." 11.3.2025, 07:29:12.253 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Control-Pilot-Unterbrechung f\u00fcr 4s." 11.3.2025, 07:29:12.254 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Control-Pilot-Unterbrechung f\u00fcr 4s." 11.3.2025, 07:29:21.712 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Ladevorgang wurde gestartet... (bei Problemen: Pr\u00fcfe bitte zuerst in den Einstellungen 'Ladeeinstellungen' und 'Konfiguration'.)" 11.3.2025, 07:29:21.712 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Ladevorgang wurde gestartet... (bei Problemen: Pr\u00fcfe bitte zuerst in den Einstellungen 'Ladeeinstellungen' und 'Konfiguration'.)"
Die Funktion läuft wohl nicht
-
@hg6806 du musst schon den funktionsblock in den 2. Debug hängen, nicht nur den “Wert” Block.
A.
-
So?
Ergebnis ist das Gleiche
11.3.2025, 07:54:11.184 [info ]: javascript.0 (157280) Stopping script script.js.common.Auto+OpenWB.Charge-Werte_auslesen 11.3.2025, 07:54:11.276 [info ]: javascript.0 (157280) Start JavaScript script.js.common.Auto+OpenWB.Charge-Werte_auslesen (Blockly) 11.3.2025, 07:54:11.285 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: registered 5 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 11.3.2025, 07:54:49.125 [info ]: javascript.0 (157280) Stopping script script.js.common.Auto+OpenWB.Charge-Werte_auslesen 11.3.2025, 07:54:49.263 [info ]: javascript.0 (157280) Start JavaScript script.js.common.Auto+OpenWB.Charge-Werte_auslesen (Blockly) 11.3.2025, 07:54:49.265 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: registered 5 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 11.3.2025, 07:55:32.315 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Die Ladung kann nicht gestartet werden, da die Einschaltschwelle nicht erreicht wird." 11.3.2025, 07:55:32.315 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Die Ladung kann nicht gestartet werden, da die Einschaltschwelle nicht erreicht wird." 11.3.2025, 07:56:01.958 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Control-Pilot-Unterbrechung f\u00fcr 4s." 11.3.2025, 07:56:01.958 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Control-Pilot-Unterbrechung f\u00fcr 4s." 11.3.2025, 07:56:12.509 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Keine Ladung, da der Lademodus Stop aktiv ist." 11.3.2025, 07:56:12.509 [info ]: javascript.0 (157280) script.js.common.Auto+OpenWB.Charge-Werte_auslesen: "Keine Ladung, da der Lademodus Stop aktiv ist."
-
Habe als Ausgabe mal einen neuen Datenpunkt erzeugt, in den wird nun auch was geschrieben, jedoch auch unkodiert, also noch ohne Umlaute.
In den alten Ausgabepunkt konnte nichts geschrieben werden.
Weil er von OpenWB/MQTT erzeugt wurde? -
@hg6806 sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
Die Funktion läuft wohl nicht
Naja - "laufen" tut die schon. Sie bringt nur nicht das gewünschte Ergebnis
Dann halt erstmal die Holzhammer-Methode:
let result = text.replaceAll('\u00e4', 'ä'); result = result.replaceAll('\u00f6', 'ö'); result = result.replaceAll('\u00fc', 'ü'); result = result.replaceAll('\u00c4', 'Ä'); result = result.replaceAll('\u00c6', 'Ö'); result = result.replaceAll('\u00dc', 'Ü'); result = result.replaceAll('\u00df', 'ß'); return result;
Edit
Natürlich könnte man das auch generisch machen und alles was mit\u00
beginnt in den entsprechenden Code übersetzen.
Das dürfte aber von der Performance noch etwas ungünstiger sein. -
@hg6806 sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
In den alten Ausgabepunkt konnte nichts geschrieben werden.
Weil er von OpenWB/MQTT erzeugt wurde?In Datenpunkte die "einem Adapter gehören" schreibt man nur dann (und zwar ohne Ack-Flag), wenn der Adapter auch etwas damit anfangen kann. Also wenn er den Wert z.B. an ein Gerät übertragen soll etc.
Zum "Umformatieren" nimmt man entweder einen Alias (wenn man den Wert per Konvertierungsfunktion verarbeiten kann) oder einen eigenen DP in0_userdata.0
(wenn der Wert per Script umformatiert werden muss). -
Also, Funktion sieht jetzt so aus, wie vorgegeben:
Ergebnis ist noch immer ohne Umlaute.
@Codierknecht Ja, habe jetzt den DP in userdata
-
@hg6806
Poste hier mal bitte (in Code-Tags </>) nicht das was im Log steht, sondern den Inhalt des Original-DP aus OpenWB/MQTT. -
"Ladevorgang wurde gestartet... (bei Problemen: Pr\u00fcfe bitte zuerst in den Einstellungen 'Ladeeinstellungen' und 'Konfiguration'.)"
-
@hg6806
Versuchs mal so:let result = text.replaceAll('\\u00e4', 'ä'); result = result.replaceAll('\\u00f6', 'ö'); result = result.replaceAll('\\u00fc', 'ü'); result = result.replaceAll('\\u00c4', 'Ä'); result = result.replaceAll('\\u00c6', 'Ö'); result = result.replaceAll('\\u00dc', 'Ü'); result = result.replaceAll('\\u00df', 'ß'); return result;
-
@codierknecht sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
let result = text.replaceAll('\u00e4', 'ä');
result = result.replaceAll('\u00f6', 'ö');
result = result.replaceAll('\u00fc', 'ü');
result = result.replaceAll('\u00c4', 'Ä');
result = result.replaceAll('\u00c6', 'Ö');
result = result.replaceAll('\u00dc', 'Ü');
result = result.replaceAll('\u00df', 'ß');
return result;BINGO!
Jetzt läuft es. Lag es evtl. an den Anführungszeichen im String?
Vielen Dank allen!
-
@hg6806 sagte in Suche Script zur Konvertierung von Unicode auf UTF-8:
Lag es evtl. an den Anführungszeichen im String?
Nein. Es lag daran, dass ein
\
ein Steuerzeichen ist und im String "escaped" werden muss.Hier noch eine generische Variante:
return text.replace(/\\u[0-9a-fA-F]{4}/gi, match => { return String.fromCharCode(parseInt(match.replace(/\\u/g, ""), 16)); });
-
Ja, geht auch so. Danke nochmals!