Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Bei bestimmtem String stürzt Javascript Instanz ab

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Bei bestimmtem String stürzt Javascript Instanz ab

    This topic has been deleted. Only users with topic management privileges can see it.
    • Ben1983
      Ben1983 last edited by

      Hallo,

      ich baue mir gerade eine Funtion, die mir Zeitangaben prüfen kann.

      // Prüfen,ob die angegebenen Zeit vor oder gleich der aktuellen ist
      onMessage("TimeBeforeOrEqualNow",(messagedata,callback)=>{
          const now = new Date();
          const actualTime = `${now.getHours()}:${now.getMinutes()}`;
          log(messagedata);
          log(messagedata.time);
          log(actualTime)
          callback(messagedata.time <= actualTime);
      });
      
      async function checkTime(){
          const ausgabe = await messageToAsync("TimeBeforeOrEqualNow",{time:"08:33"},{timeout:5000});
      
      }
      
      checkTime();
      

      Die Visu gibt auch über das "time Date" Widget so den getesteten Wert von "08:30" raus.
      Ich habe gerade nur gemerkt, dass die aktuelle Zeit ohne Führende 0 gehandelt wird.
      also "8:30". Wenn ich das als Eingabe eintrage, dann Stürzt die Instanz ab. Warum?

      Codierknecht T 2 Replies Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @Ben1983 last edited by

        @ben1983
        Liegt Dein Script in "global"?

        Ben1983 1 Reply Last reply Reply Quote 0
        • T
          ticaki Developer @Ben1983 last edited by ticaki

          NICHT TESTEN

          Bei mir hat der resultierende Fehler den iobroker zerschossen spiele gerade ein Backup ein.

          @ben1983

          Bitte erstelle eine Github Issue.

          1 Reply Last reply Reply Quote 0
          • Ben1983
            Ben1983 @Codierknecht last edited by

            @codierknecht nein

            Codierknecht 1 Reply Last reply Reply Quote 0
            • Codierknecht
              Codierknecht Developer Most Active @Ben1983 last edited by

              @ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

              @codierknecht nein

              Hatte ich mir jetzt schon gedacht, wenn @ticaki das reproduzieren kann.
              Hilft also nur, auf einen Fix zu warten oder sicherzustellen, dass der Wert in der benötigten Form verwendet wird.

              T 1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer @Codierknecht last edited by

                @codierknecht

                Das hier geht:

                onMessage("TimeBeforeOrEqualNow",(messagedata,callback)=>{
                    const now = new Date();
                    const actualTime = `${now.getHours()}:${now.getMinutes()}`;
                    log(messagedata.time <= actualTime);
                    log(messagedata.time);
                    log(actualTime)
                    callback({result: !!(messagedata.time <= actualTime)});
                });
                 
                async function checkTime(){
                    try {
                        const ausgabe = await messageToAsync("TimeBeforeOrEqualNow",{time:"9:33"},{timeout:5000});
                        log(ausgabe.result)
                    } catch(e) {
                        log (e.message)
                        log ('error2')
                    }
                }
                

                Der Absturz der Instanz kommt von dem fehlenden try{};catch um den await. Das ist so auch richtig.

                Der Bug liegt daran das messageToAsnc einen Wert als Rückgabe erwartet und "false" als kein Wert interpretiert wird. Denke ich mal. @haus-automatisierung ?

                OliverIO haus-automatisierung 2 Replies Last reply Reply Quote 0
                • OliverIO
                  OliverIO @ticaki last edited by

                  @ticaki

                  oder log fängt zirkular referenzen nicht ab und loggt sich zu tode

                  log(messagedata);
                  

                  weiß allerdings nicht, wie groß das objekt ist.

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @OliverIO last edited by ticaki

                    @oliverio sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

                    @ticaki

                    oder log fängt zirkular referenzen nicht ab und loggt sich zu tode

                    log(messagedata);
                    

                    weiß allerdings nicht, wie groß das objekt ist.

                    Da die Funktion mit Rückgabewert true funktioniert und bei false den Error unknown errorzurück gibt, denke ich nicht, dass es das ist.

                    Code des TE nur um catch try erweitert 8:33 <= 10:46 == false Weil 8 > 1

                    10:46:15.827	info	javascript.0 (9472) script.js.Test.Skript_122: registered 0 subscriptions, 0 schedules, 1 message, 0 logs and 0 file subscriptions
                    10:46:15.831	info	javascript.0 (9472) script.js.Test.Skript_122: {'time':'8:33'}
                    10:46:15.831	info	javascript.0 (9472) script.js.Test.Skript_122: 8:33
                    10:46:15.831	info	javascript.0 (9472) script.js.Test.Skript_122: 10:46
                    10:46:15.834	info	javascript.0 (9472) script.js.Test.Skript_122: Unknown error
                    

                    @Ben1983

                    Von dem Fehler abgesehen halte ich nichts davon "Zahlen" per Stringvergleich zu vergleichen. Das hier ist da imho besser:

                    const now = new Date()
                    const actualTime = now.getHours()+now.getMinutes()/60;
                    const time = '8:33';
                    const timeAsArray = time.split(':')
                    const timeAsNumber = Number(timeAsArray[0]) + Number(timeAsArray[1])/60
                    
                    log(timeAsNumber <= actualTime);
                    

                    EDIT: Wie immer einen kleinen dämlichen Fehler im Code behoben 🙂

                    1 Reply Last reply Reply Quote 0
                    • haus-automatisierung
                      haus-automatisierung Developer Most Active @ticaki last edited by

                      @ticaki sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

                      Der Bug liegt daran das messageToAsnc einen Wert als Rückgabe erwartet und "false" als kein Wert interpretiert wird. Denke ich mal. @haus-automatisierung ?

                      Das sollte auch funktionieren:

                      https://github.com/ioBroker/ioBroker.javascript/blob/939b0b0a70dd857684afc10be6732467fb3a5208/lib/sandbox.js#L3651-L3655

                      Du gibst ja als Objekt { result: false } zurück und nicht einfach nur false.

                      T 1 Reply Last reply Reply Quote 0
                      • T
                        ticaki Developer @haus-automatisierung last edited by ticaki

                        @haus-automatisierung

                        Der TE gibt im seinem Beispiel code dort oben false zurück.

                        Oh sehe gerade das im Beispielcode auch ein Objekt zurück gegeben wird.
                        https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#messagetoasync

                        Aber ist es da wirklich zwingend das ein Objekt (oder ein Wert != null/undefined/0/''/false) zurück gegeben werden muß?

                                           if (res && res.error) {
                                                reject(res.error);
                                            } else {
                                                resolve(res);
                                            }
                        

                        Wäre doch da sinnvoller oder? Kann gerne ne PR machen, hab gesehen dass das Verhalten sich in allen sendToAsync Varianten wiederholt.

                        haus-automatisierung 1 Reply Last reply Reply Quote 0
                        • haus-automatisierung
                          haus-automatisierung Developer Most Active @ticaki last edited by

                          @ticaki sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

                          Aber ist es da wirklich zwingend das ein Objekt (oder ein Wert != null/undefined/0/''/false) zurück gegeben werden muß?

                          Aktuell ja. Das ist analog zu sendTo implementiert. Würde das nicht umstellen - was ist der Mehrwert? Die Blockly-Bausteine generieren den Code ja momentan auch so, dass immer ein Objekt zurückgeliefert wird:

                          https://github.com/ioBroker/ioBroker.javascript/blob/939b0b0a70dd857684afc10be6732467fb3a5208/src/public/google-blockly/own/blocks_trigger.js#L998

                          Intern ist das ja ein einfaches sendTo. Und da arbeitet man ja eigentlich immer mit Objekten. Finde ich auch sauber gelöst.

                          T 1 Reply Last reply Reply Quote 0
                          • T
                            ticaki Developer @haus-automatisierung last edited by

                            @haus-automatisierung
                            Da ist kein Vorteil, nur das im sendTo() für jsonConfig.json bei textSendTo ein String erwartet wird(kein Object), daher meine Fehlannahme. 🙂

                            haus-automatisierung 1 Reply Last reply Reply Quote 0
                            • haus-automatisierung
                              haus-automatisierung Developer Most Active @ticaki last edited by

                              @ticaki Stimmt, wäre schöner wenn auch der Admin für textSendTo dann result.text nutzen würde und man auch dort ein Objekt zurückliefert.

                              Ben1983 1 Reply Last reply Reply Quote 0
                              • Ben1983
                                Ben1983 @haus-automatisierung last edited by

                                @haus-automatisierung ok.
                                Dann sollte ja async meineFunktion.result gehen, oder?
                                Trotzdem stürzt ja komischerweise die Instanz ab… obwohl nur der Rückgabewert geloggt werden soll. Sollte das nicht trotzdem gehen?

                                haus-automatisierung T 2 Replies Last reply Reply Quote 0
                                • haus-automatisierung
                                  haus-automatisierung Developer Most Active @Ben1983 last edited by haus-automatisierung

                                  @ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

                                  Dann sollte ja async meineFunktion.result gehen, oder?

                                  Wenn Du ein Objekt an die Callback-Funktion übergibst, ja. So wie in der Doku zu finden.

                                  PS: Strings mit <> zu vergleichen ist so eine Sache... da wirst Du noch Probleme bekommen (je nachdem ob eine 0 vorangestellt wird, oder nicht):

                                  Screenshot 2023-11-09 at 12.53.48.png

                                  Ben1983 1 Reply Last reply Reply Quote 1
                                  • T
                                    ticaki Developer @Ben1983 last edited by

                                    @ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

                                    @haus-automatisierung ok.
                                    Dann sollte ja async meineFunktion.result gehen, oder?
                                    Trotzdem stürzt ja komischerweise die Instanz ab… obwohl nur der Rückgabewert geloggt werden soll. Sollte das nicht trotzdem gehen?

                                    Oben steht doch die Lösung die geht...

                                    1 Reply Last reply Reply Quote 1
                                    • Ben1983
                                      Ben1983 @haus-automatisierung last edited by

                                      @haus-automatisierung ok danke.
                                      Ja denke mache es so, dass ich wirklich den String splitten werde, denn nur aus einer Zeit kann man ja mit Date() nichts erzeugen. Werde dann auch ein Objekt übergeben.

                                      Nur ne Frage: wie kann es denn sein, dass der Fehler jemandem den ioBroker zerschießt?

                                      haus-automatisierung 1 Reply Last reply Reply Quote 0
                                      • haus-automatisierung
                                        haus-automatisierung Developer Most Active @Ben1983 last edited by

                                        @ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

                                        Nur ne Frage: wie kann es denn sein, dass der Fehler jemandem den ioBroker zerschießt?

                                        Eigentlich gar nicht. Mindestens der JavaScript-Adapter läuft ja in einem eigenen Prozess (außer der Compact-Mode ist aktiviert). Gibt da für mich keine technisch Erklärung für.

                                        Wenn ich das fehlerhafte Script nun so nehme und ausprobiere, passiert wahrscheinlich wieder gar nix 🙂

                                        Ben1983 1 Reply Last reply Reply Quote 0
                                        • Ben1983
                                          Ben1983 @haus-automatisierung last edited by Ben1983

                                          @haus-automatisierung OK. Wundert mich jetzt auch etwas.

                                          Hier mein finaler Code, der funktioniert.
                                          Sollte das so ok sein?

                                          // Prüfen,ob die angegebenen Zeit vor oder gleich der aktuellen ist
                                          onMessage("TimeBeforeOrEqualNow",(messagedata,callback)=>{
                                              const now = new Date();
                                              const inputTime = new Date(`${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}-${messagedata.time}`);
                                              if(inputTime){
                                                  callback({result:inputTime <= now});
                                              }
                                              else{
                                                  callback({result:false});
                                              }
                                          });
                                          
                                          async function checkTime(){
                                              log((await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result);
                                          }
                                          
                                          checkTime();
                                          

                                          @haus-automatisierung ich stehe nur irgendwie noch auf dem Schlauch, wie ich das in meine Logik unterbringen soll?
                                          Also ich habe einen Trigger durch "$Selector.on((obj)=>{....}

                                          wenn ich jetzt darin die Funktion nutzen möchte, kann ich ja gar kein await nutzen, da es nicht in einer async funktion ist.
                                          Somit würde ja die If Abfrage mit "undefined" abgehakt werden, bevor ein result zurückkommen kann.

                                          Codierknecht 1 Reply Last reply Reply Quote 0
                                          • Codierknecht
                                            Codierknecht Developer Most Active @Ben1983 last edited by

                                            @ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:

                                            wenn ich jetzt darin die Funktion nutzen möchte, kann ich ja gar kein await nutzen, da es nicht in einer async funktion ist.

                                            Warum nicht? Mach doch eine draus.

                                            on({id:'dein.dp.oder.selektor', change:"ne"}, async function () {
                                                // hier geht auch await
                                            });
                                            
                                            Ben1983 1 Reply Last reply Reply Quote 2
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            913
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            21
                                            579
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo