Numerische Variablen aufsteigend sortiern

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

AGmac
Beiträge: 16
Registriert: 20.12.2022, 11:18
System: CCU
Hat sich bedankt: 2 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von AGmac » 05.02.2023, 18:47

KLASSE - Lieben Dank für die exzellente - auch für "Skripting-Beginner" verständliche und nachvollziehbare Erklärung der einzelnen Schritte!

Es ist zwar "bequem", wenn man einfertiges Skript "geliefert" bekommt, lernen kann man aber nur, wenn man entweder tief genug in der Materie steckt und somit nachvollziehen kann, was wie realisiert wurde. Als Anfänger steht man da dann ohne Erklärung ziemlich auf dem Schlauch, weil man eben die die Schritte verbindenden Gedankengänge nicht kennt. Ist etwa so, wie der Lehrer früher an der Tafel, wenn er in Mathe die für ihn logischen Zwischenschritte ausließ und man sich später fragte, wie er denn nun auf die nächste Zeile kam ;-) ...

Also, nochmals herzlichen Dank an ALLE und einen schönen und entspannten Abend!

[sprotte80]
Beiträge: 331
Registriert: 05.10.2020, 18:37
System: CCU
Hat sich bedankt: 30 Mal
Danksagung erhalten: 23 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von [sprotte80] » 26.02.2024, 19:56

Hi
Das Script funzt nicht wirklich.
Tyfys hat geschrieben:
05.02.2023, 17:32
Nebenbei: .Replace() tauscht dann ja auch andere zufällig gleiche Nachbarn, so dass dann Steps eingespart werden.
Leider tauschts nich nur gleiche sondern auch wo ähnlich sind.
Und dan kommen Zahlen raus wo gar nich vorhanden waren.

Das

Code: Alles auswählen

real s = 2.345;
real t = 1.234;
real x = 2.345;
real y = 42.345;
real z = 1.234;

object arr =  s # ";" # t # ";" #  x # ";" # y # ";" # z;
string av;
string an;
integer len = web.webGetValueListCount(arr).ToInteger();
boolean swapped = true;
boolean revers = true;
WriteLine( "unsortiert:");
WriteLine(arr);
while (swapped)
{
    integer i = 1;
    swapped = false;
    while (i < len)
    {
        if ((web.webGetValueFromList(arr, i).ToFloat()) < (web.webGetValueFromList(arr, i - 1).ToFloat()))
        {
            av = web.webGetValueFromList(arr, i - 1) # ";" # web.webGetValueFromList(arr, i);
            an = web.webGetValueFromList(arr, i) # ";" # web.webGetValueFromList(arr, i - 1);
            arr = arr.Replace(av, an);
            swapped = true;
        }
        i = i + 1;
    }
}
WriteLine( "sortiert:");
WriteLine( "aufsteigend:");
WriteLine(arr);

if (revers)
{
    object arr2="";
    string elem;
    foreach(elem, arr.Split(";"))
    {
        arr2 = elem # ";" # arr2;
    }
}
WriteLine( "absteigend:");
WriteLine(arr2.RTrim(";"));

real a = web.webGetValueFromList(arr, 0);
real b = web.webGetValueFromList(arr, 1);
real c = web.webGetValueFromList(arr, 2);
real d = web.webGetValueFromList(arr, 3);
real e = web.webGetValueFromList(arr, 4);

