[GELÖST] Benötige Script-Hilfe: "Foreach"-Schleife

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
Benutzeravatar
FBK2904
Beiträge: 454
Registriert: 22.03.2016, 17:12
System: Alternative CCU (auf Basis OCCU)
Wohnort: Bei Ludwigsburg
Hat sich bedankt: 80 Mal
Danksagung erhalten: 42 Mal

[GELÖST] Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von FBK2904 » 11.04.2019, 00:09

Hallo, Script-Experten & Co.!

Ich versuche mich seit Tagen/Wochen, Stück für Stück mit diversen Tests und Beispielen u.a. aus dem Forum hier,
in die "tolle" HM-Scriptsprache reinzuarbeiten und zu verstehen.

Nun sitze ich heute über 12 Stunden an einer einfachen "Foreach"-Schleife um eine einfache Multiplikation
durchzuführen und in eine Variable zu schreiben, aber ich Kapiere es um's verrecken nicht :roll: .

Code: Alles auswählen

string i=0;
string Wert = "1;2;3";
string Zahl;

foreach (Zahl,Wert.Split(";"))
{
 WriteLine(Zahl);
string a1;
string a2;
a1 = Zahl;            ! a1 = 2;
a2 = a1*500;
 WriteLine(a2);
i=i+1;}
Sinn und Zweck sollte "eigentlich" sein, dass die Zahl "500" nacheinander mit 1, 2, 3 multipliziert wird.
Es kommt aber statt 500, 1000, 1500 nur 1, 2, 3 heraus und multipliziert somit nicht.
Wird die Zeile "a1 = Zahl;" durch "a1 = 2;" ersetzt, dann wird die 500 mal zwei genommen (1000).

Wo liegt da mein Denkfehler?

Danke im Voraus für Euren Denkanstoß !

Grüssle,
Frank
Zuletzt geändert von FBK2904 am 12.04.2019, 21:02, insgesamt 1-mal geändert.
Grüssle,
Frank
--------------------------
System: CCU3 (RM 3.73.9.20240130) mit Stabantenne (www.stall.biz)
Geräte: 56x HM (classic) / 13x HmIP / 8x CUxD /16x virtuelle Gruppen / 4x PioTek-Tracker V4 FTTB & FAM-USB-Gateway
Addons: XML-API 2.3 / CUx-Daemon 2.11 / CUxD-Highcharts 1.45 / Programme drucken 2.6
Sonstige: SDV v5.03.04 G / AIO Creator NEO v3.1.0 mit 2x Samsung Tab SM-T580 (Root & Android 10 [LineageOS 17.1 by TALUAtXDAi])

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von Xel66 » 11.04.2019, 04:06

Bin nicht der Scriptprofi, aber ich würde mal drauf tippen, dass man mit Strings nicht so wirklich gut rechnen kann. Du solltest das schon als Integer-Zahlen oder wenn das nur ein Beispiel für ein anderes Vorhaben war, mit Fließkommazahlen arbeiten. Beispiele zur Zuweisung von Typen sind im Teil 1 der als Download beim Hersteller verfügbaren Script-Doku zu finden. Auch die merkwürdige Rangfolge (rechts nach links) ist dort beschrieben, über die man bei komplexeren Berechnungen mit Sicherheit stolpert.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

AF-Mobil
Beiträge: 317
Registriert: 25.11.2016, 19:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 20 Mal

Re: Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von AF-Mobil » 11.04.2019, 06:51

Hallo, es ist so, wie Xel66 schon vermutet
die Variablendeklaration als String ist das Problem.
Mit "real" bzw. "integer" werden Fliesskomma- und Ganzzahlvariablen deklariert.
Sieh in der Homematic Scriptdokumentation Teil 1, Spachbeschreibung nach.
Dort sind auch die Sondertypen "var" und "object" beschrieben.

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: Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von Black » 11.04.2019, 08:17

strings und rechnen ist so eine Sache auf der CCU. Rechnen allgemein ist da gewöhnungsbedürftig, man setze blos nicht Punkt vor Strichrechnung vorraus ^^

also vor rechnen einen String entweder in integer oder in Gleitomma wandeln.

und feste Aufzählungen in folge würde ich über GenerateEnum realisieren, sauber und leicher nachzuvollziehen.


Black
enum.jpg
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

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

Re: Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von alchy » 11.04.2019, 08:32

FBK2904 hat geschrieben:
11.04.2019, 00:09
Wo liegt da mein Denkfehler?
Hättest du zum Test zufällig addiert statt multipliziert, wäre dir bestimmt etwas aufgefallen.

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.

