Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehlermeldung bei SQLITE Datenbabfrage vermeiden 'NoneType'

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Fehlermeldung bei SQLITE Datenbabfrage vermeiden 'NoneType'

    Ich habe verschiedene Stromzähler, deren Verbräuche ich in einer Logik stundenweise auswerte, um mit Balkendiagramme erstellen zu lassen. Wenn nun aber in der letzten Stunde kein Verbrauch erfolgte, liefert die Datenbankabfrage keinen Wert zurück und dies wirft dann einen Fehler aus:
    PHP-Code:
    sh.strom.pumpe_kuehlung.kwh1h(sh.strom.pumpe_kuehlung.Zaehlerstand()- sh.strom.pumpe_kuehlung.Zaehlerstand.db('max','1h','1h'))
    TypeErrorunsupported operand type(s) for -: 'float' and 'NoneType' 
    ich könnte natürlich jetzt bei jedem Item vorher abfragen, ob ein Wert ausgegeben wird (bzw. ob der Zählerstand älter als eine Stunde ist), ggf. geht es aber auch eleganter?

    #2
    Hast Du hier eine Lösung gefunden?

    Kommentar


      #3
      Seit ihr auf dem Master? nur so als doofe Frage? Mit der 1.3 könntet ihr sowieso auf das Database Plugin wechseln, da analysieren wir im DEV derzeit aber ähnliche Fehler.. daher die Frage

      Kommentar


        #4
        Hallo,
        Sowas ähnliches hatte ich vor langer Zeit auch mal und die Frage hier gestellt. mknx hat drauf hin das sqlite plugin angepasst.
        Irgendwie hat die Ändererung es nicht nach smarthomeNG geschafft.
        Vergleiche _single in

        https://github.com/mknx/smarthome/bl...te/__init__.py

        mit

        https://github.com/smarthomeNG/plugi..._8/__init__.py

        Vielleicht ist es das,

        Michael

        Kommentar


          #5
          hi, ich bin auf 1.2 master und habe sqlite für 2.8 aktiviert.

          wenn ich es richtig sehe, muss Zeile 390-392 mit 374-402 ausgetauscht werden?

          Kommentar


            #6
            habe die Zellen eingefügt, leider taucht der Fehler weiter im Log auf.

            Kommentar


              #7
              Hast Du den cache Ordner des Plugins gelöscht?

              Kommentar


                #8
                habe ich gerade auch probiert - Fehler taucht aber weiter auf

                Kommentar


                  #9
                  Ich verwende die aktuelle Develop-Version (1.4.15bab5a.dev) von SmartHomeNG mit dem Plugin "sqlite_visu2_8" und versuche den Wert vor 24h zu bestimmen:

                  Code:
                  y = self.sh.Wasser.Bezug.Total.db('max','1d','1d')
                  Der Wasserzähler hat leider nur eine Auflösung von 1m3 und so kann es passieren, dass der Wert sich innerhalb von 24h nicht ändert. In diesem Fall liefert die obige Abfrage einen 'NoneType' für die Variable 'y'.

                  Was muss ich machen, damit ich sicher einen Wert erhalte ?

                  Kommentar


                    #10
                    +1

                    Kommentar


                      #11
                      Woher weiss ich denn, ob der letzte Wert ein Wert ist, der wirklich vor 24h war, oder ob einfach seit 24+n Stunden kein neuer Wert geliefert wurde, obwohl sich der Wert signifikant geändert hat. Ich finde es etwas kritisch, hier den letzten Wert zu nehmen. M.E. geht das nur verlässlich, wenn man optional jedes neue Update (auch bei gleichem Wert) in die DB aufnimmt. Ggf. wäre das ein spezieller Feature-Request in Kombi mit den Database Plugin.

                      Kommentar


                        #12
                        Zitat von gama Beitrag anzeigen
                        +1
                        Hallo gama, kannst Du diesen Hinweis etwas ausformulieren ? Ich habe mir natürlich auch überlegt, ob ich dieses Verhalten "überlisten" kann. Wenn aber über einen längeren Zeitraum (z.Bsp. >24h) der Wert sich nicht ändert, werde ich immer wieder das Problem haben, dass in einem gewünschten Zeitraum keine Daten vorhanden sind. Der Wasserzähler wird übrigens alle 5min ausgelesen und gespeichert. Es ist das Datenbank-Plugin, welches diese extreme Datenreduktion macht. Leider fehlt aber eine Funktion, die dann Daten in einer Lücke aus den vorhandenen Werten korrekt interpolieren kann.

                        Kommentar


                          #13
                          Den Wertebereich vorher vergrößern? Also statt '1d' dann '4w'. Du willst je von dem Zähler eh' nur den maximalen Wert.

                          Theoretisch brauchst Du ja nur den letzten eingetragenen Wert vor dem Zeitraum, der Dich interessiert. Vielleicht kann man das in der neuen Database Anbindung mit einbauen...

                          Kommentar


                            #14
                            Vorausgesetzt in diesem Zeitraum ist es ein Wert, der nur zunimmt (wie in meinem Beispiel), wäre eine Vergrösserung des Zeitraums eine gute Idee. Ich teste gerade mit dem Maximum vom Vortag. Vermutlich muss ich aber den Zeitraum in meinem Fall weiter vergrössern.

                            Kommentar


                              #15
                              Habe meinen Wasserwert nun mal genauer untersucht:

                              Code:
                              self.sh.Wasser.Bezug.Total() => 537
                              self.sh.Wasser.Bezug.Total.db('max','10i') => NoneType
                              self.sh.Wasser.Bezug.Total.db('max','2d','1d') => 534
                              Der Wasserwert wird alle 5min neu eingelesen.

                              Dann habe ich einen Dump der Sqlite-Datenbank gemacht und den Wasserwert rausgefiltert. Der letzte Wert im Dump ist:

                              Code:
                              INSERT INTO "num" VALUES(1497654803118,'Wasser.Bezug.Total',172531992,534.0,534.0,534.0,1.0);
                              Der aktuelle Wert '537' ist also noch nicht in der Datenbank und der letzte Eintrag hat den timestamp '1497900336292'. Somit ist der letzte Wasserwert ca. 68h alt.

                              Warum finde ich den neuesten Wert '537' nicht in der Datenbank ?
                              Warum finde ich keine Zwischenwerte zwischen '537' und '534', obwohl ich alle 5min den Wert einlese ? (der Verbrauch ist sicher nicht innert 5min um 3m3 gesprungen)

                              Andere Werte (Temperaturen, Pegel Sickerschacht) werden in kürzeren Zeiten in die Datenbank abgelegt. Also funktioniert die Sache eigentlich schon.

                              Kommentar

                              Lädt...
                              X