Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit eigenen Plugin

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

    Probleme mit eigenen Plugin

    Hallo

    mein Plugin zum auslesen der ELV Wetterstation macht Probleme.
    Vielleicht kann ja der ein oder andere mal drüber schauen ob grobe Schnitzer zu sehen sind.
    Es läuft eine weile (1 bis 2 Tage), dann kommt ein Fehler.

    Code:
    2013-10-23 20:13:28 ERROR    Dummy-8      Unhandled exception: 'utf-8' codec can't decode byte 0xdf in position 2719: invalid continuation byte
    <class 'UnicodeDecodeError'>
      File "/usr/lib/python3.2/threading.py", line 722, in _bootstrap
        self._bootstrap_inner()
      File "/usr/lib/python3.2/threading.py", line 762, in _bootstrap_inner
        (self.name, _format_exc()))
      File "/usr/lib/python3.2/traceback.py", line 269, in format_exc
        format_exception(etype, value, tb, limit, chain))
      File "/usr/lib/python3.2/traceback.py", line 186, in format_exception
        list.extend(format_tb(tb, limit))
      File "/usr/lib/python3.2/traceback.py", line 75, in format_tb
        return format_list(extract_tb(tb, limit))
      File "/usr/lib/python3.2/traceback.py", line 100, in extract_tb
        line = linecache.getline(filename, lineno, f.f_globals)
      File "/usr/lib/python3.2/linecache.py", line 15, in getline
        lines = getlines(filename, module_globals)
      File "/usr/lib/python3.2/linecache.py", line 41, in getlines
        return updatecache(filename, module_globals)
      File "/usr/lib/python3.2/linecache.py", line 132, in updatecache
        lines = fp.readlines()
      File "/usr/lib/python3.2/codecs.py", line 300, in decode
        (result, consumed) = self._buffer_decode(data, self.errors, final)
    Danach erschein cycle takes 1 seconds , was ja aus dem Plugin kommt nicht mehr im log. Jedoch gehen die Threads dieses Plugins in die Höhe.
    Irrgentwas fange ich nicht ab.


    Code:
    #!/usr/bin/env python3
    # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
    #########################################################################
    # Copyright 2011 KNX-User-Forum e.V.            https://knx-user-forum.de/
    #########################################################################
    #  This file is part of SmartHome.py.   http://smarthome.sourceforge.net/
    #
    #  SmartHome.py is free software: you can redistribute it and/or modify
    #  it under the terms of the GNU General Public License as published by
    #  the Free Software Foundation, either version 3 of the License, or
    #  (at your option) any later version.
    #
    #  SmartHome.py is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
    #########################################################################
    
    import logging
    import threading
    from serial import Serial
    import struct
    import sys
    import string
    import time
    
    
    logger = logging.getLogger('usb_wde1')
    
    
    class usb_wde1():
        
        
      
        def __init__(self, smarthome, tty, baudrate=9600, cycle=30):
            self._sh = smarthome
            self._cycle = int(cycle)
            self._baudrate = int(baudrate)
            self._tty = tty
            self._is_connected = False
            self._lock = threading.Lock()
            self._items = {}
            self.alive = True
         
            try:
                self._port_usb = Serial(port=self._tty, timeout=1, baudrate=self._baudrate)
                
            except Exception as e:
                logger.error("Could not open Serial Port {0} -->  {1}".format(self._port_usb, e))
                return
            else:
                self._is_connected = self._port_usb._isOpen
                         
            if self._is_connected:
                logger.info("usb_wde1 connected")
            else:
                logger.error("Could not connect to usb_wde1")
                return
        
        def run(self):
            self.alive = True
            self._sh.scheduler.add('usb_wd1', self._refresh_data, prio=5, cycle=self._cycle)
    
        def stop(self):
            self.self._port_usb.close()
            self.alive = False
    
        
        def parse_item(self, item):
            if 'usb_wde1' in item.conf: 
                sensor = item.conf['usb_wde1']
                logger.debug("usb_wde1 item {0} connected to Sensor {1}  ".format(item, sensor))
                self._items[sensor] = {'item': item, 'logics': None}
            return None
         
    
        def parse_logic(self, logic):
            pass
         
        #regelmaeßig alles lesen
        def _refresh_data(self):
            if not self._is_connected:
                return False
            start = time.time()
            self._lock.acquire()
            rx = self._port_usb.readlines()
            
            logger.debug(" Read Data, {0}  ".format(rx) )
            if rx != []:
                for sensor in rx:
                    data = str(sensor,'utf-8').split(';') 
                   
                    for a in self._items:
                       
                        item = self._items[a]['item']
                        value = self._decode(a, data)
                        logger.debug(" Decode Data,  -- {0} --, item Value = {1} , item {2} ".format(a,value,item) )
                        item(value, 'usb_wde1', 'refresh') 
             
            self._lock.release()            
            cycletime = time.time() - start
            logger.info("cycle takes %d seconds", cycletime)        
            
    
        def _decode(self, sensor, Data):
                if sensor == 'S1_Temp': return float(Data[3].replace(',', '.'))
                if sensor == 'S2_Temp': return float(Data[4].replace(',', '.'))
                if sensor == 'S3_Temp': return float(Data[5].replace(',', '.'))
                if sensor == 'S4_Temp': return float(Data[6].replace(',', '.'))
                if sensor == 'S5_Temp': return float(Data[7].replace(',', '.'))
                if sensor == 'S6_Temp': return float(Data[8].replace(',', '.'))
                if sensor == 'S7_Temp': return float(Data[9].replace(',', '.'))
                if sensor == 'S8_Temp': return float(Data[10].replace(',', '.'))
                if sensor == 'S1_Hum': return Data[11]
                if sensor == 'S2_Hum': return Data[12]
                if sensor == 'S3_Hum': return Data[13]
                if sensor == 'S4_Hum': return Data[14]
                if sensor == 'S5_Hum': return Data[15]
                if sensor == 'S6_Hum': return Data[16]
                if sensor == 'S7_Hum': return Data[17]
                if sensor == 'S8_Hum': return Data[18]
                if sensor == 'Komb_Temp': return float(Data[19].replace(',', '.'))
                if sensor == 'Komb_Hum': return Data[20]
                if sensor == 'Komb_Wind': return float(Data[21].replace(',', '.'))
                if sensor == 'Komb_Wippen': return Data[22]
                if sensor == 'Komb_Regen': return Data[23]
                return None
    Grüße Ronny

    #2
    Hi Ronny,

    bei dem eigentlichen Problem kann ich Dir nicht helfen. Wieso da die Zeichen auf der Seriellen sind.

    Problematisch ist wohl der folgende Teil:
    Code:
    self._lock.acquire()
    rx = self._port_usb.readlines()
           
    logger.debug(" Read Data, {0}  ".format(rx) )
    if rx != []:
    Du lockst und danach gibt es die exception. => Deadlock
    Goto Exception handling try: except: finally: lock.release()

    Statt readlines könnte/sollte man
    for rx in self._port_usb verwenden.

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo Marcus

      Danke, das werde ich mal probieren.

      Grüße Ronny

      Kommentar

      Lädt...
      X