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. Datenpunkt prüfen vor schalten

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    5
    1
    163

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    8
    1
    186

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

Datenpunkt prüfen vor schalten

Scheduled Pinned Locked Moved JavaScript
javascript
7 Posts 3 Posters 509 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.
  • M Offline
    M Offline
    Mitch
    wrote on last edited by Mitch
    #1

    Ich habe ein Datepunkt mit true, oder false. Ich möchte ihn aber nur schalten, wenn der Inhalt nicht schon dort gesetzt ist.

    Sprich true darf nur geschrieben werden, wenn es auf false steht.

    Habt jemand eine Idee, wie das am einfachsten geht? Muss glaube ich etwas mit if und getState und SetState sein.

    CodierknechtC 1 Reply Last reply
    0
    • M Mitch

      Ich habe ein Datepunkt mit true, oder false. Ich möchte ihn aber nur schalten, wenn der Inhalt nicht schon dort gesetzt ist.

      Sprich true darf nur geschrieben werden, wenn es auf false steht.

      Habt jemand eine Idee, wie das am einfachsten geht? Muss glaube ich etwas mit if und getState und SetState sein.

      CodierknechtC Offline
      CodierknechtC Offline
      Codierknecht
      Developer Most Active
      wrote on last edited by
      #2

      @mitch
      Zeig doch bitte mal, was Du bisher schon hast.
      Davon hängt nämlich ab, wie man das am besten und einfachsten umsetzt.

      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      M 1 Reply Last reply
      0
      • CodierknechtC Codierknecht

        @mitch
        Zeig doch bitte mal, was Du bisher schon hast.
        Davon hängt nämlich ab, wie man das am besten und einfachsten umsetzt.

        M Offline
        M Offline
        Mitch
        wrote on last edited by
        #3

        @codierknecht

                    if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                        setState('0_userdata.0.tv.dp_sonoff', id)
                        setState(id + '.POWER', false);
                        setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                        setState('0_userdata.0.tv.dp_room', roomid);
                        setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde ausgeschaltet');
                        var today = new Date();
                        var bh_day = ("00" + today.getDate()).slice(-2);
                        var bh_mon = today.getMonth() + 1;
                        var bh_mon2 = ("00" + bh_mon).slice(-2);
                        var bh_year = ("0000" + today.getFullYear()).slice(-4);
                        var bh_hour = ("00" + today.getHours()).slice(-2);
                        var bh_min = ("00" + today.getMinutes()).slice(-2);
                        var bh_sec = ("00" + today.getSeconds()).slice(-2);
                        InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde ausgeschaltet";
                        sendTo("telegram", "send", { text: InfoMessage });        
                    }
        

        Die Zeile 3 schaltet immer, auch wenn false schon gesetzt ist. Ich würde natürlich ein else anhängen und gleich per Alexa sagen, dass der Fernseher bereits an ist.

        paul53P 1 Reply Last reply
        0
        • M Mitch

          @codierknecht

                      if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                          setState('0_userdata.0.tv.dp_sonoff', id)
                          setState(id + '.POWER', false);
                          setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                          setState('0_userdata.0.tv.dp_room', roomid);
                          setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde ausgeschaltet');
                          var today = new Date();
                          var bh_day = ("00" + today.getDate()).slice(-2);
                          var bh_mon = today.getMonth() + 1;
                          var bh_mon2 = ("00" + bh_mon).slice(-2);
                          var bh_year = ("0000" + today.getFullYear()).slice(-4);
                          var bh_hour = ("00" + today.getHours()).slice(-2);
                          var bh_min = ("00" + today.getMinutes()).slice(-2);
                          var bh_sec = ("00" + today.getSeconds()).slice(-2);
                          InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde ausgeschaltet";
                          sendTo("telegram", "send", { text: InfoMessage });        
                      }
          

          Die Zeile 3 schaltet immer, auch wenn false schon gesetzt ist. Ich würde natürlich ein else anhängen und gleich per Alexa sagen, dass der Fernseher bereits an ist.

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

          @mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.

          Erweitere die Prüfung:

                      if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
          

          Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.

          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

          M 1 Reply Last reply
          0
          • paul53P paul53

            @mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.

            Erweitere die Prüfung:

                        if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
            

            Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.

            M Offline
            M Offline
            Mitch
            wrote on last edited by
            #5

            @paul53 sagte in Datenpunkt prüfen vor schalten:

            @mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.

            Erweitere die Prüfung:

                        if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
            

            Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.

                for(let id of members) {
                    if(id.startsWith('sonoff.')) {
                        if(id != getState(id + '.POWER').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                            setState('0_userdata.0.tv.dp_sonoff', id)
                            setState(id + '.POWER', true);
                            setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                            setState('0_userdata.0.tv.dp_room', roomid);    
                            setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde angeschaltet');
                            var today = new Date();
                            var bh_day = ("00" + today.getDate()).slice(-2);
                            var bh_mon = today.getMonth() + 1;
                            var bh_mon2 = ("00" + bh_mon).slice(-2);
                            var bh_year = ("0000" + today.getFullYear()).slice(-4);
                            var bh_hour = ("00" + today.getHours()).slice(-2);
                            var bh_min = ("00" + today.getMinutes()).slice(-2);
                            var bh_sec = ("00" + today.getSeconds()).slice(-2);
                            InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde angeschaltet";
                            sendTo("telegram", "send", { text: InfoMessage });    
                        }
                        else {
                            setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                            setState('0_userdata.0.tv.dp_room', roomid);
                            setState('0_userdata.0.tv.dp_sonoff', "")
                        }    
                    }
                }
            

            Ich habe die Zeile nochmal angepasst, da ja setState(id + '.POWER', true); die ausschlagebene Zeile ist. Habe natürlich das im True-Abschnitt und im alse-Abschnitt eingebaut.

            Leider quatscht Alexa und Telegram nicht. Muss ich also noch eine Unlogik drin haben.

            paul53P 2 Replies Last reply
            0
            • M Mitch

              @paul53 sagte in Datenpunkt prüfen vor schalten:

              @mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.

              Erweitere die Prüfung:

                          if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
              

              Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.

                  for(let id of members) {
                      if(id.startsWith('sonoff.')) {
                          if(id != getState(id + '.POWER').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                              setState('0_userdata.0.tv.dp_sonoff', id)
                              setState(id + '.POWER', true);
                              setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                              setState('0_userdata.0.tv.dp_room', roomid);    
                              setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde angeschaltet');
                              var today = new Date();
                              var bh_day = ("00" + today.getDate()).slice(-2);
                              var bh_mon = today.getMonth() + 1;
                              var bh_mon2 = ("00" + bh_mon).slice(-2);
                              var bh_year = ("0000" + today.getFullYear()).slice(-4);
                              var bh_hour = ("00" + today.getHours()).slice(-2);
                              var bh_min = ("00" + today.getMinutes()).slice(-2);
                              var bh_sec = ("00" + today.getSeconds()).slice(-2);
                              InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde angeschaltet";
                              sendTo("telegram", "send", { text: InfoMessage });    
                          }
                          else {
                              setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                              setState('0_userdata.0.tv.dp_room', roomid);
                              setState('0_userdata.0.tv.dp_sonoff', "")
                          }    
                      }
                  }
              

              Ich habe die Zeile nochmal angepasst, da ja setState(id + '.POWER', true); die ausschlagebene Zeile ist. Habe natürlich das im True-Abschnitt und im alse-Abschnitt eingebaut.

              Leider quatscht Alexa und Telegram nicht. Muss ich also noch eine Unlogik drin haben.

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

              @mitch sagte: Zeile nochmal angepasst, da ja setState(id + '.POWER', true);

              Die Anpassung ist falsch! Unter "0_userdata.0.tv.dp_sonoff" wird die übergebene ID gemerkt (Zeile 4), nicht in "0_userdata.0.tv.dp_sonoff.POWER", der einen booleschen Wert enthält.

              EDIT: Die ID ändert sich durch eine Schleife. Wozu dient dann Zeile 4, in der zuletzt nur die ID des letzten Datenpunktes der Schleife gemerkt wird?
              Dann ändere die Prüfung beim Einschalten:

                          if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && !getState(id + '.POWER').val) {
              

              und beim Ausschalten:

                          if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && getState(id + '.POWER').val) {
              

              Zeige besser mal das komplette Skript. Es scheint viele Ressourcen zu verbrauchen.

              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
              0
              • M Mitch

                @paul53 sagte in Datenpunkt prüfen vor schalten:

                @mitch sagte: Zeile 3 schaltet immer, auch wenn false schon gesetzt ist.

                Erweitere die Prüfung:

                            if(id != getState('0_userdata.0.tv.dp_sonoff').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                

                Das erspart die Ausführung des ganzen Rests, wenn die gemerkte ID gleich der aktuellen ID ist.

                    for(let id of members) {
                        if(id.startsWith('sonoff.')) {
                            if(id != getState(id + '.POWER').val && getObject(id, 'functions').enumIds[0] == 'enum.functions.tv') {
                                setState('0_userdata.0.tv.dp_sonoff', id)
                                setState(id + '.POWER', true);
                                setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                                setState('0_userdata.0.tv.dp_room', roomid);    
                                setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde angeschaltet');
                                var today = new Date();
                                var bh_day = ("00" + today.getDate()).slice(-2);
                                var bh_mon = today.getMonth() + 1;
                                var bh_mon2 = ("00" + bh_mon).slice(-2);
                                var bh_year = ("0000" + today.getFullYear()).slice(-4);
                                var bh_hour = ("00" + today.getHours()).slice(-2);
                                var bh_min = ("00" + today.getMinutes()).slice(-2);
                                var bh_sec = ("00" + today.getSeconds()).slice(-2);
                                InfoMessage = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde angeschaltet";
                                sendTo("telegram", "send", { text: InfoMessage });    
                            }
                            else {
                                setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                                setState('0_userdata.0.tv.dp_room', roomid);
                                setState('0_userdata.0.tv.dp_sonoff', "")
                            }    
                        }
                    }
                

                Ich habe die Zeile nochmal angepasst, da ja setState(id + '.POWER', true); die ausschlagebene Zeile ist. Habe natürlich das im True-Abschnitt und im alse-Abschnitt eingebaut.

                Leider quatscht Alexa und Telegram nicht. Muss ich also noch eine Unlogik drin haben.

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

                @mitch
                Weshalb werden Ein- und Ausschalten getrennt behandelt. Sie unterscheiden sich nur im Wert für ".POWER" (false/true) und in einem kleinen Textbestandteil am Textende ("ausgeschaltet"/"angeschaltet").
                Die Datums-/Uhrzeit-Bildung macht man auch nicht innerhalb einer Schleife, denn sie ändert sich während eines Trigger-Ereignisses nicht.

                Vorschlag (Variable serialNumber überprüfen!):

                on("0_userdata.0.tv.turn_on_off", function (dp) {
                    let aus_an = dp.state.val ? 'angeschaltet' : 'ausgeschaltet';
                    let serialNumber = getState("alexa2.0.History.serialNumber").val;
                    setState('0_userdata.0.tv.dp_echo', 'alexa2.0.Echo-Devices.' + serialNumber);
                    let roomid = getObject('alexa2.0.Echo-Devices.' + serialNumber, 'rooms').enumIds[0];
                    setState('0_userdata.0.tv.dp_room', roomid);
                    let roomname = getObject('alexa2.0.Echo-Devices.' + serialNumber, 'rooms').enumNames[0];
                    if(typeof roomname == 'object') roomname = roomname.de;    
                
                    var today = new Date();
                    var bh_day = ("00" + today.getDate()).slice(-2);
                    var bh_mon = today.getMonth() + 1;
                    var bh_mon2 = ("00" + bh_mon).slice(-2);
                    var bh_year = ("0000" + today.getFullYear()).slice(-4);
                    var bh_hour = ("00" + today.getHours()).slice(-2);
                    var bh_min = ("00" + today.getMinutes()).slice(-2);
                    var bh_sec = ("00" + today.getSeconds()).slice(-2);
                    let time = "[" + bh_year + "/" + bh_mon2 + "/" + bh_day + "-" + bh_hour + ":" + bh_min + ":" + bh_sec + "]>" + "\n" +"Der Fernseher im Raum " + roomname + " wurde ";
                
                    let members = getObject(roomid).common.members;
                    for(let id of members) {
                        if(getObject(id, 'functions').enumIds[0] == 'enum.functions.tv' && dp.state.val != getState(id + '.POWER').val) {
                            setState(id + '.POWER', dp.state.val);
                            setState('alexa2.0.Echo-Devices.' + serialNumber + '.Commands.speak', 'Der Fernseher im Raum ' + roomname + ' wurde ' + aus_an);
                            sendTo("telegram", "send", {text: time + aus_an});    
                        }
                    }    
                });
                

                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
                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

                331

                Online

                32.8k

                Users

                82.7k

                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