Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. gelöst - Exclusiver Zugriff auf Funktion

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    645

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

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

gelöst - Exclusiver Zugriff auf Funktion

Scheduled Pinned Locked Moved JavaScript
javascriptmonitoring
9 Posts 2 Posters 621 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    Smartin
    wrote on last edited by Smartin
    #1

    Moin,
    wieder mal eine typische Anfängerfrage ...
    Ich habe mir ein script gebastelt, dass den Wert eines Sensors (miflora) nimmt und in einen ec-Wert umrechnet.
    Da es mehrere Sensoren sind kommt es nun öfter vor, dass dabei die Daten "vermischt" werden, wenn 2 Sensoren zur fast gleichen Zeit Werte senden (da Bluetooth, kommen die Daten willkürlich vom Sensor und man kann es nicht steuern, wann Werte kommen sollen).
    Ich habe mir dafür eine Hilfsvariable "Frei" eingebaut, die die Funktion nur starten soll, wenn diese auf true steht. Ist das der Fall setzt sie "Frei" auf false und übergibt den empfangenen Wert an eine Rechenfunktion. Diese setzt dann den umgerechneten Wert in einen Datenpunkt und setzt abschließend den "Frei"-Wert wieder auf true. Funktioniert bis hierhin prima, es sei denn, 2 Sensoren senden fast zeitgleich ihre Werte. Dann scheint mir die "Frei" Variante nichts zu bringen, da sich der 2. Wert trotzdem "vordrängeln" kann. Ergebnis ist dann, dass der von der Funktion angesprochene Datenpunkt die Werte vom 2. Sensor enthält.
    Kann man das irgendwie verhindern, so dass immer nur ein Wert zur Zeit abgearbeitet wird? Wenn der zweite Wert dann in dem Moment nicht abgearbeitet werden kann wäre das nicht schlimm. Der Intervall ist klein genug, sodass der Wert des 2 Sensors dann einfach in der nächsten Runde berechnet wird, wenn die Rechnerfunktion eben wieder frei ist.
    Weiß jemand Rat?

    Vielen Dank im Voraus!

    var ecWertT = "javascript.0.variable.Statustext.ecwert.ecwertTemp";
    var Frei = "true";
    var Flora01 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
    var Flora02 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
    var Flora03 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
    
    function ecWertRechner(ec) {
        var data = getState(ecWertT).val;
        if (data >= 0 && data <= 99) setState(ec, '0.0');
        else if (data >= 100 && data <= 219) setState(ec, '0.1');
        else if (data >= 220 && data <= 329) setState(ec, '0.2');
        else if (data >= 320 && data <= 429) setState(ec, '0.3');
        else if (data >= 430 && data <= 549) setState(ec, '0.4');
        else if (data >= 550 && data <= 559) setState(ec, '0.5');
    	Frei = "true";
        setState(ecWertT, "");
    };
    
    on({id: Flora01, change: "ne"}, function(wert) {
        if (Frei = "true") {
        Frei = "false";
        setState(ecWertT, wert.state.val);
        ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert1")};
    });
    
    on({id: Flora02, change: "ne"}, function(wert) {
        if (Frei = "true") {
        Frei = "false";
        setState(ecWertT, wert.state.val);
        ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert2")};
    });
    
    on({id: Flora03, change: "ne"}, function(wert) {
        if (Frei = "true") {
        Frei = "false";
        setState(ecWertT, wert.state.val);
        ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert3")};
    });
    
    paul53P 1 Reply Last reply
    0
    • S Smartin

      Moin,
      wieder mal eine typische Anfängerfrage ...
      Ich habe mir ein script gebastelt, dass den Wert eines Sensors (miflora) nimmt und in einen ec-Wert umrechnet.
      Da es mehrere Sensoren sind kommt es nun öfter vor, dass dabei die Daten "vermischt" werden, wenn 2 Sensoren zur fast gleichen Zeit Werte senden (da Bluetooth, kommen die Daten willkürlich vom Sensor und man kann es nicht steuern, wann Werte kommen sollen).
      Ich habe mir dafür eine Hilfsvariable "Frei" eingebaut, die die Funktion nur starten soll, wenn diese auf true steht. Ist das der Fall setzt sie "Frei" auf false und übergibt den empfangenen Wert an eine Rechenfunktion. Diese setzt dann den umgerechneten Wert in einen Datenpunkt und setzt abschließend den "Frei"-Wert wieder auf true. Funktioniert bis hierhin prima, es sei denn, 2 Sensoren senden fast zeitgleich ihre Werte. Dann scheint mir die "Frei" Variante nichts zu bringen, da sich der 2. Wert trotzdem "vordrängeln" kann. Ergebnis ist dann, dass der von der Funktion angesprochene Datenpunkt die Werte vom 2. Sensor enthält.
      Kann man das irgendwie verhindern, so dass immer nur ein Wert zur Zeit abgearbeitet wird? Wenn der zweite Wert dann in dem Moment nicht abgearbeitet werden kann wäre das nicht schlimm. Der Intervall ist klein genug, sodass der Wert des 2 Sensors dann einfach in der nächsten Runde berechnet wird, wenn die Rechnerfunktion eben wieder frei ist.
      Weiß jemand Rat?

      Vielen Dank im Voraus!

      var ecWertT = "javascript.0.variable.Statustext.ecwert.ecwertTemp";
      var Frei = "true";
      var Flora01 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
      var Flora02 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
      var Flora03 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
      
      function ecWertRechner(ec) {
          var data = getState(ecWertT).val;
          if (data >= 0 && data <= 99) setState(ec, '0.0');
          else if (data >= 100 && data <= 219) setState(ec, '0.1');
          else if (data >= 220 && data <= 329) setState(ec, '0.2');
          else if (data >= 320 && data <= 429) setState(ec, '0.3');
          else if (data >= 430 && data <= 549) setState(ec, '0.4');
          else if (data >= 550 && data <= 559) setState(ec, '0.5');
      	Frei = "true";
          setState(ecWertT, "");
      };
      
      on({id: Flora01, change: "ne"}, function(wert) {
          if (Frei = "true") {
          Frei = "false";
          setState(ecWertT, wert.state.val);
          ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert1")};
      });
      
      on({id: Flora02, change: "ne"}, function(wert) {
          if (Frei = "true") {
          Frei = "false";
          setState(ecWertT, wert.state.val);
          ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert2")};
      });
      
      on({id: Flora03, change: "ne"}, function(wert) {
          if (Frei = "true") {
          Frei = "false";
          setState(ecWertT, wert.state.val);
          ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert3")};
      });
      
      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by paul53
      #2

      @Smartin
      Die Vergleiche sind keine, sondern Zuweisungen. Außerdem sollte man für eine Variable (Frei) mit 2 Zuständen keine Strings zuweisen. Will man die Freigabe erst dann machen, wenn setState() beendet ist, muss man es in einer Callback-Funktion machen.

      var ecWertT = "javascript.0.variable.Statustext.ecwert.ecwertTemp";
      var Frei = true;
      var Flora01 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
      var Flora02 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
      var Flora03 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
       
      function ecWertRechner(ec, data) {
          if (data >= 0 && data <= 99) setState(ec, '0.0');
          else if (data >= 100 && data <= 219) setState(ec, '0.1');
          else if (data >= 220 && data <= 329) setState(ec, '0.2');
          else if (data >= 320 && data <= 429) setState(ec, '0.3');
          else if (data >= 430 && data <= 549) setState(ec, '0.4');
          else if (data >= 550 && data <= 559) setState(ec, '0.5');
          setState(ecWertT, 0, function() {Frei = true;}); // enthält eine Zahl, sonst wären die Vergleiche falsch
      };
       
      on({id: Flora01, change: "ne"}, function(wert) {
          if (Frei == true) {
          Frei = false;
          setState(ecWertT, wert.state.val);
          ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert1", wert.state.val)};
      });
       
      on({id: Flora02, change: "ne"}, function(wert) {
          if (Frei == true) {
          Frei = false;
          setState(ecWertT, wert.state.val);
          ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert2", wert.state.val)};
      });
       
      on({id: Flora03, change: "ne"}, function(wert) {
          if (Frei == true) {
          Frei = false;
          setState(ecWertT, wert.state.val);
          ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert3", wert.state.val)};
      });
      

      Weshalb wird der Datenpunkt "javascript.0.variable.Statustext.ecwert.ecwertTemp" am Ende der Funktion zurück gesetzt ?

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      paul53P 1 Reply Last reply
      1
      • paul53P paul53

        @Smartin
        Die Vergleiche sind keine, sondern Zuweisungen. Außerdem sollte man für eine Variable (Frei) mit 2 Zuständen keine Strings zuweisen. Will man die Freigabe erst dann machen, wenn setState() beendet ist, muss man es in einer Callback-Funktion machen.

        var ecWertT = "javascript.0.variable.Statustext.ecwert.ecwertTemp";
        var Frei = true;
        var Flora01 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
        var Flora02 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
        var Flora03 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
         
        function ecWertRechner(ec, data) {
            if (data >= 0 && data <= 99) setState(ec, '0.0');
            else if (data >= 100 && data <= 219) setState(ec, '0.1');
            else if (data >= 220 && data <= 329) setState(ec, '0.2');
            else if (data >= 320 && data <= 429) setState(ec, '0.3');
            else if (data >= 430 && data <= 549) setState(ec, '0.4');
            else if (data >= 550 && data <= 559) setState(ec, '0.5');
            setState(ecWertT, 0, function() {Frei = true;}); // enthält eine Zahl, sonst wären die Vergleiche falsch
        };
         
        on({id: Flora01, change: "ne"}, function(wert) {
            if (Frei == true) {
            Frei = false;
            setState(ecWertT, wert.state.val);
            ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert1", wert.state.val)};
        });
         
        on({id: Flora02, change: "ne"}, function(wert) {
            if (Frei == true) {
            Frei = false;
            setState(ecWertT, wert.state.val);
            ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert2", wert.state.val)};
        });
         
        on({id: Flora03, change: "ne"}, function(wert) {
            if (Frei == true) {
            Frei = false;
            setState(ecWertT, wert.state.val);
            ecWertRechner("javascript.0.variable.Statustext.ecwert.ecwert3", wert.state.val)};
        });
        

        Weshalb wird der Datenpunkt "javascript.0.variable.Statustext.ecwert.ecwertTemp" am Ende der Funktion zurück gesetzt ?

        paul53P Offline
        paul53P Offline
        paul53
        wrote on last edited by paul53
        #3

        @paul53
        Besser macht man die Funktion ohne x mal setState().

        function ecWertRechner(data) {
            let ecWert = '0.0';
            if (data >= 100 && data <= 219) ecWert = '0.1';
            else if (data >= 220 && data <= 329) ecWert = '0.2');
            else if (data >= 320 && data <= 429) ecWert = '0.3');
            else if (data >= 430 && data <= 549) ecWert = '0.4');
            else if (data >= 550 && data <= 559) ecWert = '0.5');
            return ecWert;
        }
        
        on(Flora01, function(dp) {
            if (Frei) {
               Frei = false;
               setState("javascript.0.variable.Statustext.ecwert.ecwert1", ecWertRechner(dp.state.val), function() {
                  Frei = true;
               });
            }
        });
        // usw.
        

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Reply Last reply
        1
        • S Offline
          S Offline
          Smartin
          wrote on last edited by
          #4

          Wow, sehr interessant ...
          Also erstmal vielen Dank für die Hilfe!
          Warum ich einen String für "Frei" genommen habe weiß ich gerade ehrlich gesagt selber nicht. Macht ja gar keinen Sinn.
          ecWertTemp setze ich zurück, weil ich dachte, dass der mir eventuell in die Parade grätscht, wenn er nicht leer ist vor dem nächsten abarbeiten. Ich habe ja vorab selber einiges getestet und das war ein Punkt davon. Ich habe ihn drin gelassen, weil er nicht störte, scheint aber gar nicht nötig zu sein.
          Das man den setState mit function ausführen kann wusste ich gar nicht. Und ist natürlich ein wirklich eleganter Weg.
          Hier macht das lernen ja echt Spaß :+1:

          paul53P 1 Reply Last reply
          0
          • S Smartin

            Wow, sehr interessant ...
            Also erstmal vielen Dank für die Hilfe!
            Warum ich einen String für "Frei" genommen habe weiß ich gerade ehrlich gesagt selber nicht. Macht ja gar keinen Sinn.
            ecWertTemp setze ich zurück, weil ich dachte, dass der mir eventuell in die Parade grätscht, wenn er nicht leer ist vor dem nächsten abarbeiten. Ich habe ja vorab selber einiges getestet und das war ein Punkt davon. Ich habe ihn drin gelassen, weil er nicht störte, scheint aber gar nicht nötig zu sein.
            Das man den setState mit function ausführen kann wusste ich gar nicht. Und ist natürlich ein wirklich eleganter Weg.
            Hier macht das lernen ja echt Spaß :+1:

            paul53P Offline
            paul53P Offline
            paul53
            wrote on last edited by
            #5

            @Smartin
            Meiner Meinung nach kann man auf den Datenpunkt "javascript.0.variable.Statustext.ecwert.ecwertTemp" und die Variable Frei verzichten, wenn die Funktion ecWertRechner(data) nur umrechnet und die Datenpunkte außerhalb dieser Funktion gesetzt werden.

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            S 1 Reply Last reply
            0
            • S Offline
              S Offline
              Smartin
              wrote on last edited by Smartin
              #6

              Ich werde es gleich mal testen ohne den Datenpunkt bzw. die Variable.
              Sie ist ja nur mein hilfloser Versuch gewesen, eine Art "Exklusivität" einzubauen :grinning:
              Noch viel lernen er muss ....
              Ich muss aber sagen, dass es mir immer wieder Freude macht, zu sehen wie jemand mit Durchblick so etwas angeht. Daraus lerne ich dann, wie man es eben richtig macht. Für zukünftige Projekte.

              1 Reply Last reply
              0
              • paul53P paul53

                @Smartin
                Meiner Meinung nach kann man auf den Datenpunkt "javascript.0.variable.Statustext.ecwert.ecwertTemp" und die Variable Frei verzichten, wenn die Funktion ecWertRechner(data) nur umrechnet und die Datenpunkte außerhalb dieser Funktion gesetzt werden.

                S Offline
                S Offline
                Smartin
                wrote on last edited by Smartin
                #7

                @paul53
                Es funktioniert einwandfrei ohne Datenpunkt und "Frei" Variable.
                Ein schönes kurzes Script ist es nun geworden, was es auch gleich um einiges übersichtlicher macht.
                Vielen Dank!

                Hier nun noch für alle späteren Leser wie es jetzt aussieht:

                var Flora01 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
                var Flora02 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
                var Flora03 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
                
                function ecWertRechner(data) {
                    let ecWert = '0.0';
                    if (data >= 100 && data <= 219) ecWert = '0.1';
                    else if (data >= 220 && data <= 329) ecWert = '0.2';
                    else if (data >= 320 && data <= 429) ecWert = '0.3';
                    else if (data >= 430 && data <= 549) ecWert = '0.4';
                    else if (data >= 550 && data <= 559) ecWert = '0.5';
                    return ecWert;
                }
                 
                on(Flora01, function(dp) {setState("javascript.0.variable.Statustext.ecwert.ecwert1", ecWertRechner(dp.state.val))});
                on(Flora02, function(dp) {setState("javascript.0.variable.Statustext.ecwert.ecwert2", ecWertRechner(dp.state.val))});
                on(Flora03, function(dp) {setState("javascript.0.variable.Statustext.ecwert.ecwert3", ecWertRechner(dp.state.val))});
                
                paul53P 1 Reply Last reply
                1
                • S Smartin

                  @paul53
                  Es funktioniert einwandfrei ohne Datenpunkt und "Frei" Variable.
                  Ein schönes kurzes Script ist es nun geworden, was es auch gleich um einiges übersichtlicher macht.
                  Vielen Dank!

                  Hier nun noch für alle späteren Leser wie es jetzt aussieht:

                  var Flora01 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
                  var Flora02 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
                  var Flora03 = "ble.1.xx:xx:xx:xx:xx:xx.fertility";
                  
                  function ecWertRechner(data) {
                      let ecWert = '0.0';
                      if (data >= 100 && data <= 219) ecWert = '0.1';
                      else if (data >= 220 && data <= 329) ecWert = '0.2';
                      else if (data >= 320 && data <= 429) ecWert = '0.3';
                      else if (data >= 430 && data <= 549) ecWert = '0.4';
                      else if (data >= 550 && data <= 559) ecWert = '0.5';
                      return ecWert;
                  }
                   
                  on(Flora01, function(dp) {setState("javascript.0.variable.Statustext.ecwert.ecwert1", ecWertRechner(dp.state.val))});
                  on(Flora02, function(dp) {setState("javascript.0.variable.Statustext.ecwert.ecwert2", ecWertRechner(dp.state.val))});
                  on(Flora03, function(dp) {setState("javascript.0.variable.Statustext.ecwert.ecwert3", ecWertRechner(dp.state.val))});
                  
                  paul53P Offline
                  paul53P Offline
                  paul53
                  wrote on last edited by
                  #8

                  @Smartin
                  Andere Variante der Funktion ecWertRechner(data):

                  function ecWertRechner(data) {
                      if (data <=  99) return '0.0';
                      if (data <= 219) return '0.1';
                      if (data <= 329) return '0.2';
                      if (data <= 429) return '0.3';
                      if (data <= 549) return '0.4';
                      return '0.5';
                  }
                  

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  S 1 Reply Last reply
                  1
                  • paul53P paul53

                    @Smartin
                    Andere Variante der Funktion ecWertRechner(data):

                    function ecWertRechner(data) {
                        if (data <=  99) return '0.0';
                        if (data <= 219) return '0.1';
                        if (data <= 329) return '0.2';
                        if (data <= 429) return '0.3';
                        if (data <= 549) return '0.4';
                        return '0.5';
                    }
                    
                    S Offline
                    S Offline
                    Smartin
                    wrote on last edited by
                    #9

                    @paul53

                    Auch das funktioniert einwandfrei und ist nochmal kürzer :+1:

                    1 Reply Last reply
                    0

                    Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                    Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                    With your input, this post could be even better 💗

                    Register Login
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    147

                    Online

                    32.7k

                    Users

                    82.6k

                    Topics

                    1.3m

                    Posts
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Login

                    • Don't have an account? Register

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Home
                    • Recent
                    • Tags
                    • Unread 0
                    • Categories
                    • Unreplied
                    • Popular
                    • GitHub
                    • Docu
                    • Hilfe