Benutzeravatar
FBK2904
Beiträge: 454
Registriert: 22.03.2016, 17:12
System: Alternative CCU (auf Basis OCCU)
Wohnort: Bei Ludwigsburg
Hat sich bedankt: 80 Mal
Danksagung erhalten: 42 Mal

Re: Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von FBK2904 » 11.04.2019, 23:21

Xel66 hat geschrieben:
11.04.2019, 04:06
. . . Beispiele zur Zuweisung von Typen sind im Teil 1 der als Download beim Hersteller verfügbaren Script-Doku zu finden . . .
AF-Mobil hat geschrieben:
11.04.2019, 06:51
. . . Sieh in der Homematic Scriptdokumentation Teil 1, Spachbeschreibung nach . . .
Als ehemaliger ATMEL-Microcontroller Freak kenne ich die Maschinen- sowie Basicsprache (BASCOM) sehr gut und hatte
schon viele Hard- und Software Projekte (auch umfangreiche) umgesetzt.
Die Script-Dokumentation Teil 1 bis 4 kenne ich zu genüge, da in den letzten Jahren mehrfach und immer wieder und wieder
durchgelesen, aber nie richtig verstanden. Will mich aber nun mal reinfinden, um nicht immer nur Codeschnipsel zusammen zu tackern :P .
Andere Programmiersprachen sind in Sachbüchern besser und umfangreicher beschrieben.
Diese Script-Doku (Teil 1 - 4) wäre gedruckt (meiner Meinung nach) nicht die Farbe und das Papier Wert, aber zum Glück gibt es ja PDF :wink:
Kein Wunder, das so viele Neulinge und Anfänger hiervon kapitulieren und ebenso viele Fragen haben!

alchy hat geschrieben:
11.04.2019, 08:32
Hättest du zum Test zufällig addiert statt multipliziert, wäre dir bestimmt etwas aufgefallen.
Hatte ich gestern auch getestet und hatte (meine ich) problemloser funktioniert. Nur bei der Multiplikation klemmt's.

