foreach-Schleife: aktuelles Listenelement überspringen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Benutzeravatar
jmaus
Beiträge: 9865
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1883 Mal
Kontaktdaten:

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von jmaus » 30.05.2020, 08:00

All die Wünsche/Vorschläge mit „Listen“-Bearbeitung kann ich natürlich verstehen und nachvollziehen. Allerdings ist es so, das der Missbrauch des Tabularzeichens (\t) für die foreach abarbeitung mir noch nie zugesagt hat und es meines Erachtens besser einen richtigen Listendatentyo geben sollte statt hierfür nun diesen Tabulator-Missbrauch fortzusetzen. Weil wenn ich das jetzt auf die String Funktionen wie Contains(), Replace() etc erweitern würde dann gleiche das dem Öffnen der Büchse der Pandorra weil dann kommen diese Funktionen ja nicht mehr mit normalen strings klar in denen sich eben auch Tabulatoren befinden könnten. Also entweder müsste man für ein Contains() ein zweites ListContains() oder so einführen, oder besser man führt einen „list“ datentyp ein auf den man dann Contains() anwenden kann. Und ich tendiere zu letzterem auch wenn das wesentlich mehr aufwand wäre und somit auch wesentlich länger dauern würde.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von dtp » 30.05.2020, 12:10

Wäre mir auch Recht. ;)

Allerdings sollte die Kompatibilität zu alten Skripten bestehen bleiben, weil ansonsten eQ-3 das sicherlich nicht umsetzen würde.
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.

g55
Beiträge: 236
Registriert: 02.10.2018, 19:24
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 59 Mal
Danksagung erhalten: 11 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von g55 » 13.06.2020, 22:11

Hallo Ihr lieben script-Experten,

erstmal vielen Dank an alle für die Aufklärung hier bez. "break" und "continue". Funktioniert soweit.

jedoch bin ich grad über was seltsames gestolpert in meinen Scripten :
  • innerhalb einer foreach-Schleife funktioniert sowohl "break" als auch "continue"
  • hab ich innerhalb dieser Schleife eine weitere while- oder foreach-Schleife, geht hier auch noch break und continue
  • nach Verlassen der inneren Schleife gehen in der äußeren dann aber KEINE break oder continue mehr :shock: :?:
    ich bekomme im SDV beim Test und beim Ausführen Fehlermeldungen
hier mal ein einfaches Beispiel :

Code: Alles auswählen

string liste = "1,4,2,6,8,9,6,3,8,9";

string item;
foreach (item, liste.Split(",")) {

    var i = 0;
    while (i<10) { i=i+1; }

    if (item.ToInteger() > 5) { continue; }

    WriteLine(item);
}
Das wirft dir Fehlermeldung aus :

Code: Alles auswählen

Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: Error 1 at row 9 col 42 near ^; }^M ^M     WriteLine(item);^M }^M ^M  [SyntaxError():iseESP.cpp:1137]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: ; }^M ^M     WriteLine(item);^M }^M  [ParseProgram():iseESP.cpp:387]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: Error 1 at row 9 col 42 near ^; }^M ^M     WriteLine(item);^M }^M ^M  [SyntaxError():iseESP.cpp:1137]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: ; }^M ^M     WriteLine(item);^M }^M  [ParseProgram():iseESP.cpp:387]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: Error 1 at row 9 col 42 near ^; }^M ^M     WriteLine(item);^M }^M ^M  [SyntaxError():iseESP.cpp:1137]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: ; }^M ^M     WriteLine(item);^M }^M  [ParseProgram():iseESP.cpp:387]
Wenn ich hier das "While" (könnte auch "foreach" sein) auskommentiere, funktioniert das Skript.
Irgendwie vermute ich mal, dass bei geschachtelten Schleifen das break / continue eben nicht richtig für die jeweilige Ebene funktioniert.
jedenfalls war ich bei einem script mit so ca 500 Zeilen fast am Verzweifeln wegen Syntax-Error, daher hab ich ein einfaches Beispiel aufgesetzt und konnte es so nachvollziehen.

Ist das bei Euch auch so oder hab ich was übersehen? Bin für jeden Tipp dankbar 8)
Proxmox-MiniServer (J4125, 12GB RAM, nur SSDs, Proxmox 7.4-3), RM v3.69.7.20230506, abgesetztes, altes Funkmodul HM-MOD-RPI-PCB am RB-RF-ETH, ca. 5 HM- und 107 HMIP-Geräte, Addons : CUxD v2.10.1, eMail v1.7.6, XML-API v1.22, JB-HB v6.0, ProgrammeDrucken v2.6, CCU-Historian v3.3.1

mabel
Beiträge: 65
Registriert: 02.07.2015, 17:58
Hat sich bedankt: 2 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von mabel » 22.07.2020, 23:23

Kämpfe gerade mit dem selben Problem:
prinzipieller Programmauszug:

Code: Alles auswählen

          
          GEFUNDEN = false;
          foreach (ELEMENT1, LISTE1) 
          { foreach (ELEMENT2, LISTE2)
            { if (AUSDRUCK1 == AUSDRUCK2) 
              { GEFUNDEN = true;
                break;
              }
            }
            
          if (GEFUNDEN)
            { break; }
          }
