Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Dichte sensor kalibrierung

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Dichte sensor kalibrierung

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

      Hey Ho Leute,
      ich wollte ja schon lange meine Dichte in meinem Meerwasser Aquarium messen.
      Nun kann ich es endlich einen Sensor, der Dauerhaft im Becken verbleiben kann, doch zeigt der Sensor einen leicht anderen Wert an, als wenn ich die Dichte mit einer temperatur geeichten Spindel messe.
      Wie könnte man diesen Wert umrechnen damit der korekte Wert heaus kommt und in einen Datenpunkt geschrieben wird. Die Werte werden per Bluetooth und dem BLE Adapter übertragen an ioBroker.
      gemessene Werte:
      Spindel 52,73 ms/cm
      Dichte messgerät 4541 us/cm bei 29,5 Grad gemessen.
      @paul53 vielleicht magst du auch mal mit überlegen, wie man das machen könnte per Blockly!

      Danke Danke Danke

      paul53 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @Aphofis last edited by paul53

        @Aphofis
        Dazu benötigt man kein Blockly, sondern es kann die Umrechnung auch in einem Alias-Datenpunkt erfolgen mit common.alias.read.
        "a + b * val"
        a = Offset
        b = Steilheitskorrektur

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

          @paul53
          Das schon mal gut! Nur wie erstellt man einen Alias Datenpunkt und erstellt dann diese Rechnung darin !?

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

            @Aphofis sagte:

            wie erstellt man einen Alias Datenpunkt

            Nachdem Du idOrigin und idAlias angepasst hast und bei read a und b durch die richtigen Zahlen ersetzt hast, starte das folgende Script einmalig.

            // Original-Datenpunkt
            const idOrigin = 'mqtt.0.dimmer.status'; 
            // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
            // Bei Nicht-Verwendung Leerstring '' zuweisen
            const idRead = ''; //'knx.0.Wohnen.Licht.Esstisch_Status'/*Wohnen Licht Esstisch Status*/;
             
            // Alias-Datenpunkt
            const idAlias = 'Aquarium.Wasser.Dichte';
            var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
            // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
            nameAlias = 'Dichte Meerwasser';
            desc = 'per Script erstellt';
            // typeAlias = 'boolean'; // oder 'number'
            read = "a + b * val"; // a und b durch Zahlen ersetzen !
            // write = "val ? true : true";
            role = 'value';
            // min = 0; // nur Zahlen
            // max = 100; // nur Zahlen
            unit = 'g/ml'; // 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);
                  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 0
            • paul53
              paul53 @Aphofis last edited by paul53

              @Aphofis sagte:

              gemessene Werte:
              Spindel 52,73 ms/cm

              Was ist das für eine Maßeinheit ? Leitfähigkeit ? Normalerweise gibt man die Dichte in kg/l bzw. g/ml an.

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

                @paul53
                Der gemessene Wert ist Mit einer Spindel gemessen
                In Dichte also ich glaube wert war 1,0215 g/cm3 bei 29,5 grad den Wert habe ich in meinem Aquarium Umrechner eingetippselt um den Wert in Dichte mit Temperatur abhängig umzurechnen.
                Man kann den Salzgehalt in Dichte, relative Dichte, Salinität und Leitwert messen.
                Meine Spindel misst Die Dichte in Gramm pro cm3 und mein refeagtometer Mist in psu (Salinität)
                Das neue Messgerät Mist Den Leitwert in µs/cm
                Ist iDOrigin der gemessene Wert mit der Spindel umgerechnet oder ist es der Wert den ich vom Dichte Messgerät aus Blue bekomme?

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

                  @Aphofis sagte:

                  Ist iDOrigin der gemessene Wert mit der Spindel umgerechnet oder ist es der Wert den ich vom Dichte Messgerät aus Blue bekomme?

                  Der Datenpunkt mit idOrigin enthält den Messwert. Der Datenpunkt mit idAlias enthält den umgerechneten Wert.

                  @Aphofis sagte:

                  Meine Spindel misst Die Dichte in Gramm pro cm3

                  Also in g/ml. Soll das das Ergebnis der Umrechnung sein ?
                  Die Umrechnung kann so einfach nur erfolgen, wenn die Temperatur konstant ist und der Salzgehalt nur wenig schwankt. Sollen Temperaturänderungen berücksichtigt werden, benötigt man ein Script.

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

                    @paul53
                    Temperatur schwankungen mit einberechnet wäre natürlich mega!
                    Da der Salzgehalt ja Temperatur abhängig ist.
                    Der Wert soll in ms/cm als Leitwert ausgegeben werden.
                    Vielleicht bringt ja diese Tabelle etwas beim kalkulieren

                    salinität tabelle.pdf

                    paul53 2 Replies Last reply Reply Quote 0
                    • paul53
                      paul53 @Aphofis last edited by paul53

                      @Aphofis sagte:

                      Vielleicht bringt ja diese Tabelle etwas beim kalkulieren

                      Die Tabelle reicht nur bis 28 °C. In welcher Spanne bewegt sich die Temperatur im Aquarium ? Wenn sie nicht groß ist, genügt sicherlich eine lineare Interpolation.
                      Was möchtest Du als Ergebnis ? Salzgehalt oder Dichte ?

                      @Aphofis sagte in Dichte sensor kalibrierung:

                      Dichte messgerät 4541 us/cm bei 29,5 Grad gemessen.

                      Dieser Wert ist viel zu klein !

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

                        @Aphofis sagte:

                        Da der Salzgehalt ja Temperatur abhängig ist.

                        Eine Näherungsformel für den Salzgehalt könnte etwa so passen:

                        Salzgehalt = 15.75 + 0.68 (LF - T)
                        

                        Salzgehalt in g/l (psu), LF in mS/cm, T in °C

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

                          @paul53 Die Temperatur schwankt zwischen 25-30 Grad
                          Je nach monat und Tageszeit meistens liegt die Temperatur im Sommer bei 27- 30 Grad und im Winter bei 25-27 Grad
                          Das Messgerät mist in µs/cm ich benötige ms/cm also durch 100 aber die kalibrierung habe ich keine Ahnung von.

                          paul53 Homoran 3 Replies Last reply Reply Quote 0
                          • paul53
                            paul53 @Aphofis last edited by paul53

                            @Aphofis sagte:

                            Das Messgerät mist in µs/cm ich benötige ms/cm also durch 100

                            Nein, durch 1000. Deshalb schrieb ich, dass der Wert viel zu klein ist.

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

                              @paul53
                              Wäre das so korekt ???

                              // Original-Datenpunkt
                              const idOrigin = 'ble.0.c4:7c:8d:6b:b7:5a.fertility'; 
                              // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
                              // Bei Nicht-Verwendung Leerstring '' zuweisen
                              const idRead = ''; //'knx.0.Wohnen.Licht.Esstisch_Status'/*Wohnen Licht Esstisch Status*/;
                               
                              // Alias-Datenpunkt
                              const idAlias = 'Aquarium.Wasser.Dichte';
                              var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
                              // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
                              nameAlias = 'Dichte Meerwasser';
                              desc = 'per Script erstellt';
                              // typeAlias = 'boolean'; // oder 'number'
                              read = "a + b * val"; // a und b durch Zahlen ersetzen !
                              // write = "val ? true : true";
                              role = 'value';
                              // min = 0; // nur Zahlen
                              // max = 100; // nur Zahlen
                              unit = 'g/ml'; // 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);
                                    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('Aqua_Control.0.Sensoren.Dichte_kalibrierung' + idAlias, idOrigin, idRead);
                              

                              Das sind nun mal die Werte die ich habe! Anders kann das Messgerät nicht messen und ich brauche ms/cm um es in meine App zu tippseln damit ich weiss wie viel salz ich in mein Becken bringen muss oder wie viel Meerwasser ich durch Osmose Wasser ersetzen muss.

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

                                @Aphofis sagte in Dichte sensor kalibrierung:

                                Wäre das so korekt ???

                                Nein. Das Ergebnis soll die Leitfähigkeit in mS/cm sein.

                                // Original-Datenpunkt
                                const idOrigin = 'ble.0.c4:7c:8d:6b:b7:5a.fertility'; 
                                // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
                                // Bei Nicht-Verwendung Leerstring '' zuweisen
                                const idRead = ''; //'knx.0.Wohnen.Licht.Esstisch_Status'/*Wohnen Licht Esstisch Status*/;
                                 
                                // Alias-Datenpunkt
                                const idAlias = 'Aquarium.Wasser.Leitfaehigkeit';
                                var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
                                // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
                                nameAlias = 'Leitfähigkeit Meerwasser';
                                desc = 'per Script erstellt';
                                // typeAlias = 'boolean'; // oder 'number'
                                read = "0.0116 * val"; // 
                                // write = "val ? true : true";
                                role = 'value';
                                // min = 0; // nur Zahlen
                                // max = 100; // nur Zahlen
                                unit = 'mS/cm'; // 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);
                                      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('Aqua_Control.0.Sensoren.Dichte_kalibrierung' + idAlias, idOrigin, idRead);
                                
                                Aphofis 1 Reply Last reply Reply Quote 0
                                • Aphofis
                                  Aphofis @paul53 last edited by

                                  @paul53
                                  OK und als Javascript in Blockly erstellen?
                                  Die Datenpunkte sind so OK ?

                                  1 Reply Last reply Reply Quote 0
                                  • Homoran
                                    Homoran Global Moderator Administrators @Aphofis last edited by

                                    @Aphofis Nach deiner Tabelle wird die Leitfähigkeit in mc/cm angegeben. Eine mir gar nicht geläufige Einheit.
                                    Habe daraufhin mal gesucht und folgendes gefunden:

                                    Der Ausdruck EC wird als allgemeine Bezeichnung für die elektrische Leitfähigkeit benutzt (Electrical Conductivity = EC). Bei manchen Leitfähigkeitsmessgeräten wird die tatsächliche Leitfähigkeit in "EC" Einheiten angegeben, 1 EC ist hierbei gleichbedeutend mit milliS/cm.

                                    demnach wären milliCondukivitäten gleichbedeutend mit µS.

                                    Bei 29°C und einer Ziel-Salinität im grünen Bereich müsste die Leitfähigkeit laut Tabelle (extrapoliert) irgendwo bei 59 sein. Bei deinen 45.41 tun mir deine Fische richtig leid. Die sind kurz vor einem osmotischen Schock.
                                    Das Wasser entzieht den Fischen dann die Eelktrolyte, die Kiemen kommen da kaum noch gegen an

                                    Aphofis 1 Reply Last reply Reply Quote 0
                                    • Aphofis
                                      Aphofis @Homoran last edited by

                                      @Homoran
                                      Also zum Verständnis.
                                      Bitte genau lesen!!!
                                      Ich habe ein Messgerät, was eigentlich für Pflanzen ist und den Leitwert des in der Erde befindlichen Wassers ist!!!
                                      Dieser Wert soll kalibriert werden zu dem normalen Wert der in meinem Becken herscht.
                                      Gemessen bei 29,5 Grad habe ich einen Leitwert von 57,52 ms/cm einen PSU von 34,8 einne Dichte von 1,0217 also ein sehr sehr guter Wert bei der Temperatur!!!! Wie gesagt ich habe einen Wert per Spindel gemessen um den Wert den das Messgeät ermittelt umzurechnen in der eigentlichen Leitwert!!!!

                                      Homoran 1 Reply Last reply Reply Quote 0
                                      • Homoran
                                        Homoran Global Moderator Administrators @Aphofis last edited by

                                        @Aphofis sagte in Dichte sensor kalibrierung:

                                        Bitte genau lesen!!!
                                        Ich habe ein Messgerät, was eigentlich für Pflanzen ist und den Leitwert des in der Erde befindlichen Wassers ist!!!
                                        Dieser Wert soll kalibriert werden zu dem normalen Wert der in meinem Becken herscht.

                                        Wo stehen diese Informationen denn, dass man sie hätte lesen können?

                                        Aphofis 1 Reply Last reply Reply Quote 0
                                        • Aphofis
                                          Aphofis @Homoran last edited by

                                          @Homoran aller erster post:

                                          gemessene Werte:
                                          Spindel 52,73 ms/cm
                                          Dichte messgerät 4541 us/cm bei 29,5 Grad gemessen.
                                          es fehlen um die 300 Gramm Salz was bei einer Tonne Wasser ein leicht zu dünner wert ist 4541 ist die messung vom messgerät was für pflanzen ist dieInfo habe ich vllt verschluckt!😧 😲

                                          Homoran paul53 2 Replies Last reply Reply Quote 0
                                          • Homoran
                                            Homoran Global Moderator Administrators @Aphofis last edited by

                                            @Aphofis sagte in Dichte sensor kalibrierung:

                                            aller erster post:

                                            da lese ich nichts von:

                                            @Aphofis sagte in Dichte sensor kalibrierung:

                                            Ich habe ein Messgerät, was eigentlich für Pflanzen ist und den Leitwert des in der Erde befindlichen Wassers ist!!!
                                            Dieser Wert soll kalibriert werden zu dem normalen Wert der in meinem Becken herscht.

                                            Aber jetzt weiß ich es ja

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            873
                                            Online

                                            32.0k
                                            Users

                                            80.5k
                                            Topics

                                            1.3m
                                            Posts

                                            3
                                            44
                                            1482
                                            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