Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Javaskript Datenpunkt mit Zeit für schedule() umformen

    NEWS

    • [erledigt] 15. 05. Wartungsarbeiten am ioBroker Forum

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Javaskript Datenpunkt mit Zeit für schedule() umformen

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

      Hallo,

      Bisher habe ich die Zeiten für die Ausführung diverser Funktionen in den Code eingetragen und möchte diese nun anpassbar machen. Dazu habe ich einen Datenpunkt angelegt den ich mit Hilfe der vis (Stunden:Minuten) beschreibe. Der Wert des Datenpunkts beträgt 17:30

      Bisher habe ich das ganze wie unten zu sehen gelöst. Wie bekomme ich es hin den Datenpunkt in Stunden und Minuten zu zerlegen bzw. hat hier jemand noch ein anderen Lösungsansatz.

      schedule({hour: 17, minute: 30}, function () {
      
          setState('0_userdata.0.beckerRolladen.erdgeschoss.wohnzimmer.Westseite01_BefehlRunter'    , true);    
      
      });
      OliverIO 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @GuybrushThreepwood 0 last edited by

        @guybrushthreepwood-0

        so ungefähr

        var time = await getStateAsync("datenpunktname").split(":");
        console.log("stunden " + time[0]);
        console.log("Minuten " + time[1]);
        
        G 1 Reply Last reply Reply Quote 0
        • G
          GuybrushThreepwood 0 @OliverIO last edited by

          @oliverio Danke für die schnelle Antwort aber ich bekomme es noch nicht hin.

          Bekomme folgenden Fehler und await und split sind im Editor unterstrichen.
          javascript.0 (1535) script.js.common.gardenaVentilbox.ansteuerungVentilbox: TypeError: getStateAsync(...).split is not a function

          async function convertTime() 
          {
              var time = await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit').split(":");
              console.log("stunden " + time[0]);
              console.log("Minuten " + time[1]);
          };
          F 1 Reply Last reply Reply Quote 0
          • F
            fastfoot @GuybrushThreepwood 0 last edited by

            @guybrushthreepwood-0 sagte in Javaskript Datenpunkt mit Zeit für schedule() umformen:

            const time = (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");

            OliverIO G 2 Replies Last reply Reply Quote 0
            • OliverIO
              OliverIO @fastfoot last edited by

              @fastfoot
              ach ja das .val vergessen

              F 1 Reply Last reply Reply Quote 0
              • G
                GuybrushThreepwood 0 @fastfoot last edited by GuybrushThreepwood 0

                @fastfoot vielen Dank, das war die Lösung. Es funktioniert, auch wenn ich keine Ahnung....

                OliverIO 1 Reply Last reply Reply Quote 0
                • OliverIO
                  OliverIO @GuybrushThreepwood 0 last edited by

                  @guybrushthreepwood-0
                  aber ist doch fast lesbar.

                  getStateAync holt das Datenpunktobjekt von iobroker ab.
                  Im Objekt sind noch andere werte wie bspw Zeitstempel, etc.
                  im .val ist der eigentliche Dateninhalt gespeichert.
                  also 17:30
                  Dieser Wert wird in die javascript-Funktion split gesteckt
                  https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/split
                  diese funktion sucht in einem text nach einem Trennzeichen und macht daraus ein Array (also eine Liste, die durchnummeriert ist. Ein Array fängt immer mit 0 an
                  Daher wandert die 17 in time[0] und 30 in time[1]
                  Wen du spielen willst kannst ja mal schauen was passiert wenn du in den Datenpunk 17:30:15 einträgst, evtl kommst drauf, wie man den dritten Teil abruft

                  javascript läuft asynchron. d.h. solange irgend ein teil wartet bis irgend etwas erledigt ist, kann das programm weiterlaufen. da du nicht weißt wie lange iobroker benötigt die daten zurück zu liefern, wird darauf mit await gewartet.
                  es gibt noch eine ältere funktion (getStates) die ist ebenfalls asynchron, aber mit einer anderen logik, da müsste der code etwas anders aussehen. aber await ist moderner und der code ist lesbarer.

                  G 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @OliverIO last edited by

                    @oliverio nicht nur, auch die Klammern sind wichtig 😀 eine meiner ersten Begegnungen mit await, deshalb springt mir sowas sofort ins Auge

                    1 Reply Last reply Reply Quote 0
                    • G
                      GuybrushThreepwood 0 @OliverIO last edited by GuybrushThreepwood 0

                      @oliverio Danke für die Erläuterung, ich habe nach deinem ersten Post die Hilfe die im javascript-Adapter verlinkt ist nach split durchsucht und nichts gefunden. Der Teil zum Thema await war mir bislang nicht bekannt.

                      Um das ganze Thema noch zum Abschluss zu bringen, könnt ihr mir noch sagen wie ich die Konstanten für hour und minute noch ersetzen kann? Ich habe die Konstanten einfach durch zwei interne Variablen ersetzt, was irgendwie nicht klappt.

                      var h = 0 
                      var m = 0
                      
                      async function convertTime() 
                      {
                          var time = (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
                      
                          h   = time[0];
                          m = time[1];
                      
                          //console.log("Stunden: " + h);
                          //console.log("Minuten: " + m);
                      };
                      
                      schedule({hour: h, minute: m}, function () {
                          log("funktioniert");    
                      });
                      OliverIO 1 Reply Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @GuybrushThreepwood 0 last edited by OliverIO

                        @guybrushthreepwood-0

                        du wirst schedule erneut aufrufen müssen um den zeitrythmus zu ändern.
                        den alten schedule musst du abmelden

                        das könnte ungefähr so aussehen (ungetestet,blind geschrieben, da können noch fehler drin sein

                        let mySchedule=null;
                        on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
                            let  time  = convertTime();
                            if (mySchedule) clearSchedule(mySchedule);
                        
                            mySchedule = schedule({hour: time[0], minute:time[1]}, function () {
                                log("funktioniert");    
                            });
                        
                        });
                        
                        async function convertTime() 
                        {
                            return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
                        };
                        

                        immer wenn sich die zeit im datenpunkt ändert wird der code nach on aufgerufen
                        die zeit konvertiert
                        geprüft ob es schon ein altes schedule gibt, wenn ja abgemeldet
                        dann neues schedule gestartet und gemerkt
                        dann bis zur nächsten änderung gewartet

                        1 Reply Last reply Reply Quote 0
                        • BananaJoe
                          BananaJoe Most Active last edited by

                          Der Fall nach dem Neustart muss auch beachtet werden - also

                          let mySchedule=null;
                          mySchedule = schedule({hour: time[0], minute:time[1]}, function () {
                                  log("Start nach Skriptstart");    
                              });
                          
                          on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
                          

                          einmal nach dem

                          OliverIO 1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @BananaJoe last edited by OliverIO

                            damit wir nix doppelt schreiben dann so
                            bei dem async vor function newSchedule bin ich mir unsicher.

                            let mySchedule = newSchedule();
                            on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
                                if (mySchedule) clearSchedule(mySchedule);
                                mySchedule=newSchedule();
                             });
                            
                            function newSchedule() {
                                let  time  = convertTime();
                                return schedule({hour: time[0], minute:time[1]}, function () {
                                    log("funktioniert");    
                                });
                            } 
                            async function convertTime() 
                            {
                                return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
                            };
                            
                            
                            G 1 Reply Last reply Reply Quote 0
                            • G
                              GuybrushThreepwood 0 last edited by

                              @oliverio

                              Ich habe den Code übernommen und eine neue Logzeile eingefügt und das Skript wird ohne Fehlermeldung gespeichert. Die Änderung meiner Zeiteingabe wird erkannt und laut log funktioniert das Skript bis zur Zeile 9, hier erscheint die Fehlermeldung "javascript.0 (1535) script.js.common.gardenaVentilbox.ansteuerungVentilbox: schedule(cron=[object Object]): cannot create schedule"

                              on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) 
                                  {
                                      log("neue Zeiteingabe erkannt"); 
                                      let  time  = convertTime();
                              
                                      log("Zeitfunktion abmelden")       
                                      if (mySchedule) clearSchedule(mySchedule);
                               
                                      mySchedule = schedule({hour: time[0], minute: time[1]}, function () 
                                      {
                                      log("neue Zeitfunktion anlegen");    
                                      });
                               
                                  });
                              
                              1 Reply Last reply Reply Quote 0
                              • G
                                GuybrushThreepwood 0 @OliverIO last edited by

                                @oliverio

                                let mySchedule = newSchedule();
                                on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
                                    if (mySchedule) clearSchedule(mySchedule);
                                    mySchedule=newSchedule();
                                 });
                                 
                                function newSchedule() {
                                    let  time  = convertTime();
                                    return schedule({hour: time[0], minute:time[1]}, function () {
                                        log("funktioniert");    
                                    });
                                } 
                                async function convertTime() 
                                {
                                    return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
                                };
                                

                                23:07:24.887 error javascript.0 (1535) script.js.common.gardenaVentilbox.ansteuerungVentilbox: ReferenceError: Cannot access 'mySchedule' before initialization

                                Für mich wird's langsam kompliziert....danke für die Nerven 😃

                                paul53 1 Reply Last reply Reply Quote 0
                                • paul53
                                  paul53 @GuybrushThreepwood 0 last edited by paul53

                                  @guybrushthreepwood-0 sagte: Für mich wird's langsam kompliziert

                                  Ich würde es so machen:

                                  const idStartzeit = '0_userdata.0.gardenaVentilbox.automatik.Startzeit';
                                  let mySchedule = null;
                                  
                                  function startSchedule(time) {
                                      time = time.split(':');
                                      mySchedule = schedule({hour: time[0], minute:time[1]}, function () {
                                          log("funktioniert");    
                                      });
                                  }
                                  
                                  startSchedule(getState(idStartzeit).val); // Skriptstart
                                  
                                  on(idStartzeit, function(dp) {
                                      if (mySchedule) clearSchedule(mySchedule);
                                      startSchedule(dp.state.val);
                                  });
                                  
                                  G 2 Replies Last reply Reply Quote 0
                                  • G
                                    GuybrushThreepwood 0 @paul53 last edited by

                                    @paul53 Hat auf anhieb funktioniert...danke !

                                    1 Reply Last reply Reply Quote 0
                                    • G
                                      GuybrushThreepwood 0 @paul53 last edited by

                                      @paul53 Hallo nochmal, ich habe noch eine Frage zum Skript. Ich kann noch nicht nachvollziehen was in Zeile 13 mit dem "dp" gemeint ist. Hier wird einfach der Wert aus idStartzeit übergeben? Anschließend die bestehende schedule gelöscht und eine neue mit dem Aufruf der Funktion startSchedule angelegt.

                                      paul53 1 Reply Last reply Reply Quote 0
                                      • paul53
                                        paul53 @GuybrushThreepwood 0 last edited by paul53

                                        @guybrushthreepwood-0 sagte: mit dem "dp" gemeint ist. Hier wird einfach der Wert aus idStartzeit übergeben?

                                        dp enthält das komplette Datenpunkt-Objekt von "0_userdata.0.gardenaVentilbox.automatik.Startzeit". dp.state.val enthält den Wert, also die Startzeit.

                                        1 Reply Last reply Reply Quote 0
                                        • First post
                                          Last post

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        701
                                        Online

                                        31.6k
                                        Users

                                        79.5k
                                        Topics

                                        1.3m
                                        Posts

                                        5
                                        18
                                        633
                                        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