HM-Skript, Frage zur Beschränkung einer Liste

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
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, Frage zur Beschränkung einer Liste

Beitrag von dtp » 17.04.2019, 10:19

Hallo,

ich möchte eine Art FIFO-Puffer programmieren. Sprich, es wird eine Liste aus einer Systemvariablen ausgelesen, dann soll ein neuer Eintrag an den Anfang der Liste geschrieben und der älteste Eintrag vom Ende der Liste entfernt werden. Die Liste soll beliebige Trennzeichen enthalten können. Bevorzugt wird "\n" zur schöneren Darstellung der Listeneinträge. Schließlich soll die Liste wieder in die Systemvariable geschrieben werden. Zusätzlich soll auch noch bestimmt werden können, wie viele alte Listeneinträge vom Ende der Liste entfernt werden.

Das Lesen aus und das Schreiben in die Systemvariable ist kein Thema. Auch nicht das Schreiben neuer Einträge in die Liste. Mir geht es eher um das Entfernen der Listeneinträge. Hab mir auch schon Gedanken dazu gemacht und ein simples Testskript geschrieben.

Code: Alles auswählen

string list = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np";
integer numberOfElements = 6;
integer cnt = 0;
string listNew = ""; string listElement;

foreach(listElement, list.Split("\n")){
  if(cnt < numberOfElements){listNew = listNew#listElement#"\n";}
  cnt = cnt + 1; 
}

WriteLine(listNew);

!Ausgabe: a\nb\nc\nd\ne\nf\n
Funktioniert auch, wie gewollt. Aber muss man wirklich über eine foreach-Schleife gehen, oder fällt euch ggf. noch eine simplere und schnellere Lösung ein? Ein direkter Skriptbefehl zum Entfernen der n letzten oder ersten Listeneinträge ist mir ehrlich gesagt nicht bekannt. Oder könnte das mit .StrValueByIndex bzw. .Substr funktionieren?

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.

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: HM-Skript, Frage zur Beschränkung einer Liste

Beitrag von Bratmaxe » 17.04.2019, 11:04

So jetzt habe ich's :wink:

Code: Alles auswählen

! fifo
string list = "g\nf\ne\nd\nc\nb\na";
WriteLine("Liste beim Start: \n" # list # "\n");
integer numberOfElements = 6;
string Trennzeichen = "\n";
string newElement = "h";
WriteLine("Neues Element: \n" # newElement # "\n");
string newList = ""; 

string lastElement = list.StrValueByIndex(Trennzeichen, numberOfElements);

newList = newElement # Trennzeichen # list.Substr(0,(list.Length() -1 - lastElement.Length() -1 - Trennzeichen.Length() - 1));

WriteLine("Liste am Ende: \n" # newList # "\n");
Gruß Carsten

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, Frage zur Beschränkung einer Liste

Beitrag von dtp » 17.04.2019, 11:47

Hallo Carsten,

danke für deine Lösung. Hat Charme, aber auch den kleinen Nachteil, dass ich wirklich auf die reine FIFO-Funktionalität angewiesen bin und nicht mehrere alte Listeneinträge entfernen kann. Aber das könnte man ja ggf. ergänzen.

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.

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: HM-Skript, Frage zur Beschränkung einer Liste

Beitrag von Bratmaxe » 17.04.2019, 13:06

Wenn du das ganze über eine Systemvariable vom Typ WerteListe machst, gibt es noch eine andere Möglichkeit:

Code: Alles auswählen

object svObj = dom.GetObject(ID_SYSTEM_VARIABLES).GetObject("TEST");
if (svObj)
{   
    WriteLine(web.webGetValueFromList(svObj.ValueList(), 1));
}
Allerdings habe ich "web" noch nirgends gefunden, vielleicht gibt es auch eine Funktion zum Hinzufügen / Löschen eines Eintrages.
Gruß Carsten

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, Frage zur Beschränkung einer Liste

Beitrag von dtp » 17.04.2019, 16:48

Was macht denn der web-Befehl genau?

Eine Systemvariable vom Typ Werteliste nützt mir leider nichts, da die einzelnen Listeneinträge variabel sind.
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.

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

Re: HM-Skript, Frage zur Beschränkung einer Liste

Beitrag von alchy » 17.04.2019, 19:32

in dem Fall Namensraum web und die Regascriptmethode webGetValueFromList()

Wird z.B. angewendet, um den im Moment aktiven Wert einer Wertelistenvariablen auszulesen ohne .StrValueByIndex() zu benutzen.
Eine Wertelistenvariable könnte das was du willst wahrscheinlich auch abbilden.
Aber da du den Wert nur als "Speicher" benutzen willst, ohne einen der Werte als "aktiv" zu setzen ist das *IMHO* eher nicht zielführend.


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.

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, Frage zur Beschränkung einer Liste

Beitrag von dtp » 18.04.2019, 09:42

Danke für die Info.
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.

Antworten

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