Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. 60 Datenpunkte in 0_userdata.0.xxxx anlegen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    60 Datenpunkte in 0_userdata.0.xxxx anlegen

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

      Hallo ich muss 60 Datenpunkte in der 0_userdata.0.xxxx anlegen die sich nur durch den Namen unterscheiden. Über den Dialog ist das recht mühsam. Geht das auch einfacher ?
      Gruß Roland

      MartinP 1 Reply Last reply Reply Quote 0
      • MartinP
        MartinP @griessbx last edited by MartinP

        @griessbx

        // Upstream DOCSIS 3.0
        for (var i = 0; i < 4; i++) {
            var Channel = 'C0' + i.toString();
            createState('Internet.Docsis.US.' + Channel + '.Frequency', 0, false, {
                name: 'Frequency',
                unit: 'MHz',
                type: 'mixed',
                role: 'state'
            });
        

        Wenn man aber den Javascript-Adapter da freie Hand lässt, legt er die Datenpunkte unter "Javascript" an ...

        0cfb57a2-8676-47c6-899e-d0008236abb3-grafik.png

        EDIT: https://github.com/ioBroker/ioBroker.javascript/issues/429

        Da gibt es einen "Workaround", um den Datenpunkt in Userdata zu erzeugen...

        SBorg2014 created this issue in ioBroker/ioBroker.javascript

        closed createState in 0_userdata.0 ermöglichen #429

        T 1 Reply Last reply Reply Quote 1
        • I
          ignis-draco last edited by ignis-draco

          @griessbx

          let nameslist = ["A", "B", "C"] // <-= Die Namen eingeben (bei dir ist das "xxxx")
          
          
          for (const name of nameslist){
            createState("0_userdata.0."+name, {type: 'boolean' }) //<- Hier muss noch der passende Typ ausgewählt werden
          }
          

          Natürlich ist auch auch möglich eine andere Rolle als "state" zu verwende.

          MartinP 1 Reply Last reply Reply Quote 2
          • T
            TT-Tom @MartinP last edited by

            @martinp

            man kann mit createState unter 0_userdata seine Datenpunkte anlegen.

            for (var i = 0; i < 60; i++) {
                var Channel = String(i);
                createState('0_userdata.0.' + Channel + '.stateName', initWert, {
                    name: 'stateName',
                    unit: 'Einheit ',
                    type: 'string'; //oder number oder boolean
                    role: 'state'
                });
            }
            
            1 Reply Last reply Reply Quote 0
            • MartinP
              MartinP @ignis-draco last edited by MartinP

              @ignis-draco sagte in 60 Datenpunkte in 0_userdata.0.xxxx anlegen:

              createState("0_userdata.0."+name, {type: 'boolean' })

              Die Anleitung ist da anscheinend etwas zu kompliziert bzw lückenhaft

              https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#createstate

              Der Haken, der da geschlagen wird, um aliases zu erzeugen hat mich verwirrt ... hatte vermutet, dass man irgendwelches Vodoo im Stil des Kreieren eines Alias machen muss, um in userdata schreiben zu können ...

              Das, was im Issue unwidersprochen als letzter Kommentar steht (weil beim Erstellen noch zutreffend), hat auch nicht gerade zum Auflösen der Verwirrung beigetragen... habe im geschlossenen Issue zumindest noch einen klärenden Kommentar dahintergesetzt.

              https://github.com/ioBroker/ioBroker.javascript/issues/429

              Ich möchte gern dieses Thema aufwärmen und wieder in Erinnerung rufen.

              Es kam bei mir Freude auf, als ich die Ankündigung von 0_userdata.0 und dessen Funktionalität als benutzereigener Datenpunktbaum im Rahmen der ioBroker Version 2 gelesen hatte - weil dieses Konstrukt mir als Javascript-User mehr Sicherheit bringt. Als jedoch nach dem Upgrade auf Version 2 ein erster Test mit einem simplen Statement der Art

              createState('0_userdata.0.Test123');

              ein ungewolltes Ergebnis lieferte (nämlich einen Datenpunkt javascript.0.0_userdata.0.Test123), wandelte sich meine Freude in "Unfreude". Laut den Diskussionen im Forum soll ja das 0_userdata.0-Konstrukt gerade Einsteiger "anlocken". Um so wichtiger ist es daher, den Einsteigern auch ein einfaches Grundgerüst an Werkzeugen hierfür in die Hand zu geben.

              SBorg2014 created this issue in ioBroker/ioBroker.javascript

              closed createState in 0_userdata.0 ermöglichen #429

              T 1 Reply Last reply Reply Quote 0
              • T
                TT-Tom @MartinP last edited by TT-Tom

                @martinp

                hier mal ein kleines Beispiel mit erstellen der 0_userdata Datenpunkte und dem Alias dazu.

                /**
                 * erstellen der Datenpunkte in 0_userdata.0 und alias.0 je Haltestelle und je Route
                 */
                async function init_Datenpunkte() {
                    try {
                        for (let h = 0; h < NummernHaltestellen.length; h++) {
                            let haltestelle: string = NummernHaltestellen[h];
                            for (let i = 0; i < anzahlAbfahrtenHaltestelle; i++) {
                                if (existsObject(dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i)) == false) {
                                    log(`Datenpunkte für Haltestelle ${haltestelle} Abfahrt ${i} werden angelegt`);
                                    await createStateAsync(dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Departure', '00:00', {
                                        type: 'string',
                                        name: { de: 'Abfahrzeit', en: 'Departure time' },
                                    });
                                    await createStateAsync(dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Direction', 'Hbf', {
                                        type: 'string',
                                        name: { de: 'Richtung', en: 'Direction' },
                                    });
                                    await createStateAsync(dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Vehicle', 'train', {
                                        type: 'string',
                                        name: { de: 'Fahrzeug', en: 'Vehicle' },
                                    });
                                    await createStateAsync(dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Delay', false, {
                                        type: 'boolean',
                                        name: { de: 'Verspätung', en: 'Delay' },
                                    });
                                    setObject(dp_Alias + 'FahrplanAnzeiger.Haltestelle' + haltestelle, {
                                        type: 'device',
                                        common: {
                                            role: 'timeTable',
                                            name: { de: 'Haltestelle ' + haltestelle, en: 'Station ' + haltestelle },
                                        },
                                        native: {},
                                    });
                                    setObject(dp_Alias + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i), {
                                        type: 'channel',
                                        common: {
                                            role: 'timeTable',
                                            name: { de: 'Abfahrt ' + String(i), en: 'Departure ' + String(i) },
                                        },
                                        native: {},
                                    });
                                    await createAliasAsync(
                                        dp_Alias + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.ACTUAL',
                                        dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Departure',
                                        true,
                                        <iobJS.StateCommon>{ type: 'string', role: 'state', name: { de: 'Abfahrzeit', en: 'Departure time' } }
                                    );
                                    await createAliasAsync(
                                        dp_Alias + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.DIRECTION',
                                        dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Direction',
                                        true,
                                        <iobJS.StateCommon>{ type: 'string', role: 'state', name: { de: 'Richtung', en: 'Direction' } }
                                    );
                                    await createAliasAsync(
                                        dp_Alias + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.VEHICLE',
                                        dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Vehicle',
                                        true,
                                        <iobJS.StateCommon>{ type: 'string', role: 'state', name: { de: 'Fahrzeug', en: 'Vehicle' } }
                                    );
                                    await createAliasAsync(
                                        dp_Alias + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.DELAY',
                                        dp_Userdata + 'FahrplanAnzeiger.Haltestelle' + haltestelle + '.Abfahrt' + String(i) + '.Delay',
                                        true,
                                        <iobJS.StateCommon>{ type: 'boolean', role: 'state', name: { de: 'Verspätung', en: 'Delay' } }
                                    );
                                    log(`Fertig`);
                                } else {
                                    log(`Datenpunkte für Haltestelle ${haltestelle} Abfahrt ${i} vorhanden`);
                                }
                            }
                        }
                

                du musst zuerst die 0_userdata DP erstellen und dann die Alias Struck aufbauen. wobei du da beachten musst folder, device und channel müssen separat aufgebaut werden.

                MartinP 1 Reply Last reply Reply Quote 0
                • MartinP
                  MartinP @TT-Tom last edited by

                  @tt-tom warum legst Du eigentlich doppelte Strukturen an, einmal in alias, und einmal in userdata?

                  Ich meinte diese Variante von createState mit gesetztem "common" Parameter zur Erzeugung eines Aliases, die mich verwirrt hat ...

                  The following settings for aliases are valid too:

                  common => {
                  alias: {
                  id: 'alias.0.myOtherState', // will be created automatically if not already exists
                  write: 'val * 1000', // convert function for write to created state
                  read: 'val / 1000' // convert function to read from created state
                  }
                  }

                  or

                  common => {
                  alias: {
                  id: 'alias.0.myOtherState', // will be created automatically if not already exists
                  }
                  }

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    TT-Tom @MartinP last edited by

                    @martinp

                    das hat mit dem NSPanel zu tun und seinem Script dahinter.

                    MartinP 1 Reply Last reply Reply Quote 0
                    • MartinP
                      MartinP @TT-Tom last edited by MartinP

                      Ein Gedanke zu einer anderen Lösung:

                      Wenn man sich in Javascript nicht fit fühlt, könnte man ja auf folgende Idee kommen .. (Beispiel aus meinem Objekt Tree)

                      In Userdata_0 gibt es im Folder Sensors zwei Datenpunkte für die Temperatur der beiden CPU-Cores

                      dcc15837-5b5c-4fd6-84cc-0b860a0cd91f-grafik.png


                      {
                      "0_userdata.0.Proxmox_N3000.Sensors": {
                      "common": {
                      "name": "Sensors",
                      "desc": "Manuell erzeugt",
                      "role": "",
                      "icon": ""
                      },
                      "type": "channel",
                      "from": "system.adapter.admin.0",
                      "user": "system.user.admin",
                      "ts": 1719507072987,
                      "_id": "0_userdata.0.Proxmox_N3000.Sensors",
                      "acl": {
                      "object": 1636,
                      "owner": "system.user.admin",
                      "ownerGroup": "system.group.administrator"
                      }
                      },
                      "0_userdata.0.Proxmox_N3000.Sensors.Temp_Core0": {
                      "common": {
                      "name": "Temp_Core0",
                      "desc": "Manuell erzeugt",
                      "role": "value.temperature",
                      "type": "number",
                      "read": true,
                      "write": true,
                      "def": 0,
                      "custom": {
                      "influxdb.0": {
                      "enabled": true,
                      "storageType": "",
                      "aliasId": "",
                      "debounceTime": 0,
                      "blockTime": 0,
                      "changesOnly": true,
                      "changesRelogInterval": 0,
                      "changesMinDelta": 0,
                      "ignoreBelowNumber": "",
                      "disableSkippedValueLogging": false,
                      "enableDebugLogs": false,
                      "debounce": 1000
                      }
                      }
                      },
                      "type": "state",
                      "native": {},
                      "_id": "0_userdata.0.Proxmox_N3000.Sensors.Temp_Core0",
                      "acl": {
                      "object": 1636,
                      "state": 1636,
                      "owner": "system.user.admin",
                      "ownerGroup": "system.group.administrator"
                      },
                      "from": "system.adapter.admin.0",
                      "user": "system.user.admin",
                      "ts": 1719509549918,
                      "val": 57,
                      "ack": false
                      },
                      "0_userdata.0.Proxmox_N3000.Sensors.Temp_Core1": {
                      "common": {
                      "name": "Temp_Core1",
                      "desc": "Manuell erzeugt",
                      "role": "value.temperature",
                      "type": "number",
                      "read": true,
                      "write": true,
                      "def": 0,
                      "custom": {
                      "influxdb.0": {
                      "enabled": true,
                      "storageType": "",
                      "aliasId": "",
                      "debounceTime": 0,
                      "blockTime": 0,
                      "changesOnly": true,
                      "changesRelogInterval": 0,
                      "changesMinDelta": 0,
                      "ignoreBelowNumber": "",
                      "disableSkippedValueLogging": false,
                      "enableDebugLogs": false,
                      "debounce": 1000
                      }
                      }
                      },
                      "type": "state",
                      "native": {},
                      "_id": "0_userdata.0.Proxmox_N3000.Sensors.Temp_Core1",
                      "acl": {
                      "object": 1636,
                      "state": 1636,
                      "owner": "system.user.admin",
                      "ownerGroup": "system.group.administrator"
                      },
                      "from": "system.adapter.admin.0",
                      "user": "system.user.admin",
                      "ts": 1719509623191,
                      "val": 63,
                      "ack": false
                      }
                      }

                      Wenn man da einen JSON-Export anstößt, die Datei mit einem Text-Editor öffnet, und durch COPY&PASTE die JSON-Struktur um Blöcke für weitere CPU-Cores ergänzen, und die JSON-Datei dann wieder zurückschreiben...

                      Wäre aber sicherlich nicht so einfach, weil man nicht nur an einer Stelle umbenennen muss...

                      "0_userdata.0.Proxmox_N3000.Sensors.Temp_Core1": {

                      "_id": "0_userdata.0.Proxmox_N3000.Sensors.Temp_Core1",

                      Gibt es da einen Schema Check, bevor man so eine (möglicherweise fehlerhafte) Datei iobroker zum Import übergibt?

                      Beim Zurücklesen von VIS-2 Projekten scheint das der Fall zu sein ...

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      560
                      Online

                      31.9k
                      Users

                      80.2k
                      Topics

                      1.3m
                      Posts

                      4
                      9
                      396
                      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