Letztes Zeichen einer Variable entfernen

Aus der Variablen „A1700B1705C0D0E4F19G0H15I-5J0K1756L0M500N1O30P-5Q2109R0S2300T0U2018V1956W5X1504Y1610Z0[8310\“ soll das letzte Zeichen „\“ entfernt werden, da es beim weiterverarbeiten (teilen etc.) Probleme verursacht. Hat da jemand eine Lösung? Danke schon mal im Voraus…

…ich weiß noch nicht mal um was es eigentlich geht und was „A1700B1705C0D0E4F19G0H15I-5J0K1756L0M500N1O30P-5Q2109R0S2300T0U2018V1956W5X1504Y1610Z0[8310\“, mit einer Variable zu tun hat. Stehe ich allein auf dem Schlauch ?

Natürlich kann eine Variable alles sein und bei @Hajo_Rautenberg kommt eine Variable heraus, die mit / endet.
Damit der nächste flow mit der Variable arbeiten kann, ist das / zu viel.
Es muss also verschwinden, um irgendetwas anderes damit zu tun.
So habe ich es verstanden.

Hallo Undertaker,

danke für Dein Interesse an meiner Anfrage.
Hier mal die ausführlichere Version der Frage:

mit einer
grafik
bekomme ich folgendes zurück:
grafik

Das kommt aus meiner Haussteuerung (aus dem Jahr 2007). Darin sind alle Variablen A-Z und deren Werte enthalten, auch die Werte der Temperatursensoren. Diesen String (der eine variable Länge hat) weise ich einer Text-Variable zu. Jetzt möchte ich darin enthaltenen Variablen (z.B. H) extrahieren mit
grafik

Das klappt aber nur, wenn in diesem String das letzte Zeichen nicht vorhanden ist. Irgendwie wird das nicht mehr als Text gewertet, obwohl das in den Anführungszeichen steht.
Also muss das letzte Zeichen weg.
Ich hoffen dass ich mich verständlich ausgedrückt habe, denn ich habe dem Homey Pro noch nicht sehr lange :slight_smile:

Hallo Mike1233,

genauso ist es :slight_smile:

Chatgpt schlägt folgendes vor:

let str = “Dies ist ein Beispiel\”;
let bereinigterString = str.replace(/\$/, ‘’);
console.log(bereinigterString); // Ausgabe: “Dies ist ein Beispiel”

Oder:

let str = “Dies ist ein Beispiel\”;
let bereinigterString = str.slice(0, -1);
console.log(bereinigterString); // Ausgabe: “Dies ist ein Beispiel”

Ob folgendes geht hab ich nicht getestet:

let str = “Dies ist ein Beispiel\”;
let bereinigterString = str.trimEnd(“\”);
console.log(bereinigterString); // Ausgabe: “Dies ist ein Beispiel”

Kürzer

let bereinigterString = “Dies ist ein Beispiel\”.trimEnd(“\”);
console.log(bereinigterString); // Ausgabe: “Dies ist ein Beispiel”

Da bin ich raus Jungs, ich hab keine Ahnung, von was ihr redet.

1 Like

@Hajo_Rautenberg Ich kenne mich mit Skripten nicht aus, aber ich bin auf etwas mit JavaScript und “splice” gestoßen.
Vielleicht können Sie damit etwas anfangen.
Ich weiß nicht, ob das in Homey funktioniert.

Mit Homeyscript können Variablen ähnlich wie in Javascript bearbeitet und entsprechend gekürzt oder bearbeitet werden.
Habe grad keinen Laptop zur Hand, daher keine Vernünftigen Screenshots, kann aber morgen gerne was raus suchen.

Soll einfach jedes / entfernt werden oder immer das letzte Zeichen?

Lets try it… :smiley:

Ich habe mir auf dem Homey eine Variable angelegt, diese füttere ich mit irgendwelchen random Daten, der Name lautet “testVariable”

image

in Homeyscript habe ich das folgende Script angelegt:

const vars = await Homey.logic.getVariables();  //hole meine Variablen
const myVar = _.find(vars, (o) => o.name === "testVariable"); //nehme die Variable mit dem Namen "testVariable"
var newMessage = myVar.value.slice(0,-1); //schneide das letzte Zeichen weg
await setTagValue("myMessage", {type: "string", title: "myMessage"}, newMessage); //schreibe die neue Variable

Wenn du das nun im Flow ausführst, wird das letzte Zeichen in dem String rausgenommen.

Problem an dieser Methode ist, dass Du hier nicht mit der Karte “Wenn Variable sich ändert” arbeiten kannst, da er den Inhalt dann immer und immer wieder kürzt, bis nichts mehr da ist. (weil sich jedes mal die Variable ändert)

Wenn Du jetzt wirklich nur die BackSlashes weg haben willst, nutzt du replace.

const vars = await Homey.logic.getVariables(); 
const myVar = _.find(vars, (o) => o.name === "testVariable");
var newMessage = myVar.value.replace("\\",""); 
await setTagValue("myMessage", {type: "string", title: "myMessage"}, newMessage);

Ja, Du musst den doppelBackslash schreiben, da Javascript das sonst falsch interpretiert und einen Fehler bringt.

In diesem Fall löscht der Homey nur alle BackSlashes aus der Variable. Ändert die Variable einmal und sollte dann aufhören. die Variable anzufassen.

Den Namen “testVariable” ersetzt Du einfach mit dem Namen Deiner Variable (Achtung!: Das Script funktioniert nur mit Logik Variablen, nicht mit BetterLogic Variablen)

1 Like

Hallo schmucke,

habe die zweite Lösung genommen, hat super geklappt. Ich komme wohl nicht darum, mich mit HomeyScript zu befassen. Gibt es da etwas, um gut reinzukommen, so eine Art DAU für HomeyScript?
Vielen Dank!!!

Hallo schmucke,

hat alles bisher gut geklappt… was sich jetzt noch herausgestellt hat, dass ich von einem String das erste Zeichen abschneiden und evt. alle " aus dem String entfernen muss.
Vielleicht könntest Du bitte nochmals helfen. Danke!!!

var newMessage = myVar.value.replace(/\\|"/gi,""); // entfernt Backslash und Hochkomma

damit entfernst du alle Hochkomma und die Backslashes.

var newMessage = myVar.value.replace(/^.|\\|"/gi,""); //entfernt das erste Zeichen, alle Backslashes und alle Hochkomma

Bei zweiterem kannst du aber nicht mit “Variable hat sich geändert” arbeiten, hier musst du Dir was einfallen lassen um die Variable nicht zu leeren…

Achso, zum Thema “homeyscript lernen”

ansonsten ist das alles javascript.

Hi,

das wicxhtigste an HomeyScript ist:

  • wie bekommt man Variablen rein (Tags aus dem Flow)?
  • wie bekommt man Ergebnisse raus (als Flow-Token)?

Beispiel:


Ich habe hier 2 Variablen übergeben. Damit das funktioniert, muss man die Variablen als JSON-Objekt übergeben. Also: { var1, var2 }
Eine Variable allein könnte man auch direkt übergeben.

HomeyPro_Modbus_Fronius05
In Skript liest man den Input mir args[0].
Übergibt man ein JSON-Objekt, kann man dann auf die einzelnen Elemente zugreifen mit args[0].var1 und args[0].var2

Dann kannst mir JavaScript arbeiten.

Eine Rückgabe macht mit return oder als Token: await tag("name", value);
Beispiel:

await tag("memoryTotal",  Math.round(total *100)/100 );
await tag("memoryUsed",  Math.round(used *100)/100 );
await tag("memoryFree",  Math.round(free *100)/100 );
await tag("memoryAppList",  json_dict );

So kannst du aus einem Skript mehrere Tokens zurückgeben und diese direkt im Flow nutzen.

Hallo schmucke,

hat supergut funktioniert!! Danke!
Ich werde mich jetzt mal mit dem HomeyScript befassen…

Hallo RonnyW,

Danke für die Infos!

1 Like

Dank an alle, die hier sich eingebracht haben!

Hallo schmucke,

ich hoffe, ich belaste Dich nicht zu sehr mit meinen Fragen. Wenn es zuviel wird, einfach sagen :slight_smile:

Gibt es eine Möglichkeit, ab einer bestimmten Zeichenfolge ab einer Position eine festgelegte Zeichenlänge zu extrahieren?

Beispiel:

Suche nach “T-G”(feste Bezeichnung des Temperatursensors, steht im String nicht immer an der gleichen Stelle) und extrahiere dann “20.37” (veränderlicher Wert eines Temperatursensors, steht immer im gleichen Zeichen-Abstand zu “T-G”).

Danke!

Versuche mal das im HoemyScript-Fenster:

const regex = /(?<=<n0>T-G<\/n0><t0>).*?(?=<\/t0>)/g;

const string = '<n0>T-G</n0><t0> 23.37</t0>'

console.log(Number( string.match(regex)[0] ));

Der Regex-Ausdruck sucht nach einer Zeichenfolge zwischen diesen beiden Texten:
grafik

Das match() liefert ein Array, daher wird nur die erste Fundstelle mit [0] genommen und als Zahl konvertiert.

Zum Testen der Regex-Ausdrücke nehme ich gern diese Seite:
https://regex101.com/
Und diese Seite sieht nach einer guten Beschreibung aus:
Regex Tutorial - Lookahead and Lookbehind Zero-Length Assertions

2 Likes

Hallo RonnyW,

Deine Hinweise haben geholfen:

Ich kriege jetzt alles aus der Variable raus, was ich benötige :slight_smile:

Danke.

2 Likes