Hier erhalte ich eine Fehlermeldung.
Platziert man das Break aber direkt nach dem foreach (äußere Schleife): funktioniert es

Code: Alles auswählen

         
         GEFUNDEN = false;
          foreach (ELEMENT1, LISTE1) 
          { if (GEFUNDEN)
            { break; }

            foreach (ELEMENT2, LISTE2)
            { if (AUSDRUCK1 == AUSDRUCK2) 
              { GEFUNDEN = true;
                break;
              }
            }
          }
Problem dabei ist dann nur, dass die Variable ELEMENT1 schon das nächste Listenelement enthält.
Blöd, wenn man damit weiter arbeiten will.

MichaelN
Beiträge: 9681
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von MichaelN » 23.07.2020, 00:07

Dann spring nicht mit break aus der Schleife, sondern bau die Logik um :

Mach aus

Code: Alles auswählen

if (GEFUNDEN)
            { break; } 
ein
if (GEFUNDEN == false )
{.....
Und das Element1 musst du halt woanders zwischen speichern.
Dann brauchst du kein break mehr. Die paar leeren schleifendurchläufe, die dann folgen sind zwar unschön, aber das verkraftet die CCU schon.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

mabel
Beiträge: 65
Registriert: 02.07.2015, 17:58
Hat sich bedankt: 2 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von mabel » 23.07.2020, 00:24

Hi MichaelN

Es geht hier nur um das prinzipielle Problem, auf das g55 (und ich also auch) gestoßen ist.
Je nach Position des Abbruchbefehls "break" innerhalb der äußeren Schleife funktioniert es oder halt nicht!
Das sollte so nicht sein!
Natürlich kann man alles irgendwie zwischenspeichern und verdrehen / verbiegen. Das ist aber alles nicht nötig, wenn das mit dem Abbruchbefehl bei jeder Positionierung in der äußeren Schleife funktioniert. Das ist auf jeden Fall die bessere Lösung.

Und die "paar" Leerdurchläufe mehr, verursachen einen Laufzeitunterschied von 4-5 Sekunden in meinem Script (im Editor / Testmodus) ...

MichaelN
Beiträge: 9681
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von MichaelN » 23.07.2020, 08:48

Dann als Fehler auf Github melden. Ansonsten wird da wenig passieren.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
jmaus
Beiträge: 9865
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1883 Mal
Kontaktdaten:

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von jmaus » 23.07.2020, 08:59

MichaelN hat geschrieben:
23.07.2020, 08:48
Dann als Fehler auf Github melden. Ansonsten wird da wenig passieren.
Genau so sehe ich das auch! Nur was auf GitHub gemeldet ist existiert mehr oder weniger in meiner Erinnerung. :D Und so ist es auch mit diesem Problem. Denn erst jetzt hab ich mich gerade wieder an diesen Beitrag erinnert und hatte das problem mit break leider schon wieder total vergessen gehabt... Also bitte ein entsprechendes GitHub Ticket dazu aufmachen - bitte aber nicht einfach als einfache referenz/link hier her, sondern komplett unabgängig ausführen und mit entsprechenden lauffähigen Code Beispielen (nicht einfach nur pseudo-code) hinterlegen, etc. Nur so kann ich das dann in einer ruhigen Minute mal angehen und ggf reparieren.

Achja, und wenn ein solches Problem mit „break“ existiert sollte Das selbe auch prinzipiell mit „continue“ passieren. Das könntet ihr ja auch mal freundlicherweise testen.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

mabel
Beiträge: 65
Registriert: 02.07.2015, 17:58
Hat sich bedankt: 2 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von mabel » 23.07.2020, 11:58

Hallo Jens,
Genau so sehe ich das auch! Nur was auf GitHub gemeldet ist existiert mehr oder weniger in meiner Erinnerung. :D
Hab dir 'nen "Merkzettel" geschrieben :D

g55
Beiträge: 236
Registriert: 02.10.2018, 19:24
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 59 Mal
Danksagung erhalten: 11 Mal

Re: foreach-Schleife: aktuelles Listenelement überspringen

Beitrag von g55 » 23.07.2020, 14:12

jmaus hat geschrieben:
23.07.2020, 08:59
Achja, und wenn ein solches Problem mit „break“ existiert sollte Das selbe auch prinzipiell mit „continue“ passieren. Das könntet ihr ja auch mal freundlicherweise testen.
Hatte ich in meinem Post weiter zurück eigentlich schon erwähnt : in meinem Testscript und anderen Tests betrifft es sowohl "break" wie auch "continue".
Proxmox-MiniServer (J4125, 12GB RAM, nur SSDs, Proxmox 7.4-3), RM v3.69.7.20230506, abgesetztes, altes Funkmodul HM-MOD-RPI-PCB am RB-RF-ETH, ca. 5 HM- und 107 HMIP-Geräte, Addons : CUxD v2.10.1, eMail v1.7.6, XML-API v1.22, JB-HB v6.0, ProgrammeDrucken v2.6, CCU-Historian v3.3.1

Antworten

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