Switch Case mit UND-Verknüpfung?

Hallo zusammen,

ich kämpfe seit einiger Zeit mit einem Problem, bei dem ich nicht weiterkomme.

Hier mein bisheriges Skript. Angetriggert wird das Skript über den Status (STATE) von einem Homematic IP Schaltaktor. Wenn Status des Aktors (36699) = EIN, dann LED einschalten, sonst LED ausschalten. Das funktioniert auch wunderbar.
Nun soll zeitgleich mit dem Aktor (36699) ein weiterer Aktor geschaltet werden.
Wenn BEIDE Aktoren = EIN, dann LED einschalten. Wenn BEIDE Aktoren = AUS, dann LED ausschalten. Bei einem anderen Zustand (z.B. nur 1 Aktor AN, dann LED andere Farbe).
Nun scheitere ich aber schon daran, das ich es nicht schaffe die grüne LED einzuschalten wenn BEIDE Aktoren an sind (UND-Verknüpfung).
Weiter unten das aktuelle Skript, welches nicht funktioniert. Vielleicht kann mir hier jemand auf die Sprünge helfen?
VIELEN DANK!!

Bisheriges Skript:

switch ($_IPS[‚VARIABLE‘]){
case 36699:
if ($_IPS[‚VALUE‘] == true) { // wenn Aktor an
//LED oben einschalten
RequestAction(14146, 2); // LED Taste oben auf GRÜN
RequestAction(39725, 0.5); // LED Taste oben Helligkeit 50%

    } else {
        //LED oben ausschalten
        RequestAction(14146, 0); // LED Taste oben auf AUS
        RequestAction(39725, 0.0); // LED Taste oben Helligkeit 0%
    }
    break;

}

Neues Skript (funktioniert so nicht)

switch ($_IPS[‚VARIABLE‘]){
case (36699 && 34688):
if ($_IPS[‚VALUE‘] == true) { // wenn beide Aktoren an
RequestAction(14146, 2); // LED Taste oben auf GRÜN
RequestAction(39725, 0.5); // LED Taste oben Helligkeit 50%

    } else {
        RequestAction(14146, 0); // LED Taste oben auf AUS
        RequestAction(39725, 0.0); // LED Taste oben Helligkeit 0%
    }
    break;

}

Das geht so nicht.
Musst if statt Switch verwenden

Das funktioniert nicht

Vielen Dank erstmal.

Muss ich mich dann komplett von switch case verabschieden oder kann ich innerhalb des Skripts mehrere case(s) per UND oder ODER Verknüpfung verbinden?

Also

  • wenn case 1 UND case 2 = true, dann…
  • wenn case 1 ODER case 2 = true, dann

usw?

Switch ist nur für ODER Bedingungen geeignet:

Da schreibst du die Case untereinander:

case 12345:
case 23456:

break

es heisst ja auch switch($variable) case …

gewöhnlich kann eine Variable zu einem Zeitpunkt auch nur einen Wert haben, so das nur der „or“ Fall wie von bumaas genannt eintreffen kann. Der Trick ist hier, das das break am Ende des ersten case Block weggelassen wird, so das der Code im nächsten case Block mit ausgeführt wird. Will man mehrere Variablen zu einem Zeitpunkt für die Entscheidung vergleichen muss man „if …elseif …else“ Blöcke nehmen.

Dazu gibt es doch einen Trick. Du musst den Case nicht auf die beiden Variablen setzen sondern auf True. Hier ein Beispiel, dass ich auf die schnelle im Netz gefunden habe. Ich denke das kann man auch auf dein Beispiel anpassen…

Gruß,

Uwe

<?php
$status = 20;
switch (TRUE) {
case ($status > 0 and $status < 4);
echo "eine der niedrigsten Zahlen";
break;
case ($status > 17 and $status < 21);
echo "eine der höchsten Zahlen";
break;
default:
echo "die Zahlen dazwischen";
}
?>

Schon, aber da nimmt man gewöhnlich if … elseif … elseif …

Hi hodor,
dürfte eigentlich nicht gehen denn bei $status <= 0 und $status zwischen 4 und 17 sind 2 case false und switch müsste eigentlich meckern.

Ralf

Nein, das wäre auch korrekt und er läuft in den default.
Aber wie man sieht ist das künstliche Switch-Konstrukt sehr ungewöhnlich und nicht so leicht zu verstehen wie ein if Konstrukt.

Na da würde ich mal sagen, es ist eine Sache der Gewöhnung. Wer von Cobol die Evaluate-Struktur kennt findet sich da sehr schnell zurecht und dem graust es bei If-Else-Schachteln bis ins unendliche…

Moin,

hätte nicht gedacht, dass hier noch mehr COBOL Dinos unterwegs sind :smiley: Evaluate ist tatsächlich ein extrem mächtiger Befehl der die Möglichkeiten von switch erheblich überschreitet. Gerade in kommerziellen Anwendungen wie z. B. in der Buchhaltung, konnte man mit einer einzigen Anweisung einen kompletten Buchungssatz erzeugen bzw. zerlegen. Mit COBOL-85 und der Blockstrukturierung waren die if … else Strukturen aber recht übersichtlich geworden - vorher war man ja zwangsweise auf Spaghetti-Code (goto) angewiesen.

Schade ist, dass die Compiler Hersteller mit den extrem teuren Runtime Lizenzen sich den Ast abgesägt haben, auf dem sie einst saßen.

Off-Topic aus :wink:

Gruß
Hans

Ach ja, COBOL war wie Bücher schreiben. Programmieren in Prosa.

Gesendet von iPhone XS mit Tapatalk

Im Grunde genommen ist das ein bisschen persönlicher Geschmack. Performance-Unterschiede sind wohl eher nicht oder nur marginal vorhanden. Ich nehme das, was am Ende besser zu lesen ist. Meist nehme ich if/else.
Wenn die Anzahl der Fälle 4 oder mehr ist und/oder die Bedingungen mehrere „oder“ Verknüpfungen haben nehme ich auch gerne mal Switch Case. Im vorgestellten Code des Thread Erstellers sind allerdings Switch Case und If/else verschachtelt. Das wäre dann eher nicht mein Ding.

Wie dem auch sei - gefragt wurde ja nicht ob das schön oder üblich ist, sondern ob und wie es geht.

Gruß,

Uwe

Cobol – das war konzentrieren auf den Business-Case… da hat man sich noch auf das fachliche konzentriert statt Libraries zu suchen oder sich mit Infrastruktur rum zu schlagen. Und ja, lesen konnte man es auch noch… aber beschissen kann man in jeder Sprache programmieren, wenn man es drauf anlegt.

OT: Cobol hab ich z.Zt. der Mondlandung gelernt:D

So alt bin ich noch gar nicht das ich da schon gelebt hätte… aber deswegen ist die Sprache nicht weniger schlecht… übrigens werden aktuell Cobol-Programmierer sehr gesucht und gut bezahlt, in den USA gibt es Headhunter die sich auf Cobolianer spezialisiert haben, aber auch bei uns…
Tja, früher sind wir mit der Leistung von 3 C64 zum Mond geflogen, heute brauchen wir 4GB Hauptspeicher um Windows zu starten