Ejemplo n.º 1
0
 def __init__(self):
     """ Create listener and background zwave manager
     """
     XplHlpPlugin.__init__(self, name = 'ozwave')
     
     # Récupère la config 
     # - device
     self._config = Query(self.myxpl, self.log)
     device = self._config.query('ozwave', 'device')
     ozwlogConf = self._config.query('ozwave', 'ozwlog')
     self._config = Query(self.myxpl, self.log)
     print ('Mode log openzwave :',  ozwlogConf)
     # Recupère l'emplacement des fichiers de configuration OZW
     pathUser = self.get_data_files_directory()  +'/'
     pathConfig = self._config.query('ozwave', 'configpath') + '/'
     # Initialise le manager Open zwave
     try:
         self.myzwave = OZWavemanager(self._config, self.send_xPL, self.sendxPL_trig, self.get_stop(), self.log, configPath = pathConfig,  userPath = pathUser,  ozwlog = ozwlogConf)
     except OZwaveException as e:
         self.log.error(e.value)
         print e.value
         self.force_leave()
         return
     self.log.debug("__init__ : Enable heplers")
     self.helpers =   \
        {
          "infostate" :
           {
             "cb" : self.myzwave.GetPluginInfo,
             "desc" : "Show Info status. Experimental.",
             "usage" : "memory",
           }
         }
     self.enable_helper()
     # Crée le listener pour les messages de commande xPL traités par les devices zwave
     Listener(self.ozwave_cmd_cb, self.myxpl,{'schema': 'ozwave.basic',
                                                                     'xpltype': 'xpl-cmnd'})
     # Validation avant l'ouverture du controleur, la découverte du réseaux zwave prends trop de temps -> RINOR Timeout
     self.add_stop_cb(self.myzwave.stop)
     self.enable_hbeat()
     # Ouverture du controleur principal
     self.myzwave.openDevice(device)
