def __listen_thread(self, stop_event): logMessage('Background thread for serial started') while not stop_event.is_set(): if not self.ser: if self.port == 'auto': (serial_port, name) = autoSerial.detect_port(False) else: serial_port = self.port try: if serial_port is not None: self.ser = serial_for_url(serial_port, baudrate=57600, timeout=0.1, write_timeout=0.1) self.ser.inter_byte_timeout = 0.01 # necessary because of bug in in_waiting with sockets self.ser.flushInput() self.ser.flushOutput() logMessage('Serial (re)connected at port: {0}'.format( str(serial_port))) except (IOError, OSError, SerialException) as e: if self.ser: self.ser.close() self.ser = None error = str(e) if error != self.error: #only print once self.error = error logMessage('Error opening serial: {0}'.format( self.error)) time.sleep(1) else: new_data = "" try: while self.ser.in_waiting > 0: # for sockets, in_waiting returns 1 instead of the actual number of bytes # this is a workaround for that new_data = new_data + self.ser.read( self.ser.in_waiting) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.ser.close() self.ser = None if len(new_data) > 0: self.buffer = self.buffer + new_data while True: line_from_buffer = self.__get_line_from_buffer() if line_from_buffer: self.queue.put(line_from_buffer) else: break # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01) logMessage('Background thread for serial stopped') if self.ser: self.ser.close() self.ser = None
def stopLogging(): global config logMessage("Stopped data logging, as requested in web interface. " + "BrewPi will continue to control temperatures, but will not log any data.") config = util.configSet(configFile, 'beerName', None) config = util.configSet(configFile, 'dataLogging', 'stopped') changeWwwSetting('beerName', None) return {'status': 0, 'statusMessage': "Successfully stopped logging"}
def resumeLogging(): global config logMessage("Continued logging data, as requested in web interface.") if config['dataLogging'] == 'paused': config = util.configSet(configFile, 'dataLogging', 'active') return {'status': 0, 'statusMessage': "Successfully continued logging."} else: return {'status': 1, 'statusMessage': "Logging was not paused."}
def exit_on_fatal_error(self): if self.fatal_error is not None: self.stop() logMessage(self.fatal_error) if self.ser is not None: self.ser.close() del self.ser # this helps to fully release the port to the OS sys.exit("Terminating due to fatal serial error")
def exit_on_fatal_error(self): if self.fatal_error is not None: self.thread.join() # wait for background thread to terminate logMessage(self.fatal_error) if self.ser is not None: self.ser.close() del self.ser # this helps to fully release the port to the OS sys.exit("Terminating due to fatal serial error")
def write(self, data): self.exit_on_fatal_error() # prevent writing to a port in error state. This will leave unclosed handles to serial on the system if not self.error: try: self.ser.write(data) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.error = True
def pauseLogging(): global config logMessage("Paused logging data, as requested in web interface. " + "BrewPi will continue to control temperatures, but will not log any data until resumed.") if config['dataLogging'] == 'active': config = util.configSet(configFile, 'dataLogging', 'paused') return {'status': 0, 'statusMessage': "Successfully paused logging."} else: return {'status': 1, 'statusMessage': "Logging already paused or stopped."}
def write(self, data): self.exit_on_fatal_error() # Prevent writing to a port in error state. # This will leave unclosed handles to serial on the system written = 0 if self.ser: try: written = self.ser.write(data) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) return written
def startNewBrew(newName): global config if len(newName) > 1: # shorter names are probably invalid config = util.configSet(configFile, 'beerName', newName) config = util.configSet(configFile, 'dataLogging', 'active') startBeer(newName) logMessage("Notification: Restarted logging for beer '%s'." % newName) return {'status': 0, 'statusMessage': "Successfully switched to new brew '%s'. " % urllib.unquote(newName) + "Please reload the page."} else: return {'status': 1, 'statusMessage': "Invalid new brew name '%s', " "please enter a name with at least 2 characters" % urllib.unquote(newName)}
def __listen_thread(self, stop_event): logMessage('Background thread for serial started') while not stop_event.is_set(): if not self.ser: if self.port == 'auto': (serial_port, name) = autoSerial.detect_port(False) else: serial_port = self.port try: if serial_port is not None: self.ser = serial_for_url(serial_port, baudrate=57600, timeout=0.1, write_timeout=0.1) self.ser.inter_byte_timeout = 0.01 # necessary because of bug in in_waiting with sockets self.ser.flushInput() self.ser.flushOutput() logMessage('Serial (re)connected at port: {0}'.format(str(serial_port))) except (IOError, OSError, SerialException) as e: if self.ser: self.ser.close() self.ser = None error = str(e) if error != self.error: #only print once self.error = error logMessage('Error opening serial: {0}'.format(self.error)) time.sleep(1) else: new_data = "" try: while self.ser.in_waiting > 0: # for sockets, in_waiting returns 1 instead of the actual number of bytes # this is a workaround for that new_data = new_data + self.ser.read(self.ser.in_waiting) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.ser.close() self.ser = None if len(new_data) > 0: self.buffer = self.buffer + new_data while True: line_from_buffer = self.__get_line_from_buffer() if line_from_buffer: self.queue.put(line_from_buffer) else: break # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01) logMessage('Background thread for serial stopped') if self.ser: self.ser.close() self.ser = None
def write(self, data): self.exit_on_fatal_error() # prevent writing to a port in error state. This will leave unclosed handles to serial on the system if not self.error: try: if hasattr(data, 'encode'): # Encode if it's not already done self.ser.write(data.encode(encoding='cp437')) else: self.ser.write(data) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.error = True
def __listen_thread(self): run = True while run: new_data = "" if not self.error: try: while self.ser.in_waiting > 0: # for sockets, in_waiting returns 1 instead of the actual number of bytes # this is a workaround for that new_data = new_data + self.ser.read( self.ser.in_waiting) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.error = True if len(new_data) > 0: self.buffer = self.buffer + new_data while True: line_from_buffer = self.__get_line_from_buffer() if line_from_buffer: self.queue.put(line_from_buffer) else: break if self.error: try: # try to restore serial by closing and opening again self.ser.close() self.ser.open() # test serial to see if it is restored by writing an empty line (which is ignored by the controller) if self.writeln("") > 0: self.error = False else: self.fatal_error = 'Lost serial connection. Cannot write to serial' except (ValueError, OSError, SerialException) as e: if self.ser.isOpen(): self.ser.flushInput( ) # will help to close open handles self.ser.flushOutput( ) # will help to close open handles self.ser.close() self.fatal_error = 'Lost serial connection. Error: {0})'.format( str(e)) # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01)
def changeWwwSetting(settingName, value): wwwSettingsFileName = util.addSlash(config['wwwPath']) + 'userSettings.json' if os.path.exists(wwwSettingsFileName): wwwSettingsFile = open(wwwSettingsFileName, 'r+b') try: wwwSettings = json.load(wwwSettingsFile) # read existing settings except json.JSONDecodeError: logMessage("Error in decoding userSettings.json, creating new empty json file") wwwSettings = {} # start with a fresh file when the json is corrupt. else: wwwSettingsFile = open(wwwSettingsFileName, 'w+b') # create new file wwwSettings = {} wwwSettings[settingName] = str(value) wwwSettingsFile.seek(0) wwwSettingsFile.write(json.dumps(wwwSettings)) wwwSettingsFile.truncate() wwwSettingsFile.close()
def __listen_thread(self): while self.run: new_data = "" if not self.error: try: while self.ser.in_waiting > 0: # for sockets, in_waiting returns 1 instead of the actual number of bytes # this is a workaround for that new_data = new_data + self.ser.read(self.ser.in_waiting) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.error = True if len(new_data) > 0: self.buffer = self.buffer + new_data while True: line_from_buffer = self.__get_line_from_buffer() if line_from_buffer: self.queue.put(line_from_buffer) else: break if self.error: try: # try to restore serial by closing and opening again self.ser.close() self.ser.open() # test serial to see if it is restored by writing an empty line (which is ignored by the controller) if self.writeln("") > 0: self.error = False else: self.fatal_error = 'Lost serial connection. Cannot write to serial' except (ValueError, OSError, SerialException) as e: if self.ser.isOpen(): self.ser.flushInput() # will help to close open handles self.ser.flushOutput() # will help to close open handles self.ser.close() self.fatal_error = 'Lost serial connection. Error: {0})'.format(str(e)) # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01)
def __listenThread(self): lastReceive = time.time() while self.run: in_waiting = None new_data = None if not self.error: try: #in_waiting = self.ser.inWaiting() # WiFi Change in_waiting = self.ser.readline() if in_waiting: #new_data = self.ser.read(in_waiting) # WiFi Change new_data = in_waiting lastReceive = time.time() except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.error = True if new_data: self.buffer = self.buffer + new_data.decode(encoding="cp437") line = self.__get_line_from_buffer() if line: self.queue.put(line) if self.error: try: # try to restore serial by closing and opening again self.ser.close() self.ser.open() self.error = False except (ValueError, OSError, SerialException) as e: if self.ser.isOpen(): self.ser.flushInput( ) # will help to close open handles self.ser.flushOutput( ) # will help to close open handles self.ser.close() self.fatal_error = 'Lost serial connection. Error: {0})'.format( str(e)) self.run = False # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01)
def __listenThread(self): lastReceive = time.time() while self.run : in_waiting = None new_data = None if not self.error: try: in_waiting = self.ser.inWaiting() if in_waiting > 0: new_data = self.ser.read(in_waiting) lastReceive = time.time() except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.error = True if new_data: self.buffer = self.buffer + new_data while True: line = self.__get_line_from_buffer() if line: self.queue.put(line) else: break if self.error: try: # try to restore serial by closing and opening again self.ser.close() self.ser.open() self.error = False except (ValueError, OSError, SerialException) as e: if self.ser.isOpen(): self.ser.flushInput() # will help to close open handles self.ser.flushOutput() # will help to close open handles self.ser.close() self.fatal_error = 'Lost serial connection. Error: {0})'.format(str(e)) self.run = False # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01)
def __listen_thread(self, stop_event): logMessage('Background thread for serial started') while not stop_event.is_set(): if not self.ser: serial_port = autoSerial.find_port(self.port) try: if serial_port is not None: self.ser = serial_for_url(serial_port['device'], baudrate=57600, timeout=0.1, write_timeout=0.1) self.ser.inter_byte_timeout = 0.01 # necessary because of bug in in_waiting with sockets self.ser.flushInput() self.ser.flushOutput() if "socket://" in serial_port['device']: logMessage( 'Serial (re)connected over WiFi at {0}'.format( serial_port.get('device') or "unknown location")) else: logMessage( 'Serial (re)connected for {0} [{1}] at port: {2}' .format( serial_port.get('product') or 'unknown product', serial_port.get('serial_number') or 'unknown serial number', serial_port.get('name') or 'unknown location')) self.writeln( 'r' ) # ask device to print reset reason if disconnection was due to reset except (IOError, OSError, SerialException) as e: if self.ser: self.ser.close() self.ser = None error = str(e) if error != self.error: #only print once self.error = error logMessage('Error opening serial: {0}'.format( self.error)) time.sleep(1) else: new_data = "" try: while self.ser.in_waiting > 0: # for sockets, in_waiting returns 1 instead of the actual number of bytes # this is a workaround for that new_data = new_data + self.ser.read( self.ser.in_waiting) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.ser.close() self.ser = None if len(new_data) > 0: self.buffer = self.buffer + new_data while True: line_from_buffer = self.__get_line_from_buffer() if line_from_buffer: self.queue.put(line_from_buffer) else: break # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01) logMessage('Background thread for serial stopped') if self.ser: self.ser.close() self.ser = None
def __listen_thread(self, stop_event): logMessage('Background thread for serial started') while not stop_event.is_set(): if not self.ser: serial_port = autoSerial.find_port(self.port) try: if serial_port is not None: self.ser = serial_for_url(serial_port['device'], baudrate=57600, timeout=0.1, write_timeout=0.1) self.ser.inter_byte_timeout = 0.01 # necessary because of bug in in_waiting with sockets self.ser.flushInput() self.ser.flushOutput() if "socket://" in serial_port['device']: logMessage('Serial (re)connected over WiFi at {0}'.format( serial_port.get('device') or "unknown location" ) ) else: logMessage('Serial (re)connected for {0} [{1}] at port: {2}'.format( serial_port.get('product') or 'unknown product', serial_port.get('serial_number') or 'unknown serial number', serial_port.get('name') or 'unknown location' ) ) self.writeln('r') # ask device to print reset reason if disconnection was due to reset except (IOError, OSError, SerialException) as e: if self.ser: self.ser.close() self.ser = None error = str(e) if error != self.error: #only print once self.error = error logMessage('Error opening serial: {0}'.format(self.error)) time.sleep(1) else: new_data = "" try: while self.ser.in_waiting > 0: # for sockets, in_waiting returns 1 instead of the actual number of bytes # this is a workaround for that new_data = new_data + self.ser.read(self.ser.in_waiting) except (IOError, OSError, SerialException) as e: logMessage('Serial Error: {0})'.format(str(e))) self.ser.close() self.ser = None if len(new_data) > 0: self.buffer = self.buffer + new_data while True: line_from_buffer = self.__get_line_from_buffer() if line_from_buffer: self.queue.put(line_from_buffer) else: break # max 10 ms delay. At baud 57600, max 576 characters are received while waiting time.sleep(0.01) logMessage('Background thread for serial stopped') if self.ser: self.ser.close() self.ser = None
configFile = os.path.abspath(a) if not os.path.exists(configFile): sys.exit('ERROR: Config file "%s" was not found!' % configFile) # send quit instruction to all running instances of BrewPi if o in ('-s', '--status'): allProcesses = BrewPiProcess.BrewPiProcesses() allProcesses.update() running = allProcesses.as_dict() if running: pprint(running) else: printStdErr("No BrewPi scripts running") exit() # quit/kill running instances, then keep this one if o in ('-q', '--quit'): logMessage("Asking all BrewPi Processes to quit on their socket") allProcesses = BrewPiProcess.BrewPiProcesses() allProcesses.quitAll() time.sleep(2) exit() # send SIGKILL to all running instances of BrewPi if o in ('-k', '--kill'): logMessage("Killing all BrewPi Processes") allProcesses = BrewPiProcess.BrewPiProcesses() allProcesses.killAll() exit() # close all existing instances of BrewPi by quit/kill and keep this one if o in ('-f', '--force'): logMessage("Closing all existing processes of BrewPi and keeping this one") allProcesses = BrewPiProcess.BrewPiProcesses() if len(allProcesses.update()) > 1: # if I am not the only one running
def exit_on_fatal_error(self): if self.fatal_error is not None: self.stop() logMessage(self.fatal_error) sys.exit("Terminating due to fatal serial error")
bg_ser.start() success = 0 fail = 0 for i in range(1, 5): # request control variables 4 times. This would overrun buffer if it was not read in a background thread # the json decode will then fail, because the message is clipped bg_ser.write('v') bg_ser.write('v') bg_ser.write('v') bg_ser.write('v') bg_ser.write('v') line = True while(line): line = bg_ser.read_line() if line: if line[0] == 'V': try: decoded = simplejson.loads(line[2:]) print("Success") success += 1 except simplejson.JSONDecodeError: logMessage("Error: invalid JSON parameter string received: " + line) fail += 1 else: print(line) time.sleep(5) print("Successes: {0}, Fails: {1}".format(success,fail))
configFile = os.path.abspath(a) if not os.path.exists(configFile): sys.exit('ERROR: Config file "%s" was not found!' % configFile) # send quit instruction to all running instances of BrewPi if o in ('-s', '--status'): allProcesses = BrewPiProcess.BrewPiProcesses() allProcesses.update() running = allProcesses.as_dict() if running: pprint(running) else: printStdErr("No BrewPi scripts running") exit() # quit/kill running instances, then keep this one if o in ('-q', '--quit'): logMessage("Asking all BrewPi Processes to quit on their socket") allProcesses = BrewPiProcess.BrewPiProcesses() allProcesses.quitAll() time.sleep(2) exit() # send SIGKILL to all running instances of BrewPi if o in ('-k', '--kill'): logMessage("Killing all BrewPi Processes") allProcesses = BrewPiProcess.BrewPiProcesses() allProcesses.killAll() exit() # close all existing instances of BrewPi by quit/kill and keep this one if o in ('-f', '--force'): logMessage( "Closing all existing processes of BrewPi and keeping this one") allProcesses = BrewPiProcess.BrewPiProcesses()