Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] LOGO! & Wochenschaltuhr

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] LOGO! & Wochenschaltuhr

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

      @Vumer:

      setState("s7.0.DBs.DB1.B023-a1",ConvertBase.hex2dec(getState("javascript.0.LOGO.Uhr1-1_Einh").val)); `

      Ich vermute dass die Logo eine Zahl möchte und du einen String übergeben willst.

      Das ist aber reine Spekulation da ich ja keine LOGO habe.

      Versuch mal:

      setState("s7.0.DBs.DB1.B023-a1",parseInt(ConvertBase.hex2dec(getState("javascript.0.LOGO.Uhr1-1_Einh").val)));

      Hier die Erklärung von parseInt:

      ! Oft ist es mit Javascript notwending, eine String-Zeichenkette in eine Zahl umzuwandeln. Wenn Sie einen Text mit Javascript in Zahl konvertieren möchten, so wird eine JS Funktion verwendet - parseInt. Es ist aber anzumerken - diese Funktion liefert nur ganze Zahlen und falls der Text in eine Zahl konvertiert werden kann, so wird ein sog. NaN (not a number, also keine Zahl) zurückgegeben. Beachten Sie auch, dass die ganzen Zahlen ensprechende maximale Werte haben.

      Gruß

      Steffen

      1 Reply Last reply Reply Quote 0
      • Vumer
        Vumer last edited by

        Ja!!!!! Super!!!

        Funktioniert und die Warnung ist weg

        1 Reply Last reply Reply Quote 0
        • Peoples
          Peoples last edited by

          Freut mich!

          P.s

          Setz mal deinen Betreff noch auf [gelöst] wenn du keine Fragen mehr hast

          Gruß Steffen

          1 Reply Last reply Reply Quote 0
          • Vumer
            Vumer last edited by

            Hallo Steffen,

            noch einmal ein dikes Dankeschön
            @peoples:

            wenn du keine Fragen mehr hast `
            Tausend und eine :lol:

            Ich brauche diese Script mehrfach, mindestens 20 x 4 :roll: . Vielleicht kann man die noch optimieren? Z.B. mit global? Wie ruft man die dann auf?

            Oder vielleicht kommt hier ein Lehrer rein und zeigt wie man das direkt im Widget einbaut.

            Schöne Grüße

            1 Reply Last reply Reply Quote 0
            • Peoples
              Peoples last edited by

              Also es gibt die Möglichkeit Schleifen zu benutzen wenn du immer wieder das gleiche Script brauchst könnte man z.B. ein Array erstellen:

              Array[0] = Datenpunkt 1

              Array[1] = Datenpunkt 2

              usw.

              Dann könntest du alle Array Inhalte durch die gleiche Funktion laufen lassen sofern das bei dir eine Möglichkeit ist.

              Die Erklärung zu den Ordnern findest du hier:

              http://www.iobroker.net/docu/?page_id=6818&lang=de

              unter Ordner und Dateiliste

              Gruß

              Steffen

              1 Reply Last reply Reply Quote 0
              • Vumer
                Vumer last edited by

                Doku habe ich gelesen, verstehe es aber nicht.

                Dieses Skript brauche ich immer wieder

                ! (function(){
                ! var ConvertBase = function (num) {
                ! return {
                ! from : function (baseFrom) {
                ! return {
                ! to : function (baseTo) {
                ! return parseInt(num, baseFrom).toString(baseTo);
                ! }
                ! };
                ! }
                ! };
                ! };
                ! // binary to decimal
                ! ConvertBase.bin2dec = function (num) {
                ! return ConvertBase(num).from(2).to(10);
                ! };
                ! // binary to hexadecimal
                ! ConvertBase.bin2hex = function (num) {
                ! return ConvertBase(num).from(2).to(16);
                ! };
                ! // decimal to binary
                ! ConvertBase.dec2bin = function (num) {
                ! return ConvertBase(num).from(10).to(2);
                ! };
                ! // decimal to hexadecimal
                ! ConvertBase.dec2hex = function (num) {
                ! return ConvertBase(num).from(10).to(16);
                ! };
                ! // hexadecimal to binary
                ! ConvertBase.hex2bin = function (num) {
                ! return ConvertBase(num).from(16).to(2);
                ! };
                ! // hexadecimal to decimal
                ! ConvertBase.hex2dec = function (num) {
                ! return ConvertBase(num).from(16).to(10);
                ! };
                ! this.ConvertBase = ConvertBase;
                ! })(this);
                dem nutze ich im ersten und vierten, http://forum.iobroker.net/viewtopic.php?p=107024#p107024. Wenn ich dem im global erstelle, wie ruft man dem auf?

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

                  Erstelle das folgende Skript unter der Gruppe global, dann kannst Du aus jedem (nicht globalen) Skript die Funktion(en) mit ihrem Namen aufrufen.

                  function bin2dec(num) {
                     return parseInt(num, 2).toString(10);
                  }
                  
                  function bin2hex(num) {
                     return parseInt(num, 2).toString(16);
                  }
                  
                  function dec2bin(num) {
                     return parseInt(num, 10).toString(2);
                  }
                  
                  function dec2hex(num) {
                     return parseInt(num, 10).toString(16);
                  }
                  
                  function hex2bin(num) {
                     return parseInt(num, 16).toString(2);
                  }
                  
                  function hex2dec(num) {
                     return parseInt(num, 16).toString(10);
                  }
                  
                  

                  Zu diesem Skript kannst Du noch zwei weitere Funktionen hinzufügen:

                  function logotime2str(time) {
                     ...Hier Wandlung Logo-Zeit und return im Format "hh:mm" 
                  }
                  
                  function str2logotime(str) {  // str im Format "hh:mm"
                     ...Hier Wandlung nach Logo-Zeit und return Logo-Zeit
                  }
                  
                  1 Reply Last reply Reply Quote 0
                  • Vumer
                    Vumer last edited by

                    Hallo paul53,

                    ich brauche noch einen Schubser

                    habe deinen Skript ( ohne die zwei weitere Funktionen, dafür brauche ich keinen Schubser sondern einen Hammer ) mit dem Name Converter erstellt. Was trage ich jetzt ein?

                    createState("LOGO.Uhr1-1_Ein", 0);
                    createState("LOGO.Uhr1-1_Eind", 0);
                    
                    on({id: "s7.0.DBs.DB1.B023-a1", change: "ne"}, function (obj) {
                    
                    setStateDelayed("javascript.0.LOGO.Uhr1-1_Eind",/*[color]was trage ich hier ein[/color]*/(getState("s7.0.DBs.DB1.B023-a1").val), 1000);
                    
                    });
                    
                    1 Reply Last reply Reply Quote 0
                    • Vumer
                      Vumer last edited by

                      jo, habe es

                      Danke Dir!!!

                      setStateDelayed("javascript.0.LOGO.Uhr1-1_Eind",dec2hex(getState("s7.0.DBs.DB1.B023-a1").val), 5000);
                      

                      @paul53:

                      Zu diesem Skript kannst Du noch zwei weitere Funktionen hinzufügen: `
                      hier verstehe ich nur Bahnhof :?: :roll: :?:

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

                        Bitte den Javascript-Code in Code tags (oben die 5. Funktion) anstatt in spoiler packen.
                        @Vumer:

                        setStateDelayed("javascript.0.LOGO.Uhr1-1_Eind",/was trage ich hier ein/(getState("s7.0.DBs.DB1.B023-a1").val), 1000); `

                        setStateDelayed("javascript.0.LOGO.Uhr1-1_Eind", dec2hex(obj.state.val), 1000);
                        
                        1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 last edited by

                          @Vumer:

                          ohne die zwei weitere Funktionen, dafür brauche ich keinen Schubser sondern einen Hammer `
                          Wenn ich Deine Konvertierungen verstehen würde, könnte ich den Hammer liefern.

                          Anscheinend Ist die Logo-Zeit ein Integer-Wert ? Wie ist die Zeit in diesem Wert repräsentiert ?

                          Die Wandlung Dec–>Hex und umgekehrt verstehe ich nicht. Weshalb Hexadezimal in der Zwischenrechnung ?

                          1 Reply Last reply Reply Quote 0
                          • Vumer
                            Vumer last edited by

                            ja, total blöd

                            hier habe ich ein Zitat aus http://www.frickelzeugs.de/logocontrol/ … erstellen/
                            > Die Logo speichert Uhrzeiten (z.B. der Wochenschaltuhr) relativ seltsam ab. Eine Zeit von 18:30 Uhr wird als Hex-Wert 0x1830 im VM-Speicher abgelegt, dies entspricht der Dezimalzahl 6192\. Für die Visualisierung muss diese Dezimalzahl also wieder in Hex umgerechnet werden. Die Funktion LogoDec2Hex entspricht also einer einfachen Dec->Hex-Konvertierung mit einem Sonderfall: die Umrechnung wird nur durchgeführt, wenn der sich ergebende Hex-Wert ausschließlich aus Ziffern bestünde (kein A-F erlaubt!). Ist dies nicht der Fall, liefert die Funktion -1 zurück. Dieser Kunstgriff ist nötig, da NCalc nicht mit Hex-Werten umgehen kann. Die Funktion LogoHex2Dec erledigt die Konvertierung in die entgegengesetzte Richtung.
                            Das ist eigentlich das einzige Manko von LOGO

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

                              Gut, dann ist mir folgendes nicht klar:

                              on({id: "javascript.0.LOGO.Uhr1-1_Eind", change: "ne"}, function (dp){
                              
                                 var Zeittmp= getState("javascript.0.LOGO.Uhr1-1_Eind").val.toString();
                              
                                 if (getState ("javascript.0.LOGO.Uhr1-1_Eind").val < 1000) {
                              

                              Das wäre korrekt, wenn der Datenpunkt "javascript.0.LOGO.Uhr1-1_Eind" eine Zahl ("number") enthalten würde. Da er aber das Ergebnis von dec2hex() enthält, sollte es ein String sein. Ergänze mal durch ein Logging:

                              on({id: "javascript.0.LOGO.Uhr1-1_Eind", change: "ne"}, function (dp){
                                 log(typeof dp.state.val);
                              
                              
                              1 Reply Last reply Reply Quote 0
                              • Vumer
                                Vumer last edited by

                                > javascript.0 2017-12-27 21:55:45.581 info script.js.common.WochenUhr.ZeitMitTrenzeichen: string
                                wie schon geschrieben: bin noch im Vorschulalter was JS betrifft

                                Als Vorlage habe ich dem Skript von http://forum.iobroker.net/viewtopic.php?p=73365#p73365 genommen

                                /**
                                * Beschreibe diese Funktion …
                                */
                                createState('Sunrise', 0);
                                createState('Sunrisenf', 0);
                                
                                on({id: "s7.1.DBs.DB1.Sunrise", change: "ne"}, function (obj) {
                                
                                (function(){
                                
                                var ConvertBase = function (num) {
                                return {
                                from : function (baseFrom) {
                                return {
                                to : function (baseTo) {
                                return parseInt(num, baseFrom).toString(baseTo);
                                }
                                };
                                }
                                };
                                };
                                
                                // decimal to hexadecimal
                                ConvertBase.dec2hex = function (num) {
                                return ConvertBase(num).from(10).to(16);
                                };
                                this.ConvertBase = ConvertBase;
                                })(this);
                                
                                setState("javascript.0.Sunrisenf",ConvertBase.dec2hex(getState("s7.1.DBs.DB1.Sunrise").val));
                                
                                var Sunrisetmp= ConvertBase.dec2hex(getState("s7.1.DBs.DB1.Sunrise").val).toString();
                                
                                //setState("javascript.0.Sunrise",Sunrisetmp.slice(0, 2) + String(":") + Sunrisetmp.slice(2, 4)) ; //bei 4 stelliger Zeit
                                setState("javascript.0.Sunrise",Sunrisetmp.slice(0, 1) + String(":") + Sunrisetmp.slice(1, 3)) ; //bei 3 stelliger Zeit
                                
                                });
                                

                                dem habe ich http://forum.iobroker.net/viewtopic.php?p=106841#p106841

                                createState("LOGO.Uhr1-1_Ein", 0);
                                createState("LOGO.Uhr1-1_Eintmp", 0);
                                
                                on({id: "s7.0.DBs.DB1.B023-a1", change: "ne"}, function (obj) {
                                
                                (function(){
                                
                                var ConvertBase = function (num) {
                                return {
                                from : function (baseFrom) {
                                return {
                                to : function (baseTo) {
                                return parseInt(num, baseFrom).toString(baseTo);
                                }
                                };
                                }
                                };
                                };
                                
                                // decimal to hexadecimal
                                ConvertBase.dec2hex = function (num) {
                                return ConvertBase(num).from(10).to(16)
                                };
                                this.ConvertBase = ConvertBase;
                                })(this);
                                
                                setState("javascript.0.LOGO.Uhr1-1_Eintmp",ConvertBase.dec2hex(getState("s7.0.DBs.DB1.B023-a1").val));
                                
                                var Zeittmp= ConvertBase.dec2hex(getState("s7.0.DBs.DB1.B023-a1").val).toString();
                                
                                if (getState ("javascript.0.LOGO.Uhr1-1_Eintmp").val < 1000) {
                                
                                setState("javascript.0.LOGO.Uhr1-1_Ein",Zeittmp.slice(0, 1) + String(":") + Zeittmp.slice(1, 3)) ;
                                
                                } else {
                                
                                setState("javascript.0.LOGO.Uhr1-1_Ein",Zeittmp.slice(0, 2) + String(":") + Zeittmp.slice(2, 4)) ;
                                
                                }
                                
                                });
                                

                                hex2dec habe ich auch von http://forum.iobroker.net/viewtopic.php?p=75107#p75107

                                createState('ZeitEinnf_in', 0);
                                
                                on({id: "javascript.0.ZeitEinnf_in"/*ZeitEinnf_in*/, change: "ne"}, function (obj) {
                                
                                (function(){
                                
                                var ConvertBase = function (num) {
                                return {
                                from : function (baseFrom) {
                                return {
                                to : function (baseTo) {
                                return parseInt(num, baseFrom).toString(baseTo);
                                }
                                };
                                }
                                };
                                };
                                
                                // hexadecimal to decimal
                                ConvertBase.hex2dec = function (num) {
                                return ConvertBase(num).from(16).to(10);
                                };
                                this.ConvertBase = ConvertBase;
                                })(this);
                                
                                setState("s7.1.DBs.DB1.ZeitEin",ConvertBase.hex2dec(getState("javascript.0.ZeitEinnf_in"/*ZeitEinnf_in*/).val));
                                
                                });
                                

                                danach kamm die Geschichte ab Post1

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

                                  Hier die beiden Funktionen:

                                  function logotime2str(time) {
                                     var x = parseInt(time, 10).toString(16);
                                     if(parseInt(x) < 10) return '0:0' + x;
                                     if(parseInt(x) < 100) return '0:' + x;
                                     if(parseInt(x) < 1000) return x.slice(0, 1) + ':' + x.slice(1, 3);
                                     return x.slice(0, 2) + ':' + x.slice(2, 4);
                                  }
                                  
                                  function str2logotime(str) {  // str im Format "hh:mm:ss"
                                     var x = str.split(':');
                                     x = parseInt(x[0] + x[1], 16).toString(10);
                                     return parseInt(x);
                                  }
                                  

                                  EDIT: Habe das Skript noch für Zeiten < 0:10 Uhr und < 1:00 Uhr angepasst.

                                  1 Reply Last reply Reply Quote 0
                                  • Vumer
                                    Vumer last edited by

                                    so bald ich die beiden Funktionen in global hinterlege bekomme ich sofort einen Fehler
                                    > instance system.adapter.javascript.0 terminated with code 7 (Adapter already running)

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

                                      Der Aufruf der (globalen) Funktionen kann in einem einfachen Skript erfolgen.

                                      const idLogo = 's7.0.DBs.DB1.B023-a1';
                                      const idVis = 'javascript.0.LOGO.Uhr1-1_Ein';
                                      
                                      on(idLogo, function(dp) {
                                         setStateDelayed(idVis, logotime2str(dp.state.val), 5000);
                                      });
                                      
                                      on(idVis, function(dp) {
                                         setState(idLogo, str2logotime(dp.state.val));
                                      });
                                      
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • paul53
                                        paul53 last edited by

                                        @Vumer:

                                        so bald ich die beiden Funktionen in global hinterlege bekomme ich sofort einen Fehler `
                                        Das kann ich bei mir nicht nachvollziehen. Es erfolgt lediglich ein Adapter-Restart mit einer Warnung. Der Restart ist erforderlich, da globale Skripte in alle anderen Skripte eingefügt werden müssen.

                                        1 Reply Last reply Reply Quote 0
                                        • Homoran
                                          Homoran Global Moderator Administrators last edited by

                                          Bei code7 hat sich der adapter verabschiedet (aber nicht ganz) die Instanz wurde mit einem neuen Prozess wieder gestartet, aber die alte existiert noch.

                                          Entweder die prozesse killen oder den raspi neu starten

                                          Gruß Rainer

                                          1 Reply Last reply Reply Quote 0
                                          • Vumer
                                            Vumer last edited by

                                            @Homoran:

                                            Entweder die prozesse killen oder den raspi neu starten

                                            Gruß Rainer `
                                            Das war es

                                            ich muss darüber schlafen, Morgen bekommt ihr Blumen

                                            Einfach Super!!!

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            819
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            9
                                            61
                                            7944
                                            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