Ejemplo n.º 2
0
class OZwave(XplHlpPlugin):
    """ Implement a listener for Zwave command messages
        and launch background  manager to listening zwave events by callback
    """
    def __init__(self):
        """ Create listener and background zwave manager
        """
        XplHlpPlugin.__init__(self, name = 'ozwave')
        
        # Récupère la config 
        # - device
        self._config = Query(self.myxpl, self.log)
        device = self._config.query('ozwave', 'device')
        ozwlogConf = self._config.query('ozwave', 'ozwlog')
        self._config = Query(self.myxpl, self.log)
        print ('Mode log openzwave :',  ozwlogConf)
        # Recupère l'emplacement des fichiers de configuration OZW
        pathUser = self.get_data_files_directory()  +'/'
        pathConfig = self._config.query('ozwave', 'configpath') + '/'
        # Initialise le manager Open zwave
        try:
            self.myzwave = OZWavemanager(self._config, self.send_xPL, self.sendxPL_trig, self.get_stop(), self.log, configPath = pathConfig,  userPath = pathUser,  ozwlog = ozwlogConf)
        except OZwaveException as e:
            self.log.error(e.value)
            print e.value
            self.force_leave()
            return
        self.log.debug("__init__ : Enable heplers")
        self.helpers =   \
           {
             "infostate" :
              {
                "cb" : self.myzwave.GetPluginInfo,
                "desc" : "Show Info status. Experimental.",
                "usage" : "memory",
              }
            }
        self.enable_helper()
        # Crée le listener pour les messages de commande xPL traités par les devices zwave
        Listener(self.ozwave_cmd_cb, self.myxpl,{'schema': 'ozwave.basic',
                                                                        'xpltype': 'xpl-cmnd'})
        # Validation avant l'ouverture du controleur, la découverte du réseaux zwave prends trop de temps -> RINOR Timeout
        self.add_stop_cb(self.myzwave.stop)
        self.enable_hbeat()
        # Ouverture du controleur principal
        self.myzwave.openDevice(device)
    
    def __sizeof__(self):
        return XplHlpPlugin.__sizeof__(self) + sum(sys.getsizeof(v) for v in self.__dict__.values())
    

    def ozwave_cmd_cb(self, message):
        """" Envoie la cmd xpl vers le OZWmanager"""
        print ("commande xpl recue")
        print message
        self.log.debug(message)
        if 'command' in message.data:
            if 'group'in message.data:
                # en provenance de l'UI spéciale
                self.ui_cmd_cb(message)
            else :
                cmd = message.data['command']
                device = message.data['device']
                if cmd == 'level' :
                    print ("appel envoi zwave command %s" %cmd)
                    lvl = message.data['level']
                    self.myzwave.sendNetworkZW(cmd, device, lvl)
                elif cmd == "on"  or cmd == "off" :
                    print ("appel envoi zwave command %s" %cmd)
                    self.myzwave.sendNetworkZW(cmd, device)
                else:
                    self.myzwave.sendNetworkZW(cmd, device)
                    
    def getdict2UIdata(self, UIdata):
        """ retourne un format dict en provenance de l'UI (passage outre le format xPL)"""
        retval = UIdata.replace('"', '"').replace('&squot;', "'").replace("&ouvr;", '{').replace("&ferm;", '}') ;
        try :
            return eval(retval)
        except OZwaveException as e:
            print retval
            self.log.debug ("Format data to UI : eval in getdict2UIdata error : " +   retval)
            return {'error': 'invalid format'}
            
    def getUIdata2dict(self, ddict):
        """Retourne le dict formatter pour UI (passage outre le format xPL)"""
        print "conversion pour transfertvers UI , " , str(ddict)
        for k in ddict :   # TODO: pour passer les 1452 chars dans RINOR, à supprimer quand MQ OK, 
            if isinstance(ddict[k], str) :
                ddict[k] = ddict[k].replace("'", "&squot;")  # remplace les caractères interdits pour rinor
                if len(str(ddict[k])) >800 : 
                    ddict[k] = ddict[k][:800]
                    print("value raccourccis : ", k, ddict[k])
                    self.log.debug ("Format data to UI : value to large, cut to 800, key : %s, value : %s" % (str(k), str(ddict[k])))
        return str(ddict).replace('{', '&ouvr;').replace('}', '&ferm;').replace('"','"').replace("'",'"').replace('False', 'false').replace('True', 'true').replace('None', '""')
        
    def ui_cmd_cb(self, message):
        """xpl en provenace de l'UI (config/special)"""
        response = True
        info = "essais"
        request = self.getdict2UIdata(message.data['value'])
        print("Commande UI")
        if message.data['group'] =='UI' :
            mess = XplMessage()
            mess.set_type('xpl-trig') 
            mess.set_schema('ozwave.basic')
            if request['request'] == 'ctrlAction' :
                action = dict(request)
                del action['request']
                report = self.myzwave.handle_ControllerAction(action)
                info = self.getUIdata2dict(report)
                mess.add_data({'command' : 'Refresh-ack', 
                                    'group' :'UI', 
                                    'ctrlaction' : request['action'], 
                                    'data': info})
                if request['cmd'] =='getState' and report['cmdstate'] != 'stop' : response = False
            elif request['request'] == 'ctrlSoftReset' :
                info = self.getUIdata2dict(self.myzwave.handle_ControllerSoftReset())
                mess.add_data({'command' : 'Refresh-ack', 
                                    'group' :'UI', 
                                    'data': info})
            elif request['request'] == 'ctrlHardReset' :
                info = self.getUIdata2dict(self.myzwave.handle_ControllerHardReset())
                mess.add_data({'command' : 'Refresh-ack', 
                                    'group' :'UI', 
                                    'data': info})   
            elif request['request'] == 'GetPluginInfo' :
                info = self.getUIdata2dict(self.myzwave.GetPluginInfo())
                mess.add_data({'command' : 'Refresh-ack', 
                                    'group' :'UI', 
                                    'node' : 0, 
                                    'data': info})
            else :
                mess.add_data({'command' : 'Refresh-ack', 
                                    'group' :'UI', 
                                    'data': "unknown request", 
                                    'error': "unknown request"})
                print "commande inconnue"
            if response : self.myxpl.send(mess)
                                  
                                    
    def send_xPL(self, xPLmsg,  args = None):
        """ Envoie une commande ou message zwave vers xPL"""
        mess = XplMessage()
        mess.set_type(xPLmsg['type']) 
        mess.set_schema(xPLmsg['schema'])
        if xPLmsg.has_key('data') : mess.add_data(xPLmsg['data'])
        print '********************* Dans send_xPL *****************'
        if args :
            mess.add_data({'data': self.getUIdata2dict(args)})
        print mess
        self.myxpl.send(mess)
        
    def sendxPL_trig(self, msgtrig):
        """Envoie un message trig sur le hub xPL"""
        mess = XplMessage()
        if 'info' in msgtrig:
            self.log.error ("Error : Node %s unreponsive" % msgtrig['node'])
        elif 'Find' in msgtrig:
            print("node enregistré : %s" % msgtrig['Find'])
        elif 'typexpl' in msgtrig:
            mess.set_type(msgtrig['typexpl'])
            mess.set_schema(msgtrig['schema'])
            if msgtrig['genre'] == 'actuator' :
                if msgtrig['level'] in [0, 'False', False] : cmd ="off"
                elif msgtrig['level'] in [255, 'True',  True]: cmd ="on"
                else: cmd ='level'
                mess.add_data({'device' : msgtrig['device'],
                            'command' : cmd,
                            'level': msgtrig['level']})
                if msgtrig.has_key('type'): mess.add_data({'type' : msgtrig['type'] })
            elif msgtrig['genre'] == 'sensor' :  # tout sensor
                if msgtrig['type'] =='status' :  # gestion du sensor binary pour widget binary
                    mess.add_data({'device' : msgtrig['device'],
                            'type' : msgtrig['type'] ,
                            'current' : 'true' if msgtrig['value']   else 'false'})
                else : mess.add_data({'device' : msgtrig['device'],  
                            'type' : msgtrig['type'] ,
                            'current' : msgtrig['value'] })
            if msgtrig.has_key('units') and msgtrig['units'] !='' : mess.add_data({'units' : msgtrig['units'] })
            print mess
            self.myxpl.send(mess)
        elif 'command' in msgtrig and msgtrig['command'] == 'Info':
            print("Home ID is %s" % msgtrig['Home ID'])
Ejemplo n.º 3
0
    """ Envoie une commande zwave vers XPL"""
    # TODO : a implémenter pour les sénarios zwave entre module ?
    pass


def sendxPL_trig(sread):
    pass


def get_stop():
    pass


if __name__ == "__main__":
    log = Log()
    ozm = OZWavemanager(send_xPL, sendxPL_trig, get_stop(), log, ozwlog="")
    ozm.openDevice("/dev/zwave")
    ozm.start()
    a = "True"
    on = "False"
    sleep(15)
    print "******* GO *****"
    while a == "True":
        print "xxxxxxxxxxxx"
        if ozm.homeId() != None:
            print "Manufact node 1: " + ozm._manager.getNodeManufacturerName(int(ozm.homeId()), 1)
            print "Manufact node 5: " + ozm._manager.getNodeManufacturerName(int(ozm.homeId()), 5)
            print "     node 5 Name: " + ozm._manager.getNodeName(int(ozm.homeId()), 5)
            print "Manufact node 6: " + ozm._manager.getNodeManufacturerName(int(ozm.homeId()), 6)
            if on == "True":
                ozm._manager.setNodeOff(ozm._homeId, 5)