foreach-Schleife: aktuelles Listenelement überspringen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

dtp
Beiträge: 8211
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 62 Mal
Danksagung erhalten: 187 Mal

foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von dtp » 21.05.2020, 11:24

Hallo,

mit "quit" kann man bekanntlich aus einem Skript aussteigen und mit "break" kann man eine Schleife abbrechen. Ich suche aber gerade eine Möglichkeit, nur die aktuelle Schleifeniteration abzubrechen und zur nächsten Iteration zu springen. Also z.B. in einer foreach-Schleife das aktuelle Listenelement zu überspringen, um direkt zum nächsten zu gelangen.

Gibt es da was?
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: 2779
Registriert: 12.09.2015, 22:31
System: Alternative CCU (RaspberryMatic etc.)
Wohnort: Wegberg
Hat sich bedankt: 35 Mal
Danksagung erhalten: 170 Mal
Kontaktdaten:

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von Black » 21.05.2020, 11:44

Die aktion innerhalb der Schleife in einem If kapsel vllt ?

was ist denn der konkrete case bei dir ?

Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.51.6.20200420 mit Groundplane Antennenmod
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
Howto - AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 3.11.04 Scripteditor und Objektinspektor

technical constribution against annoying advertising

dtp
Beiträge: 8211
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 62 Mal
Danksagung erhalten: 187 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von dtp » 21.05.2020, 12:22

Es geht um mein Rollladenskript zBSS. Da kann ich unter anderem das gesamte Gewerk "Beschattung" durchlaufen, möchte aber die Option geben, Markisen hiervon auszunehmen.

Aber gerade, wo ich das hier schreibe, ist mir die Idee gekommen, an anderer Stelle anzugreifen, nämlich bei der Erzeugung der Geräteliste des Gewerks. Hier kann ich recht simpel nach Markisen fragen, um diese auszuschließen.

Der Schnipsel sieht dann so aus:

Code: Alles auswählen

string blindsTrade = "Beschattung";
boolean exAwningsFlag = true; 
string blindsList = ""; string blindChannel; string blindChannelsList; string blindNew; string blindOld;

blindChannelsList = (dom.GetObject(ID_FUNCTIONS).Get(blindsTrade)).EnumUsedNames();
foreach(blindChannel, blindChannelsList){
  blindNew = dom.GetObject(((dom.GetObject(ID_CHANNELS).Get(blindChannel)).Device())).Name();
  if((blindNew.Contains(anwningsIndicator)) && exAwningsFlag){blindNew = "";}
  if(blindNew && (blindOld != blindNew)){blindsList = blindsList#blindNew#"\t";}
  blindOld = blindNew;  
}
blindsList = blindsList.Trim();
Irgendwie komme mir die Ideen in letzter Zeit immer, wenn ich mit dir drüber diskutiere. Scheinst nen guten Einfluss auf meine Gedanken zu haben. 8)

Nichtdestotrotz fände ich aber eine Option als Ergänzung zu "quit" und "break" schön, mit der man in einer Schleife zum nächsten Element springen kann. Also z.B. ein "jump" oder dergleichen.
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: 2779
Registriert: 12.09.2015, 22:31
System: Alternative CCU (RaspberryMatic etc.)
Wohnort: Wegberg
Hat sich bedankt: 35 Mal
Danksagung erhalten: 170 Mal
Kontaktdaten:

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von Black » 21.05.2020, 12:32

vllt auch noch ein kleiner Ansatzpunkt, was ich gerne mache, wenn ich mit temporären listen arbeite. (Im SDV bei der JSON generierung auchimmer intensiv genutzt.)

du generierst dir ein ENUM Object. object oENUM= dom.CreateObject (OT_ENUM,"sdvgeneratet_dtp");

gib dem ding halt nur einen aussagefähigen namen, sollte es mal als leiche verbleibe, der SDV wirds finden und wenn du den namen siehts, weist du dann auch sofort, dass es eine leiche ist und weg kann.

danach gehst du du deine generierschleife hindurch, aber anstatt nun jedesmal etwas an einen string anzufügen, fügst zu z.b, die ID mit oENUM.Add (ID); diesem Enum Object hinzu.

wenn du eine ID daraus entfernen willst, dann oENum.Remove (ID);

das gute ist, du musst nicht auf doppelt und so achten.

am ende wenn du fertig bist, kann du

z.b.mit Count die Anzahl der objecte Abfragen oEnum.Count ()

