Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Blockly: CreateMyState: Datenpunkte mit Unit/States

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Blockly: CreateMyState: Datenpunkte mit Unit/States

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

      @bananajoe
      Wowh, vielen Dank für das Script. Gerade ausprobiert, funktioniert perfekt.
      Eine Frage noch dazu: Das was man bei ValueName angibt wird sowohl für die ObjektID als auch für den Wert im Feld Name verwendet. Kann man das eventuell auch unterscheiden?

      Ergänzung:
      Hab das Script schon so angepasst, dass ich ein eigene Variable für den Namen habe.

      2137b285-bceb-4185-8828-5fd475daba21-image.png
      DANKE!

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

        @bananajoe sagte: Als States eine Liste übergeben mit der Anzahl der States, jeweils ein Textfeld im Format
        Zahl:Text

        Weshalb nicht gleich als Objekt?

        Blockly_temp.JPG

        Anstelle von TargetType könnte man auch

        typeof TargetDefaultValue
        

        verwenden. Außerdem vermisse ich die Rolle, die automatisch aus der Kombination von TargetType und TargetIsWritable gebildet werden könnte.

        Sollten nicht alle eigenen Datenpunkte unter "0_userdata.0" erstellt werden?

        BananaJoe 1 Reply Last reply Reply Quote 1
        • BananaJoe
          BananaJoe Most Active @paul53 last edited by BananaJoe

          @paul53 Ok, die Idee mit dem Objekt hatte ich einfach nicht (ich arbeite einfach zu viel Strings).
          Aber ... das ist es schon wieder fest verdrahtet. Meine Funktion ist ja entstanden weil ich dynamisch Datenpunkte anlegen wollte - in der Regel weil ich ein JSON verarbeiten will und gar nicht weis was ich bekomme.
          Mit den Textfeldern kann ich die Liste auch per erstelle Text aus zusammenbauen, in dynamischer Länge indem ich dieser vorher erzeuge.

          Das mit dem Automatischen Target-Type, ich weis nicht. Ich hätte das schon gern klar definiert. Aber die Möglichkeit da eine automatische Auswahl zusätzlich zu den festen einzubauen wäre eine Idee.

          Ob man 0_userdata.0 da fest einbaut, könnte man. Besser wäre vielleicht zu prüfen ob der Datenpunkt unterhalb erstellt wird und dann eine Fehlermeldung zu geben.

          @ManfredHi Ok, den Namen benutze ich nie - ich nutze auch nie die Objekt-Auswahl in Blockly sondern immer Textfelder für die Datenpunkte. Für mich ist das lesbarer.
          Aber du hast ja einen Weg gefunden. Eventuell baue ich das in V5 ein, wenn man es leer lässt nimmt er dann einfach den ValueName

          Allgemein: Hauptziel war eine Funktion für das Erstellen von Datenpunkten zu bauen wo ich jeden Aspekt aus anderen Dingen zusammen bauen kann.

          Aber noch mal @paul53 Wie verarbeite ich wenn ich einen Parameter gar nicht angebe:
          ca3ec9f5-3234-40f3-b4f0-5d0153975990-image.png

          Im Moment prüfe ich auf

          if (TargetStates != "") { }
          

          oder

          if (TargetUnit.length === 0 && s_states.length === 0) {
          

          Wenn ich den Parameter einfach leer lasse, gibt es einen Fehler

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

            @bananajoe sagte: Im Moment prüfe ich auf

            Prüfe einfach

            if (TargetStates) { }
            

            und

            if (TargetUnit) { }
            

            Das genügt um undefined und Leerstrings auszuklammern.

            Meine Lösung sehe etwa so aus:

            if(!id.startsWith('0_userdata.0')) id = '0_userdata.0.' + id;
            const type = typeof def;
            if(!role) {
                if(write && type == 'boolean') role = 'switch';
                else if(write && type == 'number') role = 'level';
                else if(!write && type == 'boolean') role = 'indicator';
                else if(!write && type == 'number') role = 'value';
                else role = 'state';
            }
            const common = {
                type: type,
                name: Name,
                def: def,
                read: true,
                write: !!write,
                role: role
            };
            if(desc) common.desc = desc;
            if(unitOrStates) {
                if(typeof unitOrStates == 'object') common.states = unitOrStates;
                else if(type == 'number' && typeof unitOrStates == 'string') common.unit = unitOrStates;
            }
            createState(id, def, common);
            

            Blockly_temp.JPG

            Die letzten 3 Parameter sind optional (leer lassen oder Leerstring).

            BananaJoe 2 Replies Last reply Reply Quote 0
            • BananaJoe
              BananaJoe Most Active @paul53 last edited by

              @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

              @bananajoe sagte: Im Moment prüfe ich auf

              Prüfe einfach

              if (TargetStates) { }
              

              und

              if (TargetUnit) { }
              

              Das genügt um undefined und Leerstrings auszuklammern.

              Danke! Habe gerade festgestellt das

              if (testVar === null) { }
              

              auch geht, aber deines ist natürlich noch einfacher. Ich baue - vermutlich - morgen mal eine V5

              1 Reply Last reply Reply Quote 0
              • BananaJoe
                BananaJoe Most Active @paul53 last edited by

                @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

                Meine Lösung sehe etwa so aus:

                und stimmt, deine Variante common zunächst zu definieren und dann weitere Attribute wie if(desc) common.desc = desc; ist natürlich auch schlauer. Besser und eleganter als meine ganzen if Entscheidungen.

                M 1 Reply Last reply Reply Quote 0
                • M
                  ManfredHi @BananaJoe last edited by

                  @bananajoe
                  Hab mir jetzt noch eine zusätzliche Variable mit dem Objektpfad angelegt und wenn ich keinen eigenen Namen angebe, wird der ValueName für den Namen gesetzt.

                  if(!objektpfad.endsWith('.')) objektpfad = objektpfad + '.';
                  if(!objektpfad.startsWith('0_userdata.0.')) objektpfad = '0_userdata.0.' + objektpfad;
                  objektpfad = objektpfad + id;
                  const type = typeof def;
                  if(!role) {
                      if(write ?? type == 'boolean') role = 'switch';
                      else if(write ?? type == 'number') role = 'level';
                      else if(!write ?? type == 'boolean') role = 'indicator';
                      else if(!write ?? type == 'number') role = 'value';
                      else role = 'state';
                  }
                  const common = {
                      type: type,
                      def: def,
                      read: true,
                      write: write,
                      role: role
                  };
                  if(desc) common.desc = desc;
                  if(Name) common.name = Name
                      else common.name = id;
                  if(unitOrState) {
                      if(typeof unitOrState == 'object') common.states = unitOrState;
                      else if(type == 'number' && typeof unitOrState == 'string') common.unit = unitOrState;
                  }
                  createState(objektpfad, DefaultValue, def, common);
                  
                  
                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @ManfredHi last edited by paul53

                    @manfredhi
                    Korrigiere Zeilen 6 bis 9 und ersetze ?? durch &&.
                    Zeile 26: Defaultvalue? Du hast im Skript def ausgewertet.

                    M 1 Reply Last reply Reply Quote 0
                    • M
                      ManfredHi @paul53 last edited by ManfredHi

                      @paul53 sagte in Blockly: CreateMyState: Datenpunkte mit Unit/States:

                      Zeile 26: Defaultvalue? Du hast im Skript def ausgewertet.

                      Das mit dem def war mir nicht ganz klar. Kann ich darin z.B. als Defaultwert einen Wert eines anderen Datenpunktes eintragen? Dann steht dieser Wert aber auch im common-Block des Datenpunktes drinnen oder? Außer ich nehm den eintrag defaus dem commonheraus oder?

                      if(!objektpfad.endsWith('.')) objektpfad = objektpfad + '.';
                      if(!objektpfad.startsWith('0_userdata.0.')) objektpfad = '0_userdata.0.' + objektpfad;
                      objektpfad = objektpfad + id;
                      const type = typeof DefaultValue;
                      if(!role) {
                          if(write && type == 'boolean') role = 'switch';
                          else if(write && type == 'number') role = 'level';
                          else if(!write && type == 'boolean') role = 'indicator';
                          else if(!write && type == 'number') role = 'value';
                          else role = 'state';
                      }
                      const common = {
                          type: type,
                          read: true,
                          write: write,
                          role: role
                      };
                      if(desc) common.desc = desc;
                      if(Name) common.name = Name
                          else common.name = id;
                      if(unitOrState) {
                          if(typeof unitOrState == 'object') common.states = unitOrState;
                          else if(type == 'number' && typeof unitOrState == 'string') common.unit = unitOrState;
                      }
                      createState(objektpfad, DefaultValue, common);
                      
                      paul53 1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @ManfredHi last edited by

                        @manfredhi sagte: Kann ich darin z.B. als Defaultwert einen Wert eines anderen Datenpunktes eintragen?

                        Ja, wieso nicht?

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        727
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        3
                        11
                        563
                        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