Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Datenpunkt runden, Datenpunkt Speicher von MB auf GB

    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

    Datenpunkt runden, Datenpunkt Speicher von MB auf GB

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      klassisch Most Active @Almixx last edited by klassisch

      @Almixx Willkommen im Club.
      An Deiner Stelle würde ich erst mal in der Objektansicht manuell einen neuen Datenpunkt anlegen, der den gerundeten Datenpunkt aufnimmt.
      Dann die Einführung lesen. Dort steht drin, wie man Werte aus den Datenpunkten holt, verrechnet und wieder in einen Datenpunkt schreibt. getState und setState. Fehlermeldungen findet man dann im ioBroker logfile.
      JS ist nicht gerade mein Liebling, aber es ist halt sehr verbreitet und damit findet man viel.

      1 Reply Last reply Reply Quote 1
      • K
        klassisch Most Active last edited by

        @Almixx wenn Du gestattest, dann nutze ich den Thread, um alias an einem Beispiel selbst zu lernen und anzuwenden. Ich nutze die Gelegenheit, daß sich der hochgeschätzte @paul53 gemeldet hat.
        Folgendes Szenario:

        • Meine Mikrowelle wird mit einer messenden und schaltenden Zwischensteckdose der Fa. Shelly vesorgt.
        • Die Shelly Steckdose hat einen grausligen und wenig sprechenden Namen mit Seriennummer drin
        • Ausserdem besteht die Möglichkeit, daß ich später einmal eine andere messende und schaltende Steckdose verwende. Das kann eine andere Shelly oder auch eine Homematic-Steckdose sein
        • Mit einem alias Objekt kann ich eine verknüpfte "virtuelle" Steckdose einführen, die einen sprechenden Namen hat, z.B.
        alias.0.microwaveOven.power
        

        und dessen Werte dann automatosch mit dem zugewiesenen Zwilling hin und her synchronisiert werden

        • Ich habe bereits ein Programm, welches die Leistungsaufnahme der Mikrowelle mißt und mir eine mail schickt, wenn die fertig ist - sei es als Mikrowelle oder als Flammkuchenbackofen

        Jetzt meine erste Frage an @paul53 :

        Mein Objektraum hat noch keinen alias.0 Bereich. Kann ich einfach einen manuell anlegen und dann ist das automatisch ein alias-Raum oder ist mein System dafür noch nicht bereit?

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

          @klassisch sagte:

          Mein Objektraum hat noch keinen alias.0 Bereich.

          Der wird eigentlich durch den js-controller erzeugt. Welche Version läuft bei Dir ?
          Wenn noch keine Alias-Datenpunkte vorhanden sind, erscheint alias.0 nicht als Ordner, sondern weiter unten als Objekt vom Typ "meta".

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

            @paul53 vielen Dank!
            Mein System

            a2ae0c5c-e55a-475d-b51f-2addacfda916-grafik.png Systemdata Bitte Ausfüllen
            Hardwaresystem: Lenovo X1 i5-6300u
            Arbeitsspeicher: 8GB
            Festplattenart: SSD 180GB
            Betriebssystem: Win 10 Pro
            Node-Version: 10.17.0
            Nodejs-Version: Node.js v10.17.0
            NPM-Version: 6.11.3
            ioBroker Version (js-controller): 3.1.6
            Installationsart: Installer mit Workaround
            Image genutzt: Installer
            Installer 2 Link

            Habe jetzt mal auf Expertenmodus umgeschaltet. Jede Menge meta Objekte, aber kein alias gefunden.

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

              @klassisch sagte:

              kein alias gefunden.

              Bei js-controller 3.1.6. muss es ein Objekt alias.0 geben.
              Unabhängig davon solltest Du node.js auf Version 12.x updaten.

              Almixx K 3 Replies Last reply Reply Quote 0
              • Almixx
                Almixx @paul53 last edited by

                Habe das Runden mit Blockly versucht, bekomme aber nur Ausgabe 0GB...???
                Nehme an, am Blockly hab ich was falsch, aber was?

                Blockly.png

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

                  @Almixx sagte:

                  falsch, aber was?

                  Nicht die "Objekt ID", sondern den "Wert" verwenden. So wird aber nicht auf GB umgerechnet.

                  Almixx 1 Reply Last reply Reply Quote 1
                  • Almixx
                    Almixx @paul53 last edited by

                    @paul53
                    so funktionierts, habs hinbekommen. man muss sich nur mal etwas damit beschäftigen 🙂 😉
                    Blockly.png

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

                      @paul53 sagte in Datenpunkt runden, Datenpunkt Speicher von MB auf GB:

                      Bei js-controller 3.1.6. muss es ein Objekt alias.0 geben.

                      Aus irgendwelchen Gründen bei mir nicht da. Was passiert, wenn ich das händisch anlege?

                      Unabhängig davon solltest Du node.js auf Version 12.x updaten.

                      Windows Maschine. da hoffe ich noch auf eine aktualisierte Version des Installers von @Stabilostick mit runderneuertem Paket.

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

                        @paul53 sagte in Datenpunkt runden, Datenpunkt Speicher von MB auf GB:

                        Bei js-controller 3.1.6. muss es ein Objekt alias.0 geben.

                        Achso. Bin ja von einer älteren Version migriert mit @AlCalzone s Workaround. Da wird das gesamte iobroker-data Verzeichnis kopiert. Vielleict gibt es deshalb kein automatisches Zufügen des alias.0 Objektbereichs?

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

                          @klassisch sagte:

                          Vielleict gibt es deshalb kein automatisches Zufügen des alias.0 Objektbereichs?

                          Vielleicht ? Gibt es das Objekt "0_userdata.0" ?

                          @klassisch sagte in Datenpunkt runden, Datenpunkt Speicher von MB auf GB:

                          Was passiert, wenn ich das händisch anlege?

                          Probieren ! So muss das Objekt in der RAW-Ansicht aussehen:

                          {
                            "from": "system.adapter.admin.0",
                            "user": "system.user.admin",
                            "ts": 1572866284729,
                            "common": {
                              "name": "Alias Ordner",
                              "role": "",
                              "desc": "Manuell erzeugt",
                              "icon": ""
                            },
                            "native": {},
                            "acl": {
                              "object": 1636,
                              "owner": "system.user.admin",
                              "ownerGroup": "system.group.administrator"
                            },
                            "_id": "alias.0",
                            "type": "meta"
                          }
                          

                          Entscheidend sind Zeilen 17, 18.
                          Ich glaube mich zu erinnern (ist lange her), dass ich erst einen Alias-Datenpunkt erzeugt hatte und später ein Objekt "alias.0" vom Typ "device" das ich in Typ "meta" geändert habe.
                          Neuerdings kann man aber im Tab "Objekte" keine Objekte mehr in der Wurzel erzeugen. Dann musst Du ein Script verwenden.

                          const id = 'alias.0';
                          const obj = {
                              type: 'meta',
                              common: {
                                  name: 'Alias Ordner',
                                  desc: 'per Script erzeugt'
                              },
                              native: {}
                          };
                          
                          if(!existsObject(id)) setObject(id, obj);
                          
                          K 1 Reply Last reply Reply Quote 1
                          • K
                            klassisch Most Active @paul53 last edited by

                            @paul53 sagte in Datenpunkt runden, Datenpunkt Speicher von MB auf GB:

                            Gibt es das Objekt "0_userdata.0" ?

                            Ja, gibt es, weil ich es manuell angelegt habe. War nie ein Freund der vereinnahmenden Adapter, die immer die ganzen Daten in einem eigenen Objektraum vereinnahmen und hatte deshalb schon lange für diese Zwecke "data.0" erstellt. Man hat zwar den Vorteil des Konzepts eingesehen aber leider einen anderen Namen gewählt 😞

                            Probieren ! So muss das Objekt in der RAW-Ansicht aussehen:
                            Entscheidend sind Zeilen 17, 18.

                            Vielen Dank für die Anschubfinanzierung. Habe es in raw so hingefrickelt

                            Ich glaube mich zu erinnern (ist lange her), dass ich erst einen Alias-Datenpunkt erzeugt hatte und später ein Objekt "alias.0" vom Typ "device" das ich in Typ "meta" geändert habe.

                            wie gesagt, in raw kann man frickeln

                            Neuerdings kann man aber im Tab "Objekte" keine Objekte mehr in der Wurzel erzeugen. Dann musst Du ein Script verwenden.

                            Das ist mir lider auch aufgefallen. Aber auch das ging dann mit raw. Hätte ich zwar so nicht erwartet, ging aber.
                            Seit wann kan der JS-Adapter Objekte außerhalb seines Bereichs erzeugen? Hatte das früher mal getestet, da hat das aber nicht funktioniert.

                            Habe jetzt mal ein einfaches Skript auf alias umgestellt und das scheint zu gehen.
                            Werde ich auch noch nutzen, um meine häßliche Parallelstruktur "data.0" und "0_userdata.0" sy synchronisieren. Aber das braucht Zeit, Ruhe und Konzentration, weil ich das teilweise schon in Skripten mache und man so leicht einen Zirkelbezug generieren kann.

                            Derzeit lege ich die alias-Datenpunkt in raw an, was etwas fummelig ist. Habe aber noch keine elegantere Methode gefunden. die funktioniert.

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

                              @klassisch sagte:

                              Habe aber noch keine elegantere Methode gefunden. die funktioniert.

                              Ich verwende ein Script, das nur dazu dient, einzelne Alias-Datenpunkte zu erzeugen.

                              // Original-Datenpunkt
                              const idOrigin = '...'; 
                              // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
                              // Bei Nicht-Verwendung Leerstring '' zuweisen
                              const idRead = '';
                               
                              // Alias-Datenpunkt
                              const idAlias = 'PV.Einspeisung';
                              var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
                              
                              // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
                              nameAlias = 'PV Einspeisung';
                              desc = 'per Script erstellt';
                              // typeAlias = 'boolean'; // oder 'number'
                              // read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch  
                              // write = "val ? true : true";
                              // role = 'value';
                              // min = 0; // nur Zahlen
                              // max = 100; // nur Zahlen
                              // unit = '%'; // nur für Zahlen
                              // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
                              // custom = []; // verhindert doppelte Ausführung von history, ...
                              // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
                              // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
                              
                              // Ab hier nichts ändern !!
                              function createAlias(idDst, idSrc, idRd) {
                                 if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
                                 else {
                                    var obj = {};
                                    obj.type = 'state';
                                    obj.common = getObject(idSrc).common;
                                    obj.common.alias = {};
                                    if(idRd) {
                                        obj.common.alias.id = {};
                                        obj.common.alias.id.read = idRd;
                                        obj.common.alias.id.write = idSrc;
                                        obj.common.read = true;
                                    } else obj.common.alias.id = idSrc;
                                    if(typeAlias) obj.common.type = typeAlias;
                                    if(obj.common.read !== false && read) obj.common.alias.read = read;
                                    if(obj.common.write !== false && write) obj.common.alias.write = write;
                                    if(nameAlias) obj.common.name = nameAlias;
                                    if(role) obj.common.role = role;
                                    if(desc) obj.common.desc = desc;
                                    if(min !== undefined) obj.common.min = min;
                                    if(max !== undefined) obj.common.max = max;
                                    if(unit) obj.common.unit = unit;
                                    if(states) obj.common.states = states;
                                    if(custom && obj.common.custom) obj.common.custom = custom;
                                    obj.native = {};
                                    setObject(idDst, obj, function() {
                                         if(idRd) setState(idRd, getState(idRd).val, true);
                                         else setState(idSrc, getState(idSrc).val, true); 
                                    });
                                    if(raum && existsObject('enum.rooms.' + raum)) {
                                       let obj = getObject('enum.rooms.' + raum)
                                       obj.common.members.push(idDst);
                                       setObject('enum.rooms.' + raum, obj);
                                    }
                                    if(gewerk && existsObject('enum.functions.' + gewerk)) {
                                       let obj = getObject('enum.functions.' + gewerk)
                                       obj.common.members.push(idDst);
                                       setObject('enum.functions.' + gewerk, obj);
                                    }
                                 } 
                              }
                               
                              createAlias('alias.0.' + idAlias, idOrigin, idRead);
                              
                              1 Reply Last reply Reply Quote 1
                              • K
                                klassisch Most Active last edited by

                                @paul53 Klasse Skript, herzlichen Dank! Das macht das Leben sehr viel einfacher und steigert die Qualität der Alias-Datenpunkte enorm!
                                Da werden alle Eigenschaften vererbt. Das ist klasse! So läuft das schon sehr viel runder!

                                Der alias-Datenpunkt wird anscheind nur aktualisiert, wenn sich der Datenpunkt ändert. Und bis zu diesem Zeitpunkt gibt es eine Warnmeldung im Skript, welches den alias-Punkt verwendet (Nutzerskript).
                                Beispiel:

                                avascript.0	2020-11-07 16:13:32.779	warn	(6784) at script.js.common.automowerControl:96:24
                                javascript.0	2020-11-07 16:13:32.778	warn	(6784) getState "alias.0.Automower.onTour" not found (3) 
                                

                                Wenn ich dann manuell am Datenpunkt etwas ändere, dann wird anscheinend synchronisiert und wenn ich das Nutzerskript aufrufe gibt es keine Warnmeldung mehr.

                                Fällt auf, bei Datenpunkten mit seltener Änderung.

                                Ist anscheinend nur ein Schönheitsfehler, das Nutzerskript wird nicht abgebrochen.
                                Wäre es möglich an ein Skript ein synchronisationsbefehl dranzuhängen, damit die Aliaswerte von Anfang an befüllt werden?

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

                                  @klassisch sagte:

                                  Wäre es möglich an ein Skript ein synchronisationsbefehl dranzuhängen, damit die Aliaswerte von Anfang an befüllt werden?

                                  Ja, wenn man setObject() um eine Callback-Funktion ergänzt.

                                        setObject(idDst, obj, function() {
                                           if(idRd) setState(idRd, getState(idRd).val, true);
                                           else setState(idSrc, getState(idSrc).val, true); 
                                        });
                                  
                                  K 1 Reply Last reply Reply Quote 1
                                  • K
                                    klassisch Most Active @paul53 last edited by

                                    @paul53 den Callback habe ich eingebaut. Bei einer boolean hat es funktioniert bei einer number nicht. Das wurde nichts synchronisiert.
                                    Dann habe ich diesen alias-Datenpunkt gelöscht und seither sagt das Skript, daß des den Datenpunkt schon gäbe.
                                    Wahrscheinlich frickel ich zu viel herum.....

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

                                      @klassisch sagte:

                                      Das wurde nichts synchronisiert.

                                      Wie hast Du das festgestellt ? Im Tab "Objekte" ? Dann ist der Puffer von admin.0 noch nicht aktualisiert.

                                      @klassisch sagte in Datenpunkt runden, Datenpunkt Speicher von MB auf GB:

                                      Dann habe ich diesen alias-Datenpunkt gelöscht und seither sagt das Skript, daß des den Datenpunkt schon gäbe.

                                      Per Script oder im Tab "Objekte". Falls im Tab "Objekte", dann ist der Puffer von javascript.0 noch nicht aktualisiert.

                                      In beiden Fällen hilft ein Neustart der jeweils anderen Instanz: Änderung im Admin --> Neustart von javascript.0; Änderung per Script --> Neustart von admin.0.

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

                                        @paul53 vielen Dank, was es alles gibt. Puffer von javascript.
                                        Ich habe in der Objektansicht geschaut und gelöscht.
                                        Wie lange braucht es, bis die Puffer synchronisiert sind, wenn man javascript nicht neu starten möchte?

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

                                          @klassisch sagte:

                                          Wie lange braucht es, bis die Puffer synchronisiert sind, wenn man javascript nicht neu starten möchte?

                                          Leider keine Ahnung 😢

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

                                            @paul53 Danke, dann versuche ich es herauszufinden und warte mal ab. Muß eh noch ein paar andere Dinge tun, Auf jeden Fall kam ich heute Dank Deinem Verweis auf die alias Anleitung unverhofft und ungeplant zum Einstieg in dieses Thema, das mich schon lange interessiert und das ich noch etwas ausbauen werde. Gerade bei den messenden Schaltsteckdosen, die ab und an den Platz wechseln besonders praktisch. Dann noch bei meinen billigen 433MHz T-H-Sensoren, die leider bei jedem Batteriewechsel ihre Adresse ändern, was wirklich lästig und unnötig ist. die 433MHz TFK haben diese lästige Eigenschaft nicht.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            752
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            blockly javascript
                                            3
                                            25
                                            1633
                                            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