From f97e6a3b46ad032473573a440a7883165facd2f8 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sat, 14 Nov 2015 16:00:58 +0100 Subject: [PATCH 01/13] Fixed flashDfu --file parameter not being parsed --- utils/flashDfu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/flashDfu.py b/utils/flashDfu.py index 2b01461..4ced0bc 100644 --- a/utils/flashDfu.py +++ b/utils/flashDfu.py @@ -70,7 +70,7 @@ exit() # supply a config file - if o in ('-f', '--config'): + if o in ('-f', '--file'): binFile = os.path.abspath(a) if not os.path.exists(binFile): sys.exit('ERROR: Binary file "%s" was not found!' % binFile) From 5e4e5c3c5d15eef53d580e97d3e42371fc1922f9 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Thu, 17 Dec 2015 21:07:01 +0100 Subject: [PATCH 02/13] Modified logMessage to send back messages over JSON --- brewpi.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/brewpi.py b/brewpi.py index 4baf68e..c5ebb62 100644 --- a/brewpi.py +++ b/brewpi.py @@ -72,7 +72,7 @@ def printStdErr(*objs): import pinList import expandLogMessage import BrewPiProcess - +import queue # Settings will be read from controller, initialize with same defaults as controller # This is mainly to show what's expected. Will all be overwritten on the first update from the controller @@ -95,11 +95,21 @@ def printStdErr(*objs): # listState = "", "d", "h", "dh" to reflect whether the list is up to date for installed (d) and available (h) deviceList = dict(listState="", installed=[], available=[]) +# Message queue +messageQueue = queue.Queue() + lcdText = ['Script starting up', ' ', ' ', ' '] def logMessage(message): printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) + messageQueue.put({'messageType': messageType, 'message': message}) + +def getLogMessages(): + result_list = [] + while not messageQueue.empty(): + result_list.append(messageQueue.get()) + return result_list # Read in command line arguments try: opts, args = getopt.getopt(sys.argv[1:], "hc:sqkfld", @@ -849,6 +859,7 @@ def renameTempKey(key): if ser: ser.close() # close port if conn: + conn.send(json.dumps({'messages': getLogMessages()})) conn.shutdown(socket.SHUT_RDWR) # close socket conn.close() From 42cc792fb889645254eb2af475cc51c4d2f5a9e3 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Thu, 17 Dec 2015 21:10:11 +0100 Subject: [PATCH 03/13] Made changes to work on python 2.7 --- brewpi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/brewpi.py b/brewpi.py index c5ebb62..a603c3b 100644 --- a/brewpi.py +++ b/brewpi.py @@ -72,7 +72,7 @@ def printStdErr(*objs): import pinList import expandLogMessage import BrewPiProcess -import queue +import Queue # Settings will be read from controller, initialize with same defaults as controller # This is mainly to show what's expected. Will all be overwritten on the first update from the controller @@ -96,11 +96,11 @@ def printStdErr(*objs): deviceList = dict(listState="", installed=[], available=[]) # Message queue -messageQueue = queue.Queue() +messageQueue = Queue.Queue() lcdText = ['Script starting up', ' ', ' ', ' '] -def logMessage(message): +def logMessage(message, messageType="error"): printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) messageQueue.put({'messageType': messageType, 'message': message}) From 17affb1a1b4a8c9f4e487d5a580747c81340206c Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Fri, 18 Dec 2015 08:09:52 +0100 Subject: [PATCH 04/13] added messageType=getMessages --- brewpi.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/brewpi.py b/brewpi.py index a603c3b..520cace 100644 --- a/brewpi.py +++ b/brewpi.py @@ -110,6 +110,8 @@ def getLogMessages(): result_list.append(messageQueue.get()) return result_list + + # Read in command line arguments try: opts, args = getopt.getopt(sys.argv[1:], "hc:sqkfld", @@ -512,6 +514,8 @@ def renameTempKey(key): conn.send(json.dumps(cs)) elif messageType == "getControlVariables": conn.send(json.dumps(cv)) + elif messageType == "getMessages": + conn.send(json.dumps({'messages': getLogMessages()})) elif messageType == "refreshControlConstants": ser.write("c") raise socket.timeout @@ -859,7 +863,6 @@ def renameTempKey(key): if ser: ser.close() # close port if conn: - conn.send(json.dumps({'messages': getLogMessages()})) conn.shutdown(socket.SHUT_RDWR) # close socket conn.close() From aac18caccfdba17384c2c25b83bec23029245e8a Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Fri, 18 Dec 2015 10:35:20 +0100 Subject: [PATCH 05/13] Updated most logMessage calls to include messageType. --- brewpi.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/brewpi.py b/brewpi.py index 520cace..c6163c6 100644 --- a/brewpi.py +++ b/brewpi.py @@ -535,7 +535,7 @@ def renameTempKey(key): try: newTemp = float(value) except ValueError: - logMessage("Cannot convert temperature '" + value + "' to float") + logMessage("Cannot convert temperature '" + value + "' to float","error") continue if cc['tempSetMin'] <= newTemp <= cc['tempSetMax']: cs['mode'] = 'b' @@ -544,18 +544,18 @@ def renameTempKey(key): ser.write("j{mode:b, beerSet:" + json.dumps(cs['beerSet']) + "}") logMessage("Notification: Beer temperature set to " + str(cs['beerSet']) + - " degrees in web interface") + " degrees in web interface","info") raise socket.timeout # go to serial communication to update controller else: logMessage("Beer temperature setting " + str(newTemp) + " is outside of allowed range " + str(cc['tempSetMin']) + " - " + str(cc['tempSetMax']) + - ". These limits can be changed in advanced settings.") + ". These limits can be changed in advanced settings.","warning") elif messageType == "setFridge": # new constant fridge temperature received try: newTemp = float(value) except ValueError: - logMessage("Cannot convert temperature '" + value + "' to float") + logMessage("Cannot convert temperature '" + value + "' to float", "error") continue if cc['tempSetMin'] <= newTemp <= cc['tempSetMax']: @@ -564,17 +564,17 @@ def renameTempKey(key): ser.write("j{mode:f, fridgeSet:" + json.dumps(cs['fridgeSet']) + "}") logMessage("Notification: Fridge temperature set to " + str(cs['fridgeSet']) + - " degrees in web interface") + " degrees in web interface","info") raise socket.timeout # go to serial communication to update controller else: logMessage("Fridge temperature setting " + str(newTemp) + " is outside of allowed range " + str(cc['tempSetMin']) + " - " + str(cc['tempSetMax']) + - ". These limits can be changed in advanced settings.") + ". These limits can be changed in advanced settings.","warning") elif messageType == "setOff": # cs['mode'] set to OFF cs['mode'] = 'o' ser.write("j{mode:o}") - logMessage("Notification: Temperature control disabled") + logMessage("Notification: Temperature control disabled","info") raise socket.timeout elif messageType == "setParameters": # receive JSON key:value pairs to set parameters on the controller @@ -584,20 +584,20 @@ def renameTempKey(key): if 'tempFormat' in decoded: changeWwwSetting('tempFormat', decoded['tempFormat']) # change in web interface settings too. except json.JSONDecodeError: - logMessage("Error: invalid JSON parameter string received: " + value) + logMessage("Error: invalid JSON parameter string received: " + value,"error") raise socket.timeout elif messageType == "stopScript": # exit instruction received. Stop script. # voluntary shutdown. # write a file to prevent the cron job from restarting the script logMessage("stopScript message received on socket. " + - "Stopping script and writing dontrunfile to prevent automatic restart") + "Stopping script and writing dontrunfile to prevent automatic restart","info") run = 0 dontrunfile = open(dontRunFilePath, "w") dontrunfile.write("1") dontrunfile.close() continue elif messageType == "quit": # quit instruction received. Probably sent by another brewpi script instance - logMessage("quit message received on socket. Stopping script.") + logMessage("quit message received on socket. Stopping script.","info") run = 0 # Leave dontrunfile alone. # This instruction is meant to restart the script or replace it with another instance. @@ -606,7 +606,7 @@ def renameTempKey(key): # erase the log files for stderr and stdout open(util.scriptPath() + '/logs/stderr.txt', 'wb').close() open(util.scriptPath() + '/logs/stdout.txt', 'wb').close() - logMessage("Fresh start! Log files erased.") + logMessage("Fresh start! Log files erased.","info") continue elif messageType == "interval": # new interval received newInterval = int(value) @@ -614,10 +614,10 @@ def renameTempKey(key): try: config = util.configSet(configFile, 'interval', float(newInterval)) except ValueError: - logMessage("Cannot convert interval '" + value + "' to float") + logMessage("Cannot convert interval '" + value + "' to float","error") continue logMessage("Notification: Interval changed to " + - str(newInterval) + " seconds") + str(newInterval) + " seconds","info") elif messageType == "startNewBrew": # new beer name newName = value result = startNewBrew(newName) @@ -634,7 +634,7 @@ def renameTempKey(key): elif messageType == "dateTimeFormatDisplay": config = util.configSet(configFile, 'dateTimeFormatDisplay', value) changeWwwSetting('dateTimeFormatDisplay', value) - logMessage("Changing date format config setting: " + value) + logMessage("Changing date format config setting: " + value,"info") elif messageType == "setActiveProfile": # copy the profile CSV file to the working directory logMessage("Setting profile '%s' as active profile" % value) @@ -833,14 +833,14 @@ def renameTempKey(key): deviceList['available'] = json.loads(line[2:]) oldListState = deviceList['listState'] deviceList['listState'] = oldListState.strip('h') + "h" - logMessage("Available devices received: "+ json.dumps(deviceList['available'])) + logMessage("Available devices received: "+ json.dumps(deviceList['available']), "info") elif line[0] == 'd': deviceList['installed'] = json.loads(line[2:]) oldListState = deviceList['listState'] deviceList['listState'] = oldListState.strip('d') + "d" - logMessage("Installed devices received: " + json.dumps(deviceList['installed']).encode('utf-8')) + logMessage("Installed devices received: " + json.dumps(deviceList['installed']).encode('utf-8'),"info") elif line[0] == 'U': - logMessage("Device updated to: " + line[2:]) + logMessage("Device updated to: " + line[2:],"info") else: logMessage("Cannot process line from controller: " + line) # end or processing a line From 29c742da88b106a6c9c3d0abc6aa524a17b57a32 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 08:26:38 +0100 Subject: [PATCH 06/13] Added notification saving and printing to logMessage --- BrewPiUtil.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/BrewPiUtil.py b/BrewPiUtil.py index 97556a0..11c39dc 100644 --- a/BrewPiUtil.py +++ b/BrewPiUtil.py @@ -20,6 +20,7 @@ import os import serial import autoSerial +import Queue try: import configobj @@ -27,6 +28,8 @@ print("BrewPi requires ConfigObj to run, please install it with 'sudo apt-get install python-configobj") sys.exit(1) +# Message queue +messageQueue = Queue.Queue() def addSlash(path): """ @@ -83,12 +86,15 @@ def configSet(configFile, settingName, value): def printStdErr(*objs): print("", *objs, file=sys.stderr) -def logMessage(message): - """ - Prints a timestamped message to stderr - """ - printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) +def logMessage(message, messageType="error"): + printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) + messageQueue.put({'messageType': messageType, 'message': message}) +def getLogMessages(): + result_list = [] + while not messageQueue.empty(): + result_list.append(messageQueue.get()) + return result_list def scriptPath(): """ From b1b6098c9ca681e96bf7d24d776e506434b0c2f2 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 08:35:41 +0100 Subject: [PATCH 07/13] stupid typo --- brewpi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brewpi.py b/brewpi.py index 21fc8b9..831a324 100644 --- a/brewpi.py +++ b/brewpi.py @@ -488,7 +488,7 @@ def renameTempKey(key): elif messageType == "getControlVariables": conn.send(cv) elif messageType == "getMessages": -+ conn.send(json.dumps({'messages': getLogMessages()})) + conn.send(json.dumps({'messages': getLogMessages()})) elif messageType == "refreshControlConstants": bg_ser.write("c") raise socket.timeout From 4650881080d5657bd49494de307acc739f66a550 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 08:37:20 +0100 Subject: [PATCH 08/13] no message --- BrewPiUtil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrewPiUtil.py b/BrewPiUtil.py index 11c39dc..dfa7ac7 100644 --- a/BrewPiUtil.py +++ b/BrewPiUtil.py @@ -87,7 +87,7 @@ def printStdErr(*objs): print("", *objs, file=sys.stderr) def logMessage(message, messageType="error"): - printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) + printStdErr(time.strftime("%b %d %Y %H:%M:%S ") + message) messageQueue.put({'messageType': messageType, 'message': message}) def getLogMessages(): From f2b4110ffdb1ae4dbf03cc98e3cc471ea12715c2 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 08:38:07 +0100 Subject: [PATCH 09/13] no message --- brewpi.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/brewpi.py b/brewpi.py index 831a324..bdf880d 100644 --- a/brewpi.py +++ b/brewpi.py @@ -95,9 +95,6 @@ # listState = "", "d", "h", "dh" to reflect whether the list is up to date for installed (d) and available (h) deviceList = dict(listState="", installed=[], available=[]) -# Message queue -messageQueue = Queue.Queue() - lcdText = ['Script starting up', ' ', ' ', ' '] # Read in command line arguments From 6b6077744d72f80f241300db9636aab384868f36 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 08:51:28 +0100 Subject: [PATCH 10/13] Added sendData proxy function to append messages to any outgoing socket communication --- brewpi.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/brewpi.py b/brewpi.py index bdf880d..7c3c7b5 100644 --- a/brewpi.py +++ b/brewpi.py @@ -440,6 +440,9 @@ def renameTempKey(key): "t": "Time"} return rename.get(key, key) +def sendData (data) + conn.send(data + json.dumps({'messages': getLogMessages()})) + while run: if config['dataLogging'] == 'active': # Check whether it is a new day @@ -466,7 +469,7 @@ def renameTempKey(key): if messageType == "ack": # acknowledge request conn.send('ack') elif messageType == "lcd": # lcd contents requested - conn.send(json.dumps(lcdText)) + sendData(json.dumps(lcdText)) elif messageType == "getMode": # echo cs['mode'] setting conn.send(cs['mode']) elif messageType == "getFridge": # echo fridge temperature setting From 7824d997e9cfcc1c9e2f5b865d36f3bf175af7d3 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 08:57:47 +0100 Subject: [PATCH 11/13] no message --- brewpi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/brewpi.py b/brewpi.py index 7c3c7b5..dcabad8 100644 --- a/brewpi.py +++ b/brewpi.py @@ -20,6 +20,7 @@ from BrewPiUtil import printStdErr from BrewPiUtil import logMessage +from BrewPiUtil import getLogMessages # Check needed software dependencies to nudge users to fix their setup if sys.version_info < (2, 7): @@ -440,7 +441,7 @@ def renameTempKey(key): "t": "Time"} return rename.get(key, key) -def sendData (data) +def sendData(data): conn.send(data + json.dumps({'messages': getLogMessages()})) while run: From 93071138775933107eabe107dfff987cf9140a6d Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 09:26:41 +0100 Subject: [PATCH 12/13] Added combined response from server to client --- brewpi.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/brewpi.py b/brewpi.py index dcabad8..bbac20d 100644 --- a/brewpi.py +++ b/brewpi.py @@ -442,7 +442,7 @@ def renameTempKey(key): return rename.get(key, key) def sendData(data): - conn.send(data + json.dumps({'messages': getLogMessages()})) + conn.send(json.dumps({'response': data, 'messages': getLogMessages()})) while run: if config['dataLogging'] == 'active': @@ -470,26 +470,26 @@ def sendData(data): if messageType == "ack": # acknowledge request conn.send('ack') elif messageType == "lcd": # lcd contents requested - sendData(json.dumps(lcdText)) + sendData((lcdText)) elif messageType == "getMode": # echo cs['mode'] setting conn.send(cs['mode']) elif messageType == "getFridge": # echo fridge temperature setting - conn.send(json.dumps(cs['fridgeSet'])) + sendData(cs['fridgeSet']) elif messageType == "getBeer": # echo fridge temperature setting - conn.send(json.dumps(cs['beerSet'])) + sendData(cs['beerSet']) elif messageType == "getControlConstants": - conn.send(json.dumps(cc)) + sendData(cc) elif messageType == "getControlSettings": if cs['mode'] == "p": profileFile = util.addSlash(util.scriptPath()) + 'settings/tempProfile.csv' with file(profileFile, 'r') as prof: cs['profile'] = prof.readline().split(",")[-1].rstrip("\n") cs['dataLogging'] = config['dataLogging'] - conn.send(json.dumps(cs)) + sendData(cs) elif messageType == "getControlVariables": conn.send(cv) elif messageType == "getMessages": - conn.send(json.dumps({'messages': getLogMessages()})) + csendData({'messages': getLogMessages()}) elif messageType == "refreshControlConstants": bg_ser.write("c") raise socket.timeout @@ -586,16 +586,16 @@ def sendData(data): elif messageType == "startNewBrew": # new beer name newName = value result = startNewBrew(newName) - conn.send(json.dumps(result)) + sendData(result) elif messageType == "pauseLogging": result = pauseLogging() - conn.send(json.dumps(result)) + sendData(result) elif messageType == "stopLogging": result = stopLogging() - conn.send(json.dumps(result)) + sendData(result) elif messageType == "resumeLogging": result = resumeLogging() - conn.send(json.dumps(result)) + sendData(result) elif messageType == "dateTimeFormatDisplay": config = util.configSet(configFile, 'dateTimeFormatDisplay', value) changeWwwSetting('dateTimeFormatDisplay', value) @@ -666,7 +666,7 @@ def sendData(data): shield=hwVersion.shield, deviceList=deviceList, pinList=pinList.getPinList(hwVersion.board, hwVersion.shield)) - conn.send(json.dumps(response)) + sendData(response) else: conn.send("device-list-not-up-to-date") elif messageType == "applyDevice": From 5ef0c2c2a04c39e17140c8dfc0abe0856bda17b1 Mon Sep 17 00:00:00 2001 From: Lukas Demetz Date: Sun, 24 Jan 2016 09:28:13 +0100 Subject: [PATCH 13/13] no message --- brewpi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brewpi.py b/brewpi.py index bbac20d..be225f9 100644 --- a/brewpi.py +++ b/brewpi.py @@ -489,7 +489,7 @@ def sendData(data): elif messageType == "getControlVariables": conn.send(cv) elif messageType == "getMessages": - csendData({'messages': getLogMessages()}) + sendData({'messages': getLogMessages()}) elif messageType == "refreshControlConstants": bg_ser.write("c") raise socket.timeout