This commit is contained in:
Chip Garner 2023-01-02 20:33:22 -08:00
commit 0485ed961a
4 changed files with 32 additions and 1 deletions

View File

@ -12,12 +12,13 @@ Turns a Raspberry Pi into an inexpensive, web-enabled kiln controller.
* no limit to runtime - fire for days if you want
* view status from multiple devices at once - computer, tablet etc
* real-time firing cost estimate
* NIST-linearized conversion for accurate K type thermocouple readings
* real-time heating rate displayed in degrees per hour
* supports PID parameters you tune to your kiln
* monitors temperature in kiln after schedule has ended
* api for starting and stopping at any point in a schedule
* accurate simulation
* support for shifting schedule when kiln cannot heat quickly enough
* support for skipping first part of profile to match current kiln temperature
* prevents integral wind-up when temperatures not near the set point
* automatic restarts if there is a power outage or other event
* support for a watcher to page you via slack if you kiln is out of whack

View File

@ -327,6 +327,8 @@ class Oven(threading.Thread):
self.totaltime = 0
self.target = 0
self.heat = 0
self.heat_rate = 0
self.heat_rate_temps = []
self.pid = PID(ki=config.pid_ki, kd=config.pid_kd, kp=config.pid_kp)
@staticmethod
@ -339,6 +341,24 @@ class Oven(threading.Thread):
startat = 0
return startat
def set_heat_rate(self,runtime,temp):
'''heat rate is the heating rate in degrees/hour
'''
# arbitrary number of samples
# the time this covers changes based on a few things
numtemps = 60
self.heat_rate_temps.append((runtime,temp))
# drop old temps off the list
if len(self.heat_rate_temps) > numtemps:
self.heat_rate_temps = self.heat_rate_temps[-1*numtemps:]
time2 = self.heat_rate_temps[-1][0]
time1 = self.heat_rate_temps[0][0]
temp2 = self.heat_rate_temps[-1][1]
temp1 = self.heat_rate_temps[0][1]
if time2 > time1:
self.heat_rate = ((temp2 - temp1) / (time2 - time1))*3600
def run_profile(self, profile, startat=0, allow_seek=True):
log.debug('run_profile run on thread' + threading.current_thread().name)
runtime = startat * 60
@ -426,6 +446,8 @@ class Oven(threading.Thread):
temp = 0
pass
self.set_heat_rate(self.runtime,temp)
state = {
'cost': self.cost,
'runtime': self.runtime,
@ -433,6 +455,7 @@ class Oven(threading.Thread):
'target': self.target,
'state': self.state,
'heat': self.heat,
'heat_rate': self.heat_rate,
'totaltime': self.totaltime,
'kwh_rate': config.kwh_rate,
'currency_type': config.currency_type,

View File

@ -575,6 +575,10 @@ $(document).ready(function()
}
$('#act_temp').html(parseInt(x.temperature));
heat_rate = parseInt(x.heat_rate)
if (heat_rate > 9999) { heat_rate = 9999; }
if (heat_rate < -9999) { heat_rate = -9999; }
$('#heat_rate').html(heat_rate);
$('#heat').html('<div class="bar" style="height:'+x.pidstats.out*70+'%;"></div>')
if (x.cool > 0.5) { $('#cool').addClass("ds-led-cool-active"); } else { $('#cool').removeClass("ds-led-cool-active"); }
if (x.air > 0.5) { $('#air').addClass("ds-led-air-active"); } else { $('#air').removeClass("ds-led-air-active"); }
@ -608,6 +612,7 @@ $(document).ready(function()
$('#act_temp_scale').html('º'+temp_scale_display);
$('#target_temp_scale').html('º'+temp_scale_display);
$('#heat_rate_temp_scale').html('º'+temp_scale_display);
switch(time_scale_profile){
case "s":

View File

@ -29,6 +29,7 @@
<div class="ds-title-panel">
<div class="ds-title">Sensor Temp</div>
<div class="ds-title">Target Temp</div>
<div class="ds-title">Heat Rate</div>
<div class="ds-title">Cost</div>
<div class="ds-title ds-state pull-right" style="border-left: 1px solid #ccc;">Status</div>
</div>
@ -36,6 +37,7 @@
<div class="ds-panel">
<div class="display ds-num"><span id="act_temp">25</span><span class="ds-unit" id="act_temp_scale" >&deg;C</span></div>
<div class="display ds-num ds-target"><span id="target_temp">---</span><span class="ds-unit" id="target_temp_scale">&deg;C</span></div>
<div class="display ds-num ds-heat-rate"><span id="heat_rate">---</span><span class="ds-unit" id="heat_rate_temp_scale">&deg;C</span></div>
<div class="display ds-num ds-cost"><span id="cost">0.00</span><span class="ds-unit" id="cost"></span></div>
<div class="display ds-num ds-text" id="state"></div>
<div class="display pull-right ds-state" style="padding-right:0"><span class="ds-led" id="heat">&#92;</span><span class="ds-led" id="cool">&#108;</span><span class="ds-led" id="air">&#91;</span><span class="ds-led" id="hazard">&#73;</span><span class="ds-led" id="door">&#9832;</span></div>