Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [gelöst] switch / case mit Wert aus state liefert undefined… wieso?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    917

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[gelöst] switch / case mit Wert aus state liefert undefined… wieso?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
14 Beiträge 3 Kommentatoren 1.3k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T Offline
    T Offline
    tempestas
    schrieb am zuletzt editiert von
    #1

    Guten morgen,

    ich habe in den letzten Tagen etwas an meinem Ansageskript für die morgendliche Begrüßung im Bad rumgespielt.

    Bislang war es so, dass im Skript selbst festgelegt wurde, ob man die Terminvorschau nur für heute, bis morgen oder bis einschließlich übermorgen hören wollte.

    Das funktionierte auch wunderbar

    Skriptextrakt (zusammengekürzt auf die relevanten Bereiche):

    ! ````
    //*******************************************
    //*******************************************************************************************************
    // Festlegen, ob nur heute [1], heute und morgen [2] oder einschliesslich uebermorgen angesagt wird [3]
    //*******************************************************************************************************
    ! var terminAnsage = 1; // hier festlegen

        // Text kürzen je nach gewählter Selektion
        // ******************************************
    
        if (termineCount === 0) { 
            inhaltStringText ="Es liegen keine Termine an";
    
        }
        else {
            switch(terminAnsage) {
                case 1:
                    if (terminHeuteCount === 0) { 
                        inhaltStringText ="Es liegen keine Termine an";
                    }
                    else{
                    nthIndex(inhaltStringReplace,"§$%", terminHeuteCount);                // nutzen der Suchfunktion zum Suchen der n-ten sinnlosen Zeichenkette
                    inhaltStringText = inhaltStringReplace.slice(0,i_search);
                    for (k =0; k < terminHeuteCount; k++) {
                    inhaltStringText = inhaltStringText.replace("§$%", "");             // rausnehmen der sinnlosen Zeichen, damit diese nicht mitgesprochen werden
                    }
                    }
                break;
    
                case 2:
                    if (termineHeuteMorgenCount === 0) { 
                        inhaltStringText ="Es liegen keine Termine an";
                    }
                    else{
                    nthIndex(inhaltStringReplace,"§$%", termineHeuteMorgenCount);            // nutzen der Suchfunktion zum Suchen der n-ten sinnlosen Zeichenkette
                    inhaltStringText = inhaltStringReplace.slice(0,i_search);
                    for (k =0; k < termineHeuteMorgenCount; k++) {
                    inhaltStringText = inhaltStringText.replace("§$%", "");             // rausnehmen der sinnlosen Zeichen, damit diese nicht mitgesprochen werden
                    }          
                    }                    
                break; 
    
                case 3:
                    if (termineCount === 0) { 
                        inhaltStringText ="Es liegen keine Termine an";
                    }
                    else{
                    nthIndex(inhaltStringReplace,"§$%", termineCount);                // nutzen der Suchfunktion zum Suchen der n-ten sinnlosen Zeichenkette
                    inhaltStringText = inhaltStringReplace.slice(0,i_search);
                    for (k =0; k < termineCount; k++) {
                    inhaltStringText = inhaltStringText.replace("§$%", "");           // rausnehmen der sinnlosen Zeichen, damit diese nicht mitgesprochen werden
                    }
                    }
    
            }
        }
    

    ! ````

    Nun habe ich es abgewandelt, so dass man in VIS via Dropdown diese Auswahl treffen kann.

    Den Code habe ich zunächst so abgewandelt bzw ergänzt (wieder relevante Extrakte):

    ! ````
    ! createState('Ansage.Terminvorschau','1', force, {
    name: 'Termine heute, morgen oder bis einschließlich übermorgen',
    type: 'number',
    min: '1',
    max: '3',
    states: '1:heute;2:morgen;3:übermorgen',
    });
    ! // IDs
    ! var idTerminvorschau = "javascript.0.Ansage.Terminvorschau"/Termine heute, morgen oder bis einschließlich übermorgen/;
    ! //*******************************************************************************************************
    // Festlegen, ob nur heute [1], heute und morgen [2] oder einschliesslich uebermorgen angesagt wird [3]
    //*******************************************************************************************************
    ! var terminAnsage = getState(idTerminvorschau).val;

        [hierunter dann wieder der switch case wie oben]
    

    ! ````

    Das liefert mir dann "undefined" zurück.

    Dann dachte ich, ok, liegt eventuell daran, dass getState noch nicht "durch" ist, wenn die Ansage erfolgen soll und er folglich nicht weiß, welchen Case er nehmen soll.

    Dann habe ich es so angewandelt:

    ! ````
    ! //**********************************************************************************************************************************
    // Festlegen, ob nur heute [1], heute und morgen [2] oder einschliesslich uebermorgen angesagt wird [3] --> wird via VIS festgelegt
    //**********************************************************************************************************************************
    !
    var terminAnsage; <--- aus dem Ansagebereich rausgeholt, damit überall verfügbar

    on({id: idTerminvorschau, change: "ne"}, function(){
    checkTermine();
    });

    function checkTermine(){
    terminAnsage = getState(idTerminvorschau).val;
    if(debug) log("Terminvorschau wurde auf "+terminAnsage+" Tage eingestellt");
    }

    ! [hierunter dann wieder der switch case wie oben]
    ! ````

    Das Log liefert auch wunderbar die richtig eingestellte Anzahl der Tage, allein der switch case Teil liefert wieder "undefined".

    Ich verstehe es nicht. Wieso funktioniert es, wenn ich

    terminAnsage = 1
    ````eingebe (oder 2 oder 3), aber wenn die Zahl aus einem State gezogen wird, dann mag das Skript nicht.
    
    Habs vor lauter Verwirrung schon als String versucht, hat auch nicht geholfen.
    
    w3schools hat mir keine neuen Erkenntnisse geliefert, was ich falsch mache.
    
    Also bitte ich hier die Könner um Hilfe und Erleuchtung
    
    Danke euch vorab

    <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

    1 Antwort Letzte Antwort
    0
    • apollon77A Offline
      apollon77A Offline
      apollon77
      schrieb am zuletzt editiert von
      #2

      Das State gibt es? Auch genau mit diesem Namen?

      Was gibt denn ein "console.log(JSON.stringify(getState(idTerminvorschau)));" aus?

      Du führst das Skript auch in JavaScript-Instanz 0 aus?

      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
      1 Antwort Letzte Antwort
      0
      • BuZZyB Offline
        BuZZyB Offline
        BuZZy
        schrieb am zuletzt editiert von
        #3
        var terminAnsage = parseInt(getState(idTerminvorschau).val);
        switch(terminAnsage) { ..... bla bla und so weiter
        ````:lol:
        
        Gruß
        1 Antwort Letzte Antwort
        0
        • T Offline
          T Offline
          tempestas
          schrieb am zuletzt editiert von
          #4

          Hi,

          danke für deine Rückmeldung.

          Ja, den State gibt es. Das Log liest ja auch diesen State aus (deshalb habe ich das getestet).

          Ja, alles unter javascript.0 Instanz

          Warum json.stringify?

          Arbeitet case switch nur mit strings?

          <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

          1 Antwort Letzte Antwort
          0
          • T Offline
            T Offline
            tempestas
            schrieb am zuletzt editiert von
            #5

            @BuZZy:

            var terminAnsage = parseInt(getState(idTerminvorschau).val);
            

            Gruß `

            Danke, teste ich sofort. Frage: wieso parseInt? Dachte, state als Number sollte dafür sorgen, dass es nicht notwendig ist?

            <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

            1 Antwort Letzte Antwort
            0
            • apollon77A Offline
              apollon77A Offline
              apollon77
              schrieb am zuletzt editiert von
              #6

              @tempestas:

              Warum json.stringify?

              Arbeitet case switch nur mit strings? `

              Nein aber wenn der "state.val" undefined ist dann will ich wissen wie das gesamte State Objekt aussieht was zurückgegeben wird weil dort ggf eine Fehlermeldfung steht!

              Deswegen auch nur console.log Sollst ja nicht das benutzen, ich will die Ausgabe sehen

              Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

              • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
              • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
              1 Antwort Letzte Antwort
              0
              • T Offline
                T Offline
                tempestas
                schrieb am zuletzt editiert von
                #7

                Buzzy: hat funktioniert, danke dir!

                Wäre ich im Leben nicht drauf gekommen.

                Bitte sag mir, dass du beruflich was mit IT machst, sonst habe ich das Gefühl, ich bin total verblödet (meine Lernkurve im vgl zu deiner :) :oops:

                <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                1 Antwort Letzte Antwort
                0
                • apollon77A Offline
                  apollon77A Offline
                  apollon77
                  schrieb am zuletzt editiert von
                  #8

                  Was kommt den raus? immer 0?

                  Wenn der state.val===undefined ist kommt das immer eine 0 raus … in Meinen Augen also auch nicht unbedingt was DFu willst ... wie gesagt: wenn state.val===undefined

                  Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                  • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                  • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                  1 Antwort Letzte Antwort
                  0
                  • BuZZyB Offline
                    BuZZyB Offline
                    BuZZy
                    schrieb am zuletzt editiert von
                    #9

                    @tempestas:

                    Bitte sag mir, dass du beruflich was mit IT machst, sonst habe ich das Gefühl, ich bin total verblödet (meine Lernkurve im vgl zu deiner :) :oops: ` Muss dich leider enttäuschen.. Bin gelernter KFZ Mechatroniker - habe der KFZ Branche aber den Rücken gekehrt und arbeite jetzt in einem Betrieb der ESG (Einscheiben Sicherheitsglas) herstellt.. Sitze hier im Büro und steuere die Produktion… :lol:

                    Aber: kleiner Wehrmutstropfen.. Ich kümmere mich hier in der Firma auch um die IT.... So nebenbei.. :lol:

                    @apollon77:

                    Was kommt den raus? immer 0? ` Denke nicht, da er weder 0 noch undefined als Case im Switch block angegeben hat. Sonst hätte er (hoffe ich) nicht geschrieben dass es funktioniert. :D

                    Gruß

                    1 Antwort Letzte Antwort
                    0
                    • T Offline
                      T Offline
                      tempestas
                      schrieb am zuletzt editiert von
                      #10

                      Apollon:

                      parseInt hats gelöst.

                      @ Buzzy: ok, nun fühle ich mich minderbemittelt :oops: :lol:

                      Aber Frage: wie bist du drauf gekommen, dass es parseInt sein muss? Dachte, mit der deklaration des States als number wäre das Thema durch?

                      parseInt hätte ich genutzt (bzw nutze ich in Skripten), wenn ich Zahlen aus strings extrahieren will

                      Edit:

                      Apollon:

                      dein Hinweis liefert das hier:

                      {"val":"\n3","ack":false,"ts":1516956173260,"q":0,"from":"system.adapter.cloud.0","lc":1516956173260}
                      ````(hatte beim Testen jetzt die drei eingestellt)
                      
                      \n ist ein Zeilenumbruch imho. Das erklärt dann, warum parseInt das Thema löst. Wie der \n da rein kommt weiß ich aber nicht
                      
                      Edit 2:
                      
                      Das erklärt mir jetzt auch, warum im Log immer stand:
                      
                      

                      javascript.0 2018-01-26 08:16:28.464 info 2 Tage eingestellt
                      javascript.0 2018-01-26 08:16:28.464 info script.js.common.Ansage_Morgens: Terminvorschau wurde auf

                      
                      Seltsamerweise habe ich das aber nur, wenn ich mich per .pro einlogge.
                      
                      Gestern abend daheim war das Log ganz normal in einer Zeile geschrieben.
                      
                      Edit 3:
                      
                      Ahh klar, der Zeilenumbruch wird wohl aus dem VIS jqui select widget kommen. Dort stehen unter Werte ja
                      
                      1;
                      
                      2;
                      
                      3;
                      
                      verstanden! (hoffe ich)

                      <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                      1 Antwort Letzte Antwort
                      0
                      • BuZZyB Offline
                        BuZZyB Offline
                        BuZZy
                        schrieb am zuletzt editiert von
                        #11

                        @tempestas:

                        Aber Frage: wie bist du drauf gekommen, dass es parseInt sein muss? Dachte, mit der deklaration des States als number wäre das Thema durch?

                        parseInt hätte ich genutzt (bzw nutze ich in Skripten), wenn ich Zahlen aus strings extrahieren will `

                        Wenn du````
                        log(typeof getState(idTerminvorschau).val);

                        
                        Obwohl der Datenpunkt als number im ioBroker definiert wurde.
                        
                        Deswegen musst du ihn in ein integer umwandeln..
                        
                        Hättest du case "1" ... case "2" ... gemacht hätte es wahrscheinlich auch funktioniert - ohne es vorher mit parseInt umzuwandeln.. ;) :)
                        
                        Gruß
                        1 Antwort Letzte Antwort
                        0
                        • T Offline
                          T Offline
                          tempestas
                          schrieb am zuletzt editiert von
                          #12

                          ok danke.

                          Hier sind aber auch Füchse am Werk.

                          Gruß ebenfalls aus dem nördlichen Speckgürtel

                          <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                          1 Antwort Letzte Antwort
                          0
                          • BuZZyB Offline
                            BuZZyB Offline
                            BuZZy
                            schrieb am zuletzt editiert von
                            #13

                            Ah warte mal, hab mir dein Script nochmal angesehen..````
                            createState('Ansage.Terminvorschau','1', { ... });

                            createState('Ansage.Terminvorschau',1, { ... });

                            (OHNE ' ' um den Wert 1 herum)..
                            
                            Dann hast du die 1 als Number drin stehen! ;)
                            
                            Jetzt ist wieder die Frage was schreibt VIS in den Datenpunkt.. Wahrscheinlich einen String, ich vermute da kommt auch der Zeilenumbruch \n her.. Also ist der Weg mit parseInt wohl unumgänglich.. (Weiß nicht ob man im VIS irgendwo einstellen kann dass nur number eingetragen werden soll im Datenpunkt..) :D
                            
                            Gruß
                            1 Antwort Letzte Antwort
                            0
                            • T Offline
                              T Offline
                              tempestas
                              schrieb am zuletzt editiert von
                              #14

                              @BuZZy:

                              Ah warte mal, hab mir dein Script nochmal angesehen..````
                              createState('Ansage.Terminvorschau','1', { ... });

                              createState('Ansage.Terminvorschau',1, { ... });

                              (OHNE ' ' um den Wert 1 herum)..
                              
                              Dann hast du die 1 als Number drin stehen! ;)
                              
                              Jetzt ist wieder die Frage was schreibt VIS in den Datenpunkt.. Wahrscheinlich einen String, ich vermute da kommt auch der Zeilenumbruch \n her..
                              
                              Gruß `  
                              

                              Hi,

                              das ist ein C&P Fehler. Ich hatte zwischenzeitlich zum Testen mal auf string gestellt und dann die '' gesetzt. Vorher war es nur Number und ohne ''

                              Den Grund habe ich nun denke ich entdeckt, steht paar Postings weiter oben; Apollons Hinweis hat mich auf die Spur der Erklärung gebracht, dein Posting hats gelöst.

                              <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                              1 Antwort Letzte Antwort
                              0
                              Antworten
                              • In einem neuen Thema antworten
                              Anmelden zum Antworten
                              • Älteste zuerst
                              • Neuste zuerst
                              • Meiste Stimmen


                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              578

                              Online

                              32.6k

                              Benutzer

                              82.2k

                              Themen

                              1.3m

                              Beiträge
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                              ioBroker Community 2014-2025
                              logo
                              • Anmelden

                              • Du hast noch kein Konto? Registrieren

                              • Anmelden oder registrieren, um zu suchen
                              • Erster Beitrag
                                Letzter Beitrag
                              0
                              • Home
                              • Aktuell
                              • Tags
                              • Ungelesen 0
                              • Kategorien
                              • Unreplied
                              • Beliebt
                              • GitHub
                              • Docu
                              • Hilfe