WriteLine("a = "#a);
WriteLine("b = "#b);
WriteLine("c = "#c);
WriteLine("d = "#d);
WriteLine("e = "#e);  
gibt

Code: Alles auswählen

unsortiert:
2.345000;1.234000;2.345000;42.345000;1.234000
sortiert:
aufsteigend:
1.234000;2.345000;2.345000;2.345000;41.234000
absteigend:
41.234000;2.345000;2.345000;2.345000;1.234000
a = 1.234000
b = 2.345000
c = 2.345000
d = 2.345000
e = 41.234000
Thomas
Wenn du keine App zur Bedienung brauchst, dann hast du kein Smarthome, sondern nur eine angefangene Baustelle, oder nur ein unsmartes Autohome.

Homematic-Script - ScriptLexikon für alle
Methoden Konstanten
Hilfe und Infos erwünscht. Alle können mitmachen. Keine Levels. Keine Geheimtuerei.

Benutzeravatar
Henke
Beiträge: 1498
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 302 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von Henke » 26.02.2024, 20:53

Und mal kurz aber kreativ:

Code: Alles auswählen

! Array sortieren - M.Henke
real s = 2.345;
real t = 1.234;
real x = 2.345;
real y = 42.345;
real z = 1.234;

boolean reverse = false;
string trenn = ";";
object arr =  s # trenn # t # trenn #  x # trenn # y # trenn # z;
string js = '
let trenn = process.argv[2];
let arr = process.argv[1].split(trenn);
if ( process.argv[3] == "true" )
	process.stdout.write(arr.sort().reverse().join(trenn) );
else
	process.stdout.write(arr.sort().join(trenn) );
';

string stdout; string stderr;
system.Exec( "node -e '" # js # "' '" # arr # "' '" # trenn  # "' '" # reverse #"'" ,&stdout,&stderr);
if (stderr) { Write(stderr); quit; }
WriteLine( stdout);


Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von Tyfys » 26.02.2024, 20:59

[sprotte80] hat geschrieben:
26.02.2024, 19:56
Hi
Das Script funzt nicht wirklich.
Tyfys hat geschrieben:
05.02.2023, 17:32
Nebenbei: .Replace() tauscht dann ja auch andere zufällig gleiche Nachbarn, so dass dann Steps eingespart werden.
Leider tauschts nich nur gleiche sondern auch wo ähnlich sind.
Und dan kommen Zahlen raus wo gar nich vorhanden waren.
Danke fürs Austesten und Melden der Ungereimtheiten.

Diese Version sollte es nun richtig machen:

Code: Alles auswählen

real s = 2.345;
real t = 1.234;
real x = 2.345;
real y = 42.345;
real z = 1.234;
string sep = ";";
object arr =  s # ";" # t # ";" #  x # ";" # y # ";" # z;
arr = sep#arr.Trim(sep)#sep;
string av;
string an;
integer len = web.webGetValueListCount(arr).ToInteger() - 2;
boolean swapped = true;
boolean revers = true;
WriteLine( "unsortiert:");
WriteLine(arr.Trim(sep));
while (swapped)
{
    integer i = 2;
    swapped = false;
    while (i <= len)
    {
        if ((web.webGetValueFromList(arr, i).ToFloat()) < (web.webGetValueFromList(arr, i - 1).ToFloat()))
        {
            av = web.webGetValueFromList(arr, i - 1) # sep # web.webGetValueFromList(arr, i);
            an = web.webGetValueFromList(arr, i) # sep # web.webGetValueFromList(arr, i - 1);
			av = sep # av # sep;
			an = sep # an # sep;
            arr = arr.Replace(av, an);
            swapped = true;
        }
        i = i + 1;
    }
}
arr = arr.Trim(sep);
WriteLine( "sortiert:");
WriteLine( "aufsteigend:");
WriteLine(arr);

if (revers)
{
    object arr2="";
    string elem;
    foreach(elem, arr.Split(";"))
    {
        arr2 = elem # ";" # arr2;
    }
}
WriteLine( "absteigend:");
WriteLine(arr2.RTrim(";"));

real a= web.webGetValueFromList(arr, 0);
real b= web.webGetValueFromList(arr, 1);
real c= web.webGetValueFromList(arr, 2);
WriteLine("a = "#a);
WriteLine("b = "#b);
WriteLine("c = "#c);
Gruß
Harry

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von Tyfys » 26.02.2024, 21:05

Henke hat geschrieben:
26.02.2024, 20:53
Und mal kurz aber kreativ:
Aber nur für Leute die node.red oder etwas haben ? Und auch davon was kennen :D

Auf (m)einer CCU2 fast ohne irgendwelche addons : /bin/sh: node: not found
Gruß
Harry

Benutzeravatar
Henke
Beiträge: 1498
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 302 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von Henke » 26.02.2024, 21:32

Tyfys hat geschrieben:
26.02.2024, 21:05
Auf (m)einer CCU2 fast ohne irgendwelche addons : /bin/sh: node: not found
Auf jeder CCU3 ist zumindest ein node.js installiert.
Auf einer CCU2 geht es wohl auch. Ist ja nur 11 Jahre alt. Daher, geht mir am Arsch vorbei wenn es auf einer CCU2 nicht läuft. 8)
viewtopic.php?t=13275

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von Tyfys » 26.02.2024, 21:50

Henke hat geschrieben:
26.02.2024, 21:32
Auf jeder CCU3 ist zumindest ein node.js installiert.
Ich glaub, ich muss mir nun langsam auch eine zulegen...
Gruß
Harry

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

Re: Numerische Variablen aufsteigend sortiern

Beitrag von jp112sdl » 26.02.2024, 22:05

Henke hat geschrieben:
26.02.2024, 21:32
Tyfys hat geschrieben:
26.02.2024, 21:05
Auf (m)einer CCU2 fast ohne irgendwelche addons : /bin/sh: node: not found
Auf jeder CCU3 ist zumindest ein node.js installiert.
Auf meinem Testsystem kommt der selbe Fehler.
RaspberryMatic 3.75.2.20240213 generic-aarch64

VG,
Jérôme ☕️

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

Benutzeravatar
Henke
Beiträge: 1498
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 302 Mal

Re: Numerische Variablen aufsteigend sortiern

Beitrag von Henke » 26.02.2024, 22:23

jp112sdl hat geschrieben:
26.02.2024, 22:05
generic-aarch64
Damit ist das wohl keine CCU3, oder?
Ist node.js auf dem System?

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

Re: Numerische Variablen aufsteigend sortiern

Beitrag von jp112sdl » 27.02.2024, 07:29

Henke hat geschrieben:
26.02.2024, 22:23
jp112sdl hat geschrieben:
26.02.2024, 22:05
generic-aarch64
Damit ist das wohl keine CCU3, oder?
Ist node.js auf dem System?
Nein, wundert mich auch. Muss ich mal genauer nachschauen

VG,
Jérôme ☕️

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

Antworten

Zurück zu „HomeMatic allgemein“