Skip to content

Commit 89feee9

Browse files
committed
v1.1
1 parent 69fa748 commit 89feee9

27 files changed

+34468
-34427
lines changed

README.md

+6-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ Donations
1515

1616
This software is open-source and absolutely free, even for commercial use.
1717

18-
If you think Artisan is worth of some money and you are willing to contribute financially to its further development, feel free to send any amount via my [PayPal.Me page](https://www.paypal.me/MarkoLuther). Thanks!
18+
If you think Artisan is useful to you, contribute financially to its further development. Send any amount via my [PayPal.Me page](https://www.paypal.me/MarkoLuther). Thanks!
1919

20+
> *Home roasting enthusiasts often donate 10-100.- (in $ or EUR), while small roasting businesses and consultant that use Artisan in their daily work tend to donate 100-300.- (in $ or EUR). For extra tech support, please inquire.*
2021
2122

2223
![](https://github.com/MAKOMO/artisan/blob/master/wiki/screenshots/FZ94-PID-small.png?raw=true)
@@ -49,7 +50,9 @@ Features
4950
* Yocto Thermocouple and PT100
5051
* [Hottop KN-8828B-2K+](http://artisan-roasterscope.blogspot.de/2015/05/hottop-kn-8828b-2k.html)
5152
* external program
52-
- multi-format (import and export of various file formats: HTML, PDF, SVG, CSV, JSON, Omega HH506RA, K202, K204, [RoastLogger](http://roastlogger.co.uk/coffee/roastlogger/roastlogger.htm))
53+
- and machines
54+
* [Probat Probatone 2](https://artisan-roasterscope.blogspot.de/2017/06/probat-probatone.html)
55+
- multi-format (import and export of various file formats: HTML, PDF, SVG, CSV, JSON, Omega HH506RA, K202, K204, [RoastLogger](http://roastlogger.co.uk/coffee/roastlogger/roastlogger.htm), [Probat Pilot](http://www.probat-shoproaster.com/en/plants-equipment/control-software/general-features/), [Aillio Bullet R1](https://aillio.com))
5356
- unlimited number of temperature and [virtual curves](https://artisan-roasterscope.blogspot.de/2014/04/virtual-devices-and-symbolic-assignments.html) incl. rate-of-rise curves for ET and BT
5457
- [spike filter](http://artisan-roasterscope.blogspot.de/2013/05/fighting-spikes.html) and [curve smoothing](https://artisan-roasterscope.blogspot.de/2014/01/sampling-interval-smoothing-and-rate-of.html)
5558
- [symbolic expressions](https://artisan-roasterscope.blogspot.de/2016/03/roast-calculus.html)
@@ -105,7 +108,7 @@ Version History
105108

106109
| Version | Date | Comment |
107110
|---------|------|---------|
108-
| v1.1.0 | xx.06.2017 | Adds Recent Roast Properties, Aillio Bullet R1 profile import and support for Probats Probatone 2 machines |
111+
| v1.1.0 | 10.06.2017 | Adds [Recent Roast Properties](https://artisan-roasterscope.blogspot.de/2017/06/recent-roast-properties.html), [Aillio Bullet R1](https://aillio.com) profile import and support for [Probat Probatone 2](https://artisan-roasterscope.blogspot.de/2017/06/probat-probatone.html) |
109112
| v1.0.0 | 24.02.2017 | Adds [internal software PID](https://artisan-roasterscope.blogspot.de/2016/11/pid-control.html), external MODBUS PID control, Apollo DT301, Extech 755, fast MODBUS RTU, [AUC](https://artisan-roasterscope.blogspot.de/2016/11/area-under-curve-auc.html), RPi build, additional translations, bug fixes and stability improvements |
110113
| v0.9.9 | 14.03.2016 | Adds [batch and ranking reports, batch conversions, follow-background for Fuji PIDs, additional keyboard short cuts, designer improvements, bug fixes](https://artisan-roasterscope.blogspot.de/2016/03/artisan-v099.html) |
111114
| v0.9.8 | 21.10.2015 | US weight and volume units, extended [symbolic expressions and plotter](http://artisan-roasterscope.blogspot.de/2015/10/signals-symbolic-assignments-and-plotter.html), [ln()/x^2 approximations](http://artisan-roasterscope.blogspot.de/2015/10/natural-roasts.html), bug fixes |

src/README.txt

+8
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ o ET/BT logging and PID control supporting the following devices
4343
- Yocto Thermocouple and PT100
4444
- Hottop KN-8828B-2K+
4545
- external program
46+
and machines
47+
- Probat Probatone 2
4648
o unlimited number of devices/curves running at the same time
4749
o symbolic manipulation of device outputs
4850
o Fahrenheit and Celsius display and conversion
@@ -191,6 +193,12 @@ Artisan uses the following libraries in unmodified forms:
191193

192194
VERSION HISTORY
193195

196+
v1.1.0 (10.6.2017)
197+
- adds Recent Roast Properties
198+
- adds Aillio Bullet R1 profile import
199+
- adds support for Probat Probatone 2
200+
- bug fixes and stability improvements
201+
194202
v1.0.0 (24.2.2017)
195203
- adds internal software PID
196204
- external MODBUS PID control and faster MODBUS RTU

src/artisanlib/main.py

+67-47
Original file line numberDiff line numberDiff line change
@@ -609,8 +609,9 @@ class tgraphcanvas(FigureCanvas):
609609
def __init__(self,parent):
610610

611611
#default palette of colors
612-
self.palette = {"background":'white',"grid":'#808080',"ylabel":'0.20',"xlabel":'0.20',"title":'0.20',"rect1":'green',
613-
"rect2":'orange',"rect3":'#996633',"rect4":'lightblue',"rect5":'lightgrey',"et":'red',"bt":'#00007f',"xt":'green',"deltaet":'orange',
612+
self.palette = {"background":'white',"grid":'#808080',"ylabel":'0.20',"xlabel":'0.20',"title":'0.20',
613+
"rect1":'green',"rect2":'orange',"rect3":'#996633',"rect4":'lightblue',"rect5":'lightgrey',
614+
"et":'red',"bt":'#00007f',"xt":'green',"deltaet":'orange',
614615
"deltabt":'blue',"markers":'black',"text":'black',"watermarks":'yellow',"Cline":'blue'}
615616

616617
self.artisanflavordefaultlabels = [QApplication.translate("Textbox", "Acidity",None),
@@ -5512,20 +5513,20 @@ def markCharge(self):
55125513
self.l_annotations += self.annotate(t2,st1,tx,t2,self.ystep_up,self.ystep_down)
55135514
# mark active slider values that are not zero
55145515
for slidernr in range(4):
5515-
# if aw.eventslidervisibilities[slidernr]:
5516-
# we record also for inactive sliders as some button press actions might have changed the event values also for those
5517-
if slidernr == 0:
5518-
slidervalue = aw.slider1.value()
5519-
elif slidernr == 1:
5520-
slidervalue = aw.slider2.value()
5521-
elif slidernr == 2:
5522-
slidervalue = aw.slider3.value()
5523-
elif slidernr == 3:
5524-
slidervalue = aw.slider4.value()
5525-
if slidervalue != 0:
5526-
value = aw.float2float((slidervalue + 10.0) / 10.0)
5527-
# note that EventRecordAction avoids to generate events were type and value matches to the previously recorded one
5528-
aw.qmc.EventRecordAction(extraevent = 1,eventtype=slidernr,eventvalue=value)
5516+
if aw.eventslidervisibilities[slidernr]:
5517+
# we record also for inactive sliders as some button press actions might have changed the event values also for those
5518+
if slidernr == 0:
5519+
slidervalue = aw.slider1.value()
5520+
elif slidernr == 1:
5521+
slidervalue = aw.slider2.value()
5522+
elif slidernr == 2:
5523+
slidervalue = aw.slider3.value()
5524+
elif slidernr == 3:
5525+
slidervalue = aw.slider4.value()
5526+
if slidervalue != 0:
5527+
value = aw.float2float((slidervalue + 10.0) / 10.0)
5528+
# note that EventRecordAction avoids to generate events were type and value matches to the previously recorded one
5529+
aw.qmc.EventRecordAction(extraevent = 1,eventtype=slidernr,eventvalue=value)
55295530
except Exception:
55305531
pass
55315532
else:
@@ -8974,11 +8975,9 @@ def sample(self):
89748975
aw.qmc.rateofchange1 = ((aw.qmc.tstemp1[-1] - aw.qmc.tstemp1[-left_index])/timed)*60. #delta ET (degress/minute)
89758976
aw.qmc.rateofchange2 = ((aw.qmc.tstemp2[-1] - aw.qmc.tstemp2[-left_index])/timed)*60. #delta BT (degress/minute)
89768977

8977-
8978-
89798978
aw.qmc.unfiltereddelta1.append(aw.qmc.rateofchange1)
89808979
aw.qmc.unfiltereddelta2.append(aw.qmc.rateofchange2)
8981-
8980+
89828981
####### filter deltaBT deltaET
89838982
# decay smoothing
89848983
if aw.qmc.deltafilter and not aw.qmc.altsmoothing:
@@ -9008,13 +9007,15 @@ def sample(self):
90089007
else:
90099008
aw.qmc.unfiltereddelta2.append(0.)
90109009
aw.qmc.rateofchange1,aw.qmc.rateofchange2,rateofchange1plot,rateofchange2plot = 0.,0.,0.,0.
9010+
9011+
90119012
# limit displayed RoR (only before TP is recognized)
90129013
if not aw.qmc.TPalarmtimeindex and aw.qmc.RoRlimitFlag:
9013-
if rateofchange1plot != None and (max(-aw.qmc.maxRoRlimit,aw.qmc.RoRlimitm) < rateofchange1plot < min(aw.qmc.maxRoRlimit,aw.qmc.RoRlimit)):
9014+
if rateofchange1plot != None and not (max(-aw.qmc.maxRoRlimit,aw.qmc.RoRlimitm) < rateofchange1plot < min(aw.qmc.maxRoRlimit,aw.qmc.RoRlimit)):
90149015
rateofchange1plot = None
9015-
if rateofchange2plot != None and (max(-aw.qmc.maxRoRlimit,aw.qmc.RoRlimitm) < rateofchange2plot < min(aw.qmc.maxRoRlimit,aw.qmc.RoRlimit)):
9016+
if rateofchange2plot != None and not (max(-aw.qmc.maxRoRlimit,aw.qmc.RoRlimitm) < rateofchange2plot < min(aw.qmc.maxRoRlimit,aw.qmc.RoRlimit)):
90169017
rateofchange2plot = None
9017-
9018+
90189019
# append new data to the rateofchange
90199020
if local_flagstart:
90209021
# only if we have enough readings to fully apply the delta_span and delta_smoothing, we draw the resulting lines
@@ -9460,8 +9461,22 @@ def __init__(self, parent = None):
94609461
self.maxRecentRoasts = 20 # the maximum number of recent roasts held
94619462

94629463
#lcd1 = time, lcd2 = met, lcd3 = bt, lcd4 = roc et, lcd5 = roc bt, lcd6 = sv (extra devices lcd same as sv seetings)
9463-
self.lcdpaletteB = {"timer":'black',"et":'black',"bt":'black',"deltaet":'black',"deltabt":'black',"sv":'black'}
9464-
self.lcdpaletteF = {"timer":'white',"et":'white',"bt":'white',"deltaet":'white',"deltabt":'white',"sv":'yellow'}
9464+
self.lcdpaletteB = {
9465+
"timer":'black',
9466+
"et":'#D9D9D9', #'black',
9467+
"bt":'#D9D9D9', #'black',
9468+
"deltaet":'#BFBFBF', #'black',
9469+
"deltabt":'#BFBFBF', #'black',
9470+
"sv":'#404040', #'black'
9471+
}
9472+
self.lcdpaletteF = {
9473+
"timer":'white',
9474+
"et":'red', #'white',
9475+
"bt":'#00007F', #'white',
9476+
"deltaet":'orange', #'white',
9477+
"deltabt":'blue', #'white',
9478+
"sv":'yellow'
9479+
}
94659480

94669481
#user defined event buttons
94679482
self.extraeventsbuttonsflag = 1 #shows/hides rows of buttons 1/0; records the user choice, not the actual state!
@@ -16611,7 +16626,11 @@ def settingsLoad(self, filename=None):
1661116626
# recent roasts
1661216627
if settings.contains("recentRoasts"):
1661316628
try:
16614-
self.recentRoasts = settings.value("recentRoasts",self.recentRoasts)
16629+
rr = settings.value("recentRoasts",self.recentRoasts)
16630+
if rr != None:
16631+
self.recentRoasts = rr
16632+
else:
16633+
self.recentRoasts = []
1661516634
self.updateNewMenuRecentRoasts()
1661616635
except:
1661716636
pass
@@ -24660,28 +24679,29 @@ def __init__(self, parent = None):
2466024679

2466124680
def recentRoastActivated(self,n):
2466224681
# note, the first item is the edited text!
24663-
rr = aw.recentRoasts[n-1]
24664-
self.titleedit.textEdited(rr["title"])
24665-
self.titleedit.setEditText(rr["title"])
24666-
self.unitsComboBox.setCurrentIndex(aw.qmc.weight_units.index(rr["weightUnit"]))
24667-
self.weightinedit.setText("%g" % rr["weightIn"])
24668-
# all of the following items might not be in the dict
24669-
self.beansedit.setPlainText(rr["beans"])
24670-
self.weightoutedit.setText("%g" % rr["weightOut"])
24671-
self.volumeinedit.setText("%g" % rr["volumeIn"])
24672-
self.volumeoutedit.setText("%g" % rr["volumeOut"])
24673-
self.volumeUnitsComboBox.setCurrentIndex(aw.qmc.volume_units.index(rr["volumeUnit"]))
24674-
self.bean_density_weight_edit.setText(str(rr["densityWeight"]))
24675-
self.bean_density_weightUnitsComboBox.setCurrentIndex(aw.qmc.weight_units.index(rr["densityWeightUnit"]))
24676-
self.bean_density_volume_edit.setText(str(rr["densityVolume"]))
24677-
self.bean_density_volumeUnitsComboBox.setCurrentIndex(aw.qmc.volume_units.index(rr["densityVolumeUnit"]))
24678-
self.bean_size_edit.setText(str(rr["beanSize"]))
24679-
self.moisture_greens_edit.setText(str(rr["moistureGreen"]))
24680-
self.moisture_roasted_edit.setText(str(rr["moistureRoasted"]))
24681-
self.whole_color_edit.setText(str(rr["wholeColor"]))
24682-
self.ground_color_edit.setText(str(rr["groundColor"]))
24683-
self.colorSystemComboBox.setCurrentIndex(rr["colorSystem"])
24684-
# Note: the background profile will not be changed if recent roast is activated from Roast Properties
24682+
if n > 0:
24683+
rr = aw.recentRoasts[n-1]
24684+
self.titleedit.textEdited(rr["title"])
24685+
self.titleedit.setEditText(rr["title"])
24686+
self.unitsComboBox.setCurrentIndex(aw.qmc.weight_units.index(rr["weightUnit"]))
24687+
self.weightinedit.setText("%g" % rr["weightIn"])
24688+
# all of the following items might not be in the dict
24689+
self.beansedit.setPlainText(rr["beans"])
24690+
self.weightoutedit.setText("%g" % rr["weightOut"])
24691+
self.volumeinedit.setText("%g" % rr["volumeIn"])
24692+
self.volumeoutedit.setText("%g" % rr["volumeOut"])
24693+
self.volumeUnitsComboBox.setCurrentIndex(aw.qmc.volume_units.index(rr["volumeUnit"]))
24694+
self.bean_density_weight_edit.setText(str(rr["densityWeight"]))
24695+
self.bean_density_weightUnitsComboBox.setCurrentIndex(aw.qmc.weight_units.index(rr["densityWeightUnit"]))
24696+
self.bean_density_volume_edit.setText(str(rr["densityVolume"]))
24697+
self.bean_density_volumeUnitsComboBox.setCurrentIndex(aw.qmc.volume_units.index(rr["densityVolumeUnit"]))
24698+
self.bean_size_edit.setText(str(rr["beanSize"]))
24699+
self.moisture_greens_edit.setText(str(rr["moistureGreen"]))
24700+
self.moisture_roasted_edit.setText(str(rr["moistureRoasted"]))
24701+
self.whole_color_edit.setText(str(rr["wholeColor"]))
24702+
self.ground_color_edit.setText(str(rr["groundColor"]))
24703+
self.colorSystemComboBox.setCurrentIndex(rr["colorSystem"])
24704+
# Note: the background profile will not be changed if recent roast is activated from Roast Properties
2468524705

2468624706
def addRecentRoast(self):
2468724707
title = u(self.titleedit.currentText())

src/debian/usr/share/doc/artisan/changelog

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
artisan (1.1.0-1) precise; urgency=low
2+
* new upstream release
3+
* changes since 1.0.0:
4+
- adds Recent Roast Properties
5+
- adds Aillio Bullet R1 profile import
6+
- adds support for Probat Probatone 2
7+
- bug fixes and stability improvements
8+
-- <[email protected]> Sat, 10 Jun 2017 19:32:14 +0200
9+
110
artisan (1.0.0-6) precise; urgency=low
211
* new upstream release
312
* changes since 0.9.9:

0 commit comments

Comments
 (0)