Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Datenpunkt prüfen vor schalten

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

Datenpunkt prüfen vor schalten

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
7 Beiträge 3 Kommentatoren 477 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    Mitch
    schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      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
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von
            #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 Antworten Letzte Antwort
            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
              schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
              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
                schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                0
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                468

                Online

                32.6k

                Benutzer

                82.3k

                Themen

                1.3m

                Beiträge
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                logo
                • Anmelden

                • Du hast noch kein Konto? Registrieren

                • Anmelden oder registrieren, um zu suchen
                • Erster Beitrag
                  Letzter Beitrag
                0
                • Home
                • Aktuell
                • Tags
                • Ungelesen 0
                • Kategorien
                • Unreplied
                • Beliebt
                • GitHub
                • Docu
                • Hilfe