Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. [Gelöst] Funktion (Aufzählung) per Skript zuweisen

    NEWS

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    [Gelöst] Funktion (Aufzählung) per Skript zuweisen

    This topic has been deleted. Only users with topic management privileges can see it.
    • H-a-m-i
      H-a-m-i last edited by H-a-m-i

      Guten Morgen,

      ich bin ziemlich neu im ioBroker und mache dort alles per Blockly. Von manuellen Skripten habe ich überhaupt keine Ahnung, weshalb meine Frage für die meisten wohl lächerlich erscheint, aber ich kriege es seit Stunden einfach nicht hin und verstehe alles, was ich dazu per Suche gefunden habe, nicht. Ich hoffe hier kann mir jemand helfen.

      Ich habe ein Blockly in dem ich ein code aus dem Internet eingefügt habe, der mir einen neuen Datenpunkt erzeugt, was soweit auch einwandfrei funktioniert. Das sieht bisher so aus:

      1.JPG

      createState(id, init, {type:'number', unit:'kWh', read:true, write:true, role:'state'});
      

      Jetzt möchte ich eigentlich nur, dass diesem Datenpunkt auch die Funktion/Aufzählung mit dem Namen Ladekosten (unter Aufzählungen natürlich erstellt) zugewiesen wird. Habe schon verschiedene Schnipsel aus dem Netz in den Code eingefügt, aber es funktioniert einfach nicht.

      Wäre super, wenn mir jemand sagen könnte, wie ich den Code ergänzen muss

      haus-automatisierung 1 Reply Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @H-a-m-i last edited by

        @h-a-m-i sagte in Anfängerfrage: Funktion (Aufzählung) per Skript zuweisen:

        Jetzt möchte ich eigentlich nur, dass diesem Datenpunkt auch die Funktion/Aufzählung mit dem Namen Ladekosten (unter Aufzählungen natürlich erstellt) zugewiesen wird

        Ich mache das mit einer eigenen Funktion (sollte wirklich mal als Standard in den JavaScript-Adapter):

        https://github.com/haus-automation/iobroker-script-examples/blob/main/objects-states/add-objectid-to-enum.md

        1 Reply Last reply Reply Quote 1
        • H-a-m-i
          H-a-m-i last edited by H-a-m-i

          Danke für deine Antwort. Aber das ist mir leider schon zu viel xD sorry, was genau sollte ich jetzt machen? Dein Skript in Blockly in meine vorhandene JavaScript-Funktion einfügen?

          Mein Blockly sieht insgesamt so aus:
          2.JPG

          edit:
          Das sieht jetzt so aus:

          createState(id, init, {type:'number', unit:'kWh', read:true, write:true, role:'state'});
          
          function addToEnum(enumId, objId) {
              if (existsObject(objId)) {
                  if (existsObject(enumId)) {
                      const enumObj = getObject(enumId);
          
                      if (enumObj.type === 'enum') {
                          if (!enumObj.common.members.includes(objId)) {
                              extendObject(enumId, {
                                  common: {
                                      members: Array.prototype.concat(enumObj.common.members, [objId])
                                  }
                              });
                          }
          
                          return true;
                      } else {
                          throw new Error(`Target object with ID ${enumId} is not an enum`);
                      }
                  } else {
                      throw new Error(`Enum with ID ${enumId} does not exist`);
                  }
              } else {
                  throw new Error(`Object with ID ${objId} does not exist`);
              }
          }
          
          // Test
          addToEnum('enum.functions.ladekosten', '0_userdata.0.verbrauch');
          

          Ladekosten ist in dem erzeugten Datenpunkt aber nicht gesetzt

          haus-automatisierung 1 Reply Last reply Reply Quote 0
          • haus-automatisierung
            haus-automatisierung Developer Most Active @H-a-m-i last edited by

            @h-a-m-i sagte in Anfängerfrage: Funktion (Aufzählung) per Skript zuweisen:

            Ladekosten ist in dem erzeugten Datenpunkt aber nicht gesetzt

            Die Enums werden ja auch nicht auf dem Datenpunkt/Objekt selbst gespeichert.

            Guck mal im Tab Aufzählungen ob dein Datenpunkt gelandet ist. Ansonsten würde ich an Deiner Stelle mit await und createStateAsync (oder Callback) arbeiten, damit der DP auch wirklich erstellt wird bevor es weiter geht:

            function addToEnum(enumId, objId) {
                if (existsObject(objId)) {
                    if (existsObject(enumId)) {
                        const enumObj = getObject(enumId);
             
                        if (enumObj.type === 'enum') {
                            if (!enumObj.common.members.includes(objId)) {
                                extendObject(enumId, {
                                    common: {
                                        members: Array.prototype.concat(enumObj.common.members, [objId])
                                    }
                                });
                            }
             
                            return true;
                        } else {
                            throw new Error(`Target object with ID ${enumId} is not an enum`);
                        }
                    } else {
                        throw new Error(`Enum with ID ${enumId} does not exist`);
                    }
                } else {
                    throw new Error(`Object with ID ${objId} does not exist`);
                }
            }
             
            await createStateAsync(id, init, { type: 'number', unit: 'kWh', read: true, write: true, role: 'state' });
            addToEnum('enum.functions.ladekosten', id);
            
            haus-automatisierung 1 Reply Last reply Reply Quote 1
            • haus-automatisierung
              haus-automatisierung Developer Most Active @haus-automatisierung last edited by haus-automatisierung

              Gern auch etwas vereinfachen und die ganzen Prüfungen weglassen:

              const enumId = 'enum.functions.ladekosten';
               
              await createStateAsync(id, init, { type: 'number', unit: 'kWh', read: true, write: true, role: 'state' });
              
              const enumObj = await getObjectAsync(enumId);
              if (enumObj && enumObj.type === 'enum') {
                  if (!enumObj.common.members.includes(id)) {
                      await extendObjectAsync(enumId, {
                          common: {
                              members: [...enumObj.common.members, id]
                          }
                      });
                  }
              }
              
              
              1 Reply Last reply Reply Quote 1
              • H-a-m-i
                H-a-m-i last edited by

                Hey mega, das letzte hab ich eingefügt und das funktioniert super, der Datenpunkt ist unter Aufzählungen zu sehen! 😀

                Vielen lieben Dank, das hätte ich selbst nie hinbekommen

                1 Reply Last reply Reply Quote 0
                • H-a-m-i
                  H-a-m-i last edited by

                  @haus-automatisierung kannst du mir evtl. auch einen Tipp geben, wie ich einen Datenpunkt mit zb. "So" im Name lösche? Ich habe einen Objekt Ordner, in dem ich Datenpunkte mit dem Wochentag im Namen erstellen lasse, zB.: "0_userdata.0.Kosten.Fahrtkosten.So_Fahrtende>12:16"
                  Jetzt möchte ich täglich alle Datenpunkte die von vorgestern sind (in dem Fall also So) löschen und habe das bis jetzt so zusammengestellt:

                  Unbenannt.JPG

                  // Delete state
                  await deleteObject(id);
                  
                  

                  Leider scheint das mit dem Platzhalter nicht zu funktionieren und ich finde nichts dazu, welchen Platzhalter man verwendet. Wenn ich in Blockly statt dem * das "_Fahrtende>12:16" einsetze, klappt das löschen. Also müsste der Rest soweit passen, nur eben der Platzhalter nicht

                  haus-automatisierung 1 Reply Last reply Reply Quote 0
                  • haus-automatisierung
                    haus-automatisierung Developer Most Active @H-a-m-i last edited by

                    @h-a-m-i Erstmal finde ich es ganz komisch auf die Art und Weise Datenpunkte zu erstellen und wieder zu löschen - das gesamte Konzept würde ich überdenken.

                    Aber zu Deinem Problem:

                    • Du musst mit einem RegEx oder $-Selektor alle Datenpunkte suchen, welche Deiner Logik entsprechen
                    • Dann mit einer Schleife über das Ergebnis gehen
                    • Die Datenpunkte einzeln in der Schleife löschen
                    H-a-m-i 1 Reply Last reply Reply Quote 0
                    • H-a-m-i
                      H-a-m-i @haus-automatisierung last edited by

                      @haus-automatisierung sagte in Anfängerfrage: Funktion (Aufzählung) per Skript zuweisen:

                      Erstmal finde ich es ganz komisch auf die Art und Weise Datenpunkte zu erstellen und wieder zu löschen - das gesamte Konzept würde ich überdenken.

                      Echt? Hmm ok. Da ich absolut keine Ahnung habe, habe ich mir das so zusammen gesucht aus anderen Foren/Seiten.

                      Du musst mit einem RegEx oder $-Selektor alle Datenpunkte suchen, welche Deiner Logik entsprechen
                      Dann mit einer Schleife über das Ergebnis gehen
                      Die Datenpunkte einzeln in der Schleife löschen

                      Das ist für mich leider schon wieder spanisch, aber trotzdem vielen Dank für deine schnelle Antwort. Ich lass das Löschen der Datenpunkte dann einfach

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate
                      FAQ Cloud / IOT
                      HowTo: Node.js-Update
                      HowTo: Backup/Restore
                      Downloads
                      BLOG

                      953
                      Online

                      32.1k
                      Users

                      80.6k
                      Topics

                      1.3m
                      Posts

                      2
                      9
                      423
                      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