Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Vorlage] Anwesenheitssimulation - Script

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Vorlage] Anwesenheitssimulation - Script

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

      Hallo Looxer,

      habs mir jetzt nochmal am Laptop angesehn. Wirklich gut. Ich würde zwar nie 5 Gruppen brauchen, aber so gibt es Spielraum. Log in einer Datei benötige ich auch nicht, da reicht mir ein Diagramm von flot oder so.

      Im Executeteil kannst du die drei Zeilen

      setTimeout(function (){ // setze die Zeit zum ausstellen
      setState(Gruppe11,false); // setze die Zeit zum ausstellen 
      }, y); // ausstellzeit
      ````abkürzen mit
      

      setStateDelayed(Gruppe11,false, y);

      Beim Schreiben fällt mir gerade ein: Was ist, wenn die AWS läuft, eine Ausschaltzeit ist eingestellt und ich komme nach Hause? Dann sollten die Delays/Timeouts gelöscht werden, sonst geht irgendwann unverhofft das Licht aus. Alternativ kann natürlich von Ausführung jedes SetState noch gefragt werden, ob aktiveflag noch true ist
      

      if (aktivflag) setState blabla

      aktivflag dann auch passend aktualisieren.
      
      Eine Kleinigkeit: Die Einschaltzeiten sind immer zur vollen Minute, oder? Jemand, der vor der Tür steht und kurz kontrolliert, ob das eine AWS ist oder "lebend" geschaltet wird, würde da beim 3\. Schaltvorgang (Ein oder Aus) schon auf eine AWS tippen. Nutze doch noch
      

      schedule({second: ["zufallszahl 0-59"]}

      
      Und danke für den Spoiler. Der kann aber auch trotzdem noch Code-Tags beinhalten. :)
      
      Gruß
      
      Pix
      L 1 Reply Last reply Reply Quote 0
      • L
        looxer01 last edited by

        @pix:

        abs mir jetzt nochmal am Laptop angesehn. `
        super- Pix. Das ist super feedback was ich auch umsetzen werde.

        Folgendes schwebt mir vor:

        Feature/Gap

        • Löschen der TimeOuts wenn das Active Flag auf false gesetzt wird mit (muss noch checken ob das auch mit setStateDelayed geht)

        Das hatte ich glatt übersehen. Mache ich asap.

        function myStopFunction() {

        clearTimeout(myVar);

        Code Hygiene:

        setStateDelayed(Gruppe11,false, y); statt setTimeout

        @pix:

        ie Einschaltzeiten sind immer zur vollen Minute, oder? `
        das muss ich mir nochmal ansehen. Generell started der schedule zur vollen Minute.

        Bei 30 heisst das 30 Minuten nach der vollen Stunde und immer zur vollen Minute.

        Ich müsste also eine Einschaltverzögerung einbauen.

        darüber hinaus werde ich noch für die Startzeit die Option der Verwendung der Astrozeit je Gruppe hinzufügen.

        übrigens vermisse ich schmerzlich die Möglichkeit der indirekten Addressirung von Variablen. Das würde jede Menge Code sparen.

        oder habe ich da was übersehen ?

        vG Looxer

        1 Reply Last reply Reply Quote 0
        • P
          pix last edited by

          Was ist das? Indirekte Adressierung?

          Was kann das?

          Gesendet mit Tapatalk

          1 Reply Last reply Reply Quote 0
          • L
            looxer01 last edited by

            @pix:

            Was ist das? Indirekte Adressierung? `

            da geht es darum, dass ich eine Variable mit einem Inhalt versehe und den Inhalt dieser Variable dann verwende in weiteren Funktionen

            ungefähr so, wenn die indrekte Variable mit $ beginnen würde:

            var gruppe11 = "hm-rpc.0.JEQ0xxxxx.1.STATE"; // dies ist die direkte variable

            var $gruppenid = gruppe11; // dies ist die indirekte variable

            setState($gruppenid ,true); // hier mache ich einen setstate für "hm-rpc.0.JEQ0xxxxx.1.STATE"

            dann bräuchte ich nicht 5 codesegmente, da ja nur die Variablen unterschiedlich sind je segment.

            vG Looxer

            1 Reply Last reply Reply Quote 0
            • V
              versteckt last edited by

              Variable variablen kann mann doch mit eval(…) berechnen.

              Gesendet von meinem iPhone mit Tapatalk

              1 Reply Last reply Reply Quote 0
              • L
                looxer01 last edited by

                @versteckt:

                ariable variablen kann mann doch mit eval(…) berechnen. `
                das sagst du so einfach - da bin ich als JS-beginner noch nicht drauf gekommen :lol:

                es scheint in der Tat zu funktionieren, allerdings bekomme ich einen dezenten Hinweis vom editor "eval can be harmful."

                aha - warum denn ?

                fakt ist: damit lässt sich der code erheblich kürzen.

                EDIT: das habe ich dazu gefunden:

                The eval function is slow. If you're using it unecessarily, you're slowing down your program for no reason. One cause of this is the fact that the engine has to parse the argument as a complete new program

                1 Reply Last reply Reply Quote 0
                • V
                  versteckt last edited by

                  Sorry, war nicht so gemeint, hab es auch selten im Einsatz.

                  Musste es jetzt aber bei iobroker.rpi auch einsetzen.

                  Aber halt mit den "Einschränkungen"…

                  Gesendet von meinem iPhone mit Tapatalk
                  6696_bildschirmfoto_2018-11-26_um_20.35.52.png
                  6696_bildschirmfoto_2018-11-26_um_20.36.45.png

                  1 Reply Last reply Reply Quote 0
                  • P
                    pix last edited by

                    @looxer01:

                    da geht es darum, dass ich eine Variable mit einem Inhalt versehe und den Inhalt dieser Variable dann verwende in weiteren Funktionen

                    ungefähr so, wenn die indrekte Variable mit $ beginnen würde:

                    var gruppe11 = "hm-rpc.0.JEQ0xxxxx.1.STATE"; // dies ist die direkte variable

                    var $gruppenid = gruppe11; // dies ist die indirekte variable

                    setState($gruppenid ,true); // hier mache ich einen setstate für "hm-rpc.0.JEQ0xxxxx.1.STATE" `
                    Das war schon unter CCU.IO eins der ersten Dinge, die ich gelernt habe.

                    Dein Code:

                    var aktivflag = getState("javascript.0.Anwesenheitssteuerung.AWSAktiv").val;    // Lese Flag ob aktiv
                    ...
                    if  (getState("javascript.0.Anwesenheitssteuerung.AWSAktiv").val === true) { 
                    
                    

                    Besser gehts so:

                    ganz oben werden die id-Variablen definiert und mit den Instanzen, Pfad und Namen gefüllt, die aus createState oder von den Adaptern kommen. Das mache ich einmal und kann das so bei Änderung eines Datenpunktes (also der Instanz oder des Pfades/Namens) schnell für das GANZE Skript ändern.

                    var idAktivFlag = "javascript.0.Anwesenheitssteuerung.AWSAktiv";
                    ...
                    var idGruppe11 = "hm-rpc.0.JEQ0xxxxxx.1.LEVEL";  // Licht Wohnzimmer Esstisch Deckenlampe
                    
                    ...
                    // Funktion, die zeitgesteuert aufgerufen wird, oder auf Änderung reagiert
                    on({id: idAktivFlag,
                    ...
                    }, function () {
                    
                    // in einer Schedulefunktion alle paar Minuten
                    var AktivFlag = getState(idAktivFlag).val;
                    if (AktivFlag) ... // wenn true dann ...
                    
                    

                    Also eigentlich schreibe ich das schon immer so (und andere im Forum hier auch).

                    Die Variable mit dem prefix "id" beinhaltet zB den String mit dem Adapter+Instanz+Kanal+State, dann wird dieser State mit getState(idVariablenname).val in eine weitere Variable ohne das prefix "id" eingelesen. Diese zweite Variable wird dann im ganzen Skript weiterverwendet.

                    Du machst das ja auch schon

                    if (Gruppe11.match('STATE')) {    // ist es ein STATE Geraet ?
                           if  (getState(Gruppe11).val === false ) {  // nur wenn noch nicht eingeschaltet
                              setState(Gruppe11,true) ;      // wenn state dann setze true = an
                    
                    

                    Das wär dann mit meiner Schreibweise:

                    var idGruppe11 = "hm-rpc.0.JEQ0xxxxxx.1.LEVEL";  // Licht Wohnzimmer Esstisch Deckenlampe;
                    
                    schedule(cron1job, function() {
                    var Gruppe11 = getState(idGruppe11).val; // wichtig, muss im schedule stehen, sonst nur Befüllung bei Skriptstart
                    var AktivFlag = getState(idAktivFlag).val;
                    if  (AktivFlag) {     // AWS aktiv ?
                        ...
                        ...
                        if (x === 1 && idGruppe11 != " ") {    // ist ein Geraet zugeordnet ?
                        if (idGruppe11.match('STATE')) {    // ist es ein STATE Geraet ?
                           if  (!Gruppe11) {  // nur wenn noch nicht eingeschaltet
                              setState(idGruppe11,true) ; 
                              setStateDelay(idGruppe11,false, y);
                           } else { logtext = "keine Aktion - Geraet war bereits eingeschaltet"    }    // Ende IF fuer Check ob bereits eingeschaltet
                            } // Ende IF für STATE Geraete
                     ...
                     ...    
                    
                    ````Ich hoffe, das war verständlich :D
                    
                    Du kannst übrigens den Delay eines setStateDelay löschen, wenn du setStateDelay nochmal mit der gleichen ID aufrufst und ein true anhängst.
                    
                    [https://github.com/ioBroker/ioBroker.javascript#setstatedelayed](https://github.com/ioBroker/ioBroker.javascript#setstatedelayed) ist das ja in der Readme von Javascript andersherum erklärt:
                    
                    setStateDelayed('Kitchen.Light.Lamp', true,  1000);// Switch ON the light in the kitchen in one second
                    setStateDelayed('Kitchen.Light.Lamp', false, 5000, false, function () { // Switch OFF the light in the kitchen in 5 seconds and let first timeout run. 
                        log('Lamp is OFF');
                    });
                    
                    sek Aktion
                    
                    0 Tastendruck
                    
                    1 Licht geht an
                    
                    2
                    
                    3
                    
                    4
                    
                    5
                    
                    6 Licht geht aus
                    
                    Wenn du nun setStateDelayed('Kitchen.Light.Lamp', false, 5000, true); verwendest ist die Lampe schon bei 5 und ein paar Millisekunden Rechenzeit aus, da die Sekunde Delay vom EInschalten gekillt wird.
                    
                    Gruß
                    
                    Pix
                    1 Reply Last reply Reply Quote 0
                    • L
                      looxer01 last edited by

                      so, Script ist umgearbeitet und jetzt auch wesentlich kürzer. Version ist 0.30

                      Das macht die Pflege ein Stück einfacher. Astro Funktion ist ebenfalls eingebaut und scheint zu funktionieren.

                      Demnächst gibt es noch ein paar Hygiene-Massnahmen alla Pix 😉

                      wäre schön, wenn jemand Testen und Feedback geben könnte.

                      vG Looxer

                      1 Reply Last reply Reply Quote 0
                      • V
                        versteckt last edited by

                        Mal so ein Gedankengang, falls noch nicht angedacht….

                        Ist es möglich die Scripte auch per Github zur Verfügung zu stellen?

                        Gesendet von meinem iPhone mit Tapatalk

                        1 Reply Last reply Reply Quote 0
                        • L
                          looxer01 last edited by

                          @versteckt:

                          Ist es möglich die Scripte auch per Github zur Verfügung zu stellen? `
                          eine Installation aus Github heraus ist wohl nicht mögich - (gehe ich von aus)

                          in diesem Fall stellt sich wahrscheinlich die Sinn-Frage.

                          Der Vorteil wäre dann, dass jede Codeänderung sichtbar ist. Trotzdem eher overkill - oder ?

                          1 Reply Last reply Reply Quote 0
                          • V
                            versteckt last edited by

                            Für mich ist eher die Frage, ob die Skripte für alle irgendwann gesammelt zur Verfügung stehen.

                            Bin aber auch immer noch am überlegen, Jira zu aktivieren.

                            Gesendet von meinem iPhone mit Tapatalk

                            1 Reply Last reply Reply Quote 0
                            • L
                              looxer01 last edited by

                              Homoran hat mal einen Download-Bereich für Scripte gepflegt.

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

                              allerdings halte ich es nicht für zielführend Scripte dort anzubieten wo sie nicht gepflegt werden, zumindest nicht,

                              wenn sie recht häufig geändert werden. Da wären dann links besser. Aber kann man dort auch hinterlegen.

                              Ich weiss nur nicht wer den Bereich jetzt pflegt.

                              vG Looxer

                              1 Reply Last reply Reply Quote 0
                              • L
                                looxer01 last edited by

                                ich habe jetzt Version 0.31 eingepflegt.

                                Es gab noch Fehler bei den Gruppen drei und vier.

                                Ich habe auch den Bereich Einstellungen bearbeitet

                                • GruppeXX heisst jetzt IDGruppeXX

                                • hinzugefügt habe ich die maximle Startverzoegerung in Minuten je Gruppe ( ist aber noch ohne Funktion)

                                vG Looxer

                                1 Reply Last reply Reply Quote 0
                                • L
                                  looxer01 last edited by

                                  ich habe gerade festgestellt, dass die timeout Funktion mit EVAL ein Problem hat.

                                  JS kann dann nicht parsen. uuuuh 😮

                                  d.h., das das Programm auf einen Fehler läuft beim Versuch den Verbraucher auszuschalten.

                                  Ich versuche es gleich mal mit delay wie von Pix vorgeschlagen.- vielleicht habe ich Glück damit.

                                  Ansonsten muss ich den EVALS wieder entfernen.

                                  Neue Version wahrscheinlich heute Abend, spätestens morgen.

                                  vG Looxer

                                  1 Reply Last reply Reply Quote 0
                                  • L
                                    looxer01 last edited by

                                    so jetzt habe ich auf setstatedelayed umgestellt aber es geht trotzdem nicht.

                                    ich habe jetzt ein paar tests gemacht und einen unschönen Verdacht.

                                    folgenden Fehler bekomme ich im LOG:

                                    raspberrypi	2015-12-30 21:24:00	error	host.raspberrypi instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)
                                    javascript.0	2015-12-30 21:24:00	error	SyntaxError: Unexpected token u at Object.parse (native) at sandbox.getObject (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1381:33) at AWSSchaltung (script.js.Anwesenheitssimula
                                    javascript.0	2015-12-30 21:24:00	error	uncaught exception: Unexpected token u
                                    
                                    

                                    zum Ausprobieren habe ich mal die Variablen und das Coding für Gruppen 2-4 entfernt und dann funktioniert es, auch mit EVAL.

                                    Gibt es eine Begrenzung für Javascript bezüglich Groesse des Scripts bzw Variablen etc ?

                                    Für mich sieht es so aus. Dann stellt sich aber die nächste Frage: ist das nur bei mir so oder hängt das mit der Konfiguration zusammen ?

                                    Ich könnte die Anzahl der Gruppen reduzieren aber ist dann das Problem für alle anderen auch gelöst ?

                                    EDIT: nach Neustart von ioBroker scheint es zu gehen - muss ich beobachten

                                    Version 0.32 ist jetzt hochgeladen.

                                    vG L…

                                    1 Reply Last reply Reply Quote 0
                                    • L
                                      looxer01 last edited by

                                      Liebe Leutz,

                                      Version 0.33 ist hochgeladen.

                                      Die Hauptfunktionen sollten jetzt relativ stabil sein.

                                      Ich habe mal Beispiele im ersten post eingestellt, um zu zeigen wie man mit den Einstellungen spielen kann

                                      Die Logs sind noch nicht so klasse. Da muss ich nochmal ran.

                                      Funktional will ich es erstmal belassen und sehen, dass ggf Fehler beseitigt werden.

                                      vG und guten Rutsch.

                                      Looxer

                                      1 Reply Last reply Reply Quote 0
                                      • L
                                        looxer01 last edited by

                                        Gutes Neues….

                                        es gibt jetzt die Version 0.40.

                                        Ich habe das Log deutlich aufgeräumt. Sehr schön zu sehen ist im Log jetzt welche berechneten Ein-und Ausschaltzeiten zu Grunde gelegt werden.

                                        Das externe Log laesst sich auf dem PC mit Excel oeffnen. Eine Sortierung nach Gruppen zeigt sehr deutlich die Ein und Ausschaltzeiten je Gruppe, so dass alles nachvollziebar ist.

                                        Sieht auch alles gut aus und scheint zu funktionieren.

                                        Falls es jemand bereits mal laufen lassen hat, bitte das externe LOG einmal loeschen. Es wird dann ein Header mit eingefügt.

                                        Das macht das Lesen in Excel leichter.

                                        Jetzt hoffe ich, dass es jemand mal testet und feedback gibt.

                                        vG

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

                                          Wo finde ich denn das Skript?

                                          1 Reply Last reply Reply Quote 0
                                          • L
                                            looxer01 last edited by

                                            im ersten post. ist ein spoiler tag - einfach öffnen.

                                            vG Looxer

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.1k
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            40
                                            271
                                            52813
                                            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