Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Wo nimmt der SQL-Adapter die Datentypen her?

    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

    Wo nimmt der SQL-Adapter die Datentypen her?

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

      Hallo,

      ich habe das Problem dass mir der SQL-Adapter Variablen als String in die Db speichert die m.E. eindeutig als Zahl definiert sind. Das ist schlecht, da Flot etc. dann bei Auswertungen schimpft, dass diese Werte (verständlicherweise) nicht aggregiert werden können. Ich habe jetzt zum testen extra mal eine neue Db angelegt.

      Hier die Einstellungen einer Variablen die fehlerhaft übernommen wird:

      {
        "common": {
          "name": "GrillDuino01/TemperaturLuft",
          "role": "variable",
          "desc": "mqtt server variable",
          "type": "number",
          "write": true,
          "read": true,
          "history": {
            "sql.0": {
              "enabled": true,
              "changesOnly": true,
              "debounce": 10000,
              "retention": 31536000
            }
          }
        },
        "native": {
          "topic": "GrillDuino01/TemperaturLuft"
        },
        "acl": {
          "object": 1638,
          "owner": "system.user.admin",
          "ownerGroup": "system.group.administrator",
          "state": 1638
        },
        "_id": "mqtt.0.GrillDuino01.TemperaturLuft",
        "type": "state"
      }
      

      und hier eine die richtig übernommen wird:

      {
        "common": {
          "name": "GrillDuino01/TemperaturBack1",
          "write": true,
          "read": true,
          "role": "variable",
          "desc": "mqtt server variable",
          "type": "number",
          "history": {
            "sql.0": {
              "enabled": true,
              "changesOnly": true,
              "debounce": 1000,
              "retention": 31536000
            }
          }
        },
        "native": {
          "topic": "GrillDuino01/TemperaturBack1"
        },
        "type": "state",
        "_id": "mqtt.0.GrillDuino01.TemperaturBack1",
        "acl": {
          "object": 1638,
          "state": 1638
        }
      }
      

      Ich kann jetzt nichts erkennen wo das Problem sein könnte - sind ja beide als type:number definiert. In der Db erscheints aber so:
      250_datentypen.png

      Wie muss ich denn tun, um aus dem DP vom type:number auch wirklich einen Zahlenwert zu machen?

      Danke und Gruß

      Thilo

      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        @Thisoft:

        Hallo,

        ich habe das Problem dass mir der SQL-Adapter Variablen als String in die Db speichert die m.E. eindeutig als Zahl definiert sind. Das ist schlecht, da Flot etc. dann bei Auswertungen schimpft, dass diese Werte (verständlicherweise) nicht aggregiert werden können. Ich habe jetzt zum testen extra mal eine neue Db angelegt.

        Hier die Einstellungen einer Variablen die fehlerhaft übernommen wird:

        {
          "common": {
            "name": "GrillDuino01/TemperaturLuft",
            "role": "variable",
            "desc": "mqtt server variable",
            "type": "number",
            "write": true,
            "read": true,
            "history": {
              "sql.0": {
                "enabled": true,
                "changesOnly": true,
                "debounce": 10000,
                "retention": 31536000
              }
            }
          },
          "native": {
            "topic": "GrillDuino01/TemperaturLuft"
          },
          "acl": {
            "object": 1638,
            "owner": "system.user.admin",
            "ownerGroup": "system.group.administrator",
            "state": 1638
          },
          "_id": "mqtt.0.GrillDuino01.TemperaturLuft",
          "type": "state"
        }
        

        und hier eine die richtig übernommen wird:

        {
          "common": {
            "name": "GrillDuino01/TemperaturBack1",
            "write": true,
            "read": true,
            "role": "variable",
            "desc": "mqtt server variable",
            "type": "number",
            "history": {
              "sql.0": {
                "enabled": true,
                "changesOnly": true,
                "debounce": 1000,
                "retention": 31536000
              }
            }
          },
          "native": {
            "topic": "GrillDuino01/TemperaturBack1"
          },
          "type": "state",
          "_id": "mqtt.0.GrillDuino01.TemperaturBack1",
          "acl": {
            "object": 1638,
            "state": 1638
          }
        }
        

        Ich kann jetzt nichts erkennen wo das Problem sein könnte - sind ja beide als type:number definiert. In der Db erscheints aber so:
        filename="Datentypen.PNG" index="0">~~

        Wie muss ich denn tun, um aus dem DP vom type:number auch wirklich einen Zahlenwert zu machen?

        Danke und Gruß

        Thilo `
        Diese Zeile ist für Entscheidung verantwortlich:

        https://github.com/ioBroker/ioBroker.sq … in.js#L692

        Before aber entschieden wird, wird noch mal versucht das Wert umzuwandeln:

        https://github.com/ioBroker/ioBroker.sq ... in.js#L557

        Jetzt ist meine Frage: Was wird geschrieben, dass````
        parseFloat(x) != x

        1 Reply Last reply Reply Quote 0
        • Thisoft
          Thisoft last edited by

          Hallo Bluefox,

          Danke für die schnelle Antwort.

          Hier hab ich was geloggt was die Sache erklärt - zumindest den 2. Teil:

          sql-0 2016-07-17 14:54:12.759 warn Type of "mqtt.0.GrillDuino01.TemperaturLuft" is "string"  
          sql-0 2016-07-17 14:54:12.759 warn parseFloat of "[object Object]": 20.1 // val is:"20.10  
          sql-0 2016-07-17 14:54:12.759 warn Type of "mqtt.0.GrillDuino01.Luftfeuchte" is "string"  
          sql-0 2016-07-17 14:54:12.759 warn parseFloat of "[object Object]": 97.1 // val is:"97.10  
          
          

          Allerdings ist IMO die hauptsächliche Frage:

          Wieso ist "types[typeof state.val]" eben nicht number sondern string??

          Gruß Thilo

          1 Reply Last reply Reply Quote 0
          • Bluefox
            Bluefox last edited by

            OK. Jetzt verstehe ich. "20.10" ist nach parseFloat "20.1" und deswegen pass nicht.

            1 Reply Last reply Reply Quote 0
            • Thisoft
              Thisoft last edited by

              Wenn ich Zeile 559 ändere wie folgt funktioniert die Sache:

                          //if (f.toString() == sqlDPs[_id].state.val) {
                         if (f == parseFloat(sqlDPs[_id].state.val)) {
              

              Hättest Du dagegegen Einwände?

              Trotzdem bleibt die eigentliche Frage: Warum wird der Datentyp nicht vom Typ des Datenpunkts vererbt?

              Gruß Thilo

              1 Reply Last reply Reply Quote 0
              • Bluefox
                Bluefox last edited by

                @Thisoft:

                Wenn ich Zeile 559 ändere wie folgt funktioniert die Sache:

                            //if (f.toString() == sqlDPs[_id].state.val) {
                           if (f == parseFloat(sqlDPs[_id].state.val)) {
                

                Hättest Du dagegegen Einwände?

                Trotzdem bleibt die eigentliche Frage: Warum wird der Datentyp nicht vom Typ des Datenpunkts vererbt?

                Gruß Thilo Dein Kode funktioniert nicht. > Trotzdem bleibt die eigentliche Frage: Warum wird der Datentyp nicht vom Typ des Datenpunkts vererbt? `
                Weil die Leute es nicht pflegen. Und ich habe Gegenfrage: warum obwohl gesagt war, dass es ein Number ist wird trotzdem string geschrieben?

                1 Reply Last reply Reply Quote 0
                • Thisoft
                  Thisoft last edited by

                  Ja, Sorry - mein Vorschlag war Unsinn.

                  Aber so würde es funktionieren (und vermutlich auch etwas Sinn ergeben 😉 )

                  if (!isNaN(sqlDPs[_id].state.val))
                  

                  ` > Trotzdem bleibt die eigentliche Frage: Warum wird der Datentyp nicht vom Typ des Datenpunkts vererbt?

                  Weil die Leute es nicht pflegen. Und ich habe Gegenfrage: warum obwohl gesagt war, dass es ein Number ist wird trotzdem string geschrieben? `

                  Deine Gegenfrage ist ja meine eigentliche Hauptfrage vom Anfang:

                  Warum ist

                  typeof sqlDPs[_id].state.val
                  ````im Adapter = 'string' obwohl doch der DAtenpunkt eindeutig type:number ist (siehe mein 1.Posting)? Ich hatte gehofft, dass Du diese Frage besser beantworten kannst als ich ;)
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    Wenn common.type = "number" deklariert es, bedeutet es nicht, dass state.val auch einen Wert vom Typ "number" enthält. Man kann auch einen String in den Datenpunkt schreiben, denn es erfolgt keine Typprüfung - nur der JS-Adapter liefert neuerdings eine Warnung.

                    1 Reply Last reply Reply Quote 0
                    • Thisoft
                      Thisoft last edited by

                      Achso - jetzt verstehe ich. Aus irgend einem Grund ist ioBroker wohl mit meinem Wert den ich (über MQTT-Adapter) für den Datenpunkt liefere nicht so recht zufrieden und schreibt dann einfach einen String in den als Number definierten DP - richtig?

                      Wenn das wirklich so ist - brrrr einfach grauslich diese ganzen impliziten Typkonvertierungen die sich Javascript da selbständig ausdenkt. Ich hatte ja anfangs gehofft, dass Javascript und ich doch noch Freunde werden, aber leider erhält diese Freundschaft immer wieder schmerzhafte Fußtritte 😉

                      Dann vermute ich als Erstes, dass ich Komma und Punkt in den Dezimalwerten austauschen muss…

                      Trotzdem Vielen Dank für Eure Hilfe.

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

                        @Thisoft:

                        Aus irgend einem Grund ist ioBroker wohl mit meinem Wert den ich (über MQTT-Adapter) für den Datenpunkt liefere nicht so recht zufrieden und schreibt dann einfach einen String in den als Number definierten DP - richtig? `
                        Da es sich um Datenpunkte des MQTT-Adapters handelt, ist wohl der Adapter oder die eigentliche Quelle Ursache für den Typ "string".

                        1 Reply Last reply Reply Quote 0
                        • Thisoft
                          Thisoft last edited by

                          Ja, wie gesagt. Ich gehe davon aus dass da über MQTT das "falsche" Dezimaltrennzeichen ankommt weil es nur bei den DP's passiert wo Dezimalwerte übertragen werden. Muss ich mir anschauen wenn ich wieder zuhause bin.

                          Aber um auf den Einwand von Bluefox dass "die Leute es nicht pflegen" zurückzukommen. Die Aussage ist sicherlich berechtigt, da ein "Nichtprogrammierer" vermutlich gar nicht wirklich weiß was er da pflegen soll. Und für Leute wie mich die eben andere Programmiersprachen gewohnt sind ist es auch nicht so einfach etwas zu pflegen wenn man keine Information bekommt dass was falsch läuft und stattdessen Javascript selbständig was zusammenmurkst was nicht zusammengehört. Woher soll ich eigentlich wissen, welches Dezimaltrennzeichen hier z.B. erwartet wird damit alles korrekt erkannt wird - das aus den Systemeinstellungen auf dem ioBroker-Host? oder ganz allgemein das englisch/amerikanische? oder ist das eine JS-Grundeinstellung? Noch schlimmer wird's dann mit Datums-/Zeitformaten…

                          Nix für ungut - vielleicht wäre es ja überlegenswert für zukünftige Verbesserungen in ioBroker die lobenswerter Weise in den JS-Adapter eingebaute Typprüfung systemweit auszubauen. Der Bedarf bzw. Sinn wurde ja offensichtlich bereits erkannt 😉

                          Viele Grüße

                          Thilo

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

                            @Thisoft:

                            vielleicht wäre es ja überlegenswert für zukünftige Verbesserungen in ioBroker die lobenswerter Weise in den JS-Adapter eingebaute Typprüfung systemweit auszubauen. `
                            Das hatte ich bereits per http://iobroker.net:8000/projects/CONTROLLER/issues/CONTROLLER-7?filter=allopenissues vorgeschlagen, scheint aber Probleme bei der Umsetzung zu machen.

                            1 Reply Last reply Reply Quote 0
                            • Bluefox
                              Bluefox last edited by

                              > Nichtprogrammierer" vermutlich gar nicht wirklich weiß was er da pflegen soll
                              Die Verantwortung liegt an der Adapter-Entwickler und das kann schlecht "Nichtprogrammierer" sein 🙂

                              Übrigens wer ist da für MQTT verantwortlich?…

                              Schande, wieder ich. 😮

                              Keine Panik. Ich kriege das hin:

                               `var _val = val.replace(',', '.').replace(/^\+/, '');
                              
                              if (_val.indexOf('.') !== -1) {
                              	var i = _val.length - 1;
                              	while (_val[i] === '0') i--;
                              	if (_val[i] === '0') _val = _val.substring(0, i + 1);
                              }
                              
                              if (parseFloat(_val) == _val)...`[/i][/i]
                              
                              1 Reply Last reply Reply Quote 0
                              • Thisoft
                                Thisoft last edited by

                                Hallo Bluefox,

                                da habe ich nun versucht, lang und breit diplomatisch darum herumzureden wer für das Problem verantwortlich ist. Und jetzt kommst Du und sagst einfach Du wärst der Schuldige :lol:

                                Es sieht wohl so aus, dass das wirklich im MQTT-Adapter gefixt werden muss. Soweit mir bekannt ist werden ja die MQTT-Topics generell als String verschickt, so dass dann der MQTT-Adapter erst wieder die Zahlenwerte "herausfischen" muss. Was ja offensichtlich bei Ganzzahlen auch funktioniert, nur die Floats erkennt er eben noch nicht als Zahlenwert.

                                Aber ich bin auch zuversichtlich dass Du das hinbekommst 😉

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

                                  Da offenbar niemand als Adapter-Entwickler perfekt ist, halte ich es für sinnvoll, den js-controller soweit rund zu machen (Typprüfung / Min-, Max-Korrektur bei Typ "numbers"), dass man bei der Adapter-Entwicklung auf mögliche Fehler per Warnung hingewiesen wird und sich so entsprechende Fehler leichter vermeiden lassen.

                                  1 Reply Last reply Reply Quote 0
                                  • Bluefox
                                    Bluefox last edited by

                                    @Thisoft:

                                    Hallo Bluefox,

                                    da habe ich nun versucht, lang und breit diplomatisch darum herumzureden wer für das Problem verantwortlich ist. Und jetzt kommst Du und sagst einfach Du wärst der Schuldige :lol:

                                    Es sieht wohl so aus, dass das wirklich im MQTT-Adapter gefixt werden muss. Soweit mir bekannt ist werden ja die MQTT-Topics generell als String verschickt, so dass dann der MQTT-Adapter erst wieder die Zahlenwerte "herausfischen" muss. Was ja offensichtlich bei Ganzzahlen auch funktioniert, nur die Floats erkennt er eben noch nicht als Zahlenwert.

                                    Aber ich bin auch zuversichtlich dass Du das hinbekommst 😉 `
                                    Kannst du vom git die Version ausprobieren?

                                    1 Reply Last reply Reply Quote 0
                                    • Thisoft
                                      Thisoft last edited by

                                      Habe ausprobiert. Sieht gut aus:

                                      mqtt.0 2016-07-19 23:03:51.209 debug mqtt.0 Send to client [GrillDuino01] "GrillDuino01/Licht": 72 
                                      mqtt.0 2016-07-19 23:03:51.209 debug mqtt.0 onStateChange mqtt.0.GrillDuino01.Licht: {"val":72,"ack":true,"ts":1468962231193,"q":0,"from":"system.adapter.mqtt.0","lc":1468962180849} 
                                      mqtt.0 2016-07-19 23:03:51.209 debug mqtt.0 stateChange mqtt.0.GrillDuino01.Licht: {"val":72,"ack":true,"ts":1468962231193,"q":0,"from":"system.adapter.mqtt.0","lc":1468962180849} 
                                      mqtt.0 2016-07-19 23:03:51.209 debug inMem message *Grill* mqtt.0.GrillDuino01.Licht 
                                      mqtt.0 2016-07-19 23:03:51.177 debug mqtt.0 Send to client [GrillDuino01] "GrillDuino01/TemperaturBack2": 7 
                                      mqtt.0 2016-07-19 23:03:51.177 debug mqtt.0 onStateChange mqtt.0.GrillDuino01.TemperaturBack2: {"val":7,"ack":true,"ts":1468962231162,"q":0,"from":"system.adapter.mqtt.0","lc":1468962231162} 
                                      mqtt.0 2016-07-19 23:03:51.177 debug mqtt.0 stateChange mqtt.0.GrillDuino01.TemperaturBack2: {"val":7,"ack":true,"ts":1468962231162,"q":0,"from":"system.adapter.mqtt.0","lc":1468962231162} 
                                      mqtt.0 2016-07-19 23:03:51.177 debug inMem message *Grill* mqtt.0.GrillDuino01.TemperaturBack2 
                                      mqtt.0 2016-07-19 23:03:51.177 debug mqtt.0 Server received "GrillDuino01/Licht" (number): 72 
                                      mqtt.0 2016-07-19 23:03:51.177 debug mqtt.0 Send to client [GrillDuino01] "GrillDuino01/TemperaturBack1": 9 
                                      mqtt.0 2016-07-19 23:03:51.146 debug mqtt.0 onStateChange mqtt.0.GrillDuino01.TemperaturBack1: {"val":9,"ack":true,"ts":1468962231115,"q":0,"from":"system.adapter.mqtt.0","lc":1468962210959} 
                                      mqtt.0 2016-07-19 23:03:51.146 debug mqtt.0 stateChange mqtt.0.GrillDuino01.TemperaturBack1: {"val":9,"ack":true,"ts":1468962231115,"q":0,"from":"system.adapter.mqtt.0","lc":1468962210959} 
                                      mqtt.0 2016-07-19 23:03:51.146 debug mqtt.0 Server received "GrillDuino01/TemperaturBack2" (number): 7 
                                      mqtt.0 2016-07-19 23:03:51.146 debug inMem message *Grill* mqtt.0.GrillDuino01.TemperaturBack1 
                                      mqtt.0 2016-07-19 23:03:51.131 debug mqtt.0 stateChange mqtt.0.GrillDuino01.TemperaturLuft: {"val":15.8,"ack":true,"ts":1468962231099,"q":0,"from":"system.adapter.mqtt.0","lc":1468962200865} 
                                      mqtt.0 2016-07-19 23:03:51.131 debug inMem message *Grill* mqtt.0.GrillDuino01.TemperaturLuft 
                                      mqtt.0 2016-07-19 23:03:51.131 debug mqtt.0 Send to client [GrillDuino01] "GrillDuino01/Luftfeuchte": 94.3 
                                      mqtt.0 2016-07-19 23:03:51.131 debug mqtt.0 onStateChange mqtt.0.GrillDuino01.Luftfeuchte: {"val":94.3,"ack":true,"ts":1468962231099,"q":0,"from":"system.adapter.mqtt.0","lc":1468962221006} 
                                      mqtt.0 2016-07-19 23:03:51.131 debug mqtt.0 stateChange mqtt.0.GrillDuino01.Luftfeuchte: {"val":94.3,"ack":true,"ts":1468962231099,"q":0,"from":"system.adapter.mqtt.0","lc":1468962221006} 
                                      mqtt.0 2016-07-19 23:03:51.131 debug inMem message *Grill* mqtt.0.GrillDuino01.Luftfeuchte 
                                      mqtt.0 2016-07-19 23:03:51.131 debug mqtt.0 Server received "GrillDuino01/TemperaturBack1" (number): 9 
                                      mqtt.0 2016-07-19 23:03:51.131 debug mqtt.0 Server received "GrillDuino01/TemperaturLuft" (number): 15.8 
                                      mqtt.0 2016-07-19 23:03:51.115 debug mqtt.0 Server received "GrillDuino01/Luftfeuchte" (number): 94.3 
                                      
                                      

                                      Vielen Dank.

                                      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

                                      31.9k
                                      Users

                                      80.3k
                                      Topics

                                      1.3m
                                      Posts

                                      3
                                      17
                                      1300
                                      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