HM-Skript: Zahl in einem String finden

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

dtp
Beiträge: 10655
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

HM-Skript: Zahl in einem String finden

Beitrag von dtp » 08.01.2019, 10:51

Hallo,

gibt es eine Möglichkeit, in einem HM-Skript innerhalb eines Strings eine beliebige Zahl zu finden?

Beispiel: Ich möchte wissen, ob der String

Code: Alles auswählen

string message = "Heute sind 78 Wolken am Himmel.";
eine beliebige Zahl enthält, oder nicht. Mit

Code: Alles auswählen

message.Find(); message.Contains(); message.StartsWith(); message.EndsWith();
komme ich da leider nicht so unmittelbar weiter. Jemand eine Idee?

Gruß,

Thorsten
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Benutzeravatar
Black
Beiträge: 5463
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 418 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: HM-Skript: Zahl in einem String finden

Beitrag von Black » 08.01.2019, 10:58

auf die schnelle ohne es testen zu können:

Code: Alles auswählen

integer wolken = message.LTrim ("Heute sind ").RTrim (" Wolken am Himmel").ToInteger ();
Für sowas wollte ich eine StringBetween Funktion in der rega ^^

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

dtp
Beiträge: 10655
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: HM-Skript: Zahl in einem String finden

Beitrag von dtp » 08.01.2019, 11:29

Danke für die schnelle Antwort.

Das bedingt aber, dass die Strings bzw. deren Längen bekannt sind. Ich möchte aber ermitteln, ob in einem beliebigen String eine beliebige Zahl enthalten ist.

Trim bzw. LTrim und RTrim helfen mir da wohl leider auch nicht weiter.

Das Ganze dürfte auch etwas schwierig sein, weil ja die Zahl selbst als String gespeichert wird.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Benutzeravatar
Black
Beiträge: 5463
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 418 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: HM-Skript: Zahl in einem String finden

Beitrag von Black » 08.01.2019, 11:32

als regex würds gehen, das gibt die sprache aber nicht her ^^.
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

jp112sdl
Beiträge: 12083
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 847 Mal
Danksagung erhalten: 2139 Mal
Kontaktdaten:

Re: HM-Skript: Zahl in einem String finden

Beitrag von jp112sdl » 08.01.2019, 12:32

Wo wir gerade dabei sind, was alles nicht geht... "abs()" gibts auch nicht, oder?
Ich hab schon die Skript-Doku durchsucht - aber den Absolutwert einer Zahl bilden ist nicht drin.

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: HM-Skript: Zahl in einem String finden

Beitrag von alchy » 08.01.2019, 12:40

.Abs() sollte es geben.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

jp112sdl
Beiträge: 12083
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 847 Mal
Danksagung erhalten: 2139 Mal
Kontaktdaten:

Re: HM-Skript: Zahl in einem String finden

Beitrag von jp112sdl » 08.01.2019, 12:51

Danke!
Geht tatsächlich...
Habe jetzt noch mal intensiv gesucht und festgestellt, dass ich mich auf eine veraltete Skriptbeschreibung (V2.0) bezogen hatte.
In der V2.2 steht Abs() als mathematische Funktion drin.
Zuletzt geändert von alchy am 08.01.2019, 12:52, insgesamt 1-mal geändert.
Grund: sinnloses Fullquote entfernt

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

dtp
Beiträge: 10655
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: HM-Skript: Zahl in einem String finden

Beitrag von dtp » 08.01.2019, 15:17

Bin gerade nicht an meiner CCU, aber evtl. könnte es so klappen:

Code: Alles auswählen

string message = "Heute sind 78 Wolken am Himmel.";
string part; 
var type;

foreach(part, message.Split(" ")){
  type = part.ToInteger();
  WriteLine(type.VarType());
}
Teste es nachher mal.

EDIT: Schade, geht leider nicht, weil er ein Wort mit ToInteger() in die Zahl 0 überführt. So wird aus jedem String ein Integer. Hatte gehofft, dass das dann ein String bzw. NaN wird.
Zuletzt geändert von dtp am 08.01.2019, 15:30, insgesamt 2-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Benutzeravatar
jmaus
Beiträge: 9817
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1855 Mal
Kontaktdaten:

Re: HM-Skript: Zahl in einem String finden

Beitrag von jmaus » 08.01.2019, 15:27

Black hat geschrieben:
08.01.2019, 10:58
auf die schnelle ohne es testen zu können:

Code: Alles auswählen

integer wolken = message.LTrim ("Heute sind ").RTrim (" Wolken am Himmel").ToInteger ();
Vorsicht mit solchen Aussagen, denn die LTrim() und RTrim() Funktionen sind für solche Zwecke nicht die richtigen Funktionen. Diese suchen nach JEDEM vorkommen von Zeichen aus dem angegebenen String im Argument. D.h. deine LTrim() Nutzung wird z.B. bei folgendem String auch funktionieren obwohl das nicht sein sollte:

Code: Alles auswählen

string message = "Heeute sind 20 Wolken am Himmel";
integer wolken = message.LTrim("Heute sind ").RTrim(" Wolken am Himmel").ToInteger();
WriteLine(wolken);
Hierbei beachte man das doppelte "e" in "Heeute". D.h. LTrim() und RTrim() schneiden nicht exakt die gefundenen strings aus dem string heraus sondern alle im argument angegebenen Zeichen. D.h. das selbe Ergebnis erhält man auch mit folgendem Beispiel:

Code: Alles auswählen

string message = "Heeute sind 20 Wolken am Himmel";
integer wolken = message.LTrim("Heutsind ").RTrim("WolknamHiel ").ToInteger();
WriteLine(wolken);
Das das ist NICHT im Sinne des Erfinders dieser LTrim()/RTrim() Funktionen....
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
jmaus
Beiträge: 9817
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1855 Mal
Kontaktdaten:

Re: HM-Skript: Zahl in einem String finden

Beitrag von jmaus » 08.01.2019, 15:31

Black hat geschrieben:
08.01.2019, 11:32
als regex würds gehen, das gibt die sprache aber nicht her ^^.
Du kannst gerne ein Feature Request zu regex Funktionen in ReGaHss aufmachen. Dran gedachte hatte ich bereits, aber leider habe ich auf die schnelle keine einfache Implementierung von Regex Funktionen (C++) im Netz gefunden die zur Lizenz von ReGaHss passen würden und wenig aufwand machen würden (d.h. ohne große dependency zu externen Libs)...
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“