def __init__(self, logger=None, driver=None, port=None, cmd=None, lg_code=None): self.can = None self.commands = [] # data for all commands requested self.listCommands = [] # all usable commands from csv self.logger = logger self.command_dict={} self.backup_commands=[] listCmd = [r.split(":")[0] for r in cmd] if not self.listCommands: #if we don't get a dict with commands # get language, if non given, take it from the system LANG_CODE = lg_code[0:2] if lg_code else locale.getdefaultlocale()[0].split('_')[0].upper() hpsuDict = {} # read the translation file. if it doesn't exist, take the english one command_translations_hpsu = '%s/commands_hpsu_%s.csv' % (self.pathCOMMANDS, LANG_CODE) if not os.path.isfile(command_translations_hpsu): command_translations_hpsu = '%s/commands_hpsu_%s.csv' % (self.pathCOMMANDS, "EN") self.logger.info("HPSU %s, loading command traslations file: %s" % (cmd, command_translations_hpsu)) # check, if commands are json or csv # read all known commands with open(command_translations_hpsu, 'rU',encoding='utf-8') as csvfile: pyHPSUCSV = csv.reader(csvfile, delimiter=';', quotechar='"') next(pyHPSUCSV, None) # skip the header for row in pyHPSUCSV: name = row[0] label = row[1] desc = row[2] hpsuDict.update({name:{"label":label, "desc":desc}}) # read all known commands command_details_hpsu = '%s/commands_hpsu.json' % self.pathCOMMANDS self.logger.info("HPSU %s, loading command details file: %s" % (cmd, command_details_hpsu)) with open(command_details_hpsu, 'rU',encoding='utf-8') as jsonfile: self.all_commands = json.load(jsonfile) self.command_dict=self.all_commands["commands"] for single_command in self.command_dict: if self.command_dict[single_command]["name"] in hpsuDict: self.command_dict[single_command].update({ "label" : hpsuDict[self.command_dict[single_command]["name"]]["label"], "desc" : hpsuDict[self.command_dict[single_command]["name"]]["desc"]}) if (single_command in listCmd) or (len(listCmd) == 0): self.commands.append(self.command_dict[single_command]) if (self.command_dict[single_command]["writable"]=="true"): self.backup_commands.append(self.command_dict[single_command]["name"]) self.driver = driver if self.driver == "ELM327": self.can = CanELM327(self) elif self.driver == "EMU": self.can = CanEMU(self) elif self.driver == "PYCAN": self.can = CanPI(self) elif self.driver == "HPSUD": self.can = CanTCP(self) else: logger.error("Error selecting driver %s" % self.driver) sys.exit(9) self.initInterface(port)
class HPSU(object): commands = [] listCommands = [] UM_DEGREE = "deg" UM_BOOLEAN = "bool" UM_PERCENT = "percent" UM_INT = "int" UM_BAR = "bar" UM_HOUR = "hour" driver = None pathCOMMANDS = "/etc/pyHPSU" def __init__(self, logger=None, driver=None, port=None, cmd=None, lg_code=None): self.can = None self.commands = [] # data for all commands requested self.listCommands = [] # all usable commands from csv self.logger = logger self.command_dict = {} self.backup_commands = [] listCmd = [r.split(":")[0] for r in cmd] if not self.listCommands: #if we don't get a dict with commands # get language, if non given, take it from the system LANG_CODE = lg_code.upper( )[0:2] if lg_code else locale.getdefaultlocale()[0].split( '_')[0].upper() hpsuDict = {} # read the translation file. if it doesn't exist, take the english one commands_hpsu = '%s/commands_hpsu_%s.csv' % (self.pathCOMMANDS, LANG_CODE) if not os.path.isfile(commands_hpsu): commands_hpsu = '%s/commands_hpsu_%s.csv' % (self.pathCOMMANDS, "EN") # check, if commands are json or csv # read all known commands with open(commands_hpsu, 'rU', encoding='utf-8') as csvfile: pyHPSUCSV = csv.reader(csvfile, delimiter=';', quotechar='"') next(pyHPSUCSV, None) # skip the header for row in pyHPSUCSV: name = row[0] label = row[1] desc = row[2] hpsuDict.update({name: {"label": label, "desc": desc}}) # read all known commands with open('%s/commands_hpsu.json' % self.pathCOMMANDS, 'rU', encoding='utf-8') as jsonfile: self.all_commands = json.load(jsonfile) self.command_dict = self.all_commands["commands"] for single_command in self.command_dict: if self.command_dict[single_command]["name"] in hpsuDict: self.command_dict[single_command].update({ "label": hpsuDict[self.command_dict[single_command] ["name"]]["label"], "desc": hpsuDict[self.command_dict[single_command]["name"]] ["desc"] }) if (single_command in listCmd) or (len(listCmd) == 0): self.commands.append(self.command_dict[single_command]) if (self.command_dict[single_command]["writable"] == "true" ): self.backup_commands.append( self.command_dict[single_command]["name"]) self.driver = driver if self.driver == "ELM327": self.can = CanELM327(self) elif self.driver == "EMU": self.can = CanEMU(self) elif self.driver == "PYCAN": self.can = CanPI(self) elif self.driver == "HPSUD": self.can = CanTCP(self) else: print("Error selecting driver %s" % self.driver) sys.exit(9) self.initInterface(port) def printd(self, level, msg): if self.logger: if level == 'warning': self.logger.warning(msg) elif level == 'error': self.logger.error(msg) elif level == 'info': self.logger.info(msg) elif level == 'exception': self.logger.exception(msg) else: if self.driver != "HPSUD": print("%s - %s" % (level, msg)) def sendCommandWithParse(self, cmd, setValue=None, priority=1): response = None verbose = "1" i = 1 while i <= 3: rc = self.sendCommand(cmd, setValue=setValue, priority=priority) if rc != "KO": i = 4 if not setValue: response = self.parseCommand(cmd=cmd, response=rc, verbose=verbose)["resp"] else: response = "" else: i += 1 time.sleep(2.0) return response def getParameterValue(self, parameter, priority=1): response = None cmd = None for c in self.commands: if c["name"] == parameter: cmd = c if cmd: response = self.sendCommandWithParse(cmd=cmd, priority=priority) return response def setParameterValue(self, parameter, setValue, priority=1): response = None cmd = None for c in self.commands: if c["name"] == parameter: cmd = c if cmd: response = self.sendCommandWithParse(cmd=cmd, setValue=setValue, priority=priority) return response def initInterface(self, portstr=None, baudrate=38400, init=False): if self.driver == "ELM327": self.can.initInterface(portstr=portstr, baudrate=baudrate, init=True) elif self.driver == "HPSUD": self.can.initInterface() # funktion to set/read a value def sendCommand(self, cmd, setValue=None, priority=1): rc = self.can.sendCommandWithID(cmd=cmd, setValue=setValue, priority=priority) if rc not in ["KO", "OK"]: try: hexValues = [int(r, 16) for r in rc.split(" ")] except ValueError: return "KO" return rc def timestamp(self): epoch = datetime.datetime.utcfromtimestamp(0) return (datetime.datetime.now() - epoch).total_seconds() * 1000.0 def toSigned(self, n, cmd): if cmd["unit"] == "deg": n = n & 0xffff return (n ^ 0x8000) - 0x8000 else: return n def parseCommand(self, cmd, response, verbose): hexValues = [int(r, 16) for r in response.split(" ")] hexArray = response.split(" ") if cmd["type"] == "int": if hexValues[2] == 0xfa: resp = int( self.toSigned(hexValues[5], cmd) // float(cmd["divisor"])) else: resp = int( self.toSigned(hexValues[3], cmd) // float(cmd["divisor"])) elif cmd["type"] == "longint": if hexValues[2] == 0xfa: resp = int( self.toSigned(hexValues[5] * 0x100 + hexValues[6], cmd) // float(cmd["divisor"])) else: resp = int( self.toSigned(hexValues[3] * 0x100 + hexValues[4], cmd) // float(cmd["divisor"])) elif cmd["type"] == "float": if hexValues[2] == 0xfa: resp = self.toSigned(hexValues[5] * 0x100 + hexValues[6], cmd) / float(cmd["divisor"]) else: resp = self.toSigned(hexValues[3] * 0x100 + hexValues[4], cmd) / float(cmd["divisor"]) elif cmd["type"] == "value": if hexValues[2] == 0xfa: resp = int(str(hexArray[5]) + str(hexArray[6]), 16) // int( cmd["divisor"]) else: resp = int(str(hexArray[3]) + str(hexArray[4]), 16) // int( cmd["divisor"]) if verbose == "2": timestamp = datetime.datetime.now().isoformat() else: if sys.version_info >= (3, 0): timestamp = datetime.datetime.now().timestamp() else: timestamp = self.timestamp() return {"resp": resp, "timestamp": timestamp} def umConversion(self, cmd, response, verbose): # convert into different units resp = response["resp"] if cmd["unit"] == HPSU.UM_DEGREE: resp = locale.format("%.2f", round(response["resp"], 2)) if verbose == "2": resp = "%s c" % resp elif cmd["unit"] == HPSU.UM_BOOLEAN: resp = int(response["resp"]) if verbose == "2": resp = "ON" if resp == 1 else "OFF" elif cmd["unit"] == HPSU.UM_PERCENT: resp = int(response["resp"]) if verbose == "2": resp = "%s%%" % int(response["resp"]) elif cmd["unit"] == HPSU.UM_INT: resp = str(response["resp"]) else: resp = str(response["resp"]) #if cmd["value_code"]: # resp=cmd["value_code"][resp] return resp