foreach-Schleife: aktuelles Listenelement überspringen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 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: 5469
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 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
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: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 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: 5469
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 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);
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

mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 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: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von alchy » 23.05.2020, 21:43

oder auch so:
BB_continue.jpg
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
jmaus
Beiträge: 9839
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 462 Mal
Danksagung erhalten: 1863 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.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 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: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 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

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
jmaus
Beiträge: 9839
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 462 Mal
Danksagung erhalten: 1863 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.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)“