oder einmach mit foreach (sEnum,oEnum.EnumIDs () ) {

}

über deine Liste iterieren.

am ende halt nur nicht vergessen, das Enum Object wieder zu elimineiren.

Black

dom.DeleteObject (oEnum);
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.51.6.20200420 mit Groundplane Antennenmod
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
Howto - AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 3.11.04 Scripteditor und Objektinspektor

technical constribution against annoying advertising

mademyday
Beiträge: 97
Registriert: 03.10.2014, 12:46
Danksagung erhalten: 1 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von mademyday » 22.05.2020, 15:52

lt. HM-Skript_Teil_1_Sprachbeschreibung_V2.3.pdf https://www.eq-3.de/service/downloads.html?id=58, S. 11:
Wie die „while“-Schleife, lässt sich auch die „foreach“-Schleife mittels „break“-Befehl beenden oder mittels „continue“-Befehl fortsetzen.

alchy
Beiträge: 9538
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 15 Mal
Danksagung erhalten: 214 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von alchy » 23.05.2020, 21:43

oder auch so:
BB_continue.jpg
Alchy

.................... 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
jmaus
Beiträge: 5800
Registriert: 17.02.2015, 14:45
Wohnort: Dresden
Hat sich bedankt: 14 Mal
Danksagung erhalten: 289 Mal
Kontaktdaten:

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von jmaus » 24.05.2020, 00:49

dtp hat geschrieben:
21.05.2020, 11:24
mit "quit" kann man bekanntlich aus einem Skript aussteigen und mit "break" kann man eine Schleife abbrechen. Ich suche aber gerade eine Möglichkeit, nur die aktuelle Schleifeniteration abzubrechen und zur nächsten Iteration zu springen. Also z.B. in einer foreach-Schleife das aktuelle Listenelement zu überspringen, um direkt zum nächsten zu gelangen.

Gibt es da was?
Ja, einfach als Statement "continue" nehmen. Das habe ich seinerzeit zusammen mit break der ReGaHss beigebracht. Geht für sämtliche Schleifenvarianten der ReGaHss (foreach, while, etc.).
RaspberryMatic 3.51.6.20200420 @ ESXi mit ~170 HomeMatic Geräten + ioBroker – GitHubGitHub Sponsors / PayPalTwitter

dtp
Beiträge: 8211
Registriert: 21.09.2012, 08:09
Wohnort: Stuttgart
Hat sich bedankt: 62 Mal
Danksagung erhalten: 187 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von dtp » 24.05.2020, 11:36

Danke. Den "continue"-Befehl hatte ich tatsächlich übersehen. Die Bezeichnung finde ich jedoch etwas unglücklich, weil ich "continue" eher mit einem Weiterführen nach einer Unterbrechung als mit einem Springen zum nächsten Listenelement bzw. zum nächsten Schleifenschritt verbinde. Nun ja, Namen sind bekanntlich Schall und Rauch. ;)
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: 9538
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 15 Mal
Danksagung erhalten: 214 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von alchy » 24.05.2020, 19:47

jmaus hat geschrieben:
24.05.2020, 00:49
Geht für sämtliche Schleifenvarianten der ReGaHss (foreach, while, etc.).
Kannst du bitte etc. diesbezüglich näher beschreiben?

Alchy

.................... 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
jmaus
Beiträge: 5800
Registriert: 17.02.2015, 14:45
Wohnort: Dresden
Hat sich bedankt: 14 Mal
Danksagung erhalten: 289 Mal
Kontaktdaten:

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von jmaus » 24.05.2020, 20:30

dtp hat geschrieben:
24.05.2020, 11:36
Die Bezeichnung finde ich jedoch etwas unglücklich, weil ich "continue" eher mit einem Weiterführen nach einer Unterbrechung als mit einem Springen zum nächsten Listenelement bzw. zum nächsten Schleifenschritt verbinde. Nun ja, Namen sind bekanntlich Schall und Rauch. ;)
Na wenn du „break“ und „continue“ als unglücklich gewählt ansiehst dann hast du anscheinend noch nie C Programmierung betrieben. Da heissen diese Statements nämlich auch und IMHO ergeben diese Namen durchaus Sinn.
RaspberryMatic 3.51.6.20200420 @ ESXi mit ~170 HomeMatic Geräten + ioBroker – GitHubGitHub Sponsors / PayPalTwitter

Antworten

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