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

  • Robert
    antwortet
    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

    Einen Kommentar schreiben:


  • stromie
    antwortet
    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

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hi Marcus,

    Zitat von mknx Beitrag anzeigen
    vielen Dank. Das hat mir echt geholfen.
    Schön. Da hatte ich beim Posten meine Zweifel (mir hätte es nicht geholfen ;-)

    Der Onewire-Bug ist noch offen. Was ist denn 26.7ED96B010000 für ein Sensor? Also Hersteller und Typ.
    Hersteller ist einfach: ElabNet.
    Typ muss ich nachsehen...:
    Ah, das ist ein BMS, bei dem -dank der Litze die am Busmaster hängt- wohl die 5V abgegangen sind. Das CommunityGate Web-IF sagt: 0V und Error bei den Werten.

    Anbei mal die Seite aus dem Web-IF und der Inthalt des Verzeichnisses im ow-fuse (wobei es da Lesefehler gab, als ich die tar.gz (.zip bitte ignorieren, das ist nur um die Foren-SW auszutricksen) erstellt habe)

    Gruß,
    Hendrik
    Angehängte Dateien

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo Hendrik,

    vielen Dank. Das hat mir echt geholfen.

    Der Onewire-Bug ist noch offen. Was ist denn 26.7ED96B010000 für ein Sensor? Also Hersteller und Typ.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hallo,

    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
    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
    und:
    Code:
    2013-10-19 12:02:48 ERROR    Main         Connections: local variable 'reply' referenced before assignment
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/connection.py", line 108, in poll
        con._in()
      File "/usr/local/smarthome/lib/connection.py", line 240, in _in
        self.found_terminator(data)
      File "/usr/local/smarthome/plugins/visu/__init__.py", line 410, in rfc6455_parse
        self.json_parse(payload.decode())
      File "/usr/local/smarthome/plugins/visu/__init__.py", line 313, in json_parse
        if 'update' in reply:
    UnboundLocalError: local variable 'reply' referenced before assignment
    Gruß,
    Hendrik
    Angehängte Dateien

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hi Mike,

    danke für Deinen Patch. Es sollte jetzt funktionieren.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • mike
    antwortet
    Hi Marcus,

    danke für das Fade. Ich nutze das übrigens am häufigsten für Countdown-Timer.

    Ich habe noch ein paar Probleme in lib/item.py entdeckt. Alles im Zusammenhang mit eval/eval_trigger. Ich habe einen Patch angehangen ...

    Grüße
    Mike
    Angehängte Dateien

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hi Robert,

    Zitat von Robert Beitrag anzeigen
    Die Daten des Kombisensor stehen bei mir alle auf "cache = true", da sonst wenn die einzelnen Messwerte eintrudeln fehlerhafte Ergebnisse berechnet werden (daher auch mein Wunsch sowas detektieren zu können um ein Eval erst starten zu lassen, wenn alle Werte "geupdated" wurden - nur als Randbemerkung!).
    ein Item erst triggern zu lassen, wenn es wirklich das erste mal geändert wird, ist denkbar.
    Aber bei das eval erst durchführen zu lassen, wenn alle verwendetetn Items geändert worden sind, dafür fehlt mir ein Konzept. Ich denke das ist auch nicht immer gewünscht. Das hängt halt start vom eval ab.
    Hast Du einen Vorschlag oder Patch?

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hi Robert,

    danke für den Fix. Ist integriert.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • Robert
    antwortet
    Hi Marcus,

    beim Wiederherstellen von __last_change wird bei gecacheten Items ein "offset-naive" datetime verwendet, der dann in Kombination mit _sh_now() crasht:

    Code:
    2013-10-18 11:28:22,380 INFO     1w-sen       Item Garage.Kombisensor.Versorgungsspannung = 4.72 via 1-Wire /bus.3/26.6F0973010000/VDD None -- item.py:__update:357
    2013-10-18 11:28:22,498 ERROR    1w-sen       Method 1w-sen exception: can't subtract offset-naive and offset-aware datetimes -- scheduler.py:_task:348
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 344, in _task
        obj()
      File "/usr/local/smarthome/plugins/onewire/__init__.py", line 395, in _sensor_cycle
        item(value, '1-Wire', path)
      File "/usr/local/smarthome/lib/item.py", line 279, in __call__
        self.__update(value, caller, source, dest)
      File "/usr/local/smarthome/lib/item.py", line 350, in __update
        self.__prev_age = (self._sh.now() - self.__last_change).total_seconds()
    TypeError: can't subtract offset-naive and offset-aware datetimes
    2013-10-18 11:28:24,192 INFO     Main         knx: 1.1.230 set 6/3/150 to 0.16 -- __init__.py:parse_telegram:190
    Die Daten des Kombisensor stehen bei mir alle auf "cache = true", da sonst wenn die einzelnen Messwerte eintrudeln fehlerhafte Ergebnisse berechnet werden (daher auch mein Wunsch sowas detektieren zu können um ein Eval erst starten zu lassen, wenn alle Werte "geupdated" wurden - nur als Randbemerkung!).

    Fix:

    PHP-Code:
    diff --git a/lib/item.py b/lib/item.py
    index 805b527
    ..65193b9 100755
    --- a/lib/item.py
    +++ b/lib/item.py
    @@ -99,+99,@@ def _cast_num(value):
     
    #####################################################################
     
    def _cache_read(filename):
         
    ts os.path.getmtime(filename)
    -    
    dt datetime.datetime.fromtimestamp(ts)
    +    
    dt datetime.datetime.fromtimestamp(tsself._sh._tzinfo)
         
    value None
         with open
    (filename'rb') as f:
             
    value pickle.load(f

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Python 3.2 Migration in develop bzw. 1.0 Release

    Als kleine Anregung, wie wäre es noch mit last_value() für den letzten Wert? Das würde manche Logiken vereinfachen und manchmal sogar den Einsatz des sqlite Plugins überflüssig machen.

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo,

    so wir näher uns einem Feature-Freeze. Ich bin dabei die Tests vorzubereiten.

    Einen habe ich noch:

    sh.match_items kann noch nach einem Attribute filtern.

    z.B. sh.match_items('winter*:heizung') liefert alle Items zurück die mit winter anfangen und ein Attribute 'heizung' definiert haben.

    Dadurch können die Items, bei eval_trigger, auch den Attributfilter verwenden.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hi Mike,
    Zitat von mike Beitrag anzeigen
    Hallo,

    beim "Refactoring lib.item" wurde die Methode "fade" entfernt. Gibt es dafür einen Ersatz? Ich habe diese Methode in einigen Logiken verwendet.
    ist wieder drin.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • stromie
    antwortet
    Hallo Marcus

    schon das du mich an die https://knx-user-forum.de/smarthome-p...rbehebung.html erinnerst.
    Leider trat der Fehler zum ersten mal auf. Im logfile steht nicht viel anders drin da nicht im Debug lief.
    Habe jetzt erst mal den Debug angemacht und werde sehen ob der Fehler wieder auftritt.
    Es hat was mit dem threading zu tun.
    Ich dachte vielleicht ist so was schon mal bei dir aufgetreten.


    Ich werde das weiter untersuchen. Vielleicht liegt es an meinen Dimplex plugin das per pymodbus auf die WP zugreift.


    Grüße

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Ach ja, und changed_by liefert
    'Init:None' für intiale, 'Cache:None' für gecachte Werte zurück.

    Bis bald

    Marcus

    Einen Kommentar schreiben:

Lädt...
X