diff --git a/config.py.EXAMPLE b/config.py.EXAMPLE index bf15d37..2dbf4c0 100644 --- a/config.py.EXAMPLE +++ b/config.py.EXAMPLE @@ -12,6 +12,10 @@ log_format = '%(asctime)s %(levelname)s %(name)s: %(message)s' listening_ip = "0.0.0.0" listening_port = 8081 +### Cost Estimate +kwh_rate = 0.26 # Rate in currency_type to calculate cost to run job +currency_type = "EUR" # Currency Symbol to show when calculating cost to run job + ######################################################################## # # GPIO Setup (BCM SoC Numbering Schema) @@ -62,3 +66,13 @@ sim_R_o_nocool = 1.0 # K/W thermal resistance oven -> environment sim_R_o_cool = 0.05 # K/W " with cooling sim_R_ho_noair = 0.1 # K/W thermal resistance heat element -> oven sim_R_ho_air = 0.05 # K/W " with internal air circulation + + +######################################################################## +# +# Time and Temperature parameters + +temp_scale = "c" # c = Celsius | f = Fahrenheit - Unit to display +time_scale_slope = "s" # s = Seconds | m = Minutes | h = Hours - Slope displayed in temp_scale per time_scale_slope +time_scale_profile = "s" # s = Seconds | m = Minutes | h = Hours - Enter and view target time in time_scale_profile + diff --git a/lib/oven.py b/lib/oven.py index 3c37d73..74059cb 100644 --- a/lib/oven.py +++ b/lib/oven.py @@ -215,13 +215,14 @@ class TempSensorReal(TempSensor): self.thermocouple = MAX6675(config.gpio_sensor_cs, config.gpio_sensor_clock, config.gpio_sensor_data, - "c") + config.temp_scale) + if config.max31855: log.info("init MAX31855") self.thermocouple = MAX31855(config.gpio_sensor_cs, config.gpio_sensor_clock, config.gpio_sensor_data, - "c") + config.temp_scale) def run(self): while True: diff --git a/picoreflowd.py b/picoreflowd.py index 00506b5..29169ac 100755 --- a/picoreflowd.py +++ b/picoreflowd.py @@ -136,6 +136,19 @@ def handle_storage(): log.info("websocket (storage) closed") +@app.route('/config') +def handle_config(): + wsock = get_websocket_from_request() + log.info("websocket (config) opened") + while True: + try: + message = wsock.receive() + wsock.send(get_config()) + except WebSocketError: + break + log.info("websocket (config) closed") + + @app.route('/status') def handle_status(): wsock = get_websocket_from_request() @@ -183,6 +196,15 @@ def delete_profile(profile): log.info("Deleted %s" % filepath) return True + +def get_config(): + return json.dumps({"temp_scale": config.temp_scale, + "time_scale_slope": config.time_scale_slope, + "time_scale_profile": config.time_scale_profile, + "kwh_rate": config.kwh_rate, + "currency_type": config.currency_type}) + + def main(): ip = config.listening_ip port = config.listening_port diff --git a/public/assets/css/picoreflow.css b/public/assets/css/picoreflow.css index d37e898..8e77db7 100644 --- a/public/assets/css/picoreflow.css +++ b/public/assets/css/picoreflow.css @@ -135,6 +135,16 @@ body { background: radial-gradient(ellipse at center, rgba(242,195,67,1) 0%,rgba(241,218,54,0.26) 100%); /* W3C */ } +.ds-led-door-open { + color: rgb(214, 42, 0); + background: -moz-radial-gradient(center, ellipse cover, rgba(242,195,67,1) 0%, rgba(241,218,54,0.26) 100%); /* FF3.6+ */ + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(242,195,67,1)), color-stop(100%,rgba(241,218,54,0.26))); /* Chrome,Safari4+ */ + background: -webkit-radial-gradient(center, ellipse cover, rgba(242,195,67,1) 0%,rgba(241,218,54,0.26) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-radial-gradient(center, ellipse cover, rgba(242,195,67,1) 0%,rgba(241,218,54,0.26) 100%); /* Opera 12+ */ + background: -ms-radial-gradient(center, ellipse cover, rgba(242,195,67,1) 0%,rgba(241,218,54,0.26) 100%); /* IE10+ */ + background: radial-gradient(ellipse at center, rgba(242,195,67,1) 0%,rgba(241,218,54,0.26) 100%); /* W3C */ +} + .ds-led-cool-active { color: rgb(74, 159, 255); background: -moz-radial-gradient(center, ellipse cover, rgba(124,197,239,1) 0%, rgba(48,144,209,0.26) 100%); /* FF3.6+ */ @@ -188,7 +198,7 @@ body { border: none; width: initial; text-align: center; - width: 168px; + width: 210px; padding: 0; } diff --git a/public/assets/js/picoreflow.js b/public/assets/js/picoreflow.js index 746e34d..206ba7e 100644 --- a/public/assets/js/picoreflow.js +++ b/public/assets/js/picoreflow.js @@ -6,12 +6,21 @@ var profiles = []; var time_mode = 0; var selected_profile = 0; var selected_profile_name = 'leadfree'; +var temp_scale = "c"; +var time_scale_slope = "s"; +var time_scale_profile = "s"; +var time_scale_long = "Seconds"; +var temp_scale_display = "C"; +var kwh_rate = 0.26; +var currency_type = "EUR"; var host = "ws://" + window.location.hostname + ":" + window.location.port; var ws_status = new WebSocket(host+"/status"); var ws_control = new WebSocket(host+"/control"); +var ws_config = new WebSocket(host+"/config"); var ws_storage = new WebSocket(host+"/storage"); + if(window.webkitRequestAnimationFrame) window.requestAnimationFrame = window.webkitRequestAnimationFrame; graph.profile = @@ -36,14 +45,13 @@ graph.live = function updateProfile(id) { selected_profile = id; - job_time = parseInt(profiles[id].data[profiles[id].data.length-1][0]); - var kwh = (3850*job_time/3600/1000).toFixed(2); - var cost = (kwh*0.26).toFixed(2); - var minutes = Math.floor(job_time/60), seconds = job_time-minutes*60; - job_time = minutes+':'+ (seconds < 10 ? "0" : "") + seconds; + var job_seconds = parseInt(profiles[id].data[profiles[id].data.length-1][0]); + var kwh = (3850*job_seconds/3600/1000).toFixed(2); + var cost = (kwh*kwh_rate).toFixed(2); + var job_time = new Date(job_seconds * 1000).toISOString().substr(11, 8); $('#sel_prof').html(profiles[id].name); $('#sel_prof_eta').html(job_time); - $('#sel_prof_cost').html(kwh + ' kWh (EUR: '+ cost +')'); + $('#sel_prof_cost').html(kwh + ' kWh ('+ currency_type +': '+ cost +')'); graph.profile.data = profiles[id].data; graph.plot = $.plot("#graph_container", [ graph.profile, graph.live ] , getOptions()); } @@ -95,20 +103,20 @@ function updateProfileTable() var color = ""; var html = '
# | Target Time | Target Temperature in °C | Slope in °C/s | |||
---|---|---|---|---|---|---|
# | Target Time in ' + time_scale_long+ ' | Target Temperature in °'+temp_scale_display+' | Slope in °'+temp_scale_display+'/'+time_scale_slope+' | |||
' + (i+1) + ' | ';
- html += ''; + html += ' | '; html += ' | '; - html += ' |