Ankündigung

Einklappen
Keine Ankündigung bisher.

Python 3.2 Migration in develop bzw. 1.0 Release

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

    Hallo Marcus

    ich habe gerade mal die aktuellen plugins gezogen und bekomme folgendes

    Code:
    2013-10-20 14:00:17,977 DEBUG    Main         WebSocket: incoming connection from 192.168.120.123:60564 to 0.0.0.0:2424 -- connection.py:accept:187
    2013-10-20 14:00:18,342 DEBUG    Main         192.168.120.123:60564 sent '{"cmd":"proto","ver":2}' -- __init__.py:json_parse:263
    2013-10-20 14:00:18,343 WARNING  Main         WebSocket: protocol mismatch. Update your client: 192.168.120.123:60564 -- __init__.py:json_parse:343
    2013-10-20 14:00:18,347 DEBUG    Main         192.168.120.123:60564 sent '{"cmd":"monitor","items":["WP.Temp_Vorlauf","WP.A_ZP","WP.A_VD1","WP.A_VD2","WP.A_Ventilator","WP.Temp_Aussen","WP.L_Status_Str","WP.Temp_HK1_soll","WP.Temp_Ruecklauf","WP.A_ZUP","WP.Temp_HK2_soll","WP.Temp_HK2","WP.A_HK2_P","WP.A_HK2_Mischer_Auf","WP.A_HK2_Mischer_Zu","WP.Temp_HK3_soll","WP.Temp_HK3","WP.Temp_WW","WP.A_HK3_Mischer_Auf","WP.A_HK3_Mischer_Zu","WP.A_Flanschh","WP.Z_BSVD1","WP.Z_BSVEN","WP.Z_BSHUP","WP.Z_WMZ_H","WP.Stoerung_Lastk","WP.Stoerung_Prim","WP.P_Segment","WP.Z_WPA_H","WP.A_Stoerung","WP.Z_ABT_RI","WP.Z_ABT_RK","WP.Z_SP_WERT","WP.Z_Statwert","WP.Z_HSWStatus","WS.Kombi_Temp","WS.Kombi_Hum","WS.Kombi_Wind","WS.Kombi_Wippen","WS.Kombi_Regen_hour","WS.Buero_Temp","WS.Bad_Temp","WS.Buero_Hum","WS.Bad_Hum","WP.L_LiveTime"]}' -- __init__.py:json_parse:263
    2013-10-20 14:00:18,359 DEBUG    Main         192.168.120.123:60564 sent '{"cmd":"series","item":"WP.Temp_Vorlauf","series":"avg","start":"1d"}' -- __init__.py:json_parse:263
    2013-10-20 14:00:18,364 ERROR    Main         Problem fetching series for WP.Temp_Vorlauf: unsupported operand type(s) for /: 'NoneType' and 'int' -- __init__.py:json_parse:312
    Traceback (most recent call last):
      File "/usr/smarthome/plugins/visu/__init__.py", line 310, in json_parse
        reply = self.items[path].series(series, start, end)
      File "/usr/smarthome/plugins/sqlite/__init__.py", line 287, in _series
        step = int(step / 1000)
    TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'
    hat sich da was geändert ?

    Hab den Stand vor deinen Änderungen am sqlite und visu plugin ausgescheckt und kommt kein fehler.

    grüße ronny

    Kommentar


      Hi!

      Jemand (ich glaube Mirko oder Hendrik?) hatte sich die Tage schon ein "last_value" bei den Items gewünscht. Heute hatte ich jüngst auch den Wunsch nach so etwas:

      Meine Wärmepumpe bestimmt den korrekten Rücklaufwert nur wenn die Umwälzpumpe läuft (bzw. gerade gelaufen ist). Der Pumpenzustand und die "rohe" Rücklauftemperatur sind in Modbus-Register encodiert. Um jetzt elegant ohne Logik das zu erschlagen möchte ich jetzt einfach ein drittes Item mit eval benutzen:

      (pseudo)
      eval_trigger = Pumpenzustand
      eval = sh.temp_raw() if ((sh.Pumpenzustand = 0) and (sh.Pumpenzustand.last_value = 4)) else self()

      Zudem Vorschlag last_age() nur on-demand zu berechnen, analog zu age(). Verhindert Inkonsistenzen und der gesparte Speicher/gesparte Rechenleistung kann für last_value() benutzt werden. ;-)

      PHP-Code:
      diff --git a/lib/item.py b/lib/item.py
      index 2521a89
      ..f86ca2e 100755
      --- a/lib/item.py
      +++ b/lib/item.py
      @@ -256,+256,@@ class Item():
               
      except:
                   
      logger.error("Item {}: value {} does not match type {}.".format(self._pathself._valueself._type))
                   
      raise
      +        self.__last_value self._value
               
      #############################################################
               # Crontab/Cycle
               #############################################################
      @@ -350,+351,@@ class Item():
               if 
      value != self._value:
                   
      _changed True
                   self
      ._value value
      -            self.__prev_age = (self._sh.now() - self.__last_change).total_seconds()
                   
      self.__prev_change self.__last_change
                   self
      .__last_change self._sh.now()
      +            
      self.__last_value self._value
                   self
      .__changed_by "{0}:{1}".format(callersource)
                   if 
      caller != "fader":
                       
      self._fading False
      @@ -420,11 +421,15 @@ class Item():
               return 
      self.__last_update

           def prev_age
      (self):
      -        return 
      self.__prev_age
      +        delta self.__last_change self.__prev_change
      +        return delta.total_seconds()

           
      def prev_change(self):
               return 
      self.__prev_change

      +    def last_value(self):
      +        return 
      self.__last_value
      +
           
      def return_children(self): 
      Grüße
      Robert

      Kommentar


        Hallo Ronny,

        ja sorry, da habe ich gestern Nacht noch etwas geändert.

        Ist gefixed.

        Bis bald

        Marcus

        Kommentar


          Zitat von mknx Beitrag anzeigen
          Hallo Ronny,

          ja sorry, da habe ich gestern Nacht noch etwas geändert.

          Ist gefixed.

          Bis bald

          Marcus
          OK Danke für die Info, dachte das ich schon wieder was übersehen hatte.

          Grüße Ronny

          Kommentar


            Hi Niko, Hi Robert,
            Zitat von 2ndsky Beitrag anzeigen
            Als kleine Anregung, wie wäre es noch mit last_value() für den letzten Wert?
            es gibt jetzt die Methode prev_value() die den vorletzten Werte zurück gibt. Der letzte/aktuelle Wert steht ja bereits mit Item() zur Verfügung.

            Bis bald

            Marcus

            Kommentar


              Hi Hendrik,

              Zitat von henfri Beitrag anzeigen
              ich denke, das hier ist noch ein Bug:
              Code:
              2013-10-19 10:47:15 ERROR    1w-disc      no payload for /bus.0/26.7ED96B010000/pages/page.3
              ausnahmsweise war es kein Bug, sonder nur zu viel Output der verwirrt. Ich habe den Output reduziert/angepasst. Es erscheint eine Warning das etwas mit dem Sensor nicht passt.

              Bis bald

              Marcus

              Kommentar


                Zitat von mknx Beitrag anzeigen
                es gibt jetzt die Methode prev_value() die den vorletzten Werte zurück gibt. Der letzte/aktuelle Wert steht ja bereits mit Item() zur Verfügung.
                So wars eigentlich gemeint. *thumbs_up*
                Mit freundlichen Grüßen
                Niko Will

                Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                Kommentar


                  "prev_", "last_", "veryverylast_", "theonebeforeprev_" - ich bin mit allem glücklich was mein Diff reduziert. :-)

                  In meinem Patch war natürlich noch der Fehler, last/prev_value nach dem eigentlichen Update zu kopieren... Wollte nur gucken ob du auch aufpasst. ;-)

                  So sieht dann eine flankenabhängige Torfunktion aus:
                  eval_trigger = Waermepumpe.DOBuffer
                  eval = sh.Waermepumpe.Waermetauscher.Eingang() if ((sh.Waermepumpe.DOBuffer.prev_value() == 4) and (sh.Waermepumpe.DOBuffer() == 0)) else self()
                  Frage/Vorschlag in diesem Kontext: Wenn ich "else self()" weglasse, würde es momentan eine Warning geben. Könnte man das ganze Exception-abhängig so bauen, dass man das ohne Warnung weglassen kann? "except ValueError: pass" oder so...

                  Sicher, dass du "prev_age" jedes mal berechnen möchtest? Schätze mal das wird von 1000 Items nur von einem aufgerufen.

                  Ach so: Ich glaube wenn ein Item existiert, aber (noch) keine History dafür existiert, dann liefert "Series" was zurück, was smartVISU 2.6 veranlasst, den Plot gar nicht zu zeichnen. Gibt es dafür eine elegante Lösung?

                  Grüße
                  Robert

                  Kommentar


                    Hi Robert,

                    Zitat von Robert Beitrag anzeigen
                    PHP-Code:
                            eval_trigger Waermepumpe.DOBuffer
                            
                    eval = sh.Waermepumpe.Waermetauscher.Eingang() if ((sh.Waermepumpe.DOBuffer.prev_value() == 4) and (sh.Waermepumpe.DOBuffer() == 0)) else self() 
                    Frage in diesem Context: WAs passiert jetzt, wenn ich "else self()" weglassen würde? Könnte man das ganze so bauen, dass man das ohne Fehler weglassen kann? Weiß nicht was eval zurückliefern würde, evtl. ginge eine Exception-abhängige Geschichte, die alles andere nach wie vor bemäkeln würde.
                    Wenn das eval nichts zurück liefert, dann ist das None. Ich habe gerade Code eingecheckt für den Fall. Wenn None, dann wird kein Update durchgeführt.

                    Zitat von Robert Beitrag anzeigen
                    Ach so: Ich glaube wenn ein Item existiert, aber (noch) keine History dafür existiert, dann liefert "Series" was zurück, was smartVISU 2.6 veranlasst, den Plot gar nicht zu zeichnen. Gibt es dafür eine elegante Lösung?
                    Sicher? Ich habe das die Tage aufgeräumt, er bekommt nichts mehr zurück.

                    Bis bald

                    Marcus

                    Kommentar


                      Zitat von mknx Beitrag anzeigen
                      Wenn das eval nichts zurück liefert, dann ist das None. Ich habe gerade Code eingecheckt für den Fall. Wenn None, dann wird kein Update durchgeführt.
                      Merci. Denke dass ist generell für so Torfunktionen hilfreich.

                      ABER: Wie erstellst du deine Beiträge? Guck mal, ich hatte obigen Post um 17:45 noch mal präzisiert, weil ich nach einem schnellen Blick in den Code vermutet hatte, das eine selektive Abfange der Exception eine Möglichkeit wäre. Kopierst du die alten Sachen mühevoll aus der Mitteilungsemail? Dann muss ich mir das Editieren abgewöhnen (wenngleich ich das übersichtlicher finde und auf meinen Post-Counter pfeife...)

                      Zitat von mknx Beitrag anzeigen
                      Sicher? Ich habe das die Tage aufgeräumt, er bekommt nichts mehr zurück
                      Hm, präzisiere "Tage". Ist mir "die Tage" *g* aufgefallen als ich mit dem obigen eval-Sachen rumgespielt habe. Ich behalte es im Auge!

                      Viele Grüße
                      Robert

                      Kommentar


                        Hallo,

                        ich hab hier noch drei:
                        Code:
                        sh.Allgemein.Stromzaehler.Zaehlerstand()- sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '1i'))*60.0*1000.0:
                        Ergibt:
                        Code:
                        unsupported operand type(s) for -: 'float' and 'NoneType'
                        Und (unabhängig):
                        Code:
                        2013-10-21 02:43:15 WARNING  Main         KNX: Wrong payload '115e' for ga '6/5/1' with dpt '5.001'.
                        (Mir fällt gerade ein: Müsste dpt 5 (ohne .001) sein, oder? Ich meine das Item kommt aus 2ndsky Export-Skript, bin aber nicht sicher.

                        Und noch einen:
                        Code:
                        2013-10-21 00:00:02 WARNING  Allgemein.Lampen.FlurEingang.Verbrauch_self Item Allgemein.Lampen.FlurEingang.Verbrauch_self: problem evaluating sh.Allgemein.Lampen.FlurEingang.Verbrauch_self()+self._parent.Dimmwert()/255*self._parent.Leistung()*self._parent.Dimmwert.age()/60.0/60.0: 'Item' object has no attribute '_parent'
                        Warum gibt's _parent nimmer?

                        Gruß,
                        Hendrik

                        Kommentar


                          Zitat von henfri Beitrag anzeigen
                          Hallo,

                          ich hab hier noch drei:

                          Gruß,
                          Hendrik
                          Vorsicht, gleich kommt Marcus mit der Keule. Zumindest die beiden unteren sind ja keine Bugs...

                          Item: Na, müsstest halt mal schaun, was du da eingetragen hast. Vielleicht ist es auch ein DPT 9?

                          _parent: War ja "privat" würde Marcus sagen. *g* Ist jetzt "__parent" (zwei Unterstriche - und damit noch viel viel böser). Dafür gibt es jetzt offiziell und public ".return_parent()".

                          Datenbank: kein Plan. Mit der bin ich auch noch über Kreuz. Werd wohl zu rrdtool zurück wechseln (müssen).

                          Kommentar


                            Hi Robert,

                            Zitat von Robert Beitrag anzeigen
                            ABER: Wie erstellst du deine Beiträge? Guck mal, ich hatte obigen Post um 17:45 noch mal präzisiert, weil ich nach einem schnellen Blick in den Code vermutet hatte, das eine selektive Abfange der Exception eine Möglichkeit wäre. Kopierst du die alten Sachen mühevoll aus der Mitteilungsemail? Dann muss ich mir das Editieren abgewöhnen (wenngleich ich das übersichtlicher finde und auf meinen Post-Counter pfeife...)
                            ich habe unterwegs angefangen zu antworten und es erst zu Haus losgeschickt.

                            Bis bald

                            Marcus

                            Kommentar


                              Hi Hendrik,

                              es sind alles drei keine Bugs auf SH.py Seite. Das sind Probleme auf Deiner Seite.
                              Vllt. würde es Dir helfen Logiken zu schreiben, anstelle alles in ein eval zu quetschen.

                              _ und __variablen sind ein NoGo. Da bist Du auf Dich alleine gestellt. Ach ja, return_parent() gibt es schon sehr lange.

                              Bis bald

                              Marcus

                              Kommentar


                                Zitat von mknx Beitrag anzeigen
                                ausnahmsweise war es kein Bug,
                                Hm, auch das folgende
                                Code:
                                Traceback (most recent call last):
                                  File "/usr/local/smarthome/plugins/onewire/__init__.py", line 181, in identify_sensor
                                    page3 = self.read(path + 'pages/page.3')  # .encode('hex').upper()
                                  File "/usr/local/smarthome/plugins/onewire/__init__.py", line 75, in read
                                    return self._request(path, cmd=2)
                                  File "/usr/local/smarthome/plugins/onewire/__init__.py", line 145, in _request
                                    raise owex('no payload for {0}'.format(path))
                                plugins.onewire.owex: no payload for /bus.0/26.7ED96B010000/pages/page.3
                                ??

                                Gruß,
                                Hendrik

                                Kommentar

                                Lädt...
                                X