Black hat geschrieben:
11.04.2019, 08:17
strings und rechnen ist so eine Sache auf der CCU. Rechnen allgemein ist da gewöhnungsbedürftig, man setze blos nicht Punkt vor Strichrechnung vorraus ^^
Danke Black, diese Eigenart kenne ich. Kein Punkt vor Strich sowie in Klammer (Vergesse was du vor 45 Jahren in der Schule gelernt hast).
Black hat geschrieben:
11.04.2019, 08:17
also vor rechnen einen String entweder in integer oder in Gleitomma wandeln.
Hatte ich in allen erdenklichen Kombinationen versucht und immer wieder auf die Nase gefallen.
Aber irgendwann macht auch die Birne zu und will nicht mehr :(
Black hat geschrieben:
11.04.2019, 08:17
und feste Aufzählungen in folge würde ich über GenerateEnum realisieren, sauber und leicher nachzuvollziehen
"GenerateEnum" kannte ich bis dato nicht und auch nicht wirklich etwas in der Doku gelesen -> Aber es funktioniert so -> SUUPI :lol:
Grüssle,
Frank
--------------------------
System: CCU3 (RM 3.73.9.20240130) mit Stabantenne (www.stall.biz)
Geräte: 56x HM (classic) / 13x HmIP / 8x CUxD /16x virtuelle Gruppen / 4x PioTek-Tracker V4 FTTB & FAM-USB-Gateway
Addons: XML-API 2.3 / CUx-Daemon 2.11 / CUxD-Highcharts 1.45 / Programme drucken 2.6
Sonstige: SDV v5.03.04 G / AIO Creator NEO v3.1.0 mit 2x Samsung Tab SM-T580 (Root & Android 10 [LineageOS 17.1 by TALUAtXDAi])

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

Re: Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von alchy » 12.04.2019, 07:25

FBK2904 hat geschrieben:
11.04.2019, 23:21
...schon viele Hard- und Software Projekte (auch umfangreiche) umgesetzt.
hilft dir gar nix, vielleicht überqualifiziert.

FBK2904 hat geschrieben:
11.04.2019, 23:21
Andere Programmiersprachen sind in Sachbüchern besser und umfangreicher beschrieben.
Diese Script-Doku (Teil 1 - 4) wäre gedruckt (meiner Meinung nach) nicht die Farbe und das Papier Wert, aber zum Glück gibt es ja PDF
Naja, aber man muss die Grundlagen auch lesen und versuchen zu verstehen. Die Dokumente enthalten nur einen Bruchteil der Möglichkeiten.

FBK2904 hat geschrieben:
11.04.2019, 23:21
Hatte ich gestern auch getestet und hatte (meine ich) problemloser funktioniert. Nur bei der Multiplikation klemmt's.
Nein, man kann mit Zeichenketten nun mal nicht rechnen. Würdest du auf die Idee kommen, das eine Anweisung wie
zwei * drei
oder
drei + fünf
zu einem richtigen Ergebnis führt?
Aber du wärst aber vielleicht stutzig geworden, wenn dein Script:

Code: Alles auswählen

1
1500
2
2500
3
3500
.
ausgegeben hätte, wenn du statt Multiplizieren im Script eben Addieren verwendet hättest.. :wink:

FBK2904 hat geschrieben:
11.04.2019, 23:21
Black hat geschrieben:
11.04.2019, 08:17
also vor rechnen einen String entweder in integer oder in Gleitomma wandeln.
Hatte ich in allen erdenklichen Kombinationen versucht und immer wieder auf die Nase gefallen.
Aber irgendwann macht auch die Birne zu und will nicht mehr :(
Das steht aber *IMHO* in der deiner Meinung nach nutzlosen Doku. Ein einfaches .ToInteger() in dein Script eingefügt und es wird gerechnet.

Code: Alles auswählen

string i=0;
string Wert = "1;2;3";
string Zahl;

foreach (Zahl,Wert.Split(";"))
{
 WriteLine(Zahl);
string a1;
string a2;
a1 = Zahl;            ! a1 = 2;
a2 = a1.ToInteger()*500;
 WriteLine(a2);
i=i+1;}

^^ Bleibt immer noch optimierbar, aber es liefert das gewünschte Ergebnis.

FBK2904 hat geschrieben:
11.04.2019, 23:21
"GenerateEnum" kannte ich bis dato nicht und auch nicht wirklich etwas in der Doku gelesen -> Aber es funktioniert so -> SUUPI :lol:
Das gehört zu den vielen nicht dokumentierten Geschichten. Beachte aber bitte, nicht GenerateEnum ist dein Fehler.

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.

Benutzeravatar
FBK2904
Beiträge: 454
Registriert: 22.03.2016, 17:12
System: Alternative CCU (auf Basis OCCU)
Wohnort: Bei Ludwigsburg
Hat sich bedankt: 80 Mal
Danksagung erhalten: 42 Mal

Re: Benötige Script-Hilfe: "Foreach"-Schleife

Beitrag von FBK2904 » 12.04.2019, 21:01

alchy hat geschrieben:
12.04.2019, 07:25
Naja, aber man muss die Grundlagen auch lesen und versuchen zu verstehen.
Dabei bin ich ja seit einigen Tagen dran, um nicht immer nur irgendwelche Script-Schnipsel zusammen "zukleben" :lol:

alchy hat geschrieben:
12.04.2019, 07:25
Die Dokumente enthalten nur einen Bruchteil der Möglichkeiten.
Ja und das ist Schade. Wäre doch eine tolle Idee hierzu ein Sachbuch zu veröffentlichen :wink:

alchy hat geschrieben:
12.04.2019, 07:25
Ein einfaches .ToInteger() in dein Script eingefügt und es wird gerechnet.

Code: Alles auswählen

string i=0;
string Wert = "1;2;3";
string Zahl;

foreach (Zahl,Wert.Split(";"))
{
 WriteLine(Zahl);
string a1;
string a2;
a1 = Zahl;            ! a1 = 2;
a2 = a1.ToInteger()*500;
 WriteLine(a2);
i=i+1;}

^^ Bleibt immer noch optimierbar, aber es liefert das gewünschte Ergebnis.
Alchy, Du bist und bleibst halt unser HM-Genie :D
Ich hatte soooo viele Kombinationen und Umstellungen probiert, auch mit .ToInteger(), .To String(0), .ToFloat(), usw.
Aber nach über 12 Stunden und Mitternacht war mein Latein am Ende und man(n) kapituliert.
Zumal einige andere Lernvorgänge von Befehlen zuvor ohne größere Probleme in mein Hirn gingen.
Aber man lernt ja bekanntlich nie aus. DANKE :!:

Grüssle,
Frank
Grüssle,
Frank
--------------------------
System: CCU3 (RM 3.73.9.20240130) mit Stabantenne (www.stall.biz)
Geräte: 56x HM (classic) / 13x HmIP / 8x CUxD /16x virtuelle Gruppen / 4x PioTek-Tracker V4 FTTB & FAM-USB-Gateway
Addons: XML-API 2.3 / CUx-Daemon 2.11 / CUxD-Highcharts 1.45 / Programme drucken 2.6
Sonstige: SDV v5.03.04 G / AIO Creator NEO v3.1.0 mit 2x Samsung Tab SM-T580 (Root & Android 10 [LineageOS 17.1 by TALUAtXDAi])

Antworten

Zurück zu „HomeMatic allgemein“