Each alarm is only triggered once. Alarms are scanned in order from the top of the table to the bottom.
-
-
-
-
-
-
Field
-
Description
-
-
-
-
-
Nr
-
Alarm number for reference.
-
-
-
Status
-
Activate or Deactivate the alarm.
-
-
-
If Alarm
-
Alarm triggered only if the alarm with the given number was triggered before. Use 0 for no guard.
-
-
-
But Not
-
Alarm triggered only if the alarm with the given number was not triggered before. Use 0 for no guard.
-
-
-
From
-
Alarm only triggered after the given event.
-
-
-
Time
-
If not 00:00, alarm is triggered mm:ss after the event "From" happens.
-
-
-
Source
-
The observed temperature source.
-
-
-
Condition
-
Alarm is triggered if source rises above or below the specified temperature.
-
-
-
Temp
-
The specified temperature limit.
-
-
-
Action
-
The action to be triggered if all conditions are fulfilled.
-
-
-
Description
-
Commands for alarms with an action go here. Anything after a '#' character is considered a comment and is ignored when processing the alarm.
-
-
-
ALARM CONFIGURATION OPTIONS
-
-
-
Option
-
Description
-
-
-
-
-
Add
-
Adds a new alarm to the bottom of the table.
-
-
-
Insert
-
Inserts a new alarm above the selected alarm.
-
-
-
Delete
-
Deletes the selected alarm.
-
-
-
Copy Table
-
Copy the alarm table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.
-
-
-
All On
-
Enables all alarms.
-
-
-
All Off
-
Disables all alarms.
-
-
-
Load
-
Load alarm definition from a file.
-
-
-
Save
-
Save the alarm definitions to a file.
-
-
-
Clear
-
Clears all alarms from the table.
-
-
-
Help
-
Opens this window.
-
-
-
Load from Profile
-
when ticked will replace the alarm table when loading a profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.
-
-
-
Load from Background
-
when ticked will replace the alarm table when loading a background profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.
-
-
-
PopUp TimeOut
-
A PopUp will automatically close after this time if the OK button has not been clicked.
-
-
-
Alarm Actions
-
-
-
Enter the Command into the Description field of the Alarm.
-
-
-
-
-
-
Action
-
Command
-
Meaning
-
-
-
-
-
Pop Up
-
<text>
-
the text to be displayed in the pop up
-
-
-
Call Program
-
A program/script path (absolute or relative)
-
start an external program
-
-
-
Event Button
-
<button number>
-
triggers the button, the button number comes from the Events Buttons configuration
-
-
-
Slider <1>
-
<value>
-
set the slider for special event nr. 1 to the value
-
-
-
Slider <2>
-
<value>
-
set the slider for special event nr. 2 to the value
-
-
-
Slider <3>
-
<value>
-
set the slider for special event nr. 3 to the value
-
-
-
Slider <4>
-
<value>
-
set the slider for special event nr. 4 to the value
-
-
-
START
-
-
trigger START
-
-
-
DRY
-
-
trigger the DRY event
-
-
-
FCs
-
-
trigger the FCs event
-
-
-
FCe
-
-
trigger the FCe event
-
-
-
SCs
-
-
trigger the SCs event
-
-
-
SCe
-
-
trigger the SCe event
-
-
-
DROP
-
-
trigger the DROP event
-
-
-
COOL END
-
-
trigger the COOL END event
-
-
-
OFF
-
-
trigger OFF
-
-
-
CHARGE
-
-
trigger the CHARGE event
-
-
-
RampSoak ON
-
-
turns PID on and switches to RampSoak mode
-
-
-
RampSoak OFF
-
-
turns PID off and switches to manual mode
-
-
-
Set Canvas Color
-
<color>
-
sets the canvas to <color>, can be in hex format, e.g. "#ffaa55" or a color name, e.g. "blue"
-
-
-
Reset Canvas Color
-
-
reset the canvas color to the color specified in Config>>Colors canvas color resets automatically at OFF
-
-
-
+ ALARMS
+
+
+
Each alarm is only triggered once. Alarms are scanned in order from the top of the table to the bottom.
+
+
+
+
+
+
Field
+
Description
+
+
+
+
+
Nr
+
Alarm number for reference.
+
+
+
Status
+
Activate or Deactivate the alarm.
+
+
+
If Alarm
+
Alarm triggered only if the alarm with the given number was triggered before. Use 0 for no guard.
+
+
+
But Not
+
Alarm triggered only if the alarm with the given number was not triggered before. Use 0 for no guard.
+
+
+
From
+
Alarm only triggered after the given event.
+
+
+
Time
+
If not 00:00, alarm is triggered mm:ss after the event "From" happens.
+
+
+
Source
+
The observed temperature source.
+
+
+
Condition
+
Alarm is triggered if source rises above or below the specified temperature.
+
+
+
Temp
+
The specified temperature limit.
+
+
+
Action
+
The action to be triggered if all conditions are fulfilled.
+
+
+
Description
+
Commands for alarms with an action go here. Anything after a '#' character is considered a comment and is ignored when processing the alarm.
+
+
+
ALARM CONFIGURATION OPTIONS
+
+
+
Option
+
Description
+
+
+
+
+
Add
+
Adds a new alarm to the bottom of the table.
+
+
+
Insert
+
Inserts a new alarm above the selected alarm.
+
+
+
Delete
+
Deletes the selected alarm.
+
+
+
Copy Table
+
Copy the alarm table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.
+
+
+
All On
+
Enables all alarms.
+
+
+
All Off
+
Disables all alarms.
+
+
+
Load
+
Load alarm definition from a file.
+
+
+
Save
+
Save the alarm definitions to a file.
+
+
+
Clear
+
Clears all alarms from the table.
+
+
+
Help
+
Opens this window.
+
+
+
Load from Profile
+
when ticked will replace the alarm table when loading a profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.
+
+
+
Load from Background
+
when ticked will replace the alarm table when loading a background profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.
+
+
+
PopUp TimeOut
+
A PopUp will automatically close after this time if the OK button has not been clicked.
+
+
+
Alarm Actions
+
+
+
Enter the Command into the Description field of the Alarm.
+
+
+
+
+
+
Action
+
Command
+
Meaning
+
+
+
+
+
Pop Up
+
<text>
+
the text to be displayed in the pop up
+
+
+
Call Program
+
A program/script path (absolute or relative)
+
start an external program
+
+
+
Event Button
+
<button number>
+
triggers the button, the button number comes from the Events Buttons configuration
+
+
+
Slider <1>
+
<value>
+
set the slider for special event nr. 1 to the value
+
+
+
Slider <2>
+
<value>
+
set the slider for special event nr. 2 to the value
+
+
+
Slider <3>
+
<value>
+
set the slider for special event nr. 3 to the value
+
+
+
Slider <4>
+
<value>
+
set the slider for special event nr. 4 to the value
+
+
+
START
+
+
trigger START
+
+
+
DRY
+
+
trigger the DRY event
+
+
+
FCs
+
+
trigger the FCs event
+
+
+
FCe
+
+
trigger the FCe event
+
+
+
SCs
+
+
trigger the SCs event
+
+
+
SCe
+
+
trigger the SCe event
+
+
+
DROP
+
+
trigger the DROP event
+
+
+
COOL END
+
+
trigger the COOL END event
+
+
+
OFF
+
+
trigger OFF
+
+
+
CHARGE
+
+
trigger the CHARGE event
+
+
+
RampSoak ON
+
+
turns PID on and switches to RampSoak mode
+
+
+
RampSoak OFF
+
+
turns PID off and switches to manual mode
+
+
+
Set Canvas Color
+
<color>
+
sets the canvas to <color>, can be in hex format, e.g. "#ffaa55" or a color name, e.g. "blue"
+
+
+
Reset Canvas Color
+
+
reset the canvas color to the color specified in Config>>Colors canvas color resets automatically at OFF
Turn Autosave ON or OFF. When sampling, the keyboard 'a' will save the profile at that moment. NOTE: Files with the same file name will be silently overwritten. Use ~currdatetime in the file name prefix to get unique file names.
-
-
-
Add to recent file list
-
When checked, Autosaved files will be added to the Files>> Open Recent files list.
-
-
-
File Name Prefix
-
Defines the file name to use for Autosave. See the Autosave Fields section below.
-
-
-
Preview:
-
Shows an example of the file name based on the File Name Prefix field. A 'While Recording:' example will also be shown if the file name will be different when the scope is sampling.
-
-
-
Path
-
Where to store the Autosaved files.
-
-
-
Save Also
-
Allows to save an additional file. Choose the file type from the pull-down menu.
-
-
-
Path
-
Where to store the additional files.
-
-
-
AUTOSAVE FIELDS
-
-
-
Prefix Field
-
Source
-
Example
-
-
-
-
-
~batchprefix
-
The batch prefix set in Config>Batch>Prefix
-
Prod-
-
-
-
~batchcounter
-
The current batch number
-
653
-
-
-
~batch
-
Same as "~batchprefix~batchnum"
-
Prod-653
-
-
-
~batchposition
-
The current batch position, or "Roast of the Day"
-
9
-
-
-
~batch_long
-
Same as Batch field in Roast Properties "~batchprefix~batchnum (~batchposition)"
-
Prod-653 (9)
-
-
-
~title
-
From Roast>Properties>Title
-
Ethiopia Guji
-
-
-
~beans_nn
-
Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Beans field. From Roast>Properties>Beans
-
Ethiopia G
-
-
-
~beans_line
-
The entire first line From Roast>Properties>Beans
-
Ethiopia Guji purchased from Royal
-
-
-
~date
-
Roast date in format yy-MM-dd
-
20-02-05
-
-
-
~date_long
-
Roast date in format yyyy-MM-dd
-
2020-02-05
-
-
-
~time
-
Roast time in format hhmm
-
1742
-
-
-
~datetime
-
Roast date and time in format yy-MM-dd_hhmm
-
20-02-05_1742
-
-
-
~datetime_long
-
Roast date and time in format yyyy-MM-dd_hhmm
-
2020-02-05_1742
-
-
-
~yyyy
-
Roast year in format yyyy
-
2020
-
-
-
~yy
-
Roast year in format yy
-
20
-
-
-
~mmm
-
Roast month in format MMM (localized)
-
Feb
-
-
-
~mm
-
Roast month in format MM
-
02
-
-
-
~ddd
-
Roast day in format ddd (localized)
-
Wed
-
-
-
~dd
-
Roast day in format dd
-
05
-
-
-
~hour
-
Roast hour in format hh
-
17
-
-
-
~minute
-
Roast minute in format mm
-
42
-
-
-
~currtime
-
Current date and time with seconds in format yy-MM-dd_hhmmss. Not the same as roast time.
-
21-01-18_093609
-
-
-
~operator
-
From Roast>Properties>Operator
-
Dave
-
-
-
~organization
-
From Roast>Properties>Organization
-
Dave's Coffee
-
-
-
~machine
-
From Roast>Properties>Machine
-
SF-6
-
-
-
~weight
-
From Roast>Properties>Weight Green
-
3
-
-
-
~roastedweight
-
From Roast>Properties>Weight Roasted
-
2.6
-
-
-
~weightunits
-
From Roast>Properties>Weight
-
Kg
-
-
-
~weightloss
-
Calculated weight loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)
-
14.1
-
-
-
~volume
-
From Roast>Properties>Volume Green
-
4.1
-
-
-
~roastedvolume
-
From Roast>Properties>Volume Roasted
-
6.8
-
-
-
~volumeunits
-
From Roast>Properties>Volume
-
l
-
-
-
~volumegain
-
Calculated volume gain in percent
-
61.5
-
-
-
~density
-
From Roast>Properties>Density Green
-
756.4
-
-
-
~roasteddensity
-
From Roast>Properties>Density Roasted
-
375.2
-
-
-
~densityunits
-
From Roast>Properties>Density
-
g_l
-
-
-
~densityloss
-
Calculated density loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)
-
46.8
-
-
-
~moisture
-
From Roast>Properties>Moisture Green
-
11.7
-
-
-
~roastedmoisture
-
From Roast>Properties>Moisture Roasted
-
2.8
-
-
-
~moistureloss
-
Calculated moisture loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)
-
8.1
-
-
-
~drumspeed
-
From Roast>Properties>Drum Speed
-
64
-
-
-
~colorwhole
-
From Roast>Properties>Color Whole
-
103
-
-
-
~colorground
-
From Roast>Properties>Color Ground
-
98
-
-
-
~colorsystem
-
From Roast>Properties>Color System
-
Tonino
-
-
-
~screenmin
-
From Roast>Properties>Screen Min
-
16
-
-
-
~screenmax
-
From Roast>Properties>Screen Max
-
18
-
-
-
~greenstemp
-
From Roast>Properties>(Green) Beans Temperature
-
68.0
-
-
-
~ambtemp
-
From Roast>Properties>Ambient Temperature
-
70.0
-
-
-
~ambhumidity
-
From Roast>Properties>Ambient Humidity
-
35.1
-
-
-
~ambpressure
-
From Roast>Properties>Ambient Pressure
-
1023.8
-
-
-
~devtime
-
Calculated time from FCs to DROP in seconds
-
112
-
-
-
~devtime_long
-
Calculated time from FCs to DROP in min_secs
-
01_52
-
-
-
~dtr
-
From Profile Statistics - DTR (in percent)
-
22.1
-
-
-
~auc
-
From the Profile Statistics - AUC
-
218
-
-
-
~aucbase
-
From the Profile Statistics - AUC Base
-
300
-
-
-
~mode
-
From Config>Temperature - the current temperature mode C or F.
-
F
-
-
-
~chargeet
-
From the Profile - ET at CHARGE
-
379.4
-
-
-
~chargebt
-
From the Profile - BT at CHARGE
-
375.2
-
-
-
~fcset
-
From the Profile - ET at FCs
-
397.4
-
-
-
~fcsbt
-
From the Profile -BT at FCs
-
386.7
-
-
-
~fcstime
-
From the Profile - FCs time in seconds
-
490
-
-
-
~fcstime_long
-
From the Profile - FCs time in min_secs
-
08_10
-
-
-
~dropet
-
From the Profile - ET at DROP
-
378.6
-
-
-
~dropbt
-
From the Profile - BT at DROP
-
412.5
-
-
-
~droptime
-
From the Profile - DROP time in seconds
-
617
-
-
-
~droptime_long
-
From the Profile - DROP time in min_secs
-
10_17
-
-
-
~dryphasedeltatemp
-
From the Profile - BT temperature change from TP to DRY
-
121.3
-
-
-
~midphasedeltatemp
-
From the Profile - BT temperature change from DRY to FCs
-
78.6
-
-
-
~finishphasedeltatemp
-
From the Profile - BT temperature change from FCs to DROP
-
19.8
-
-
-
~roastingnotes_nn
-
Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Roasting Notes field. From Roast>Properties>Roasting Notes
-
No crash,
-
-
-
~roastingnotes_line
-
The entire first line From Roast>Properties>Roasting Notes
-
No crash, maintained RoR
-
-
-
~cuppingnotes_nn
-
Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Cupping Notes field. From Roast>Properties>Cupping Notes
-
Lots of be
-
-
-
~cuppingnotes_line
-
The entire first line From Roast>Properties>Cupping Notes
-
Lots of berries and chocolate
-
-
-
~btubatch
-
From the Profile Energy Use - Total energy used by the batch in BTU
-
8943.2
-
-
-
~co2batch
-
From the Profile Energy Use - CO2 produced by the batch in g
-
923.3
-
-
-
~btupreheat
-
From the Profile Energy Use - Energy used during preheat in BTU
-
2538.8
-
-
-
~co2preheat
-
From the Profile Energy Use - CO2 produced during preheat in g
-
443.9
-
-
-
~btubbp
-
From the Profile Energy Use - Energy used during Between Batch Protocol in BTU
-
1019.7
-
-
-
~co2bbp
-
From the Profile Energy Use - CO2 produced during Between Batch Protocol in g
-
254.1
-
-
-
~bturoast
-
From the Profile Energy Use - Energy used from CHARGE to DROP in BTU
-
7843.2
-
-
-
~co2roast
-
From the Profile Energy Use - CO2 produced from CHARGE to DROP in g
-
873.9
-
-
-
~co2pergreenkg
-
From the Profile Energy Use - CO2 produced per kg of green beans in g
-
354.3
-
-
-
-
-
-
NOTES: Anything between single quotes ' will show in the file name only when ON. Example: 'REC ~batch'
Anything between double quotes " will show in the file name only when OFF. Example: "~operator"
For backward compatibility, when the Prefix field is text only the date and time are appended to the file name. Example: 'Autosave' will result in file name 'Autosave_20-01-13_1705'. To show only the text place a single '!' at the start of the Prefix field Example: '!Autosave' will result in file name 'Autosave'.
To maintain cross platform compatibility, file names may contain only letters, numbers, spaces, and the following special characters: _ - . ( )
-
-
-
EXAMPLES
-
-
-
Data used to replace the fields in the Autosave File Name Prefix are pulled from the current Roast Properties.
Creates a unique filename for multiple saves while sampling by using ~currtime. When OFF: Prod-1380 Burundi Kiganda Murambi 2020-04-25_1136.alog While Recording. Recording 1380 Burundi KigandaMurambi 2020-04-25_113809.alog
-
-
-
\ No newline at end of file
+ AUTOSAVE DIALOG
+
+
+
Dialog Field
+
Meaning
+
+
+
+
+
Autosave [a]
+
Turn Autosave ON or OFF. When sampling, the keyboard 'a' will save the profile at that moment. NOTE: Files with the same file name will be silently overwritten. Use ~currdatetime in the file name prefix to get unique file names.
+
+
+
Add to recent file list
+
When checked, Autosaved files will be added to the Files>> Open Recent files list.
+
+
+
File Name Prefix
+
Defines the file name to use for Autosave. See the Autosave Fields section below.
+
+
+
Preview:
+
Shows an example of the file name based on the File Name Prefix field. A 'While Recording:' example will also be shown if the file name will be different when the scope is sampling.
+
+
+
Path
+
Where to store the Autosaved files.
+
+
+
Save Also
+
Allows to save an additional file. Choose the file type from the pull-down menu.
+
+
+
Path
+
Where to store the additional files.
+
+
+
AUTOSAVE FIELDS
+
+
+
Prefix Field
+
Source
+
Example
+
+
+
+
+
~batchprefix
+
The batch prefix set in Config>Batch>Prefix
+
Prod-
+
+
+
~batchcounter
+
The current batch number
+
653
+
+
+
~batch
+
Same as "~batchprefix~batchnum"
+
Prod-653
+
+
+
~batchposition
+
The current batch position, or "Roast of the Day"
+
9
+
+
+
~batch_long
+
Same as Batch field in Roast Properties "~batchprefix~batchnum (~batchposition)"
+
Prod-653 (9)
+
+
+
~title
+
From Roast>Properties>Title
+
Ethiopia Guji
+
+
+
~beans_nn
+
Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Beans field. From Roast>Properties>Beans
+
Ethiopia G
+
+
+
~beans_line
+
The entire first line From Roast>Properties>Beans
+
Ethiopia Guji purchased from Royal
+
+
+
~date
+
Roast date in format yy-MM-dd
+
20-02-05
+
+
+
~date_long
+
Roast date in format yyyy-MM-dd
+
2020-02-05
+
+
+
~time
+
Roast time in format hhmm
+
1742
+
+
+
~datetime
+
Roast date and time in format yy-MM-dd_hhmm
+
20-02-05_1742
+
+
+
~datetime_long
+
Roast date and time in format yyyy-MM-dd_hhmm
+
2020-02-05_1742
+
+
+
~yyyy
+
Roast year in format yyyy
+
2020
+
+
+
~yy
+
Roast year in format yy
+
20
+
+
+
~mmm
+
Roast month in format MMM (localized)
+
Feb
+
+
+
~mm
+
Roast month in format MM
+
02
+
+
+
~ddd
+
Roast day in format ddd (localized)
+
Wed
+
+
+
~dd
+
Roast day in format dd
+
05
+
+
+
~hour
+
Roast hour in format hh
+
17
+
+
+
~minute
+
Roast minute in format mm
+
42
+
+
+
~currtime
+
Current date and time with seconds in format yy-MM-dd_hhmmss. Not the same as roast time.
+
21-01-18_093609
+
+
+
~operator
+
From Roast>Properties>Operator
+
Dave
+
+
+
~organization
+
From Roast>Properties>Organization
+
Dave's Coffee
+
+
+
~machine
+
From Roast>Properties>Machine
+
SF-6
+
+
+
~weight
+
From Roast>Properties>Weight Green
+
3
+
+
+
~roastedweight
+
From Roast>Properties>Weight Roasted
+
2.6
+
+
+
~weightunits
+
From Roast>Properties>Weight
+
Kg
+
+
+
~weightloss
+
Calculated weight loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)
+
14.1
+
+
+
~volume
+
From Roast>Properties>Volume Green
+
4.1
+
+
+
~roastedvolume
+
From Roast>Properties>Volume Roasted
+
6.8
+
+
+
~volumeunits
+
From Roast>Properties>Volume
+
l
+
+
+
~volumegain
+
Calculated volume gain in percent
+
61.5
+
+
+
~density
+
From Roast>Properties>Density Green
+
756.4
+
+
+
~roasteddensity
+
From Roast>Properties>Density Roasted
+
375.2
+
+
+
~densityunits
+
From Roast>Properties>Density
+
g_l
+
+
+
~densityloss
+
Calculated density loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)
+
46.8
+
+
+
~moisture
+
From Roast>Properties>Moisture Green
+
11.7
+
+
+
~roastedmoisture
+
From Roast>Properties>Moisture Roasted
+
2.8
+
+
+
~moistureloss
+
Calculated moisture loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)
+
8.1
+
+
+
~drumspeed
+
From Roast>Properties>Drum Speed
+
64
+
+
+
~colorwhole
+
From Roast>Properties>Color Whole
+
103
+
+
+
~colorground
+
From Roast>Properties>Color Ground
+
98
+
+
+
~colorsystem
+
From Roast>Properties>Color System
+
Tonino
+
+
+
~screenmin
+
From Roast>Properties>Screen Min
+
16
+
+
+
~screenmax
+
From Roast>Properties>Screen Max
+
18
+
+
+
~greenstemp
+
From Roast>Properties>(Green) Beans Temperature
+
68.0
+
+
+
~ambtemp
+
From Roast>Properties>Ambient Temperature
+
70.0
+
+
+
~ambhumidity
+
From Roast>Properties>Ambient Humidity
+
35.1
+
+
+
~ambpressure
+
From Roast>Properties>Ambient Pressure
+
1023.8
+
+
+
~devtime
+
Calculated time from FCs to DROP in seconds
+
112
+
+
+
~devtime_long
+
Calculated time from FCs to DROP in min_secs
+
01_52
+
+
+
~dtr
+
From Profile Statistics - DTR (in percent)
+
22.1
+
+
+
~auc
+
From the Profile Statistics - AUC
+
218
+
+
+
~aucbase
+
From the Profile Statistics - AUC Base
+
300
+
+
+
~mode
+
From Config>Temperature - the current temperature mode C or F.
+
F
+
+
+
~chargeet
+
From the Profile - ET at CHARGE
+
379.4
+
+
+
~chargebt
+
From the Profile - BT at CHARGE
+
375.2
+
+
+
~fcset
+
From the Profile - ET at FCs
+
397.4
+
+
+
~fcsbt
+
From the Profile -BT at FCs
+
386.7
+
+
+
~fcstime
+
From the Profile - FCs time in seconds
+
490
+
+
+
~fcstime_long
+
From the Profile - FCs time in min_secs
+
08_10
+
+
+
~dropet
+
From the Profile - ET at DROP
+
378.6
+
+
+
~dropbt
+
From the Profile - BT at DROP
+
412.5
+
+
+
~droptime
+
From the Profile - DROP time in seconds
+
617
+
+
+
~droptime_long
+
From the Profile - DROP time in min_secs
+
10_17
+
+
+
~dryphasedeltatemp
+
From the Profile - BT temperature change from TP to DRY
+
121.3
+
+
+
~midphasedeltatemp
+
From the Profile - BT temperature change from DRY to FCs
+
78.6
+
+
+
~finishphasedeltatemp
+
From the Profile - BT temperature change from FCs to DROP
+
19.8
+
+
+
~roastingnotes_nn
+
Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Roasting Notes field. From Roast>Properties>Roasting Notes
+
No crash,
+
+
+
~roastingnotes_line
+
The entire first line From Roast>Properties>Roasting Notes
+
No crash, maintained RoR
+
+
+
~cuppingnotes_nn
+
Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Cupping Notes field. From Roast>Properties>Cupping Notes
+
Lots of be
+
+
+
~cuppingnotes_line
+
The entire first line From Roast>Properties>Cupping Notes
+
Lots of berries and chocolate
+
+
+
~btubatch
+
From the Profile Energy Use - Total energy used by the batch in BTU
+
8943.2
+
+
+
~co2batch
+
From the Profile Energy Use - CO2 produced by the batch in g
+
923.3
+
+
+
~btupreheat
+
From the Profile Energy Use - Energy used during preheat in BTU
+
2538.8
+
+
+
~co2preheat
+
From the Profile Energy Use - CO2 produced during preheat in g
+
443.9
+
+
+
~btubbp
+
From the Profile Energy Use - Energy used during Between Batch Protocol in BTU
+
1019.7
+
+
+
~co2bbp
+
From the Profile Energy Use - CO2 produced during Between Batch Protocol in g
+
254.1
+
+
+
~bturoast
+
From the Profile Energy Use - Energy used from CHARGE to DROP in BTU
+
7843.2
+
+
+
~co2roast
+
From the Profile Energy Use - CO2 produced from CHARGE to DROP in g
+
873.9
+
+
+
~co2pergreenkg
+
From the Profile Energy Use - CO2 produced per kg of green beans in g
+
354.3
+
+
+
+
+
+
NOTES: Anything between single quotes ' will show in the file name only when ON. Example: 'REC ~batch'
Anything between double quotes " will show in the file name only when OFF. Example: "~operator"
For backward compatibility, when the Prefix field is text only the date and time are appended to the file name. Example: 'Autosave' will result in file name 'Autosave_20-01-13_1705'. To show only the text place a single '!' at the start of the Prefix field Example: '!Autosave' will result in file name 'Autosave'.
To maintain cross platform compatibility, file names may contain only letters, numbers, spaces, and the following special characters: _ - . ( )
+
+
+
EXAMPLES
+
+
+
Data used to replace the fields in the Autosave File Name Prefix are pulled from the current Roast Properties.
Creates a unique filename for multiple saves while sampling by using ~currtime. When OFF: Prod-1380 Burundi Kiganda Murambi 2020-04-25_1136.alog While Recording. Recording 1380 Burundi KigandaMurambi 2020-04-25_113809.alog
+
+
+
diff --git a/doc/help_dialogs/Output_html/energy_help.html b/doc/help_dialogs/Output_html/energy_help.html
index 18c9695d8..c3a0befee 100644
--- a/doc/help_dialogs/Output_html/energy_help.html
+++ b/doc/help_dialogs/Output_html/energy_help.html
@@ -1,142 +1,142 @@
- Energy and CO2 Calculator
-
-
-
The Energy tab displays a roast's energy consumption. CO2 emissions are also calculated to monitor the impact of the roasting operation. Settings must be made for each energy load. Loads are the main burners, motors and blowers, and an afterburner if one is used. The energy used for pre-heating, between batch, and roaster cooling protocols are included in the calculations, and settings are available for them as well.
Note that pre-heating and roaster cooling energy values are applied to the first roast of a roasting session. Between batch energies are applied to every roast except the first. Tick the "Between batches after Pre-Heating box to apply the between batch value to the first roast.
Follow the steps below to set the energy inputs for the roast machine and afterburner.
Blank entries are the same as a zero entry. Negative values are not allowed.
-
-
-
-
-
-
Once you set up the Loads sub-tab and the Protocols sub-tab, it is a good idea to click "Save Defaults" on both sub-tabs (they are saved separately). When loading a profile with existing energy values, the profile settings will be read and will overwrite the values on the Loads and Profiles sub-tabs. Having them saved as defaults allow for them to be quickly restored by clicking "Restore Defaults" on each sub-tab.
-
-
-
1. Details Sub-Tab
-
-
-
This sub-tab shows a detailed table of the energy consumption and CO2 production data for the roast. The values in this table are based on current Profile and the settings made on the Loads and Protocols sub-tabs. Columns may be sorted by clicking on the column title. To return to original sort click on the 'Kind' column title.
-
-
-
-
-
-
Field
-
Description
-
-
-
-
-
Results in
-
Choose the energy units for the summary displays and the Details sub-tab.
-
-
-
2. Loads Sub-Tab
-
-
-
Begin by making entries on the Loads sub-tab to define the sources of energy used by this roast. It might be a good idea to save those settings as defaults to be used to calculate the energy consumption of future roasts
Power ratings for up to four energy loads may be entered. Loads will be the main burners or heaters, motors and blowers, and the afterburner if one is used. Enter one load per line. Motors and blowers that run continuously may be aggregated and entered as one load.
Loads are assumed to run continuously. Variable loads, such as the main burner setting, can be recorded in Artisan using one of the four special events. The settings can be captured from a button, slider or in some cases read directly from the roaster. The load setup allows linking a load to one of these events. The energy calculator will then determine the setting percentage and the duration of the setting to calculate the energy consumed.
Burner entries require knowing the power rating of the burner. Roasting machine manufacturer's typically provide this information. If this information can not be found for your machine this table provides approximate values based on roaster capacities. https://artisan-scope.org/ratings/
-
-
-
-
-
-
Field
-
Description
-
-
-
-
-
Label
-
Enter your personal description for this burner. Examples are 'Main' and 'Afterburner'.
-
-
-
Rating
-
This is the power rating of the load Choose the units in the next column.
-
-
-
Unit
-
Select the appropriate power unit. Some manufacturers incorrectly use BTU. In that case use BTU/h for the unit.
-
-
-
Fuel
-
Select the type of fuel used by this load 'Elec' is assumed to be electricity generated from dirty coal. There is a setting below to adjust for renewable clean energy sources.
-
-
-
Event
-
Special Events are often used to record load settings, such as a burner setting, in the roast profile. Select the Event that corresponds to the load setting here.
When blank the load is assumed to be at a constant setting, which is the percent 'Value 100%' multiplied by the rating. A 10 kW load at '100% Value'= 60 would thus be 10 kW * 60% = 6 kW. Continuous loads are typically motors and blowers and the afterburner.
-
-
-
Pressure %
-
For gas loads tick this box when the readings are made in units of pressure. Some roasters and some controllers provide readings in heat energy. When the readings are made in heat energy leave this box unticked.
-
-
-
Value 0%
-
When an Event is selected in the previous column this value can be set to match the 0% burner setting to the event setting. In most cases a 0 Event value will correspond to the 0% load setting.
-
-
-
Value 100%
-
When an Event is selected this value can be set to match the 100% load setting to the event setting. This is useful when the 100% load setting is recorded as a different number in the Event. For instance, maybe the burner event is recorded as 10x the kPa reading on the gas manometer. An event value of 35 is recoded to signify 3.5 kPa, which is 50% pressure. If the 100% burner setting corresponds to 7 kPa then the 'Value 100%' should be set to 70, which is 7 * 10 = 70. Thus 3.5 kPa will be seen by he energy calculator as 50%. For pressure readings be sure to tick the Pressure box. Heat energy readings are normally 0%-100% and do not require any adjustment to this setting.
-
-
-
Electric Energy Mix
-
This setting allows to set a mix of renewable energy that sources the electric loads. 0% assumes all the energy comes from burning dirty coal and maximizes the CO2 in the calculations. 100% assumes the energy comes only from renewable sources with no CO2 produced.
-
-
-
Save Defaults
-
Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file.
-
-
-
Restore Defaults
-
Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.
-
-
-
3. Protocol Sub-Tab
-
-
-
The Protocol settings allow including Pre-Heating, Between Batch (BBP) and Cooling protocol energy consumption. There are two ways to specify these values. The first assumes a constant load setting for a defined period of time. An example for pre-heating is to set a Duration of 45:00 (45 minutes) at 30% Burner setting. Percentages must be entered with the percent sign (30%). When a percentage is entered a corresponding Duration must be entered.
The second type of entry is a "measured" energy value. This can be any value greater than 1.0. Artisan can inspect the open profile to determine energy values for each Load that is associated with an Event on the Loads sub-tab. Click the [...] button for each Protocol to auto fill the Measured Energy fields. The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.
To use the Artisan energy measurement feature you will need to record one or more profiles that include the protocol of interest. For example, to measure the Pre-Heating energy, START recording when the roaster is turned on. Let Artisan record the entire pre-heating procedure. At the end of the pre-heating you can either STOP recording the profile or go forward with the roast. The CHARGE event will mark the end of pre-heating when Artisan measures the pre-heat energy. Similarly a Between Batches protocol can be recorded with START followed by a normal roast. A Cooling protocol would be captured by not turning the Artisan recording OFF until the roaster is fully cooled.
The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.
-
-
-
-
-
-
Field
-
Description
-
-
-
-
-
Pre-Heating
-
This row sets the values for pre-heating energy. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.
Pre-Heating energy is applied only to the first batch of a roasting session.
-
-
-
Between Batches
-
This row sets the values for between batches protocol for the roasting session. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.
Between Batches energy is applied to each batch of the roasting session, except the first batch. Tick the 'Between Batches after Pre-Heating' box to apply Between Batches energies to the first batch of the session too.
-
-
-
Cooling
-
This row sets the values for the energy used for cooling. Most common loads are motors and blowers that consume energy during the roaster cool down period. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.
Pre-Heating energy is applied only to the first batch of a roasting session.
-
-
-
Duration
-
The length (mm:ss) of protocol. It is used with a burner's percentage setting to calculate the energy consumed by that burner. When a percentage entry is made for the burner, the Duration field must be set.
-
-
-
Measured Energy or Output %
-
The value is either the measured energy for the protocol or the burner constant percentage setting for the length of the Duration field.
-
-
-
Measure Profile [...]
-
Energy is measured from the open profile for each load where an event is specified on the Loads tab. Click OK to auto fill in the associated Measured Energy field.
-
-
-
Between Batches after Pre-Heating
-
This box should be ticked when a Between Batches protocol run is done after the Pre-heating and before the roast.
-
-
-
Save Defaults
-
Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file.
-
-
-
Restore Defaults
-
Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.
-
-
-
+ Energy and CO2 Calculator
+
+
+
The Energy tab displays a roast's energy consumption. CO2 emissions are also calculated to monitor the impact of the roasting operation. Settings must be made for each energy load. Loads are the main burners, motors and blowers, and an afterburner if one is used. The energy used for pre-heating, between batch, and roaster cooling protocols are included in the calculations, and settings are available for them as well.
Note that pre-heating and roaster cooling energy values are applied to the first roast of a roasting session. Between batch energies are applied to every roast except the first. Tick the "Between batches after Pre-Heating box to apply the between batch value to the first roast.
Follow the steps below to set the energy inputs for the roast machine and afterburner.
Blank entries are the same as a zero entry. Negative values are not allowed.
+
+
+
+
+
+
Once you set up the Loads sub-tab and the Protocols sub-tab, it is a good idea to click "Save Defaults" on both sub-tabs (they are saved separately). When loading a profile with existing energy values, the profile settings will be read and will overwrite the values on the Loads and Profiles sub-tabs. Having them saved as defaults allow for them to be quickly restored by clicking "Restore Defaults" on each sub-tab.
+
+
+
1. Details Sub-Tab
+
+
+
This sub-tab shows a detailed table of the energy consumption and CO2 production data for the roast. The values in this table are based on current Profile and the settings made on the Loads and Protocols sub-tabs. Columns may be sorted by clicking on the column title. To return to original sort click on the 'Kind' column title.
+
+
+
+
+
+
Field
+
Description
+
+
+
+
+
Results in
+
Choose the energy units for the summary displays and the Details sub-tab.
+
+
+
2. Loads Sub-Tab
+
+
+
Begin by making entries on the Loads sub-tab to define the sources of energy used by this roast. It might be a good idea to save those settings as defaults to be used to calculate the energy consumption of future roasts
Power ratings for up to four energy loads may be entered. Loads will be the main burners or heaters, motors and blowers, and the afterburner if one is used. Enter one load per line. Motors and blowers that run continuously may be aggregated and entered as one load.
Loads are assumed to run continuously. Variable loads, such as the main burner setting, can be recorded in Artisan using one of the four special events. The settings can be captured from a button, slider or in some cases read directly from the roaster. The load setup allows linking a load to one of these events. The energy calculator will then determine the setting percentage and the duration of the setting to calculate the energy consumed.
Burner entries require knowing the power rating of the burner. Roasting machine manufacturer's typically provide this information. If this information can not be found for your machine this table provides approximate values based on roaster capacities. https://artisan-scope.org/ratings/
+
+
+
+
+
+
Field
+
Description
+
+
+
+
+
Label
+
Enter your personal description for this burner. Examples are 'Main' and 'Afterburner'.
+
+
+
Rating
+
This is the power rating of the load Choose the units in the next column.
+
+
+
Unit
+
Select the appropriate power unit. Some manufacturers incorrectly use BTU. In that case use BTU/h for the unit.
+
+
+
Fuel
+
Select the type of fuel used by this load 'Elec' is assumed to be electricity generated from dirty coal. There is a setting below to adjust for renewable clean energy sources.
+
+
+
Event
+
Special Events are often used to record load settings, such as a burner setting, in the roast profile. Select the Event that corresponds to the load setting here.
When blank the load is assumed to be at a constant setting, which is the percent 'Value 100%' multiplied by the rating. A 10 kW load at '100% Value'= 60 would thus be 10 kW * 60% = 6 kW. Continuous loads are typically motors and blowers and the afterburner.
+
+
+
Pressure %
+
For gas loads tick this box when the readings are made in units of pressure. Some roasters and some controllers provide readings in heat energy. When the readings are made in heat energy leave this box unticked.
+
+
+
Value 0%
+
When an Event is selected in the previous column this value can be set to match the 0% burner setting to the event setting. In most cases a 0 Event value will correspond to the 0% load setting.
+
+
+
Value 100%
+
When an Event is selected this value can be set to match the 100% load setting to the event setting. This is useful when the 100% load setting is recorded as a different number in the Event. For instance, maybe the burner event is recorded as 10x the kPa reading on the gas manometer. An event value of 35 is recoded to signify 3.5 kPa, which is 50% pressure. If the 100% burner setting corresponds to 7 kPa then the 'Value 100%' should be set to 70, which is 7 * 10 = 70. Thus 3.5 kPa will be seen by he energy calculator as 50%. For pressure readings be sure to tick the Pressure box. Heat energy readings are normally 0%-100% and do not require any adjustment to this setting.
+
+
+
Electric Energy Mix
+
This setting allows to set a mix of renewable energy that sources the electric loads. 0% assumes all the energy comes from burning dirty coal and maximizes the CO2 in the calculations. 100% assumes the energy comes only from renewable sources with no CO2 produced.
+
+
+
Save Defaults
+
Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file.
+
+
+
Restore Defaults
+
Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.
+
+
+
3. Protocol Sub-Tab
+
+
+
The Protocol settings allow including Pre-Heating, Between Batch (BBP) and Cooling protocol energy consumption. There are two ways to specify these values. The first assumes a constant load setting for a defined period of time. An example for pre-heating is to set a Duration of 45:00 (45 minutes) at 30% Burner setting. Percentages must be entered with the percent sign (30%). When a percentage is entered a corresponding Duration must be entered.
The second type of entry is a "measured" energy value. This can be any value greater than 1.0. Artisan can inspect the open profile to determine energy values for each Load that is associated with an Event on the Loads sub-tab. Click the [...] button for each Protocol to auto fill the Measured Energy fields. The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.
To use the Artisan energy measurement feature you will need to record one or more profiles that include the protocol of interest. For example, to measure the Pre-Heating energy, START recording when the roaster is turned on. Let Artisan record the entire pre-heating procedure. At the end of the pre-heating you can either STOP recording the profile or go forward with the roast. The CHARGE event will mark the end of pre-heating when Artisan measures the pre-heat energy. Similarly a Between Batches protocol can be recorded with START followed by a normal roast. A Cooling protocol would be captured by not turning the Artisan recording OFF until the roaster is fully cooled.
The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.
+
+
+
+
+
+
Field
+
Description
+
+
+
+
+
Pre-Heating
+
This row sets the values for pre-heating energy. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.
Pre-Heating energy is applied only to the first batch of a roasting session.
+
+
+
Between Batches
+
This row sets the values for between batches protocol for the roasting session. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.
Between Batches energy is applied to each batch of the roasting session, except the first batch. Tick the 'Between Batches after Pre-Heating' box to apply Between Batches energies to the first batch of the session too.
+
+
+
Cooling
+
This row sets the values for the energy used for cooling. Most common loads are motors and blowers that consume energy during the roaster cool down period. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.
Pre-Heating energy is applied only to the first batch of a roasting session.
+
+
+
Duration
+
The length (mm:ss) of protocol. It is used with a burner's percentage setting to calculate the energy consumed by that burner. When a percentage entry is made for the burner, the Duration field must be set.
+
+
+
Measured Energy or Output %
+
The value is either the measured energy for the protocol or the burner constant percentage setting for the length of the Duration field.
+
+
+
Measure Profile [...]
+
Energy is measured from the open profile for each load where an event is specified on the Loads tab. Click OK to auto fill in the associated Measured Energy field.
+
+
+
Between Batches after Pre-Heating
+
This box should be ticked when a Between Batches protocol run is done after the Pre-heating and before the roast.
+
+
+
Save Defaults
+
Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file.
+
+
+
Restore Defaults
+
Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.
Number of seconds before or after CHARGE Before CHARGE shows negative Displays '*' when no CHARGE event exists
-
522
-
-
-
~dCHARGE_ms
-
Time before or after CHARGE in min:sec Before CHARGE shows negative Displays '*' when no CHARGE event exists
-
8:42
-
-
-
~dFCs
-
Number of seconds before or after FCs Best used inside double quotes (see notes below) Negative value before FCs Displays '*' when no FCs event exists
-
47
-
-
-
~dFCs_ms
-
Time after FCs in min:sec Best used inside double quotes (see notes below) Negative value before FCs Displays '*' when no FCs event exists
-
1:35
-
-
-
~preFCs
-
Number of seconds before FCs Best used inside single quotes or back ticks (see notes below) Positive value only Displays '*' after FCs or when no FCs event exists
-
50
-
-
-
~preFCs_ms
-
Time before FCs in min:sec Best used inside single quotes or back ticks (see notes below) Positive value only Displays '*' after FCs or when no FCs event exists
-
1:25
-
-
-
~DTR
-
Development time ratio (percent). Note: DTR=0 before FCs 100*(t{Event}-t{FCs})/(t{FCs}-t{CHARGE})
-
12
-
-
-
~deg
-
The degree symbol
-
°
-
-
-
~mode
-
Temperature mode ('C' or 'F')
-
F
-
-
-
~degmode
-
Degree symbol with Temperature mode
-
°C
-
-
-
~R1
-
ET RoR value Displays '--' when the RoR value is not available.
-
9.9
-
-
-
~R2
-
BT RoR value Shows '--' when the RoR value Is not available.
-
18.2
-
-
-
~degmin
-
RoR units Shorthand for '~deg~mode/min'
-
°C/min
-
-
-
~R1degmin
-
ET RoR with units Field is hidden when the RoR value is not available.
-
9.9°C/min
-
-
-
~R2degmin
-
BT RoR with units Field is hidden when the RoR value is not available.
-
18.2°C/min
-
-
-
~quot
-
Quote symbol
-
"
-
-
-
~squot
-
Single quote symbol
-
'
-
-
-
EXAMPLES
-
-
-
Assumptions: The event value is 50. In the case of Gas the value 50 corresponds to either 5.0kPh or 50%. For a sensory milestone (see notes above) the value 50 corresponds to the "Hay" aroma.
-
-
-
-
-
-
Annotation Field
-
Displays
-
-
-
-
-
Gas ~E @~Y2~degmode
-
Gas 50 @340°F
-
-
-
Gas ~E% @~Y2~mode
-
Gas 50% @340F
-
-
-
Gas ~E/10kPh @~Y2~mode
-
Gas 5.0kPh @340F
-
-
-
Gas ~E/10kPh @~Y2~mode and ~R2~degmin
-
Gas 5.0kPh @340F and 32.8°F/min
-
-
-
Gas ~E% '@~Y2 ~degmode'"@~DTR% DTR"
-
Before FCs: Gas 50% @340 °F
After FCs: Gas 50% @12% DTR
-
-
-
Gas ~E% '@~Y2 ~degmode`, ~preFCs sec before FCs`'"@~DTR% DTR"
-
More than 90 seconds before FCs: Gas 50% @340 °F
Less than 90 seconds before FCs: Gas 50% @340 °F, 50 sec before FCs
Event annotations apply only for 'Step' and 'Step+' Events settings
-
-
-
Anything between double quotes " will show only after FCs. Example: "~E1 @~DTR%"
-
-
-
Anything between single quotes ' will show only before FCs. Example: '~E1 @~degmode'
-
-
-
Anything between back ticks ` will show only within 90 seconds before FCs. Example: `~E1 `FCs~dFCs sec`
-
-
-
When combining back ticks with single or double quotes the back ticks should be inside the quotes.
-
-
-
Background event annotations can be seen during a roast when 'Annotations' is checked in the Profile Background window.
-
-
-
Simple scaling of the event value is possible. Use a single math operator ('*', '/', '+' or '-') immediately following the field name "E". For example: '~E/10' will divide the E value by 10. '~E+5' adds 5 to the the value of E.
-
-
-
Another style of annotations allows to replace an event's numeric value with a text string, known as a nominal value. One example where this can be useful is when an event is used to record sensory milestones. The value 20 might be used for 'Fresh Cut Grass' aroma, 50 for 'Hay', 80 for 'Baking Bread', and 100 to represent the 'A Point'.
This form of annotation must be enclosed in curly brackets '{}'. Entries are numeric values immediately followed by their nominal representation text. Entries are separated by the vertical bar '|'. The following Annotation string implements this example. {~E|20Fresh Cut Grass|50Hay|80Baking Bread|100A Point}
Note that if the event value does not match any value in the Annotation definition a blank string will be returned. In the example above an event value of 30 will return a blank string. The easiest way to ensure these values match is to use Custom Buttons to for the Event.
-
-
-
When annotations overlap to the point they can not be read, try reducing the value of the 'Allowed Annotation Overlap' found on the Annotations configuration page. The default value for this setting is 100%.
-
-
-
+ EVENT ANNOTATIONS
+
+
+
Prefix Field
+
Source
+
Example
+
+
+
+
+
~E
+
The value of Event
+
60
+
+
+
~Y1
+
ET value
+
420
+
+
+
~Y2
+
BT value
+
372
+
+
+
~descr
+
The Description field of the Event
+
Gas 10
+
+
+
~type
+
The Type field of the Event
+
Power
+
+
+
~sldrunit
+
The value of the Slider Unit for this Event
+
kPa
+
+
+
~dCHARGE
+
Number of seconds before or after CHARGE Before CHARGE shows negative Displays '*' when no CHARGE event exists
+
522
+
+
+
~dCHARGE_ms
+
Time before or after CHARGE in min:sec Before CHARGE shows negative Displays '*' when no CHARGE event exists
+
8:42
+
+
+
~dFCs
+
Number of seconds before or after FCs Best used inside double quotes (see notes below) Negative value before FCs Displays '*' when no FCs event exists
+
47
+
+
+
~dFCs_ms
+
Time after FCs in min:sec Best used inside double quotes (see notes below) Negative value before FCs Displays '*' when no FCs event exists
+
1:35
+
+
+
~preFCs
+
Number of seconds before FCs Best used inside single quotes or back ticks (see notes below) Positive value only Displays '*' after FCs or when no FCs event exists
+
50
+
+
+
~preFCs_ms
+
Time before FCs in min:sec Best used inside single quotes or back ticks (see notes below) Positive value only Displays '*' after FCs or when no FCs event exists
+
1:25
+
+
+
~DTR
+
Development time ratio (percent). Note: DTR=0 before FCs 100*(t{Event}-t{FCs})/(t{FCs}-t{CHARGE})
+
12
+
+
+
~deg
+
The degree symbol
+
°
+
+
+
~mode
+
Temperature mode ('C' or 'F')
+
F
+
+
+
~degmode
+
Degree symbol with Temperature mode
+
°C
+
+
+
~R1
+
ET RoR value Displays '--' when the RoR value is not available.
+
9.9
+
+
+
~R2
+
BT RoR value Shows '--' when the RoR value Is not available.
+
18.2
+
+
+
~degmin
+
RoR units Shorthand for '~deg~mode/min'
+
°C/min
+
+
+
~R1degmin
+
ET RoR with units Field is hidden when the RoR value is not available.
+
9.9°C/min
+
+
+
~R2degmin
+
BT RoR with units Field is hidden when the RoR value is not available.
+
18.2°C/min
+
+
+
~quot
+
Quote symbol
+
"
+
+
+
~squot
+
Single quote symbol
+
'
+
+
+
EXAMPLES
+
+
+
Assumptions: The event value is 50. In the case of Gas the value 50 corresponds to either 5.0kPh or 50%. For a sensory milestone (see notes above) the value 50 corresponds to the "Hay" aroma.
+
+
+
+
+
+
Annotation Field
+
Displays
+
+
+
+
+
Gas ~E @~Y2~degmode
+
Gas 50 @340°F
+
+
+
Gas ~E% @~Y2~mode
+
Gas 50% @340F
+
+
+
Gas ~E/10kPh @~Y2~mode
+
Gas 5.0kPh @340F
+
+
+
Gas ~E/10kPh @~Y2~mode and ~R2~degmin
+
Gas 5.0kPh @340F and 32.8°F/min
+
+
+
Gas ~E% '@~Y2 ~degmode'"@~DTR% DTR"
+
Before FCs: Gas 50% @340 °F
After FCs: Gas 50% @12% DTR
+
+
+
Gas ~E% '@~Y2 ~degmode`, ~preFCs sec before FCs`'"@~DTR% DTR"
+
More than 90 seconds before FCs: Gas 50% @340 °F
Less than 90 seconds before FCs: Gas 50% @340 °F, 50 sec before FCs
Event annotations apply only for 'Step' and 'Step+' Events settings
+
+
+
Anything between double quotes " will show only after FCs. Example: "~E1 @~DTR%"
+
+
+
Anything between single quotes ' will show only before FCs. Example: '~E1 @~degmode'
+
+
+
Anything between back ticks ` will show only within 90 seconds before FCs. Example: `~E1 `FCs~dFCs sec`
+
+
+
When combining back ticks with single or double quotes the back ticks should be inside the quotes.
+
+
+
Background event annotations can be seen during a roast when 'Annotations' is checked in the Profile Background window.
+
+
+
Simple scaling of the event value is possible. Use a single math operator ('*', '/', '+' or '-') immediately following the field name "E". For example: '~E/10' will divide the E value by 10. '~E+5' adds 5 to the the value of E.
+
+
+
Another style of annotations allows to replace an event's numeric value with a text string, known as a nominal value. One example where this can be useful is when an event is used to record sensory milestones. The value 20 might be used for 'Fresh Cut Grass' aroma, 50 for 'Hay', 80 for 'Baking Bread', and 100 to represent the 'A Point'.
This form of annotation must be enclosed in curly brackets '{}'. Entries are numeric values immediately followed by their nominal representation text. Entries are separated by the vertical bar '|'. The following Annotation string implements this example. {~E|20Fresh Cut Grass|50Hay|80Baking Bread|100A Point}
Note that if the event value does not match any value in the Annotation definition a blank string will be returned. In the example above an event value of 30 will return a blank string. The easiest way to ensure these values match is to use Custom Buttons to for the Event.
+
+
+
When annotations overlap to the point they can not be read, try reducing the value of the 'Allowed Annotation Overlap' found on the Annotations configuration page. The default value for this setting is 100%.
Button numbers can be drag and dropped to a new position. While holding the ALT key (Windows) / OPTION (macOS) buttons are swapped
-
-
-
-
-
-
Column
-
Description
-
-
-
-
-
Button Label
-
Enter \n to create labels with multiple lines. \t is substituted by the event type.
-
-
-
Event Description
-
Description of the Event to be recorded.
-
-
-
Event Type
-
Event type to be recorded or leave blank for no event. '±' types add a chosen offset (positive or negative) to the present value of the chosen event.
-
-
-
Event Value
-
Value of event (1-100) to be recorded.
-
-
-
Action
-
Perform an action at the time of the event.
-
-
-
Documentation
-
The action Command. Depends on the action type, '{}' is replaced by the event value and the offset in case of a ± event type.
-
-
-
Button Visibility
-
Hides/shows individual button.
-
-
-
EVENT BUTTONS CONFIGURATION OPTIONS
-
-
-
Option
-
Description
-
-
-
-
-
Max buttons per row
-
Sets a maximum number of buttons to display on a single row.
-
-
-
Button size
-
Sets a size for the buttons. Choices are tiny, small and large.
-
-
-
Color Pattern
-
Applies one of 99 autogenerated color patterns to the buttons. Set to "0" to manually choose the button colors.
-
-
-
Mark Last Pressed
-
Invert state and color of last button pressed
-
-
-
Tooltips
-
Show button specification as tooltips on hovering a button
-
-
-
Add
-
Adds a new button to the bottom of the table.
-
-
-
Insert
-
Inserts a new button above the selected button.
-
-
-
Delete
-
Deletes the selected button.
-
-
-
Copy Table
-
Copy the button table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.
-
-
-
Help
-
Opens this window.
-
-
-
LABELS
-
-
-
The following substitutions are applied to button labels
-
-
-
-
-
-
String
-
Substitution
-
-
-
-
-
\n
-
New line character
-
-
-
\t
-
Event name (translated if using default event names)
-
-
-
\q
-
Event type 1
-
-
-
\w
-
Event type 2
-
-
-
\e
-
Event type 3
-
-
-
\r
-
Event type 4
-
-
-
\0
-
OFF (translated)
-
-
-
\1
-
ON (translated)
-
-
-
\2
-
OFF (translated, respecting button state)
-
-
-
\3
-
ON (translated, respecting button state)
-
-
-
\p
-
STOP (translated)
-
-
-
\s
-
START (translated)
-
-
-
\P
-
STOP (translated, respecting button state)
-
-
-
\S
-
START (translated, respecting button state)
-
-
-
\c
-
CLOSE (translated)
-
-
-
\o
-
OPEN (translated)
-
-
-
\C
-
CLOSE (translated, respecting button state)
-
-
-
\O
-
OPEN (translated, respecting button state)
-
-
-
\a
-
AUTO (translated)
-
-
-
\m
-
MANUAL (translated)
-
-
-
\A
-
AUTO (translated, respecting button state)
-
-
-
\M
-
MANUAL (translated, respecting button state)
-
-
-
\i
-
STIRRER
-
-
-
\f
-
FILL
-
-
-
\f
-
DISCHARGE
-
-
-
\R
-
RELEASE
-
-
-
\h
-
HEATING
-
-
-
\l
-
COOLING
-
-
-
\b
-
FLAP
-
-
-
\d
-
CONTROL
-
-
-
\V
-
event value
-
-
-
\F
-
event value interpreted as temperature in Fahrenheit converted to the current temperature mode
-
-
-
\T
-
event value interpreted as temperature in Celsius converted to the current temperature mode
-
-
-
COMMANDS
-
-
-
Note: "{}" can be used as a placeholder, it will be substituted by the current button value plus the offset for ± event types. If a placeholder occurs several times in a description/command, all those occurrences are replaced by the value.
Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands
Note: Commands can be sequenced, separated by semicolons like in “<cmd1>;<cmd2>;<cmd3>”
Note: All characters given as documentation to a Serial Command action are sent as one string to the connected device. If the device can interpret this string as separate commands separated by semicolon this is fine. Otherwise you can use a Multiple Event referencing a number of event buttons (using a comma separated list of event button numbers as documentation string) where each of the referenced event buttons issues one of the commands via a corresponding Serial Command action. Those event buttons can be hidden thus having the same effect as if the Serial Command allowed a sequence of commands.
Note: In PHIDGET commands, the optional parameter <sn> has the form <hub_serial>[:<hub_port>] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.
Note: In YOCTOPUCE commands, the optional parameter <sn> holds either the modules serial number or its name
-
-
-
-
-
-
Action
-
Command
-
Description
-
-
-
-
-
Serial Command
-
ASCII serial command or binary a2b_uu(serial command)
-
-
-
-
Call Program
-
A program/script path (absolute or relative)
-
start an external program
-
-
-
Multiple Event
-
button numbers or sleep(<float>) separated by a comma: 1,2,sleep(2.5), 3..
-
triggers other buttons
-
-
-
Modbus Command
-
_
-
variable holding the last value read via MODBUS
-
-
-
-
$
-
variable holding the last state of the button pressed (1 or 0)
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
button(i,b)
-
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button(<bool>)
-
sets calling button to “pressed” if argument is 1 or True
-
-
-
-
button()
-
toggles the state of the button
-
-
-
-
read(slaveID,register)
-
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
readSigned(slaveId,register)
-
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
readBCD(slaveID,register)
-
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
read32(slaveID,register)
-
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
read32Signed(slaveID,register)
-
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
read32BCD(slaveID,register)
-
reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
readFloat(slaveID,register)
-
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])
-
write register: MODBUS function 6 (int) or function 16 (float)
-
-
-
-
wcoil(slaveId,register,<bool>)
-
write coil: MODBUS function 5
-
-
-
-
wcoils(slaveId,register,[<bool>,..,<bool>])
-
write coils: MODBUS function 15
-
-
-
-
mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)
-
mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v
-
-
-
-
writem(slaveId,register,value) or writem(slaveId,register,[<int>,..,<int>])
-
write registers: MODBUS function 16
-
-
-
-
writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])
-
write 16bit BCD encoded value v to register r of slave s
-
-
-
-
writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])
-
write 32bit float to two 16bit int registers: MODBUS function 16
-
-
-
-
writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])
-
write 32bit integer to two 16bit int registers: MODBUS function 16
-
-
-
-
writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])
-
write 16bit integer to a single 16bit register: MODBUS function 6 (int)
-
-
-
DTA Command
-
Insert Data address : value, ex. 4701:1000 and sv is 100. Always multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating
-
-
-
-
IO Command
-
_
-
variable holding the last result value
-
-
-
-
$
-
variable holding the last state of the button pressed (1 or 0)
-
-
-
-
set(c,b[,sn])
-
PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)
-
-
-
-
toggle(c[,sn])
-
PHIDGET Binary Output: toggles channel c
-
-
-
-
pulse(c,t[,sn])
-
PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds
-
-
-
-
out(c,v[,sn])
-
PHIDGET Voltage Output: sets voltage output of channel c to v (float)
-
-
-
-
accel(c,v[,sn])
-
PHIDGET DCMotor: sets acceleration of channel c to v (float)
-
-
-
-
vel(c,v[,sn])
-
PHIDGET DCMotor: sets target velocity of channel c to v (float)
-
-
-
-
limit(c,v[,sn])
-
PHIDGET DCMotor: sets current limit of channel c to v (float)
-
-
-
-
on(c[,sn])
-
YOCTOPUCE Relay Output: turn channel c of the relay module on
-
-
-
-
off(c[,sn])
-
YOCTOPUCE Relay Output: turn channel c of the relay module off
-
-
-
-
yset(c,b[,sn])
-
YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)
-
-
-
-
flip(c[,sn])
-
YOCTOPUCE Relay Output: toggle the state of channel c
-
-
-
-
pip(c,delay,duration[,sn])
-
YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds
-
-
-
-
powerReset([sn])
-
YOCTOPUCE resets the power counter of the Yocto-Watt module
-
-
-
-
slider(c,v)
-
move slider c to value v
-
-
-
-
button(i,c,b[,sn])
-
switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b
-
-
-
-
button(i,b)
-
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button(b)
-
sets button to pressed if value b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button()
-
toggles the state of the button
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
santoker(<target>,<value>)
-
sends integer <value> to <target> register specified by as byte in hex notation like “fa” via the Santoker Network protocol
-
-
-
-
kaleido(<target>,<value>)
-
sends <value> to <target> via the Kaleido Serial or Network protocol
-
-
-
Hottop Heater
-
-
sets heater to value
-
-
-
Hottop Fan
-
-
sets fan to value
-
-
-
Hottop Command
-
motor(n),solenoid(n),stirrer(n),heater(h),fan(f)
-
with n={0 ,1},h={0,..100},f={0,..10}
-
-
-
p-i-d
-
<p>;<i>;<d>
-
configures PID to the values <p>;<i>;<d>
-
-
-
Fuji Command
-
write(<unitId>,<register>,<value>)
-
-
-
-
PWM Command
-
out(<channel>,<value>[,<sn>])
-
PHIDGET PWM Output: <value> in [0-100]
-
-
-
-
toggle(<channel>[,<sn>])
-
PHIDGET PWM Output: toggles <channel>
-
-
-
-
pulse(<channel>,<millis>[,<sn>])
-
PHIDGET PWM Output: turn <channel> on for <millis> milliseconds
-
-
-
-
outhub(<channel>,<value>[,<sn>])
-
PHIDGET HUB PWM Output: <value> in [0-100]
-
-
-
-
togglehub(<channel>[,<sn>])
-
PHIDGET HUB PWM Output: toggles <channel>
-
-
-
-
pulsehub(<channel>,<millis>[,<sn>])
-
PHIDGET HUB PWM Output: turn <channel> on for <millis> milliseconds
-
-
-
-
enabled(c,b[,sn])
-
YOCTOPUCE PWM Output: PWM running state
-
-
-
-
freq(c,f[,sn])
-
YOCTOPUCE PWM Output: set PWM frequency to f (Hz)
-
-
-
-
duty(c,d[,sn])
-
YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]
-
-
-
-
move(c,d,t[,sn])
-
YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval
-
-
-
VOUT Command
-
range(c,r[,sn])
-
for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for 5V and r=10 for 10V)
-
-
-
-
out(<n>,<v>[,<sn>])
-
for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)
-
-
-
-
vout(c,v[,sn])
-
for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]
-
-
-
-
cout(c[,sn])
-
for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
S7 Command
-
_
-
variable holding the last value read via S7
-
-
-
-
$
-
variable holding the last state of the button pressed (1 or 0)
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
button(i,b)
-
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button(<bool>)
-
sets calling button to “pressed” if argument is 1 or True
increases or decreases the current target SV value by <int>
-
-
-
-
pidSV(<int>)
-
sets the PID target set value SV
-
-
-
-
pidSVC(<int>)
-
sets the PID target set value SV given in C
-
-
-
-
pidRS(<rs>)
-
activates the PID Ramp-Soak pattern number <rs> (1-based!) or the one labeled <rs>
-
-
-
-
pidSource(<int>)
-
selects the PID input source with <n> 0: BT, 1: ET (Software PID); <n> in {0,..,3} (Arduino PID)
-
-
-
-
pidLookahead(<int>)
-
sets the PID lookahead
-
-
-
-
popup(<msg>[,<int>])
-
shows popup with message <msg> which optionally automatically closes after <int> seconds
-
-
-
-
message(<msg>)
-
shows message <msg> in the message line
-
-
-
-
notifications(<bool>)
-
enables/disables notifications; while disabled issued notifications are ignored
-
-
-
-
notify(<title>,[<msg>])
-
sends notification with title <title> and optional message <msg>
-
-
-
-
setCanvasColor(<color>)
-
sets canvas color to the RGB-hex <color> like #27f1d3
-
-
-
-
resetCanvasColor
-
resets canvas color
-
-
-
-
button(i,b)
-
sets button i to pressed if value of b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button(<name>|<bool>)
-
activates button <name> from { START, CHARGE, DRY, FCs, FCe, SCs, SCe, DROP, COOL, OFF } ; sets calling button to “pressed” if argument is 1 or True
-
-
-
-
button()
-
toggles the state of the button
-
-
-
-
visible(i,b)
-
sets button i to visible if value of b is yes, true, t, or 1, otherwise to hidden
-
-
-
-
palette(<p>)
-
activates palette <p> with <p> either a number 0-9 or a palette label
-
-
-
-
playbackmode(<int>)
-
sets playback mode to 0: off, 1: time, 2: BT, 3: ET
-
-
-
-
openProperties
-
opens the Roast Properties dialog
-
-
-
-
loadBackground(<filepath>)
-
loads the .alog profile at the given filepath as background profile
-
-
-
-
clearBackground
-
clears the current background profile
-
-
-
-
alarmset(<as>)
-
activates the alarmset with the given number or label
-
-
-
-
moveBackground(<direction>,<int>)
-
moves the background profile the indicated number of steps towards <direction>, with <direction> one of up, down, left, right
-
-
-
-
keyboard(<bool>)
-
enables/disables keyboard mode
-
-
-
-
keepON(<bool>)
-
enables/disables the Keep ON flag
-
-
-
-
showCurve(<name>,<bool>)
-
shows/hides the curve indicated by <name> which is one of { ET, BT, DeltaET, DeltaBT, BackgroundET, BackgroundBT}
-
-
-
-
showExtraCurve(<extra_device>,<curve>,<bool>)
-
shows/hides the <curve> (one of {T1,T2}) of the zero-based <extra_device> number
-
-
-
-
showEvents(<event_type>, <bool>)
-
shows/hides the events of <event_type> in [1,..,5]
-
-
-
-
showBackgroundEvents(<bool>)
-
shows/hides the events of the background profile
-
-
-
RC Command
-
pulse(ch,min,max[,sn])
-
for PHIDGET RC modules: sets the min/max pulse width in microseconds
-
-
-
-
pos(ch,min,max[,sn])
-
for PHIDGET RC modules: sets the min/max position
-
-
-
-
engaged(ch,b[,sn])
-
for PHIDGET RC modules: engage (b=1) or disengage (b = 0)
-
-
-
-
ramp(ch,b[,sn])
-
for PHIDGET RC modules: activates or deactivates the speed ramping state
-
-
-
-
volt(ch,v[,sn])
-
for PHIDGET RC modules: set the voltage to one of 5, 6 or 7.4 in Volt
-
-
-
-
accel(ch,a[,sn])
-
for PHIDGET RC modules: set the acceleration
-
-
-
-
veloc(ch,v[,sn])
-
for PHIDGET RC modules: set the velocity
-
-
-
-
set(ch,pos[,sn])
-
for PHIDGET RC modules: set the target position
-
-
-
-
enabled(c,b[,sn])
-
for YOCTOPUCE RC modules: with c:int the channel, b a bool (eg. enabled(0,1) or enabled(0,True))
-
-
-
-
move(c,p[,t][,sn])
-
for YOCTOPUCE RC modules: with c:int the channel, p:int the target position, the optional t the duration in ms, sn the optional modules serial number or logical name
-
-
-
-
neutral(c,n[,sn])
-
for YOCTOPUCE RC modules: with n an int [0..65000] in us
-
-
-
-
range(c,r[,sn])
-
for YOCTOPUCE RC modules: with r an int in %
-
-
-
WebSocket Command
-
$
-
variable holding the last state of the button pressed (1 or 0)
-
-
-
-
send(<json>)
-
If {} substitutions are used, json brackets need to be duplicated to escape them like in send({{ “value”: {}}})
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
button(i,b)
-
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button(<bool>)
-
sets calling button to “pressed” if argument evaluates to 1 or True
-
-
-
-
button()
-
toggles the state of the button
-
-
-
-
read(<json>)
-
if the `<json>` text respects the JSON format it is send to the connected WebSocket server and the response is bound to the variable `_`
-
-
-
+ EVENT CUSTOM BUTTONS
+
+
+
Button numbers can be drag and dropped to a new position. While holding the ALT key (Windows) / OPTION (macOS) buttons are swapped
+
+
+
+
+
+
Column
+
Description
+
+
+
+
+
Button Label
+
Enter \n to create labels with multiple lines. \t is substituted by the event type.
+
+
+
Event Description
+
Description of the Event to be recorded.
+
+
+
Event Type
+
Event type to be recorded or leave blank for no event. '±' types add a chosen offset (positive or negative) to the present value of the chosen event.
+
+
+
Event Value
+
Value of event (1-100) to be recorded.
+
+
+
Action
+
Perform an action at the time of the event.
+
+
+
Documentation
+
The action Command. Depends on the action type, '{}' is replaced by the event value and the offset in case of a ± event type.
+
+
+
Button Visibility
+
Hides/shows individual button.
+
+
+
EVENT BUTTONS CONFIGURATION OPTIONS
+
+
+
Option
+
Description
+
+
+
+
+
Max buttons per row
+
Sets a maximum number of buttons to display on a single row.
+
+
+
Button size
+
Sets a size for the buttons. Choices are tiny, small and large.
+
+
+
Color Pattern
+
Applies one of 99 autogenerated color patterns to the buttons. Set to "0" to manually choose the button colors.
+
+
+
Mark Last Pressed
+
Invert state and color of last button pressed
+
+
+
Tooltips
+
Show button specification as tooltips on hovering a button
+
+
+
Add
+
Adds a new button to the bottom of the table.
+
+
+
Insert
+
Inserts a new button above the selected button.
+
+
+
Delete
+
Deletes the selected button.
+
+
+
Copy Table
+
Copy the button table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.
+
+
+
Help
+
Opens this window.
+
+
+
LABELS
+
+
+
The following substitutions are applied to button labels
+
+
+
+
+
+
String
+
Substitution
+
+
+
+
+
\n
+
New line character
+
+
+
\t
+
Event name (translated if using default event names)
+
+
+
\q
+
Event type 1
+
+
+
\w
+
Event type 2
+
+
+
\e
+
Event type 3
+
+
+
\r
+
Event type 4
+
+
+
\0
+
OFF (translated)
+
+
+
\1
+
ON (translated)
+
+
+
\2
+
OFF (translated, respecting button state)
+
+
+
\3
+
ON (translated, respecting button state)
+
+
+
\p
+
STOP (translated)
+
+
+
\s
+
START (translated)
+
+
+
\P
+
STOP (translated, respecting button state)
+
+
+
\S
+
START (translated, respecting button state)
+
+
+
\c
+
CLOSE (translated)
+
+
+
\o
+
OPEN (translated)
+
+
+
\C
+
CLOSE (translated, respecting button state)
+
+
+
\O
+
OPEN (translated, respecting button state)
+
+
+
\a
+
AUTO (translated)
+
+
+
\m
+
MANUAL (translated)
+
+
+
\A
+
AUTO (translated, respecting button state)
+
+
+
\M
+
MANUAL (translated, respecting button state)
+
+
+
\i
+
STIRRER
+
+
+
\f
+
FILL
+
+
+
\f
+
DISCHARGE
+
+
+
\R
+
RELEASE
+
+
+
\h
+
HEATING
+
+
+
\l
+
COOLING
+
+
+
\b
+
FLAP
+
+
+
\d
+
CONTROL
+
+
+
\V
+
event value
+
+
+
\F
+
event value interpreted as temperature in Fahrenheit converted to the current temperature mode
+
+
+
\T
+
event value interpreted as temperature in Celsius converted to the current temperature mode
+
+
+
COMMANDS
+
+
+
Note: "{}" can be used as a placeholder, it will be substituted by the current button value plus the offset for ± event types. If a placeholder occurs several times in a description/command, all those occurrences are replaced by the value.
Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands
Note: Commands can be sequenced, separated by semicolons like in “<cmd1>;<cmd2>;<cmd3>”
Note: All characters given as documentation to a Serial Command action are sent as one string to the connected device. If the device can interpret this string as separate commands separated by semicolon this is fine. Otherwise you can use a Multiple Event referencing a number of event buttons (using a comma separated list of event button numbers as documentation string) where each of the referenced event buttons issues one of the commands via a corresponding Serial Command action. Those event buttons can be hidden thus having the same effect as if the Serial Command allowed a sequence of commands.
Note: In PHIDGET commands, the optional parameter <sn> has the form <hub_serial>[:<hub_port>] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.
Note: In YOCTOPUCE commands, the optional parameter <sn> holds either the modules serial number or its name
+
+
+
+
+
+
Action
+
Command
+
Description
+
+
+
+
+
Serial Command
+
ASCII serial command or binary a2b_uu(serial command)
+
+
+
+
Call Program
+
A program/script path (absolute or relative)
+
start an external program
+
+
+
Multiple Event
+
button numbers or sleep(<float>) separated by a comma: 1,2,sleep(2.5), 3..
+
triggers other buttons
+
+
+
Modbus Command
+
_
+
variable holding the last value read via MODBUS
+
+
+
+
$
+
variable holding the last state of the button pressed (1 or 0)
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
button(i,b)
+
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button(<bool>)
+
sets calling button to “pressed” if argument is 1 or True
+
+
+
+
button()
+
toggles the state of the button
+
+
+
+
read(slaveID,register)
+
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
readSigned(slaveId,register)
+
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
readBCD(slaveID,register)
+
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
read32(slaveID,register)
+
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
read32Signed(slaveID,register)
+
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
read32BCD(slaveID,register)
+
reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
readFloat(slaveID,register)
+
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])
+
write register: MODBUS function 6 (int) or function 16 (float)
+
+
+
+
wcoil(slaveId,register,<bool>)
+
write coil: MODBUS function 5
+
+
+
+
wcoils(slaveId,register,[<bool>,..,<bool>])
+
write coils: MODBUS function 15
+
+
+
+
mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)
+
mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v
+
+
+
+
writem(slaveId,register,value) or writem(slaveId,register,[<int>,..,<int>])
+
write registers: MODBUS function 16
+
+
+
+
writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])
+
write 16bit BCD encoded value v to register r of slave s
+
+
+
+
writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])
+
write 32bit float to two 16bit int registers: MODBUS function 16
+
+
+
+
writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])
+
write 32bit integer to two 16bit int registers: MODBUS function 16
+
+
+
+
writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])
+
write 16bit integer to a single 16bit register: MODBUS function 6 (int)
+
+
+
DTA Command
+
Insert Data address : value, ex. 4701:1000 and sv is 100. Always multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating
+
+
+
+
IO Command
+
_
+
variable holding the last result value
+
+
+
+
$
+
variable holding the last state of the button pressed (1 or 0)
+
+
+
+
set(c,b[,sn])
+
PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)
+
+
+
+
toggle(c[,sn])
+
PHIDGET Binary Output: toggles channel c
+
+
+
+
pulse(c,t[,sn])
+
PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds
+
+
+
+
out(c,v[,sn])
+
PHIDGET Voltage Output: sets voltage output of channel c to v (float)
+
+
+
+
accel(c,v[,sn])
+
PHIDGET DCMotor: sets acceleration of channel c to v (float)
+
+
+
+
vel(c,v[,sn])
+
PHIDGET DCMotor: sets target velocity of channel c to v (float)
+
+
+
+
limit(c,v[,sn])
+
PHIDGET DCMotor: sets current limit of channel c to v (float)
+
+
+
+
on(c[,sn])
+
YOCTOPUCE Relay Output: turn channel c of the relay module on
+
+
+
+
off(c[,sn])
+
YOCTOPUCE Relay Output: turn channel c of the relay module off
+
+
+
+
yset(c,b[,sn])
+
YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)
+
+
+
+
flip(c[,sn])
+
YOCTOPUCE Relay Output: toggle the state of channel c
+
+
+
+
pip(c,delay,duration[,sn])
+
YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds
+
+
+
+
powerReset([sn])
+
YOCTOPUCE resets the power counter of the Yocto-Watt module
+
+
+
+
slider(c,v)
+
move slider c to value v
+
+
+
+
button(i,c,b[,sn])
+
switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b
+
+
+
+
button(i,b)
+
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button(b)
+
sets button to pressed if value b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button()
+
toggles the state of the button
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
santoker(<target>,<value>)
+
sends integer <value> to <target> register specified by as byte in hex notation like “fa” via the Santoker Network protocol
+
+
+
+
kaleido(<target>,<value>)
+
sends <value> to <target> via the Kaleido Serial or Network protocol
+
+
+
Hottop Heater
+
+
sets heater to value
+
+
+
Hottop Fan
+
+
sets fan to value
+
+
+
Hottop Command
+
motor(n),solenoid(n),stirrer(n),heater(h),fan(f)
+
with n={0 ,1},h={0,..100},f={0,..10}
+
+
+
p-i-d
+
<p>;<i>;<d>
+
configures PID to the values <p>;<i>;<d>
+
+
+
Fuji Command
+
write(<unitId>,<register>,<value>)
+
+
+
+
PWM Command
+
out(<channel>,<value>[,<sn>])
+
PHIDGET PWM Output: <value> in [0-100]
+
+
+
+
toggle(<channel>[,<sn>])
+
PHIDGET PWM Output: toggles <channel>
+
+
+
+
pulse(<channel>,<millis>[,<sn>])
+
PHIDGET PWM Output: turn <channel> on for <millis> milliseconds
+
+
+
+
outhub(<channel>,<value>[,<sn>])
+
PHIDGET HUB PWM Output: <value> in [0-100]
+
+
+
+
togglehub(<channel>[,<sn>])
+
PHIDGET HUB PWM Output: toggles <channel>
+
+
+
+
pulsehub(<channel>,<millis>[,<sn>])
+
PHIDGET HUB PWM Output: turn <channel> on for <millis> milliseconds
+
+
+
+
enabled(c,b[,sn])
+
YOCTOPUCE PWM Output: PWM running state
+
+
+
+
freq(c,f[,sn])
+
YOCTOPUCE PWM Output: set PWM frequency to f (Hz)
+
+
+
+
duty(c,d[,sn])
+
YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]
+
+
+
+
move(c,d,t[,sn])
+
YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval
+
+
+
VOUT Command
+
range(c,r[,sn])
+
for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for 5V and r=10 for 10V)
+
+
+
+
out(<n>,<v>[,<sn>])
+
for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)
+
+
+
+
vout(c,v[,sn])
+
for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]
+
+
+
+
cout(c[,sn])
+
for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
S7 Command
+
_
+
variable holding the last value read via S7
+
+
+
+
$
+
variable holding the last state of the button pressed (1 or 0)
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
button(i,b)
+
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button(<bool>)
+
sets calling button to “pressed” if argument is 1 or True
increases or decreases the current target SV value by <int>
+
+
+
+
pidSV(<int>)
+
sets the PID target set value SV
+
+
+
+
pidSVC(<int>)
+
sets the PID target set value SV given in C
+
+
+
+
pidRS(<rs>)
+
activates the PID Ramp-Soak pattern number <rs> (1-based!) or the one labeled <rs>
+
+
+
+
pidSource(<int>)
+
selects the PID input source with <n> 0: BT, 1: ET (Software PID); <n> in {0,..,3} (Arduino PID)
+
+
+
+
pidLookahead(<int>)
+
sets the PID lookahead
+
+
+
+
popup(<msg>[,<int>])
+
shows popup with message <msg> which optionally automatically closes after <int> seconds
+
+
+
+
message(<msg>)
+
shows message <msg> in the message line
+
+
+
+
notifications(<bool>)
+
enables/disables notifications; while disabled issued notifications are ignored
+
+
+
+
notify(<title>,[<msg>])
+
sends notification with title <title> and optional message <msg>
+
+
+
+
setCanvasColor(<color>)
+
sets canvas color to the RGB-hex <color> like #27f1d3
+
+
+
+
resetCanvasColor
+
resets canvas color
+
+
+
+
button(i,b)
+
sets button i to pressed if value of b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button(<name>|<bool>)
+
activates button <name> from { START, CHARGE, DRY, FCs, FCe, SCs, SCe, DROP, COOL, OFF } ; sets calling button to “pressed” if argument is 1 or True
+
+
+
+
button()
+
toggles the state of the button
+
+
+
+
visible(i,b)
+
sets button i to visible if value of b is yes, true, t, or 1, otherwise to hidden
+
+
+
+
palette(<p>)
+
activates palette <p> with <p> either a number 0-9 or a palette label
+
+
+
+
playbackmode(<int>)
+
sets playback mode to 0: off, 1: time, 2: BT, 3: ET
+
+
+
+
openProperties
+
opens the Roast Properties dialog
+
+
+
+
loadBackground(<filepath>)
+
loads the .alog profile at the given filepath as background profile
+
+
+
+
clearBackground
+
clears the current background profile
+
+
+
+
alarmset(<as>)
+
activates the alarmset with the given number or label
+
+
+
+
moveBackground(<direction>,<int>)
+
moves the background profile the indicated number of steps towards <direction>, with <direction> one of up, down, left, right
+
+
+
+
keyboard(<bool>)
+
enables/disables keyboard mode
+
+
+
+
keepON(<bool>)
+
enables/disables the Keep ON flag
+
+
+
+
showCurve(<name>,<bool>)
+
shows/hides the curve indicated by <name> which is one of { ET, BT, DeltaET, DeltaBT, BackgroundET, BackgroundBT}
+
+
+
+
showExtraCurve(<extra_device>,<curve>,<bool>)
+
shows/hides the <curve> (one of {T1,T2}) of the zero-based <extra_device> number
+
+
+
+
showEvents(<event_type>, <bool>)
+
shows/hides the events of <event_type> in [1,..,5]
+
+
+
+
showBackgroundEvents(<bool>)
+
shows/hides the events of the background profile
+
+
+
RC Command
+
pulse(ch,min,max[,sn])
+
for PHIDGET RC modules: sets the min/max pulse width in microseconds
+
+
+
+
pos(ch,min,max[,sn])
+
for PHIDGET RC modules: sets the min/max position
+
+
+
+
engaged(ch,b[,sn])
+
for PHIDGET RC modules: engage (b=1) or disengage (b = 0)
+
+
+
+
ramp(ch,b[,sn])
+
for PHIDGET RC modules: activates or deactivates the speed ramping state
+
+
+
+
volt(ch,v[,sn])
+
for PHIDGET RC modules: set the voltage to one of 5, 6 or 7.4 in Volt
+
+
+
+
accel(ch,a[,sn])
+
for PHIDGET RC modules: set the acceleration
+
+
+
+
veloc(ch,v[,sn])
+
for PHIDGET RC modules: set the velocity
+
+
+
+
set(ch,pos[,sn])
+
for PHIDGET RC modules: set the target position
+
+
+
+
enabled(c,b[,sn])
+
for YOCTOPUCE RC modules: with c:int the channel, b a bool (eg. enabled(0,1) or enabled(0,True))
+
+
+
+
move(c,p[,t][,sn])
+
for YOCTOPUCE RC modules: with c:int the channel, p:int the target position, the optional t the duration in ms, sn the optional modules serial number or logical name
+
+
+
+
neutral(c,n[,sn])
+
for YOCTOPUCE RC modules: with n an int [0..65000] in us
+
+
+
+
range(c,r[,sn])
+
for YOCTOPUCE RC modules: with r an int in %
+
+
+
WebSocket Command
+
$
+
variable holding the last state of the button pressed (1 or 0)
+
+
+
+
send(<json>)
+
If {} substitutions are used, json brackets need to be duplicated to escape them like in send({{ “value”: {}}})
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
button(i,b)
+
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button(<bool>)
+
sets calling button to “pressed” if argument evaluates to 1 or True
+
+
+
+
button()
+
toggles the state of the button
+
+
+
+
read(<json>)
+
if the `<json>` text respects the JSON format it is send to the connected WebSocket server and the response is bound to the variable `_`
Command to perform, depends on the Action type. ('{}' is replaced by the slider value*Factor + Offset)
-
-
-
Offset
-
Offset to be added to the Slider value (after scaling by Factor).
-
-
-
Factor
-
Scale factor, Slider value is multiplied by this value.
-
-
-
Min
-
Sets the minimum value for the range of the slider.
-
-
-
Max
-
Sets the maximum value for the range of the slider.
-
-
-
Course
-
When ticked the slider moves in steps of 10.
-
-
-
Temp
-
Should be ticked when the slider's value is a temperature to allow Artisan to properly scale the value between Centigrade and Fahrenheit.
-
-
-
Unit
-
Optional text used in annotations to the the units used for the slider value.
-
-
-
COMMANDS
-
-
-
Note: "{}" can be used as a placeholder, it will be substituted by (value*factor + offset). In all slider command actions, but for IO, VOUT, S7 and RC Commands, the bound value is converted from a float to an int.
Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands
Note: commands can be sequenced, separated by semicolons like in “<cmd1>;<cmd2>;<cmd3>”
Note: in PHIDGET commands, the optional parameter <sn> has the form <hub_serial>[:<hub_port>] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.
Note: in YOCTOPUCE commands, the optional parameters <sn> holds either the modules serial number or its name
-
-
-
-
-
-
Action
-
Command
-
Description
-
-
-
-
-
Serial Command
-
ASCII serial command or binary a2b_uu(serial command)
-
-
-
-
Modbus Command
-
_
-
variable holding the last value read via MODBUS
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
button(<bool>)
-
sets calling button to “pressed” if argument is 1 or True
-
-
-
-
read(slaveID,register)
-
reads register from slave slaveID using function 3 (Read Multiple Holding Registers). The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
readSigned(slaveId,register)
-
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
readBCD(slaveID,register)
-
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
read32(slaveID,register)
-
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
read32Signed(slaveID,register)
-
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
read32BCD(slaveID,register)
-
reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
readFloat(slaveID,register)
-
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.
-
-
-
-
write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])
-
write register: MODBUS function 6 (int) or function 16 (float)
-
-
-
-
wcoil(slaveId,register,<bool>)
-
write coil: MODBUS function 5
-
-
-
-
wcoils(slaveId,register,[<bool>,..,<bool>])
-
write coils: MODBUS function 15
-
-
-
-
mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)
-
mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v
-
-
-
-
writem(slaveId,register,value) or writem(slaveId,register,[<int>,..,<int>])
-
write registers: MODBUS function 16
-
-
-
-
writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])
-
write 16bit BCD encoded value v to register r of slave s
-
-
-
-
writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])
-
write 32bit float to two 16bit int registers: MODBUS function 16
-
-
-
-
writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])
-
write 32bit integer to two 16bit int registers: MODBUS function 16
-
-
-
-
writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])
-
write 16bit integer to a single 16bit register: MODBUS function 6 (int)
-
-
-
DTA Command
-
Insert Data address : value, ex. 4701:1000 and sv is 100.
-
Always multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating
-
-
-
Call Program
-
A program/script path (absolute or relative)
-
start and external program
-
-
-
Hottop Heater
-
-
sets heater to value
-
-
-
Hottop Fan
-
-
sets fan to value
-
-
-
Hottop Command
-
motor(n),solenoid(n),stirrer(n),heater(h),fan(f)
-
with n={0 ,1},h={0,..100},f={0,..10}
-
-
-
Fuji Command
-
write(<unitId>,<register>,<value>)
-
-
-
-
PWM Command
-
out(<channel>,<value>[,<sn>])
-
PHIDGET PWM Output: <value> in [0-100]
-
-
-
-
toggle(<channel>[,<sn>])
-
PHIDGET PWM Output: toggles <channel>
-
-
-
-
pulse(<channel>,<millis>[,<sn>])
-
PHIDGET PWM Output: turn <channel> on for <millis> milliseconds
-
-
-
-
outhub(<channel>,<value>[,<sn>])
-
PHIDGET HUB PWM Output: <value> in [0-100]
-
-
-
-
togglehub(<channel>[,<sn>])
-
PHIDGET HUB PWM Output: toggles <channel>
-
-
-
-
pulsehub(<channel>,<millis>[,<sn>])
-
PHIDGET HUB PWM Output: turn <channel> on for <millis> milliseconds
-
-
-
-
enabled(c,b[,sn])
-
YOCTOPUCE PWM Output: PWM running state
-
-
-
-
freq(c,f[,sn])
-
YOCTOPUCE PWM Output: set PWM frequency to f (Hz)
-
-
-
-
duty(c,d[,sn])
-
YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]
-
-
-
-
move(c,d,t[,sn])
-
YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval
-
-
-
VOUT Command
-
range(c,r[,sn])
-
for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for r5V and r=10 for 10V)
-
-
-
-
out(n,v[,sn])
-
for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)
-
-
-
-
vout(c,v[,sn])
-
for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]
-
-
-
-
cout(c[,sn])
-
for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
IO Command
-
set(c,b[,sn])
-
PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)
-
-
-
-
toggle(c[,sn])
-
PHIDGET Binary Output: toggles channel c
-
-
-
-
pulse(c,t[,sn])
-
PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds
-
-
-
-
out(c,v[,sn])
-
PHIDGET Voltage Output: sets voltage output of channel c to v (float)
-
-
-
-
accel(c,v[,sn])
-
PHIDGET DCMotor: sets acceleration of channel c to v (float)
-
-
-
-
vel(c,v[,sn])
-
PHIDGET DCMotor: sets target velocity of channel c to v (float)
-
-
-
-
limit(c,v[,sn])
-
PHIDGET DCMotor: sets current limit of channel c to v (float)
-
-
-
-
on(c[,sn])
-
YOCTOPUCE Relay Output: turn channel c of the relay module on
-
-
-
-
off(c[,sn])
-
YOCTOPUCE Relay Output: turn channel c of the relay module off
-
-
-
-
yset(c,b[,sn])
-
YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)
-
-
-
-
flip(c[,sn])
-
YOCTOPUCE Relay Output: toggle the state of channel c
-
-
-
-
pip(c,delay,duration[,sn])
-
YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds
-
-
-
-
powerReset([sn])
-
YOCTOPUCE resets the power counter of the Yocto-Watt module
-
-
-
-
slider(c,v)
-
move slider c to value v
-
-
-
-
button(i,c,b[,sn])
-
switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b
-
-
-
-
button(i,b)
-
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button(b)
-
sets button to pressed if value b is yes, true, t, or 1, otherwise to normal
-
-
-
-
button()
-
toggles the state of the button
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
santoker(<target>,<value>)
-
sends integer <value> to <target> register specified by as byte in hex notation like “fa” via the Santoker Network protocol
-
-
-
-
kaleido(<target>,<value>)
-
sends <value> to <target> via the Kaleido Serial or Network protocol
-
-
-
S7 Command
-
_
-
variable holding the last value read via S7
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
button(<bool>)
-
sets calling button to “pressed” if argument evaluates to 1 or True
-
-
-
-
getDBbool(<dbnumber>,<start>,<index>)
-
read bool from S7 DB
-
-
-
-
getDBint(<dbnumber>,<start>)
-
read int from S7 DB
-
-
-
-
getDBfloat(<dbnumber>,<start>)
-
read float from S7 DB
-
-
-
-
setDBbool(<dbnumber>,<start>,<index>,<value>)
-
write bool to S7 DB
-
-
-
-
setDBint(<dbnumber>,<start>,<value>)
-
write int to S7 DB
-
-
-
-
setDBfloat(<dbnumber>,<start>,<value>)
-
write float to S7 DB
-
-
-
Aillio R1 Heater
-
-
sets heater to value
-
-
-
Aillio R1 Fan
-
-
sets fan to value
-
-
-
Aillio R1 Drum
-
-
sets drum speed to value
-
-
-
Artisan Command
-
alarms(<bool>)
-
enables/disables alarms
-
-
-
-
autoCHARGE(<bool>)
-
enables/disables autoCHARGE
-
-
-
-
autoDROP(<bool>)
-
enables/disables autoDROP
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
tare(<int>)
-
tare channel <int> with 1 => ET, 2 => BT, 3 => E1c1, 4: E1c2,..
increases or decreases the current target SV value by <int>
-
-
-
-
pidSV(<int>)
-
sets the PID target set value SV
-
-
-
-
pidSVC(<int>)
-
sets the PID target set value SV given in C
-
-
-
-
pidRS(<rs>)
-
activates the PID Ramp-Soak pattern number <rs> (1-based!) or the one labeled <rs>
-
-
-
-
pidSource(<int>)
-
selects the PID input source with <n> 0: BT, 1: ET (Software PID); <n> in {0,..,3} (Arduino PID)
-
-
-
-
pidLookahead(<int>)
-
sets the PID lookahead
-
-
-
-
popup(<msg>[,<int>])
-
shows popup with message <msg> which optionally automatically closes after <int> seconds
-
-
-
-
message(<msg>)
-
shows message <msg> in the message line
-
-
-
-
notifications(<bool>)
-
enables/disables notifications; while disabled issued notifications are ignored
-
-
-
-
notify(<title>,[<msg>])
-
sends notification with title <title> and optional message <msg>
-
-
-
-
setCanvasColor(<color>)
-
sets canvas color to the RGB-hex <color> like #27f1d3
-
-
-
-
resetCanvasColor
-
resets canvas color
-
-
-
-
button(<name>)
-
activates button <name> from { START, CHARGE, DRY, FCs, FCe, SCs, SCe, DROP, COOL, OFF }
-
-
-
-
palette(<p>)
-
activates palette <p> with <p> either a number 0-9 or a palette label
-
-
-
-
playbackmode(<int>)
-
sets playback mode to 0: off, 1: time, 2: BT, 3: ET
-
-
-
-
openProperties
-
opens the Roast Properties dialog
-
-
-
-
loadBackground(<filepath>)
-
loads the .alog profile at the given filepath as background profile
-
-
-
-
clearBackground
-
clears the current background profile
-
-
-
-
alarmset(<as>)
-
activates the alarmset with the given number or label
-
-
-
-
moveBackground(<direction>,<int>)
-
moves the background profile the indicated number of steps towards <direction>, with <direction> one of up, down, left, right
-
-
-
-
keyboard(<bool>)
-
enables/disables keyboard mode
-
-
-
-
keepON(<bool>)
-
enables/disables the Keep ON flag
-
-
-
-
showCurve(<name>,<bool>)
-
shows/hides the curve indicated by <name> which is one of { ET, BT, DeltaET, DeltaBT, BackgroundET, BackgroundBT}
-
-
-
-
showExtraCurve(<extra_device>,<curve>,<bool>)
-
shows/hides the <curve> (one of {T1,T2}) of the zero-based <extra_device> number
-
-
-
-
showEvents(<event_type>, <bool>)
-
shows/hides the events of <event_type> in [1,..,5]
-
-
-
-
showBackgroundEvents(<bool>)
-
shows/hides the events of the background profile
-
-
-
RC Command
-
pulse(ch,min,max[,sn])
-
for PHIDGET RC modules: sets the min/max pulse width in microseconds
-
-
-
-
pos(ch,min,max[,sn])
-
for PHIDGET RC modules: sets the min/max position
-
-
-
-
engaged(ch,b[,sn])
-
for PHIDGET RC modules: engage (b=1) or disengage (b = 0)
-
-
-
-
ramp(ch,b[,sn])
-
for PHIDGET RC modules: activates or deactivates the speed ramping state
-
-
-
-
volt(ch,v[,sn])
-
for PHIDGET RC modules: set the voltage to one of 5, 6 or 7.4 in Volt
-
-
-
-
accel(ch,a[,sn])
-
for PHIDGET RC modules: set the acceleration
-
-
-
-
veloc(ch,v[,sn])
-
for PHIDGET RC modules: set the velocity
-
-
-
-
set(ch,pos[,sn])
-
for PHIDGET RC modules: set the target position
-
-
-
-
enabled(c,b[,sn])
-
for YOCTOPUCE RC modules: with c:int the channel, b a bool (eg. enabled(0,1) or enabled(0,True))
-
-
-
-
move(c,p[,t][,sn])
-
for YOCTOPUCE RC modules: with c:int the channel, p:int the target position, the optional t the duration in ms
-
-
-
-
neutral(c,n[,sn])
-
for YOCTOPUCE RC modules: with n an int [0..65000] in us
-
-
-
-
range(c,r[,sn])
-
for YOCTOPUCE RC modules: with r an int in %
-
-
-
WebSocket Command
-
send(<json>)
-
If {} substitutions are used, json brackets need to be duplicated to escape them like in send({{ “value”: {}}})
-
-
-
-
sleep(<float>)
-
sleep: add a delay of <float> seconds
-
-
-
-
button(<bool>)
-
sets calling button to “pressed” if argument evaluates to 1 or True
-
-
-
-
read(<json>)
-
if the `<json>` text respects the JSON format it is send to the connected WebSocket server and the response is bound to the variable `_`
-
-
-
+ EVENT CUSTOM SLIDERS
+
+
+
Column
+
Description
+
+
+
+
+
Event
+
Hide or show the corresponding slider.
+
+
+
Action
+
Perform an action on the slider release.
+
+
+
Command
+
Command to perform, depends on the Action type. ('{}' is replaced by the slider value*Factor + Offset)
+
+
+
Offset
+
Offset to be added to the Slider value (after scaling by Factor).
+
+
+
Factor
+
Scale factor, Slider value is multiplied by this value.
+
+
+
Min
+
Sets the minimum value for the range of the slider.
+
+
+
Max
+
Sets the maximum value for the range of the slider.
+
+
+
Course
+
When ticked the slider moves in steps of 10.
+
+
+
Temp
+
Should be ticked when the slider's value is a temperature to allow Artisan to properly scale the value between Centigrade and Fahrenheit.
+
+
+
Unit
+
Optional text used in annotations to the the units used for the slider value.
+
+
+
COMMANDS
+
+
+
Note: "{}" can be used as a placeholder, it will be substituted by (value*factor + offset). In all slider command actions, but for IO, VOUT, S7 and RC Commands, the bound value is converted from a float to an int.
Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands
Note: commands can be sequenced, separated by semicolons like in “<cmd1>;<cmd2>;<cmd3>”
Note: in PHIDGET commands, the optional parameter <sn> has the form <hub_serial>[:<hub_port>] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.
Note: in YOCTOPUCE commands, the optional parameters <sn> holds either the modules serial number or its name
+
+
+
+
+
+
Action
+
Command
+
Description
+
+
+
+
+
Serial Command
+
ASCII serial command or binary a2b_uu(serial command)
+
+
+
+
Modbus Command
+
_
+
variable holding the last value read via MODBUS
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
button(<bool>)
+
sets calling button to “pressed” if argument is 1 or True
+
+
+
+
read(slaveID,register)
+
reads register from slave slaveID using function 3 (Read Multiple Holding Registers). The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
readSigned(slaveId,register)
+
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
readBCD(slaveID,register)
+
reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
read32(slaveID,register)
+
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
read32Signed(slaveID,register)
+
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
read32BCD(slaveID,register)
+
reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
readFloat(slaveID,register)
+
reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.
+
+
+
+
write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])
+
write register: MODBUS function 6 (int) or function 16 (float)
+
+
+
+
wcoil(slaveId,register,<bool>)
+
write coil: MODBUS function 5
+
+
+
+
wcoils(slaveId,register,[<bool>,..,<bool>])
+
write coils: MODBUS function 15
+
+
+
+
mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)
+
mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v
+
+
+
+
writem(slaveId,register,value) or writem(slaveId,register,[<int>,..,<int>])
+
write registers: MODBUS function 16
+
+
+
+
writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])
+
write 16bit BCD encoded value v to register r of slave s
+
+
+
+
writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])
+
write 32bit float to two 16bit int registers: MODBUS function 16
+
+
+
+
writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])
+
write 32bit integer to two 16bit int registers: MODBUS function 16
+
+
+
+
writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])
+
write 16bit integer to a single 16bit register: MODBUS function 6 (int)
+
+
+
DTA Command
+
Insert Data address : value, ex. 4701:1000 and sv is 100.
+
Always multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating
+
+
+
Call Program
+
A program/script path (absolute or relative)
+
start and external program
+
+
+
Hottop Heater
+
+
sets heater to value
+
+
+
Hottop Fan
+
+
sets fan to value
+
+
+
Hottop Command
+
motor(n),solenoid(n),stirrer(n),heater(h),fan(f)
+
with n={0 ,1},h={0,..100},f={0,..10}
+
+
+
Fuji Command
+
write(<unitId>,<register>,<value>)
+
+
+
+
PWM Command
+
out(<channel>,<value>[,<sn>])
+
PHIDGET PWM Output: <value> in [0-100]
+
+
+
+
toggle(<channel>[,<sn>])
+
PHIDGET PWM Output: toggles <channel>
+
+
+
+
pulse(<channel>,<millis>[,<sn>])
+
PHIDGET PWM Output: turn <channel> on for <millis> milliseconds
+
+
+
+
outhub(<channel>,<value>[,<sn>])
+
PHIDGET HUB PWM Output: <value> in [0-100]
+
+
+
+
togglehub(<channel>[,<sn>])
+
PHIDGET HUB PWM Output: toggles <channel>
+
+
+
+
pulsehub(<channel>,<millis>[,<sn>])
+
PHIDGET HUB PWM Output: turn <channel> on for <millis> milliseconds
+
+
+
+
enabled(c,b[,sn])
+
YOCTOPUCE PWM Output: PWM running state
+
+
+
+
freq(c,f[,sn])
+
YOCTOPUCE PWM Output: set PWM frequency to f (Hz)
+
+
+
+
duty(c,d[,sn])
+
YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]
+
+
+
+
move(c,d,t[,sn])
+
YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval
+
+
+
VOUT Command
+
range(c,r[,sn])
+
for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for r5V and r=10 for 10V)
+
+
+
+
out(n,v[,sn])
+
for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)
+
+
+
+
vout(c,v[,sn])
+
for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]
+
+
+
+
cout(c[,sn])
+
for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
IO Command
+
set(c,b[,sn])
+
PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)
+
+
+
+
toggle(c[,sn])
+
PHIDGET Binary Output: toggles channel c
+
+
+
+
pulse(c,t[,sn])
+
PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds
+
+
+
+
out(c,v[,sn])
+
PHIDGET Voltage Output: sets voltage output of channel c to v (float)
+
+
+
+
accel(c,v[,sn])
+
PHIDGET DCMotor: sets acceleration of channel c to v (float)
+
+
+
+
vel(c,v[,sn])
+
PHIDGET DCMotor: sets target velocity of channel c to v (float)
+
+
+
+
limit(c,v[,sn])
+
PHIDGET DCMotor: sets current limit of channel c to v (float)
+
+
+
+
on(c[,sn])
+
YOCTOPUCE Relay Output: turn channel c of the relay module on
+
+
+
+
off(c[,sn])
+
YOCTOPUCE Relay Output: turn channel c of the relay module off
+
+
+
+
yset(c,b[,sn])
+
YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)
+
+
+
+
flip(c[,sn])
+
YOCTOPUCE Relay Output: toggle the state of channel c
+
+
+
+
pip(c,delay,duration[,sn])
+
YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds
+
+
+
+
powerReset([sn])
+
YOCTOPUCE resets the power counter of the Yocto-Watt module
+
+
+
+
slider(c,v)
+
move slider c to value v
+
+
+
+
button(i,c,b[,sn])
+
switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b
+
+
+
+
button(i,b)
+
sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button(b)
+
sets button to pressed if value b is yes, true, t, or 1, otherwise to normal
+
+
+
+
button()
+
toggles the state of the button
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
santoker(<target>,<value>)
+
sends integer <value> to <target> register specified by as byte in hex notation like “fa” via the Santoker Network protocol
+
+
+
+
kaleido(<target>,<value>)
+
sends <value> to <target> via the Kaleido Serial or Network protocol
+
+
+
S7 Command
+
_
+
variable holding the last value read via S7
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
button(<bool>)
+
sets calling button to “pressed” if argument evaluates to 1 or True
+
+
+
+
getDBbool(<dbnumber>,<start>,<index>)
+
read bool from S7 DB
+
+
+
+
getDBint(<dbnumber>,<start>)
+
read int from S7 DB
+
+
+
+
getDBfloat(<dbnumber>,<start>)
+
read float from S7 DB
+
+
+
+
setDBbool(<dbnumber>,<start>,<index>,<value>)
+
write bool to S7 DB
+
+
+
+
setDBint(<dbnumber>,<start>,<value>)
+
write int to S7 DB
+
+
+
+
setDBfloat(<dbnumber>,<start>,<value>)
+
write float to S7 DB
+
+
+
Aillio R1 Heater
+
+
sets heater to value
+
+
+
Aillio R1 Fan
+
+
sets fan to value
+
+
+
Aillio R1 Drum
+
+
sets drum speed to value
+
+
+
Artisan Command
+
alarms(<bool>)
+
enables/disables alarms
+
+
+
+
autoCHARGE(<bool>)
+
enables/disables autoCHARGE
+
+
+
+
autoDROP(<bool>)
+
enables/disables autoDROP
+
+
+
+
sleep(<float>)
+
sleep: add a delay of <float> seconds
+
+
+
+
tare(<int>)
+
tare channel <int> with 1 => ET, 2 => BT, 3 => E1c1, 4: E1c2,..
When Keyboard Shortcuts are ON chooses the current button When Keyboard Shortcuts are OFF adds a custom event When Meter=NONE opens dialog to manually enter temperatures during roast
-
-
-
LEFT,RIGHT
-
Change roast event key focus
-
-
-
LEFT,RIGHT,UP,DOWN
-
Move background (when sliders not visible or when Config>> Events>> Sliders tab>> Keyboard Control is not selected)
-
-
-
A
-
Autosave
-
-
-
⌘-N [Mac] CRTL+N [Win]
-
Autosave + RESET + START
-
-
-
T [Mac] CTRL+SHIFT+T [Win]
-
Toggle mouse cross lines
-
-
-
G
-
Toggle auto axis mode between Roast, BBP+Roast and BBP
-
-
-
D
-
Toggle xy cursor mode (off/temp/delta)
-
-
-
Z
-
Toggle xy cursor clamp mode (off/BT/ET/BTB/ETB)
-
-
-
U
-
Toggle LCD cursor (off/profile/background)
-
-
-
C
-
Shows/Hides Controls
-
-
-
X
-
Shows/Hides LCD Readings
-
-
-
Y
-
Shows/Hides Mini Event editor (on recording)
-
-
-
M
-
Shows/Hides Event Buttons
-
-
-
B
-
Shows/Hides Extra Event Buttons
-
-
-
S
-
Shows/Hides Event Sliders
-
-
-
P
-
Toggle PID mode
-
-
-
J
-
Toggle Playback Events
-
-
-
H CTRL+H [Win]
-
Load background profile
-
-
-
OPTION+H [Mac] CTRL+SHIFT+H [Win]
-
Remove background profile
-
-
-
I
-
Toggle foreground curves “show full”
-
-
-
O
-
Toggle background curves “show full”
-
-
-
L
-
Load alarms
-
-
-
+,-
-
Inc/dec PID lookahead
-
-
-
⌘ +,- [Mac] CRTL +,- [Win]
-
Inc/dec graph resolution
-
-
-
⌘ 0-9 [Mac] CRTL 0-9 [Win]
-
Changes Event Button Palettes
-
-
-
;
-
Application ScreenShot
-
-
-
:
-
Desktop ScreenShot
-
-
-
Q,W,E,R + <value>
-
Quick Special Event Entry. The keys q,w,e, and r correspond to special events 1,2,3 and 4. A two digit numeric value must follow the shortcut letter, e.g. 'q75', when the corresponding event slider max value is 100 or less (default setting). When the slider max value is greater than 100, three digits must be entered and for values less than 100 a leading zero is required, e.g. 'q075'.
-
-
-
V + <value>
-
Quick PID SV Entry. Value is a three digit number. For values less than 100 must be entered with a leading zero, e.g. 'v075'.
For various tables this copies the table in tabular form
-
-
-
-
Click on Home Icon While recording only
-
Navigation Toolbar
-
Toggle Zoom Follow (automatic panning)
-
Zoom action while recording sets Follow ON
-
-
-
Hold Shift+Option [Mac] Hold Shift+Alt [Win]
-
When starting Artisan
-
Skip Settings Load
-
-
-
-
Hold Shift+Option [Mac] Hold Shift+Alt [Win]
-
When quitting Artisan
-
Skip Settings Save
-
-
-
-
Hold Shift+Option [Mac] Hold Shift+Alt [Win]
-
When opening a profile (.alog file)
-
Skip creating settings cache and ask user to apply existing settings or settings from profile
-
-
-
-
MENU SHORTCUTS
-
-
-
Keys
-
Menu
-
Action
-
-
-
-
-
⌘+O [Mac] CTRL+O [Win]
-
File
-
Open
-
-
-
⌘+S [Mac] CTRL+S [Win]
-
File
-
Save
-
-
-
⌘+P [Mac] CTRL+P [Win]
-
File
-
Print
-
-
-
⌘+X [Mac] CTRL+X [Win]
-
Edit
-
Cut
-
-
-
⌘+C [Mac] CTRL+C [Win]
-
Edit
-
Copy
-
-
-
⌘+V [Mac] CTRL+V [Win]
-
Edit
-
Paste
-
-
-
⌘+T [Mac] CTRL+T [Win]
-
Roast
-
Open Roast Properties dialog
-
-
-
⌘+B [Mac] CTRL+B [Win]
-
Roast
-
Open Profile Background dialog
-
-
-
⌘+F4 [Mac] CTRL+F4 [Win]
-
Roast
-
Switch Profiles (Foreground<=>Background)
-
-
-
⌘+D [Mac] CTRL+D [Win]
-
Config
-
Open Devices dialog
-
-
-
⌘+U [Mac] CTRL+U [Win]
-
Config
-
Open Curves dialog
-
-
-
⌘+E [Mac] CTRL+E [Win]
-
Config
-
Open Events dialog
-
-
-
⌘+A [Mac] CTRL+A [Win]
-
Config
-
Open Alarms dialog
-
-
-
⌘+SHIFT+A [Mac] CTRL+SHIFT+A [Win]
-
Config
-
Open Axes dialog
-
-
-
⌘+K [Mac] CTRL+K [Win]
-
Tools
-
Analyzer Auto All
-
-
-
⌘+OPTION+A [Mac] CTRL+ALT+K [Win]
-
Tools
-
Analyzer Clear Results
-
-
-
⌘+L [Mac] CTRL+L [Win]
-
View
-
Show/Hide Large Main LCDs
-
-
-
⌘+F [Mac] CTRL+SHIFT+F [Win]
-
View
-
Toggle Full Screen Mode
-
-
-
F1
-
Help
-
Open QuickStart Guide in the system browser
-
-
-
+ KEYBOARD SHORTCUTS
+
+
+
Keys
+
Description
+
+
+
+
+
ENTER
+
Turns ON/OFF Keyboard Shortcuts
+
+
+
⌘-ENTER [Mac] CTRL+ENTER [Win]
+
Starts recording
+
+
+
SHIFT-ENTER
+
Turns Artisan OFF
+
+
+
SPACE
+
When Keyboard Shortcuts are ON chooses the current button When Keyboard Shortcuts are OFF adds a custom event When Meter=NONE opens dialog to manually enter temperatures during roast
+
+
+
LEFT,RIGHT
+
Change roast event key focus
+
+
+
LEFT,RIGHT,UP,DOWN
+
Move background (when sliders not visible or when Config>> Events>> Sliders tab>> Keyboard Control is not selected)
+
+
+
A
+
Autosave
+
+
+
⌘-N [Mac] CRTL+N [Win]
+
Autosave + RESET + START
+
+
+
T [Mac] CTRL+SHIFT+T [Win]
+
Toggle mouse cross lines
+
+
+
G
+
Toggle auto axis mode between Roast, BBP+Roast and BBP
+
+
+
D
+
Toggle xy cursor mode (off/temp/delta)
+
+
+
Z
+
Toggle xy cursor clamp mode (off/BT/ET/BTB/ETB)
+
+
+
U
+
Toggle LCD cursor (off/profile/background)
+
+
+
C
+
Shows/Hides Controls
+
+
+
X
+
Shows/Hides LCD Readings
+
+
+
Y
+
Shows/Hides Mini Event editor (on recording)
+
+
+
M
+
Shows/Hides Event Buttons
+
+
+
B
+
Shows/Hides Extra Event Buttons
+
+
+
S
+
Shows/Hides Event Sliders
+
+
+
P
+
Toggle PID mode
+
+
+
J
+
Toggle Playback Events
+
+
+
H CTRL+H [Win]
+
Load background profile
+
+
+
OPTION+H [Mac] CTRL+SHIFT+H [Win]
+
Remove background profile
+
+
+
I
+
Toggle foreground curves “show full”
+
+
+
O
+
Toggle background curves “show full”
+
+
+
L
+
Load alarms
+
+
+
+,-
+
Inc/dec PID lookahead
+
+
+
⌘ +,- [Mac] CRTL +,- [Win]
+
Inc/dec graph resolution
+
+
+
⌘ 0-9 [Mac] CRTL 0-9 [Win]
+
Changes Event Button Palettes
+
+
+
;
+
Application ScreenShot
+
+
+
:
+
Desktop ScreenShot
+
+
+
Q,W,E,R + <value>
+
Quick Special Event Entry. The keys q,w,e, and r correspond to special events 1,2,3 and 4. A two digit numeric value must follow the shortcut letter, e.g. 'q75', when the corresponding event slider max value is 100 or less (default setting). When the slider max value is greater than 100, three digits must be entered and for values less than 100 a leading zero is required, e.g. 'q075'.
+
+
+
V + <value>
+
Quick PID SV Entry. Value is a three digit number. For values less than 100 must be entered with a leading zero, e.g. 'v075'.
The MODBUS serial protocols RTU, ASCII, and Binary is using the specified serial port parameters. The MODBUS IP protocol on TCP and UDP is respecting the host IP and port.
-
-
-
The inputs 1+2 configure the MODBUS device, inputs 3+4 configure the MODBUS_34 device and so on. Inputs with the slave id set to 0 are turned off.
-
-
-
Function 1 (Read Coils): registers 0 to 65535 corresponding to numbers 000001 to 065536 Function 2 (Read Discrete Inputs): registers 0 to 65535 corresponding to numbers 100001 to 165536 Function 3 (Read Multiple Holding Registers): registers 0 to 65535 corresponding to numbers 400001 to 465536 Function 4 (Read Input Registers): registers 0 to 65535 corresponding to numbers 300001 to 365536
-
-
-
Dividers 1/10 and 1/100 can be set to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.
-
-
-
Temperature readings are automatically converted based on the specified unit per input channel.
-
-
-
If a 32bit decoder is set two succeeding 16bit registers are requested and the received 4 bytes are interpreted using the byte and word order as specified by the corresponding flag.
-
-
-
The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). MODBUS commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available MODBUS write commands.
-
-
-
The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.
-
-
-
Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.
-
-
-
+ PORTS CONFIGURATION
+
+
+
MODBUS SETTINGS
+
+
+
+
+
The MODBUS serial protocols RTU, ASCII, and Binary is using the specified serial port parameters. The MODBUS IP protocol on TCP and UDP is respecting the host IP and port.
+
+
+
The inputs 1+2 configure the MODBUS device, inputs 3+4 configure the MODBUS_34 device and so on. Inputs with the slave id set to 0 are turned off.
+
+
+
Function 1 (Read Coils): registers 0 to 65535 corresponding to numbers 000001 to 065536 Function 2 (Read Discrete Inputs): registers 0 to 65535 corresponding to numbers 100001 to 165536 Function 3 (Read Multiple Holding Registers): registers 0 to 65535 corresponding to numbers 400001 to 465536 Function 4 (Read Input Registers): registers 0 to 65535 corresponding to numbers 300001 to 365536
+
+
+
Dividers 1/10 and 1/100 can be set to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.
+
+
+
Temperature readings are automatically converted based on the specified unit per input channel.
+
+
+
If a 32bit decoder is set two succeeding 16bit registers are requested and the received 4 bytes are interpreted using the byte and word order as specified by the corresponding flag.
+
+
+
The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). MODBUS commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available MODBUS write commands.
+
+
+
The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.
+
+
+
Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.
Link external programs that print temperature when called. This allows to connect meters that use any program language.
Artisan will start the program each sample period. The program output must be to stdout (like when using print statements). The program must exit and must not be persistent.
If only one temperature is provided it will be interpreted as BT. If more than one temperature is provided the values are order dependent with ET first and BT second.
Data may also be provided to the "Program" extra devices. Extra device "Program" are the first two values, typically ET and BT. "Program 34" are the third and fourth values. Up to 10 values may be supplied.
Example of output needed from program for single temperature (BT): "100.4" (note: "" not needed)
Example of output needed from program for double temperature (ET,BT) "200.4,100.4" (note: temperatures are separated by a comma "ET,BT")
Example of output needed from program for double temperature (ET,BT) and extra devices (Program and Program 34) "200.4,100.4,312.4,345.6,299.0,275.5"
-
-
-
-
-
-
Example of a file written in Python called test.py:
#comment: print a string with two numbers separated by a comma #!/usr/bin/env python print("237.1,100.4")
Note: In many cases the path to the Python or other language executatable should be provided along with the external program path. On Windows it is advised to enclose the paths with quotation marks if there are any spaces, and use forward slashes '/' in the path. "C:/Python38-64/python.exe" "c:/scripts/test.py"
Under Output a script can be specified which is called per sample interval with 4 arguments, ET, BT, Background ET and Background BT the output script also called if Prog is not selected as input source
Example of a file written in Python called out.py:
#comment: adds the script arguments ET, BT, ETB, BTB to "/tmp/out.txt" #!/usr/bin/env python
import sys ET, BT, ETB, BTB = sys.argv[1:]
with open("/tmp/out.txt", "w+") as file: file.write(f'ET: {ET}, BT: {ET}, ETB: {ETB}, BTB: {BTB};')
-
-
-
+ EXTERNAL PROGRAMS
+
+
+
Link external programs that print temperature when called. This allows to connect meters that use any program language.
Artisan will start the program each sample period. The program output must be to stdout (like when using print statements). The program must exit and must not be persistent.
If only one temperature is provided it will be interpreted as BT. If more than one temperature is provided the values are order dependent with ET first and BT second.
Data may also be provided to the "Program" extra devices. Extra device "Program" are the first two values, typically ET and BT. "Program 34" are the third and fourth values. Up to 10 values may be supplied.
Example of output needed from program for single temperature (BT): "100.4" (note: "" not needed)
Example of output needed from program for double temperature (ET,BT) "200.4,100.4" (note: temperatures are separated by a comma "ET,BT")
Example of output needed from program for double temperature (ET,BT) and extra devices (Program and Program 34) "200.4,100.4,312.4,345.6,299.0,275.5"
+
+
+
+
+
+
Example of a file written in Python called test.py:
#comment: print a string with two numbers separated by a comma #!/usr/bin/env python print("237.1,100.4")
Note: In many cases the path to the Python or other language executatable should be provided along with the external program path. On Windows it is advised to enclose the paths with quotation marks if there are any spaces, and use forward slashes '/' in the path. "C:/Python38-64/python.exe" "c:/scripts/test.py"
Under Output a script can be specified which is called per sample interval with 4 arguments, ET, BT, Background ET and Background BT the output script also called if Prog is not selected as input source
Example of a file written in Python called out.py:
#comment: adds the script arguments ET, BT, ETB, BTB to "/tmp/out.txt" #!/usr/bin/env python
import sys ET, BT, ETB, BTB = sys.argv[1:]
with open("/tmp/out.txt", "w+") as file: file.write(f'ET: {ET}, BT: {ET}, ETB: {ETB}, BTB: {BTB};')
The Siemens S7 is respecting the host IP and port.
-
-
-
The inputs 1+2 configure the S7 device, inputs 3+4 configure the S7_34 device and so on. Inputs with the area set to the empty input are turned off.
-
-
-
Factors 1/10 and 1/100 can be set as dividers to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.
-
-
-
Temperature readings are automatically converted based on the specified unit per input channel.
-
-
-
If mode is set to C or F, readings are automatically converted to the temperature unit set for display.
-
-
-
The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). S7 commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available S7 write commands.
-
-
-
The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.
-
-
-
Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.
-
-
-
+ PORTS CONFIGURATION
+
+
+
S7 SETTINGS
+
+
+
+
+
The Siemens S7 is respecting the host IP and port.
+
+
+
The inputs 1+2 configure the S7 device, inputs 3+4 configure the S7_34 device and so on. Inputs with the area set to the empty input are turned off.
+
+
+
Factors 1/10 and 1/100 can be set as dividers to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.
+
+
+
Temperature readings are automatically converted based on the specified unit per input channel.
+
+
+
If mode is set to C or F, readings are automatically converted to the temperature unit set for display.
+
+
+
The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). S7 commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available S7 write commands.
+
+
+
The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.
+
+
+
Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.
Absolute time (seconds) from begin of recording (not only the time after CHARGE!)
-
Yes
-
-
-
b
-
Absolute time (seconds) from begin of recording of the background profile
-
Yes
-
-
-
x
-
Current channel reading (not available in the Plotter)
-
-
-
-
Y1
-
ET value
-
Yes
-
-
-
Y2
-
BT value
-
Yes
-
-
-
Y3
-
Extra #1 T1 value
-
Yes
-
-
-
Y4
-
Extra #1 T2 value
-
Yes
-
-
-
Y5
-
Extra #2 T1 value
-
Yes
-
-
-
Y6
-
Extra #2 T2 value
-
Yes
-
-
-
...
-
...and so forth
-
Yes
-
-
-
B1
-
ET background
-
Yes
-
-
-
B2
-
BT background
-
Yes
-
-
-
B3
-
ExtraBackground #1-A
-
Yes
-
-
-
B4
-
ExtraBackground #1-B
-
Yes
-
-
-
B5
-
ExtraBackground #2-A
-
Yes
-
-
-
...
-
...and so forth
-
Yes
-
-
-
T1
-
ET tare value
-
-
-
-
T2
-
BT tare value
-
-
-
-
T3
-
Extra Device #1 channel 1 tare value
-
-
-
-
T4
-
Extra Device #1 channel 2 tare value
-
-
-
-
T5
-
Extra Device #2 channel 1 tare value
-
-
-
-
...
-
...and so forth
-
-
-
-
E1
-
Last event value of the first event type
-
-
-
-
E2
-
Last event value of the second event type
-
-
-
-
E3
-
Last event value of the third event type
-
-
-
-
E4
-
Last event value of the fourth event type
-
-
-
-
-
-
-
-
-
R1
-
ET rate of rise
-
Yes
-
-
-
R2
-
BT rate of rise
-
Yes
-
-
-
RB1
-
Background ET rate of rise
-
Yes
-
-
-
RB2
-
Background BT rate of rise
-
Yes
-
-
-
SHIFTED SYMBOLIC VARIABLES
-
-
-
The symbolic variables t, b, Y<n>, B<n> and R<n> evaluate to the current value of a sequence of values that define a roast profile. To access earlier or later values one can apply a shift value.
For example, while "Y2" returns the current bean temperature (BT), "Y2[-1]" returns the previous BT temperature and "Y2[-2]" the one before that. Formulas used in the Plotter are applied in sequence to all values, thus there "Y2" points to the current BT temperature processed, "Y2[-1]" the previous BT temperature processed and "Y2[+1]" the next BT temperature to be processed. A positive shift is only available in the Plotter, obviously not during recording.
-
-
-
-
-
-
Example
-
Description
-
-
-
-
-
t[+1]
-
Time one index ahead (plotter only)
-
-
-
t[-3]
-
Time three indexes delayed
-
-
-
Y1[-2]
-
ET value delayed by 2 indexes
-
-
-
Y2[+1]
-
BT value index advanced by one index (plotter only)
Previously recorded data assigned to the symbolic variables t, b, Y<n>, B<n> and R<n> can also directly accessed by index. "Y2{0}" evaluates to the first recorded bean temperature (BT) and "Y2{CHARGE}" to the bean temperature at CHARGE. Additionally, the symbolic variable b can be used to access the recording time at a certain index of the background profile. Thus "b{CHARGE}" returns the recording time at CHARGE of the background profile.
-
-
-
AXIS MAPPING
-
-
-
Symbol
-
Description
-
-
-
-
-
k
-
Scaling factor from RoR to Temp axis. The range of the temperature scale divided by the range of the delta scale.
-
-
-
o
-
Offset from RoR to Temp axis.
-
-
-
-
-
-
Note: RoR values r can be scaled to the temperature axis using a linear approximation of the form "r*k + o". As the variables k and o depend on the actual axis settings which can be changed by the user without triggering a recomputation, those variable are less useful for use in a recording, but useful in the Plotter to plot w.r.t. the RoR y-axis instead of the temperature y-axis.
-
-
-
EVENT INDEX and TIME DELTA
-
-
-
Symbol
-
Description
-
-
-
-
-
CHARGE, DRY, FCs, FCe, SCs, SCe, DROP
-
Index of the corresponding event of the profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.
-
-
-
bCHARGE, bDRY, bFCs, bFCe, bSCs, bSCe, bDROP
-
Index of the corresponding event of the background profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.
-
-
-
-
-
-
-
dCHARGE, dDRY, dFCs, dFCe, dSCs, dSCe, dDROP
-
Time distance in seconds after the corresponding event. Thus dCHARGE is bound to the current roast time (after CHARGE) in seconds while t is bound to the time in seconds from the start of the recording.
-
-
-
AREA UNDER THE CURVE (AUC)
-
-
-
Symbol
-
Description
-
-
-
-
-
AUCbase
-
AUC base temperature (could be from the selected event, if set)
-
-
-
AUCtarget
-
AUC target value (could be from the background profile, if set)
-
-
-
AUCvalue
-
the current AUC value. -1 if none available.
-
-
-
PREDICTIONS
-
-
-
Symbol
-
Description
-
-
-
-
-
pDRY
-
Prediction of the time distance to the DRY event based on the current RoR. Evaluates to -1 on negative RoR and to 0 if the DRY event is already set.
-
-
-
pFCs
-
Same as pDRY, just for the FCs event.
-
-
-
-
-
-
Note: The same rules as for the corresponding PhasesLCDs apply to pDRY and pFCs:
If there is no background profile the DRY or FCs bean temperature used for the prediction is taken from the Config>Phases setup.
If there is a background profile and there is DRY or FCs event in the background profile, the DRY or FCs bean temperature used for the prediction is taken from the background profile.
Exception to the above for DRY only: if AutoDRY is checked the DRY temperature used for the prediction is taken from the Config>Phases setup. This does not apply to FCs and AutoFCs.
The prediction value is the calculated time in seconds to reach the DRY or FCs temperature.
-
-
-
AMBIENT
-
-
-
Symbol
-
Description
-
-
-
-
-
aTMP
-
ambient temperature (default 0)
-
-
-
aHUM
-
ambient humidity (default 0)
-
-
-
aPRE
-
ambient pressure (default 0)
-
-
-
-
-
-
Note: The data is (re-)sampled some seconds after the start of recording
-
-
-
ROAST PROPERTIES
-
-
-
Symbol
-
Description
-
-
-
-
-
WEIGHTin
-
batch size (g)
-
-
-
MOISTUREin
-
green moisture (%)
-
-
-
TEMPunit
-
temperature unit (Celsius: 0, Fahrenheit: 1)
-
-
-
EXPRESSIONS
-
-
-
Expression
-
Description
-
-
-
-
-
(<true-expr> if <cond> else <false-expr>)
-
Conditional. Evaluates to the value of the expression <true-expr> if the condition <cond> holds, otherwise to the value of the expression <false-expr>. The rules of Python are applied to decide if a value holds or not. Thus the boolean values "True" and "False" have the obvious semantic. Any number unequal to 0 evaluates to True and 0 evaluates to False. The value "None" is also evaluated to False.
-
-
-
MATHEMATICAL FORMULAS
-
-
-
Formula
-
Description
-
-
-
-
-
abs(x)
-
Return the absolute value of x.
-
-
-
acos(x)
-
Return the arc cosine (measured in radians) of x.
-
-
-
asin(x)
-
Return the arc sine (measured in radians) of x.
-
-
-
atan(x)
-
Return the arc tangent (measured in radians) of x.
-
-
-
cos(x)
-
Return the cosine of x (measured in radians).
-
-
-
degrees(x)
-
Convert angle x from radians to degrees.
-
-
-
exp(x)
-
Return e raised to the power of x.
-
-
-
log(x[, base])
-
Return the logarithm of x to the given base.
-
-
-
min(x1,...,xn)
-
Return the minimum of the given values.
-
-
-
max(x1,...,xn)
-
Return the maximum of the given values.
-
-
-
pow(x, y)
-
Return x**y (x to the power of y).
-
-
-
radians(x)
-
Convert angle x from degrees to radians.
-
-
-
sin(x)
-
Return the sine of x (measured in radians).
-
-
-
sqrt(x)
-
Return the square root of x.
-
-
-
tan(x)
-
Return the tangent of x (measured in radians).
-
-
-
bit(n,x)
-
Return 1 if the bit n of value x (interpreted as integer) is set, otherwise 0.
-
-
-
MATHEMATICAL CONSTANTS
-
-
-
Symbol
-
Value
-
-
-
-
-
e
-
2.71828182845904
-
-
-
pi
-
3.14159265358979
-
-
-
PLOTTER EXTENSIONS
-
-
-
Note: This section applies only to the Plotter Using math formulas in the plotter also allows to use the symbolic variables P and F (see Signals, Symbolic Assignments and the Plotter).
-
-
-
-
-
-
Symbol
-
Description
-
-
-
-
-
P1...P9
-
The variables P1,..,P9 represent the results from plot #1,..,#9. You can perform calculations in a later plot on variables of an earlier plot. That way, the plot variables P1,..,P9 allow the cascading or intermediate results. For example, plot #3 can refer to the results of plot 1 using the variable P1.
-
-
-
F1...F9
-
F1 refers to the previous result of the actual formula to realize a feedback loop. This is useful in filter designs. Similarly, F2 refers to the second previous result etc.
-
-
-
+ SYMBOLIC VARIABLES
+
+
+
Symbol
+
Description
+
Can shift? (see below)
+
+
+
+
+
t
+
Absolute time (seconds) from begin of recording (not only the time after CHARGE!)
+
Yes
+
+
+
b
+
Absolute time (seconds) from begin of recording of the background profile
+
Yes
+
+
+
x
+
Current channel reading (not available in the Plotter)
+
+
+
+
Y1
+
ET value
+
Yes
+
+
+
Y2
+
BT value
+
Yes
+
+
+
Y3
+
Extra #1 T1 value
+
Yes
+
+
+
Y4
+
Extra #1 T2 value
+
Yes
+
+
+
Y5
+
Extra #2 T1 value
+
Yes
+
+
+
Y6
+
Extra #2 T2 value
+
Yes
+
+
+
...
+
...and so forth
+
Yes
+
+
+
B1
+
ET background
+
Yes
+
+
+
B2
+
BT background
+
Yes
+
+
+
B3
+
ExtraBackground #1-A
+
Yes
+
+
+
B4
+
ExtraBackground #1-B
+
Yes
+
+
+
B5
+
ExtraBackground #2-A
+
Yes
+
+
+
...
+
...and so forth
+
Yes
+
+
+
T1
+
ET tare value
+
+
+
+
T2
+
BT tare value
+
+
+
+
T3
+
Extra Device #1 channel 1 tare value
+
+
+
+
T4
+
Extra Device #1 channel 2 tare value
+
+
+
+
T5
+
Extra Device #2 channel 1 tare value
+
+
+
+
...
+
...and so forth
+
+
+
+
E1
+
Last event value of the first event type
+
+
+
+
E2
+
Last event value of the second event type
+
+
+
+
E3
+
Last event value of the third event type
+
+
+
+
E4
+
Last event value of the fourth event type
+
+
+
+
+
+
+
+
+
R1
+
ET rate of rise
+
Yes
+
+
+
R2
+
BT rate of rise
+
Yes
+
+
+
RB1
+
Background ET rate of rise
+
Yes
+
+
+
RB2
+
Background BT rate of rise
+
Yes
+
+
+
SHIFTED SYMBOLIC VARIABLES
+
+
+
The symbolic variables t, b, Y<n>, B<n> and R<n> evaluate to the current value of a sequence of values that define a roast profile. To access earlier or later values one can apply a shift value.
For example, while "Y2" returns the current bean temperature (BT), "Y2[-1]" returns the previous BT temperature and "Y2[-2]" the one before that. Formulas used in the Plotter are applied in sequence to all values, thus there "Y2" points to the current BT temperature processed, "Y2[-1]" the previous BT temperature processed and "Y2[+1]" the next BT temperature to be processed. A positive shift is only available in the Plotter, obviously not during recording.
+
+
+
+
+
+
Example
+
Description
+
+
+
+
+
t[+1]
+
Time one index ahead (plotter only)
+
+
+
t[-3]
+
Time three indexes delayed
+
+
+
Y1[-2]
+
ET value delayed by 2 indexes
+
+
+
Y2[+1]
+
BT value index advanced by one index (plotter only)
Previously recorded data assigned to the symbolic variables t, b, Y<n>, B<n> and R<n> can also directly accessed by index. "Y2{0}" evaluates to the first recorded bean temperature (BT) and "Y2{CHARGE}" to the bean temperature at CHARGE. Additionally, the symbolic variable b can be used to access the recording time at a certain index of the background profile. Thus "b{CHARGE}" returns the recording time at CHARGE of the background profile.
+
+
+
AXIS MAPPING
+
+
+
Symbol
+
Description
+
+
+
+
+
k
+
Scaling factor from RoR to Temp axis. The range of the temperature scale divided by the range of the delta scale.
+
+
+
o
+
Offset from RoR to Temp axis.
+
+
+
+
+
+
Note: RoR values r can be scaled to the temperature axis using a linear approximation of the form "r*k + o". As the variables k and o depend on the actual axis settings which can be changed by the user without triggering a recomputation, those variable are less useful for use in a recording, but useful in the Plotter to plot w.r.t. the RoR y-axis instead of the temperature y-axis.
+
+
+
EVENT INDEX and TIME DELTA
+
+
+
Symbol
+
Description
+
+
+
+
+
CHARGE, DRY, FCs, FCe, SCs, SCe, DROP
+
Index of the corresponding event of the profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.
+
+
+
bCHARGE, bDRY, bFCs, bFCe, bSCs, bSCe, bDROP
+
Index of the corresponding event of the background profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.
+
+
+
+
+
+
+
dCHARGE, dDRY, dFCs, dFCe, dSCs, dSCe, dDROP
+
Time distance in seconds after the corresponding event. Thus dCHARGE is bound to the current roast time (after CHARGE) in seconds while t is bound to the time in seconds from the start of the recording.
+
+
+
AREA UNDER THE CURVE (AUC)
+
+
+
Symbol
+
Description
+
+
+
+
+
AUCbase
+
AUC base temperature (could be from the selected event, if set)
+
+
+
AUCtarget
+
AUC target value (could be from the background profile, if set)
+
+
+
AUCvalue
+
the current AUC value. -1 if none available.
+
+
+
PREDICTIONS
+
+
+
Symbol
+
Description
+
+
+
+
+
pDRY
+
Prediction of the time distance to the DRY event based on the current RoR. Evaluates to -1 on negative RoR and to 0 if the DRY event is already set.
+
+
+
pFCs
+
Same as pDRY, just for the FCs event.
+
+
+
+
+
+
Note: The same rules as for the corresponding PhasesLCDs apply to pDRY and pFCs:
If there is no background profile the DRY or FCs bean temperature used for the prediction is taken from the Config>Phases setup.
If there is a background profile and there is DRY or FCs event in the background profile, the DRY or FCs bean temperature used for the prediction is taken from the background profile.
Exception to the above for DRY only: if AutoDRY is checked the DRY temperature used for the prediction is taken from the Config>Phases setup. This does not apply to FCs and AutoFCs.
The prediction value is the calculated time in seconds to reach the DRY or FCs temperature.
+
+
+
AMBIENT
+
+
+
Symbol
+
Description
+
+
+
+
+
aTMP
+
ambient temperature (default 0)
+
+
+
aHUM
+
ambient humidity (default 0)
+
+
+
aPRE
+
ambient pressure (default 0)
+
+
+
+
+
+
Note: The data is (re-)sampled some seconds after the start of recording
+
+
+
ROAST PROPERTIES
+
+
+
Symbol
+
Description
+
+
+
+
+
WEIGHTin
+
batch size (g)
+
+
+
MOISTUREin
+
green moisture (%)
+
+
+
TEMPunit
+
temperature unit (Celsius: 0, Fahrenheit: 1)
+
+
+
EXPRESSIONS
+
+
+
Expression
+
Description
+
+
+
+
+
(<true-expr> if <cond> else <false-expr>)
+
Conditional. Evaluates to the value of the expression <true-expr> if the condition <cond> holds, otherwise to the value of the expression <false-expr>. The rules of Python are applied to decide if a value holds or not. Thus the boolean values "True" and "False" have the obvious semantic. Any number unequal to 0 evaluates to True and 0 evaluates to False. The value "None" is also evaluated to False.
+
+
+
MATHEMATICAL FORMULAS
+
+
+
Formula
+
Description
+
+
+
+
+
abs(x)
+
Return the absolute value of x.
+
+
+
acos(x)
+
Return the arc cosine (measured in radians) of x.
+
+
+
asin(x)
+
Return the arc sine (measured in radians) of x.
+
+
+
atan(x)
+
Return the arc tangent (measured in radians) of x.
+
+
+
cos(x)
+
Return the cosine of x (measured in radians).
+
+
+
degrees(x)
+
Convert angle x from radians to degrees.
+
+
+
exp(x)
+
Return e raised to the power of x.
+
+
+
log(x[, base])
+
Return the logarithm of x to the given base.
+
+
+
min(x1,...,xn)
+
Return the minimum of the given values.
+
+
+
max(x1,...,xn)
+
Return the maximum of the given values.
+
+
+
pow(x, y)
+
Return x**y (x to the power of y).
+
+
+
radians(x)
+
Convert angle x from degrees to radians.
+
+
+
sin(x)
+
Return the sine of x (measured in radians).
+
+
+
sqrt(x)
+
Return the square root of x.
+
+
+
tan(x)
+
Return the tangent of x (measured in radians).
+
+
+
bit(n,x)
+
Return 1 if the bit n of value x (interpreted as integer) is set, otherwise 0.
+
+
+
MATHEMATICAL CONSTANTS
+
+
+
Symbol
+
Value
+
+
+
+
+
e
+
2.71828182845904
+
+
+
pi
+
3.14159265358979
+
+
+
PLOTTER EXTENSIONS
+
+
+
Note: This section applies only to the Plotter Using math formulas in the plotter also allows to use the symbolic variables P and F (see Signals, Symbolic Assignments and the Plotter).
+
+
+
+
+
+
Symbol
+
Description
+
+
+
+
+
P1...P9
+
The variables P1,..,P9 represent the results from plot #1,..,#9. You can perform calculations in a later plot on variables of an earlier plot. That way, the plot variables P1,..,P9 allow the cascading or intermediate results. For example, plot #3 can refer to the results of plot 1 using the variable P1.
+
+
+
F1...F9
+
F1 refers to the previous result of the actual formula to realize a feedback loop. This is useful in filter designs. Similarly, F2 refers to the second previous result etc.
The Transposer allows to map the current profile w.r.t. the time and temperature axis by setting targets time and temperature at major events like yellow point (DRY END) or first crack (FC START) or for time transformations also by target phases duration. Temperature transformation are only applied to the bean temperature (BT) curve while time transformations are applied to the whole profile.
Three different mapping methods are available to compute from the current profile and the given targets a resulting profile. The linear and quadratic mappings are continuous functions while the discrete option is defined stepwise between the given source/target pairs and extended at the borders
Pressing the "Apply" button applies the current computed mapping to the loaded profile for inspection. "Reset" returns to the original profile shape. Leaving the Transposer with "OK" applies the current mapping to the profile. Leaving the Transposer with "Cancel" returns to the unchanged initially loaded profile.
-
-
-
EXAMPLE 1: ADJUST TOTAL ROAST TIME
-
-
-
You might want to re-roast a profile, but extended/restricted to a total length of 10:00.
Load the profile and start the Transposer under Tools. Enter our target roast time of "10:00" minutes into the target DROP field under Time and select "linear" as mapping. Check the resulting times of the main events in the time tables last row, press "Apply" to view the transposed profile in the graph. If you are happy with the result, press "OK" and save the newly generated transposed profile such that you can use it as a template for future roasts.
-
-
-
EXAMPLE 2: MAP BETWEEN TWO ROASTING MACHINES
-
-
-
Transpose temperature readings from your smaller machine to your larger machine assuming on your larger machine the DRY and FC START events happen at different temperatures than on your smaller one.
Load the profile recorded on the smaller machine and open the Transposer. Select the linear mapping and put the DRY and FC START target temperatures as observed on your larger machine into the into the corresponding fields under BT. Underneath the table you see the calculated symbolic formula that can be copy-pasted into the BT symbolic formula under Config >> Devices to adjust the computed mapping automatically while roasting on your smaller machine to see the temperature reading as you expect them on the larger machine.
-
-
-
+ TRANSPOSER
+
+
+
The Transposer allows to map the current profile w.r.t. the time and temperature axis by setting targets time and temperature at major events like yellow point (DRY END) or first crack (FC START) or for time transformations also by target phases duration. Temperature transformation are only applied to the bean temperature (BT) curve while time transformations are applied to the whole profile.
Three different mapping methods are available to compute from the current profile and the given targets a resulting profile. The linear and quadratic mappings are continuous functions while the discrete option is defined stepwise between the given source/target pairs and extended at the borders
Pressing the "Apply" button applies the current computed mapping to the loaded profile for inspection. "Reset" returns to the original profile shape. Leaving the Transposer with "OK" applies the current mapping to the profile. Leaving the Transposer with "Cancel" returns to the unchanged initially loaded profile.
+
+
+
EXAMPLE 1: ADJUST TOTAL ROAST TIME
+
+
+
You might want to re-roast a profile, but extended/restricted to a total length of 10:00.
Load the profile and start the Transposer under Tools. Enter our target roast time of "10:00" minutes into the target DROP field under Time and select "linear" as mapping. Check the resulting times of the main events in the time tables last row, press "Apply" to view the transposed profile in the graph. If you are happy with the result, press "OK" and save the newly generated transposed profile such that you can use it as a template for future roasts.
+
+
+
EXAMPLE 2: MAP BETWEEN TWO ROASTING MACHINES
+
+
+
Transpose temperature readings from your smaller machine to your larger machine assuming on your larger machine the DRY and FC START events happen at different temperatures than on your smaller one.
Load the profile recorded on the smaller machine and open the Transposer. Select the linear mapping and put the DRY and FC START target temperatures as observed on your larger machine into the into the corresponding fields under BT. Underneath the table you see the calculated symbolic formula that can be copy-pasted into the BT symbolic formula under Config >> Devices to adjust the computed mapping automatically while roasting on your smaller machine to see the temperature reading as you expect them on the larger machine.
+
+
+
diff --git a/doc/help_dialogs/Script/pyproject.toml b/doc/help_dialogs/Script/pyproject.toml
new file mode 100644
index 000000000..7a4a5d649
--- /dev/null
+++ b/doc/help_dialogs/Script/pyproject.toml
@@ -0,0 +1,368 @@
+# Copied from artisan/src/pyporject.toml
+# Modified
+# [tool.mypy]
+# files = ["xlsx_to_artisan_help.py"]
+# and
+# [tool.pyright]
+# include = []
+# exclude = []
+
+[project]
+name = 'Artisan'
+dynamic = ['version']
+description = "Artisan is a software that helps coffee roasters record, analyze, and control roast profiles."
+readme = {file = 'README.txt', content-type='text/markdown'}
+authors = [
+ {name = 'Rafael Cobo'},
+ {name = 'Marko Luther'},
+ {name = 'Dave Baxter'}
+]
+maintainers = [
+ {name = 'Marko Luther'},
+ {name = 'Dave Baxter'}
+]
+license = {file = 'LICENSE'}
+requires-python = '>=3.8'
+keywords = ['roasting', 'roast logging', 'speciality coffee']
+classifiers = [
+ 'Development Status :: 5 - Production/Stable',
+ 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
+ "Operating System :: Windows",
+ "Operating System :: MacOS",
+ "Operating System :: POSIX :: Linux",
+ 'Programming Language :: Python',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: 3.11',
+ 'Programming Language :: Python :: 3 :: Only',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Other/Nonlisted Topic'
+]
+
+[project.urls]
+'Homepage' = 'https://artisan-scope.org/'
+'Documentation' = 'https://artisan-scope.org/docs/quick-start-guide/'
+'Repository' = 'https://github.com/artisan-roaster-scope/artisan'
+'Issue Tracker' = 'https://github.com/artisan-roaster-scope/artisan/issues'
+'Changelog' = 'https://github.com/artisan-roaster-scope/artisan/blob/master/wiki/ReleaseHistory.md'
+
+
+## black
+
+[tool.black]
+line-length = 100
+target-version = ['py38']
+include = '\.pyi?$'
+extend-exclude = '''
+# A regex preceded with ^/ will apply only to files and directories
+# in the root of the project.
+^/foo.py # exclude a file named foo.py in the root of the project (in addition to the defaults)
+'''
+
+## pylint conf
+
+[tool.pylint.MASTER]
+load-plugins = [
+# 'pylint.extensions.bad_builtin', # suggest comprehension over filter/join/map
+ 'pylint.extensions.check_elif',
+# 'pylint.extensions.code_style', # suggests the := operator; NOT YET
+ 'pylint.extensions.comparison_placement',
+# 'pylint.extensions.confusing_elif', # nested if => functions; NOT YET
+ 'pylint.extensions.docparams',
+ 'pylint.extensions.docstyle',
+ 'pylint.extensions.eq_without_hash',
+ 'pylint.extensions.for_any_all',
+ 'pylint.extensions.overlapping_exceptions',
+# 'pylint.extensions.private_import',
+ 'pylint.extensions.set_membership',
+ 'pylint.extensions.typing',
+# 'pylint.extensions.redefined_variable_type', # NOT YET
+# 'pylint.extensions.mccabe', # complexity rating for functions; NOT YET
+ 'pylint.extensions.no_self_use'
+]
+ignore-paths = [ "^uic/.*$",
+ "^build/.*$",
+ "^dist/.*$",
+ "^proto/.*$",
+ "^test/.*$" ]
+
+# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
+# number of processors available to use.
+jobs = "0"
+
+# Minimum supported python version
+py-version = "3.8"
+
+# Pickle collected data for later comparisons.
+persistent = "no"
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code.
+extension-pkg-allow-list='''PyQt6'''
+
+[tool.pylint.'MESSAGES CONTROL']
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once). You can also use "--disable=all" to
+# disable everything first and then re-enable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use "--disable=all --enable=classes
+# --disable=W".
+disable='''
+ line-too-long,
+ too-many-lines,
+ trailing-whitespace,
+ missing-final-newline,
+ trailing-newlines,
+ multiple-statements,
+ multiple-imports,
+ wrong-import-order,
+ ungrouped-imports,
+ wrong-import-position,
+ useless-import-alias,
+ import-outside-toplevel,
+ empty-docstring,
+ missing-module-docstring,
+ missing-class-docstring,
+ missing-function-docstring,
+ invalid-name,
+ too-many-statements,
+ too-many-branches,
+ too-many-ancestors,
+ too-many-instance-attributes,
+ too-few-public-methods,
+ too-many-public-methods,
+ too-many-return-statements,
+ too-many-branches,
+ too-many-arguments,
+ too-many-locals,
+ too-many-boolean-expressions,
+ too-many-nested-blocks,
+ too-many-positional-arguments,
+ cyclic-import,
+ duplicate-code,
+'''
+
+# raw-checker-failed,
+# bad-inline-option,
+# locally-disabled,
+# file-ignored,
+# suppressed-message,
+# useless-suppression,
+# deprecated-pragma,
+# use-symbolic-message-instead,
+# wrong-spelling-in-comment,
+# wrong-spelling-in-docstring,
+# invalid-characters-in-docstring,
+# unnecessary-dunder-call,
+# bad-file-encoding,
+# bad-classmethod-argument,
+# bad-mcs-method-argument,
+# bad-mcs-classmethod-argument,
+# single-string-used-for-slots,
+# unnecessary-lambda-assignment,
+# unnecessary-direct-lambda-call,
+# non-ascii-name,
+# non-ascii-module-import,
+
+# superfluous-parens,
+# mixed-line-endings,
+# unexpected-line-ending-format,
+
+# unneeded-not,
+# consider-using-enumerate,
+# consider-iterating-dictionary,
+# consider-using-dict-items,
+# use-maxsplit-arg,
+# use-sequence-for-iteration,
+# consider-using-f-string,
+# use-implicit-booleaness-not-len,
+# use-implicit-booleaness-not-comparison,
+
+
+# disallowed-name,
+# typevar-name-incorrect-variance,
+# typevar-double-variance,
+# typevar-name-mismatch,
+
+# singleton-comparison,
+# unidiomatic-typecheck,
+# useless-option-value,
+# no-classmethod-decorator,
+# no-staticmethod-decorator,
+# useless-object-inheritance,
+# property-with-parameters,
+# consider-using-from-import,
+# consider-merging-isinstance,
+# simplifiable-if-statement,
+# redefined-argument-from-local,
+# no-else-return,
+# consider-using-ternary,
+# trailing-comma-tuple,
+# stop-iteration-return,
+# simplify-boolean-expression,
+# inconsistent-return-statements,
+# useless-return,
+# consider-swap-variables,
+# consider-using-join,
+# consider-using-in,
+# consider-using-get,
+# chained-comparison,
+# consider-using-dict-comprehension,
+# consider-using-set-comprehension,
+# simplifiable-if-expression,
+# no-else-raise,
+# unnecessary-comprehension,
+# consider-using-sys-exit,
+# no-else-break,
+# no-else-continue,
+# super-with-arguments,
+# simplifiable-condition,
+# condition-evals-to-constant,
+# consider-using-generator,
+# use-a-generator,
+# consider-using-min-builtin,
+# consider-using-max-builtin,
+# consider-using-with,
+# unnecessary-dict-index-lookup,
+# use-list-literal,
+# use-dict-literal,
+# unnecessary-list-index-lookup,
+# literal-comparison,
+# comparison-with-itself,
+# comparison-of-constants,
+# no-self-use,
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+enable='''c-extension-no-member,'''
+
+
+## mypy conf
+
+[tool.mypy]
+files = ["xlsx_to_artisan_help.py"]
+exclude = ['build', 'dist', 'uic', 'misc']
+python_version = "3.8"
+
+# Ensure full coverage
+check_untyped_defs = true
+disallow_incomplete_defs = true
+disallow_untyped_calls = true
+disallow_untyped_defs = true
+disallow_untyped_decorators = true
+disallow_any_unimported = false # raises about 100 errors with numpy >= 2.1
+
+# Restrict dynamic typing
+disallow_any_generics = true
+disallow_subclassing_any = true
+warn_return_any = true
+
+# Some more checks
+local_partial_types = true
+strict_equality = true
+
+# Know exactly what we're doing
+warn_redundant_casts = true
+warn_unused_configs = true
+warn_unused_ignores = true
+warn_unreachable = true
+#show_error_codes = true
+
+# Explicit is better than implicit
+no_implicit_optional = true
+
+
+plugins = ["numpy.typing.mypy_plugin"]
+
+[[tool.mypy.overrides]]
+module = ["matplotlib.*", "aiohttp.*", "aiohttp.web.*", "aiohttp_jinja2.*", "libusb_package.*"]
+ignore_missing_imports = true
+
+
+[[tool.mypy.overrides]]
+module = "uic.*"
+follow_imports = 'skip'
+
+
+## ruff conf
+
+[tool.ruff]
+# Enable pycodestyle (`E`), Pyflakes (`F`), Updates ('UP'), flake8-bugbear (`B`) codes by default.
+# also flake8-2020 (YTT), flake8-commas (COM), flake8-comprehensions (C4),
+# flake8-datetimez (DTZ), flake8-pie (PIE), flake8-raise (RSE), flake8-return (RET),
+# flake8-simplify (SIM), flake8-gettext (INT), flake8-unused-arguments (ARG),
+# Error (PLE), Refactor (PLR), Warning (PLW)
+## next: flake8-use-pathlib (PTH), flake8-print (T20)
+lint.select = ["E", "F", "UP", "B", "A", "YTT", "COM", "C4", "DTZ", "PIE", "RSE", "RET", "SIM", "ARG", "PLE", "PLR", "PLW", "INT", "RUF013"]
+
+output-format = "pylint" # one of: text, json, junit, grouped, github, gitlab, pylint, azure
+
+# Same as Black.
+line-length = 80
+
+# Never enforce `E501` (line length violations).
+lint.ignore = ["E501", "E741", "E402", "PLR0912", "PLR0913", "PLR0915", "SIM105", "PLR2044", "PLR2004", "PLW0603", "PLR0911", "COM812"]
+
+# Exclude a variety of commonly ignored directories.
+exclude = ["dist", "build", "proto", ".pytype", ".mypy_cache", ".git", ".venv", ".venv_universal", ".venv_arm"]
+
+# Assume Python 3.8.
+target-version = "py38"
+
+[tool.ruff.lint.per-file-ignores]
+"uic/*.py" = ["UP004", "F401", "ARG002"]
+
+
+
+## pyright conf
+
+[tool.pyright]
+include = []
+exclude = []
+# ignore = []
+
+reportMissingImports = true
+reportMissingTypeStubs = false
+
+pythonVersion = "3.8"
+pythonPlatform = "All"
+
+#typeCheckingMode = "strict" # "off", "basic", "strict"
+
+# strict disabled checks # "error", "warning", false, true
+#reportUnboundVariable = "error"
+#reportUnknownParameterType = false
+#reportMissingParameterType = false
+#reportUnknownMemberType = false
+#reportUnknownArgumentType = false
+#reportGeneralTypeIssues = false
+useLibraryCodeForTypes = false
+reportInvalidTypeForm = false # since numpy 2.1 more than 150 errors are reported
+
+
+## pytest conf
+
+[tool.pytest.ini_options]
+minversion = "7.4"
+addopts = "-ra -v"
+testpaths = [
+ "test",
+]
+pythonpath = [
+ "."
+]
+
+[tool.codespell]
+skip = '*.ts,./coverage,./build,./dist*,./htmlcov,./*.spec'
+count = ''
+quiet-level = 3
+ignore-words-list = 'ser,alog,nd,iterm,dout,te,commandi,dout,exitt,currenty,exaust,controle,coment,controle,outweight,everytime,sade,weightIn,weightin'
diff --git a/doc/help_dialogs/Script/xlsx_to_artisan_help.py b/doc/help_dialogs/Script/xlsx_to_artisan_help.py
index 33b1bc8bd..6e4ba26ad 100644
--- a/doc/help_dialogs/Script/xlsx_to_artisan_help.py
+++ b/doc/help_dialogs/Script/xlsx_to_artisan_help.py
@@ -1,4 +1,3 @@
-#
# ABOUT
# Script to take an Excel input file and generate Artisan help dialog code.
@@ -15,8 +14,7 @@
# AUTHOR
# Dave Baxter, 2023
-'''
-Command line: xlsx_to_artisan_help.py |all
+'''Command line: xlsx_to_artisan_help.py |all
**Note that filename should have no suffix, file name only.
The input file is drawn from ../input_files/.xlsx
@@ -29,14 +27,14 @@
Excel file format:
One Excel file for each help dialog.
- One or more tabs, each tab is a seperate table within the same help dialog.
+ One or more tabs, each tab is a separate table within the same help dialog.
The tab name is not important but it will be used to generate the associated PrettyTable table name.
Each tab must have the following cells, starting in the upper left cell A1
Title of the table [First row, required]
Top Note [Multiple contiguous rows, optional]
- Table headers, aka column titles [One row, optional but if provided must include table rows]
- Table data rows [Multiple coniguous rows, optional but must follow the table headers]
+ Table headers, aka column titles [One row, optional but if provided must include table data rows]
+ Table data rows [Multiple contiguous rows, optional but must follow the table headers]
Bottom Note [Multiple contiguous rows, optional]
QApplication.translate() is not applied to cells formatted as Italic, formatted with any font color
@@ -47,7 +45,7 @@
A single quote at the start of a cell string acts as a flag to Excel that the cell contains text. If the
single quote at the start of a string is to be displayed and passed along to the help code it should
- be escaped (proceeded) with another single quote. Example, to display the string 'Hello' put ''Hello'
+ be escaped (preceded) with another single quote. Example, to display the string 'Hello' put ''Hello'
into the cell. Single quotes in the middle or end of a string do not need to be escaped.
Single blank rows are legal. Consecutive blank rows are interpreted as the end of a table. All cells in
@@ -70,7 +68,7 @@
Recent changes:
- Single quotes now tolerated
-- hacked around the problem: The unicode elipsis \x85 "…" is not properly handled. These seem to get into the Excel file when cut and paste from the blog.
+- hacked around the problem: The Unicode ellipsis \x85 "…" is not properly handled. These seem to get into the Excel file when cut and paste from the blog.
Must be replaced with three periods "..." in the Excel file.
- Alt-Enter in Excel to create newlines now tolerated
- adds support for PyQt6
@@ -85,32 +83,33 @@
import sys
sys.dont_write_bytecode = True #prevents __pycache__ folder written to help/
+from typing import List, Tuple
+from openpyxl.worksheet.worksheet import Worksheet # pylint: disable=unused-import
+
try:
- from PyQt6.QtWidgets import QApplication
+ from PyQt6.QtWidgets import QApplication # pylint: disable=unused-import
except ImportError:
- from PyQt5.QtWidgets import QApplication # type: ignore # noqa: F401
+ from PyQt5.QtWidgets import QApplication # type: ignore # noqa: F401 # pylint: disable=unused-import
from openpyxl import load_workbook
-def u(x):
- return str(x)
ind = ' ' #indent
nlind = '\n' + ind #new line plus indent
-def translateStr(in_str, group='HelpDlg'):
- return "QApplication.translate('" + group + "','" + u(in_str) + "')"
+def translateStr(in_str:str, group:str='HelpDlg') -> str:
+ return "QApplication.translate('" + group + "','" + str(in_str) + "')"
-def generateRows(ws):
+def generateRows(ws:Worksheet) -> List[List[str]]:
all_rows = []
for row in ws.iter_rows():
this_row = []
for cell in row:
# insert a nonbreaking space into blank cells to keep the row height homgenous
- if cell.value in (None, ''):
+ if cell.value in {None, ''}:
cell_str = "' '"
else:
if cell.data_type == 's':
- cell_value = re.subn(r"'",r''',cell.value) #protect downstream by changing single quotes to double
+ cell_value = re.subn(r"'",r''',str(cell.value)) #protect downstream by changing single quotes to double
cell_value = re.subn(r'\n',r'\\n',cell_value[0])
# do not translate if the cell has italic format or any font color
if cell.font.italic or \
@@ -132,26 +131,26 @@ def generateRows(ws):
all_rows.append(this_row)
return all_rows
-def getTitle(all_rows,_,nsheet):
+def getTitle(all_rows:List[List[str]],_:Worksheet,nsheet:int) -> str:
del _
if nsheet == 0:
- title = nlind + 'strlist.append("")'
+ title = nlind + "strlist.append('')"
else:
- title = nlind + 'strlist.append("
')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','ALARMS'))
- strlist.append('')
- tbl_Alarmstop = prettytable.PrettyTable()
- tbl_Alarmstop.header = False
- tbl_Alarmstop.add_row([QApplication.translate('HelpDlg','Each alarm is only triggered once.\nAlarms are scanned in order from the top of the table to the bottom.')])
- strlist.append(tbl_Alarmstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Alarms = prettytable.PrettyTable()
- tbl_Alarms.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Nr'),QApplication.translate('HelpDlg','Alarm number for reference.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Status'),QApplication.translate('HelpDlg','Activate or Deactivate the alarm.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','If Alarm'),QApplication.translate('HelpDlg','Alarm triggered only if the alarm with the given number was triggered before. Use 0 for no guard.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','But Not'),QApplication.translate('HelpDlg','Alarm triggered only if the alarm with the given number was not triggered before. Use 0 for no guard.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','From'),QApplication.translate('HelpDlg','Alarm only triggered after the given event.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Time'),QApplication.translate('HelpDlg','If not 00:00, alarm is triggered mm:ss after the event "From" happens.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Source'),QApplication.translate('HelpDlg','The observed temperature source.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Condition'),QApplication.translate('HelpDlg','Alarm is triggered if source rises above or below the specified temperature.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Temp'),QApplication.translate('HelpDlg','The specified temperature limit.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','The action to be triggered if all conditions are fulfilled.')])
- tbl_Alarms.add_row([QApplication.translate('HelpDlg','Description'),QApplication.translate('HelpDlg','Commands for alarms with an action go here. Anything after a '#' character is considered a comment and is ignored when processing the alarm. ')])
- strlist.append(tbl_Alarms.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','ALARM CONFIGURATION OPTIONS'))
- strlist.append('')
- tbl_Options = prettytable.PrettyTable()
- tbl_Options.field_names = [QApplication.translate('HelpDlg','Option'),QApplication.translate('HelpDlg','Description')]
- tbl_Options.add_row([QApplication.translate('HelpDlg','Add'),QApplication.translate('HelpDlg','Adds a new alarm to the bottom of the table.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Insert'),QApplication.translate('HelpDlg','Inserts a new alarm above the selected alarm.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Delete'),QApplication.translate('HelpDlg','Deletes the selected alarm.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Copy Table'),QApplication.translate('HelpDlg','Copy the alarm table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','All On'),QApplication.translate('HelpDlg','Enables all alarms.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','All Off'),QApplication.translate('HelpDlg','Disables all alarms.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Load'),QApplication.translate('HelpDlg','Load alarm definition from a file.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Save'),QApplication.translate('HelpDlg','Save the alarm definitions to a file.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Clear'),QApplication.translate('HelpDlg','Clears all alarms from the table.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Help'),QApplication.translate('HelpDlg','Opens this window.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Load from Profile'),QApplication.translate('HelpDlg','when ticked will replace the alarm table when loading a profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Load from Background'),QApplication.translate('HelpDlg','when ticked will replace the alarm table when loading a background profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','PopUp TimeOut'),QApplication.translate('HelpDlg','A PopUp will automatically close after this time if the OK button has not been clicked.')])
- strlist.append(tbl_Options.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','Alarm Actions'))
- strlist.append('')
- tbl_Actionstop = prettytable.PrettyTable()
- tbl_Actionstop.header = False
- tbl_Actionstop.add_row([QApplication.translate('HelpDlg','Enter the Command into the Description field of the Alarm.')])
- strlist.append(tbl_Actionstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Actions = prettytable.PrettyTable()
- tbl_Actions.field_names = [QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Meaning')]
- tbl_Actions.add_row([QApplication.translate('HelpDlg','Pop Up'),QApplication.translate('HelpDlg',''),QApplication.translate('HelpDlg','the text to be displayed in the pop up')])
- tbl_Actions.add_row([QApplication.translate('HelpDlg','Call Program'),QApplication.translate('HelpDlg','A program/script path (absolute or relative)'),QApplication.translate('HelpDlg','start an external program')])
- tbl_Actions.add_row([QApplication.translate('HelpDlg','Event Button'),QApplication.translate('HelpDlg','')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','ALARMS'))
+ strlist.append('')
+ tbl_Alarmstop = prettytable.PrettyTable()
+ tbl_Alarmstop.header = False
+ tbl_Alarmstop.add_row([QApplication.translate('HelpDlg','Each alarm is only triggered once.\nAlarms are scanned in order from the top of the table to the bottom.')])
+ strlist.append(tbl_Alarmstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Alarms = prettytable.PrettyTable()
+ tbl_Alarms.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Nr'),QApplication.translate('HelpDlg','Alarm number for reference.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Status'),QApplication.translate('HelpDlg','Activate or Deactivate the alarm.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','If Alarm'),QApplication.translate('HelpDlg','Alarm triggered only if the alarm with the given number was triggered before. Use 0 for no guard.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','But Not'),QApplication.translate('HelpDlg','Alarm triggered only if the alarm with the given number was not triggered before. Use 0 for no guard.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','From'),QApplication.translate('HelpDlg','Alarm only triggered after the given event.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Time'),QApplication.translate('HelpDlg','If not 00:00, alarm is triggered mm:ss after the event "From" happens.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Source'),QApplication.translate('HelpDlg','The observed temperature source.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Condition'),QApplication.translate('HelpDlg','Alarm is triggered if source rises above or below the specified temperature.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Temp'),QApplication.translate('HelpDlg','The specified temperature limit.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','The action to be triggered if all conditions are fulfilled.')])
+ tbl_Alarms.add_row([QApplication.translate('HelpDlg','Description'),QApplication.translate('HelpDlg','Commands for alarms with an action go here. Anything after a '#' character is considered a comment and is ignored when processing the alarm. ')])
+ strlist.append(tbl_Alarms.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','ALARM CONFIGURATION OPTIONS'))
+ strlist.append('')
+ tbl_Options = prettytable.PrettyTable()
+ tbl_Options.field_names = [QApplication.translate('HelpDlg','Option'),QApplication.translate('HelpDlg','Description')]
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Add'),QApplication.translate('HelpDlg','Adds a new alarm to the bottom of the table.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Insert'),QApplication.translate('HelpDlg','Inserts a new alarm above the selected alarm.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Delete'),QApplication.translate('HelpDlg','Deletes the selected alarm.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Copy Table'),QApplication.translate('HelpDlg','Copy the alarm table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','All On'),QApplication.translate('HelpDlg','Enables all alarms.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','All Off'),QApplication.translate('HelpDlg','Disables all alarms.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Load'),QApplication.translate('HelpDlg','Load alarm definition from a file.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Save'),QApplication.translate('HelpDlg','Save the alarm definitions to a file.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Clear'),QApplication.translate('HelpDlg','Clears all alarms from the table.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Help'),QApplication.translate('HelpDlg','Opens this window.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Load from Profile'),QApplication.translate('HelpDlg','when ticked will replace the alarm table when loading a profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Load from Background'),QApplication.translate('HelpDlg','when ticked will replace the alarm table when loading a background profile with the alarms stored in the profile. If there are no alarms in the profile the alarm table will be cleared.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','PopUp TimeOut'),QApplication.translate('HelpDlg','A PopUp will automatically close after this time if the OK button has not been clicked.')])
+ strlist.append(tbl_Options.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','Alarm Actions'))
+ strlist.append('')
+ tbl_Actionstop = prettytable.PrettyTable()
+ tbl_Actionstop.header = False
+ tbl_Actionstop.add_row([QApplication.translate('HelpDlg','Enter the Command into the Description field of the Alarm.')])
+ strlist.append(tbl_Actionstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Actions = prettytable.PrettyTable()
+ tbl_Actions.field_names = [QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Meaning')]
+ tbl_Actions.add_row([QApplication.translate('HelpDlg','Pop Up'),QApplication.translate('HelpDlg',''),QApplication.translate('HelpDlg','the text to be displayed in the pop up')])
+ tbl_Actions.add_row([QApplication.translate('HelpDlg','Call Program'),QApplication.translate('HelpDlg','A program/script path (absolute or relative)'),QApplication.translate('HelpDlg','start an external program')])
+ tbl_Actions.add_row([QApplication.translate('HelpDlg','Event Button'),QApplication.translate('HelpDlg','')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','AUTOSAVE DIALOG'))
- strlist.append('')
- tbl_Autosave = prettytable.PrettyTable()
- tbl_Autosave.field_names = [QApplication.translate('HelpDlg','Dialog Field'),QApplication.translate('HelpDlg','Meaning')]
- tbl_Autosave.add_row([QApplication.translate('HelpDlg','Autosave [a]'),QApplication.translate('HelpDlg','Turn Autosave ON or OFF. When sampling, the keyboard 'a' will save the profile at that moment.\nNOTE: Files with the same file name will be silently overwritten. Use ~currdatetime in the file name prefix to get unique file names.')])
- tbl_Autosave.add_row([QApplication.translate('HelpDlg','Add to recent file list'),QApplication.translate('HelpDlg','When checked, Autosaved files will be added to the Files>> Open Recent files list.')])
- tbl_Autosave.add_row([QApplication.translate('HelpDlg','File Name Prefix'),QApplication.translate('HelpDlg','Defines the file name to use for Autosave. See the Autosave Fields section below.')])
- tbl_Autosave.add_row([QApplication.translate('HelpDlg','Preview:'),QApplication.translate('HelpDlg','Shows an example of the file name based on the File Name Prefix field.\nA 'While Recording:' example will also be shown if the file name will be different when the scope is sampling.')])
- tbl_Autosave.add_row([QApplication.translate('HelpDlg','Path'),QApplication.translate('HelpDlg','Where to store the Autosaved files.')])
- tbl_Autosave.add_row([QApplication.translate('HelpDlg','Save Also'),QApplication.translate('HelpDlg','Allows to save an additional file. Choose the file type from the pull-down menu.')])
- tbl_Autosave.add_row([QApplication.translate('HelpDlg','Path'),QApplication.translate('HelpDlg','Where to store the additional files.')])
- strlist.append(tbl_Autosave.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','AUTOSAVE FIELDS'))
- strlist.append('')
- tbl_AutosaveFields = prettytable.PrettyTable()
- tbl_AutosaveFields.field_names = [QApplication.translate('HelpDlg','Prefix Field'),QApplication.translate('HelpDlg','Source'),QApplication.translate('HelpDlg','Example')]
- tbl_AutosaveFields.add_row(['~batchprefix',QApplication.translate('HelpDlg','The batch prefix set in Config>Batch>Prefix'),'Prod-'])
- tbl_AutosaveFields.add_row(['~batchcounter',QApplication.translate('HelpDlg','The current batch number'),653])
- tbl_AutosaveFields.add_row(['~batch',QApplication.translate('HelpDlg','Same as "~batchprefix~batchnum"'),'Prod-653'])
- tbl_AutosaveFields.add_row(['~batchposition',QApplication.translate('HelpDlg','The current batch position, or "Roast of the Day"'),9])
- tbl_AutosaveFields.add_row(['~batch_long',QApplication.translate('HelpDlg','Same as Batch field in Roast Properties\n"~batchprefix~batchnum (~batchposition)"'),'Prod-653 (9)'])
- tbl_AutosaveFields.add_row(['~title',QApplication.translate('HelpDlg','From Roast>Properties>Title'),'Ethiopia Guji'])
- tbl_AutosaveFields.add_row(['~beans_nn',QApplication.translate('HelpDlg','Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Beans field.\nFrom Roast>Properties>Beans'),'Ethiopia G'])
- tbl_AutosaveFields.add_row(['~beans_line',QApplication.translate('HelpDlg','The entire first line From Roast>Properties>Beans'),'Ethiopia Guji purchased from Royal'])
- tbl_AutosaveFields.add_row(['~date',QApplication.translate('HelpDlg','Roast date in format yy-MM-dd'),'20-02-05'])
- tbl_AutosaveFields.add_row(['~date_long',QApplication.translate('HelpDlg','Roast date in format yyyy-MM-dd'),'2020-02-05'])
- tbl_AutosaveFields.add_row(['~time',QApplication.translate('HelpDlg','Roast time in format hhmm'),1742])
- tbl_AutosaveFields.add_row(['~datetime',QApplication.translate('HelpDlg','Roast date and time in format yy-MM-dd_hhmm'),'20-02-05_1742'])
- tbl_AutosaveFields.add_row(['~datetime_long',QApplication.translate('HelpDlg','Roast date and time in format yyyy-MM-dd_hhmm'),'2020-02-05_1742'])
- tbl_AutosaveFields.add_row(['~yyyy',QApplication.translate('HelpDlg','Roast year in format yyyy'),2020])
- tbl_AutosaveFields.add_row(['~yy',QApplication.translate('HelpDlg','Roast year in format yy'),20])
- tbl_AutosaveFields.add_row(['~mmm',QApplication.translate('HelpDlg','Roast month in format MMM (localized)'),'Feb'])
- tbl_AutosaveFields.add_row(['~mm',QApplication.translate('HelpDlg','Roast month in format MM'),'02'])
- tbl_AutosaveFields.add_row(['~ddd',QApplication.translate('HelpDlg','Roast day in format ddd (localized)'),'Wed'])
- tbl_AutosaveFields.add_row(['~dd',QApplication.translate('HelpDlg','Roast day in format dd'),'05'])
- tbl_AutosaveFields.add_row(['~hour',QApplication.translate('HelpDlg','Roast hour in format hh'),17])
- tbl_AutosaveFields.add_row(['~minute',QApplication.translate('HelpDlg','Roast minute in format mm'),42])
- tbl_AutosaveFields.add_row(['~currtime',QApplication.translate('HelpDlg','Current date and time with seconds in format yy-MM-dd_hhmmss. Not the same as roast time. '),'21-01-18_093609'])
- tbl_AutosaveFields.add_row(['~operator',QApplication.translate('HelpDlg','From Roast>Properties>Operator'),'Dave'])
- tbl_AutosaveFields.add_row(['~organization',QApplication.translate('HelpDlg','From Roast>Properties>Organization'),'Dave's Coffee'])
- tbl_AutosaveFields.add_row(['~machine',QApplication.translate('HelpDlg','From Roast>Properties>Machine'),'SF-6'])
- tbl_AutosaveFields.add_row(['~weight',QApplication.translate('HelpDlg','From Roast>Properties>Weight Green'),3])
- tbl_AutosaveFields.add_row(['~roastedweight',QApplication.translate('HelpDlg','From Roast>Properties>Weight Roasted'),2.6])
- tbl_AutosaveFields.add_row(['~weightunits',QApplication.translate('HelpDlg','From Roast>Properties>Weight'),'Kg'])
- tbl_AutosaveFields.add_row(['~weightloss',QApplication.translate('HelpDlg','Calculated weight loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)'),14.1])
- tbl_AutosaveFields.add_row(['~volume',QApplication.translate('HelpDlg','From Roast>Properties>Volume Green'),4.1])
- tbl_AutosaveFields.add_row(['~roastedvolume',QApplication.translate('HelpDlg','From Roast>Properties>Volume Roasted'),6.8])
- tbl_AutosaveFields.add_row(['~volumeunits',QApplication.translate('HelpDlg','From Roast>Properties>Volume'),'l'])
- tbl_AutosaveFields.add_row(['~volumegain',QApplication.translate('HelpDlg','Calculated volume gain in percent'),61.5])
- tbl_AutosaveFields.add_row(['~density',QApplication.translate('HelpDlg','From Roast>Properties>Density Green'),756.4])
- tbl_AutosaveFields.add_row(['~roasteddensity',QApplication.translate('HelpDlg','From Roast>Properties>Density Roasted'),375.2])
- tbl_AutosaveFields.add_row(['~densityunits',QApplication.translate('HelpDlg','From Roast>Properties>Density'),'g_l'])
- tbl_AutosaveFields.add_row(['~densityloss',QApplication.translate('HelpDlg','Calculated density loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)'),46.8])
- tbl_AutosaveFields.add_row(['~moisture',QApplication.translate('HelpDlg','From Roast>Properties>Moisture Green'),11.7])
- tbl_AutosaveFields.add_row(['~roastedmoisture',QApplication.translate('HelpDlg','From Roast>Properties>Moisture Roasted'),2.8])
- tbl_AutosaveFields.add_row(['~moistureloss',QApplication.translate('HelpDlg','Calculated moisture loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)'),8.1])
- tbl_AutosaveFields.add_row(['~drumspeed',QApplication.translate('HelpDlg','From Roast>Properties>Drum Speed'),64])
- tbl_AutosaveFields.add_row(['~colorwhole',QApplication.translate('HelpDlg','From Roast>Properties>Color Whole'),103])
- tbl_AutosaveFields.add_row(['~colorground',QApplication.translate('HelpDlg','From Roast>Properties>Color Ground'),98])
- tbl_AutosaveFields.add_row(['~colorsystem',QApplication.translate('HelpDlg','From Roast>Properties>Color System'),'Tonino'])
- tbl_AutosaveFields.add_row(['~screenmin',QApplication.translate('HelpDlg','From Roast>Properties>Screen Min'),16])
- tbl_AutosaveFields.add_row(['~screenmax',QApplication.translate('HelpDlg','From Roast>Properties>Screen Max'),18])
- tbl_AutosaveFields.add_row(['~greenstemp',QApplication.translate('HelpDlg','From Roast>Properties>(Green) Beans Temperature'),'68.0'])
- tbl_AutosaveFields.add_row(['~ambtemp',QApplication.translate('HelpDlg','From Roast>Properties>Ambient Temperature'),'70.0'])
- tbl_AutosaveFields.add_row(['~ambhumidity',QApplication.translate('HelpDlg','From Roast>Properties>Ambient Humidity'),35.1])
- tbl_AutosaveFields.add_row(['~ambpressure',QApplication.translate('HelpDlg','From Roast>Properties>Ambient Pressure'),1023.8])
- tbl_AutosaveFields.add_row(['~devtime',QApplication.translate('HelpDlg','Calculated time from FCs to DROP in seconds'),112])
- tbl_AutosaveFields.add_row(['~devtime_long',QApplication.translate('HelpDlg','Calculated time from FCs to DROP in min_secs'),'01_52'])
- tbl_AutosaveFields.add_row(['~dtr',QApplication.translate('HelpDlg','From Profile Statistics - DTR (in percent)'),22.1])
- tbl_AutosaveFields.add_row(['~auc',QApplication.translate('HelpDlg','From the Profile Statistics - AUC'),218])
- tbl_AutosaveFields.add_row(['~aucbase',QApplication.translate('HelpDlg','From the Profile Statistics - AUC Base'),300])
- tbl_AutosaveFields.add_row(['~mode',QApplication.translate('HelpDlg','From Config>Temperature - the current temperature mode C or F. '),'F'])
- tbl_AutosaveFields.add_row(['~chargeet',QApplication.translate('HelpDlg','From the Profile - ET at CHARGE'),379.4])
- tbl_AutosaveFields.add_row(['~chargebt',QApplication.translate('HelpDlg','From the Profile - BT at CHARGE'),375.2])
- tbl_AutosaveFields.add_row(['~fcset',QApplication.translate('HelpDlg','From the Profile - ET at FCs'),397.4])
- tbl_AutosaveFields.add_row(['~fcsbt',QApplication.translate('HelpDlg','From the Profile -BT at FCs'),386.7])
- tbl_AutosaveFields.add_row(['~fcstime',QApplication.translate('HelpDlg','From the Profile - FCs time in seconds'),490])
- tbl_AutosaveFields.add_row(['~fcstime_long',QApplication.translate('HelpDlg','From the Profile - FCs time in min_secs'),'08_10'])
- tbl_AutosaveFields.add_row(['~dropet',QApplication.translate('HelpDlg','From the Profile - ET at DROP'),378.6])
- tbl_AutosaveFields.add_row(['~dropbt',QApplication.translate('HelpDlg','From the Profile - BT at DROP'),412.5])
- tbl_AutosaveFields.add_row(['~droptime',QApplication.translate('HelpDlg','From the Profile - DROP time in seconds'),617])
- tbl_AutosaveFields.add_row(['~droptime_long',QApplication.translate('HelpDlg','From the Profile - DROP time in min_secs'),'10_17'])
- tbl_AutosaveFields.add_row(['~dryphasedeltatemp',QApplication.translate('HelpDlg','From the Profile - BT temperature change from TP to DRY'),121.3])
- tbl_AutosaveFields.add_row(['~midphasedeltatemp',QApplication.translate('HelpDlg','From the Profile - BT temperature change from DRY to FCs'),78.6])
- tbl_AutosaveFields.add_row(['~finishphasedeltatemp',QApplication.translate('HelpDlg','From the Profile - BT temperature change from FCs to DROP'),19.8])
- tbl_AutosaveFields.add_row(['~roastingnotes_nn',QApplication.translate('HelpDlg','Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Roasting Notes field.\nFrom Roast>Properties>Roasting Notes'),'No crash, '])
- tbl_AutosaveFields.add_row(['~roastingnotes_line',QApplication.translate('HelpDlg','The entire first line From Roast>Properties>Roasting Notes'),'No crash, maintained RoR'])
- tbl_AutosaveFields.add_row(['~cuppingnotes_nn',QApplication.translate('HelpDlg','Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Cupping Notes field.\nFrom Roast>Properties>Cupping Notes'),'Lots of be'])
- tbl_AutosaveFields.add_row(['~cuppingnotes_line',QApplication.translate('HelpDlg','The entire first line From Roast>Properties>Cupping Notes'),'Lots of berries and chocolate'])
- tbl_AutosaveFields.add_row(['~btubatch',QApplication.translate('HelpDlg','From the Profile Energy Use - Total energy used by the batch in BTU'),8943.2])
- tbl_AutosaveFields.add_row(['~co2batch',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced by the batch in g'),923.3])
- tbl_AutosaveFields.add_row(['~btupreheat',QApplication.translate('HelpDlg','From the Profile Energy Use - Energy used during preheat in BTU'),2538.8])
- tbl_AutosaveFields.add_row(['~co2preheat',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced during preheat in g'),443.9])
- tbl_AutosaveFields.add_row(['~btubbp',QApplication.translate('HelpDlg','From the Profile Energy Use - Energy used during Between Batch Protocol in BTU'),1019.7])
- tbl_AutosaveFields.add_row(['~co2bbp',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced during Between Batch Protocol in g'),254.1])
- tbl_AutosaveFields.add_row(['~bturoast',QApplication.translate('HelpDlg','From the Profile Energy Use - Energy used from CHARGE to DROP in BTU'),7843.2])
- tbl_AutosaveFields.add_row(['~co2roast',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced from CHARGE to DROP in g'),873.9])
- tbl_AutosaveFields.add_row(['~co2pergreenkg',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced per kg of green beans in g'),354.3])
- strlist.append(tbl_AutosaveFields.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_AutosaveFieldsbottom = prettytable.PrettyTable()
- tbl_AutosaveFieldsbottom.header = False
- tbl_AutosaveFieldsbottom.add_row(['NOTES:\nAnything between single quotes ' will show in the file name only when ON.\nExample: 'REC ~batch'\n\nAnything between double quotes " will show in the file name only when OFF. \nExample: "~operator"\n\nFor backward compatibility, when the Prefix field is text only the date and time are appended to the file name.\nExample: 'Autosave' will result in file name 'Autosave_20-01-13_1705'.\nTo show only the text place a single '!' at the start of the Prefix field\nExample: '!Autosave' will result in file name 'Autosave'.\n\nTo maintain cross platform compatibility, file names may contain only letters, numbers, spaces, \nand the following special characters: \n_ - . ( )'])
- strlist.append(tbl_AutosaveFieldsbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','EXAMPLES'))
- strlist.append('')
- tbl_Examplestop = prettytable.PrettyTable()
- tbl_Examplestop.header = False
- tbl_Examplestop.add_row([QApplication.translate('HelpDlg','Data used to replace the fields in the Autosave File Name Prefix are pulled from the current Roast Properties. ')])
- strlist.append(tbl_Examplestop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Examples = prettytable.PrettyTable()
- tbl_Examples.field_names = [QApplication.translate('HelpDlg','Autosave Field'),QApplication.translate('HelpDlg','Example File Name')]
- tbl_Examples.add_row(['~title Roasted on ~date','Burundi Roasted on 20-04-25.alog'])
- tbl_Examples.add_row(['~batchcounter ~title ~date_long','1380 Burundi 2020-04-25_1136.alog'])
- tbl_Examples.add_row(['~beans ~machine ~drumspeedRPM ~weight~weightunits ~poisturePCT ~operator ~date ~batch(~batchposition)','Burundi Kiganda Murambi Lot44 SF-25 64RPM 10.3Kg 10.2PCT Roberto 20-04-25 Prod-1380(6).alog'])
- tbl_Examples.add_row(['~title ~weight~weightunits ~finishphase_deltatemp~mode','Burundi 454.0g 19.8F.alog'])
- tbl_Examples.add_row(['\u0027Recording ~batchcounter' "~batch" ~title ~datetime_long','When OFF:\nProd-1380 Burundi Kiganda Murambi 2020-04-25_1136.alog\nWhile Recording:\nRecording 1380 Burundi KigandaMurambi 2020-04-25_1136.alog'])
- tbl_Examples.add_row(['\u0027Recording ~batchcounter' "~batch" ~title ~date_long_'~currtime'"~time"','Creates a unique filename for multiple saves while sampling by using ~currtime.\nWhen OFF:\nProd-1380 Burundi Kiganda Murambi 2020-04-25_1136.alog\nWhile Recording. \nRecording 1380 Burundi KigandaMurambi 2020-04-25_113809.alog'])
- strlist.append(tbl_Examples.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','AUTOSAVE DIALOG'))
+ strlist.append('')
+ tbl_Autosave = prettytable.PrettyTable()
+ tbl_Autosave.field_names = [QApplication.translate('HelpDlg','Dialog Field'),QApplication.translate('HelpDlg','Meaning')]
+ tbl_Autosave.add_row([QApplication.translate('HelpDlg','Autosave [a]'),QApplication.translate('HelpDlg','Turn Autosave ON or OFF. When sampling, the keyboard 'a' will save the profile at that moment.\nNOTE: Files with the same file name will be silently overwritten. Use ~currdatetime in the file name prefix to get unique file names.')])
+ tbl_Autosave.add_row([QApplication.translate('HelpDlg','Add to recent file list'),QApplication.translate('HelpDlg','When checked, Autosaved files will be added to the Files>> Open Recent files list.')])
+ tbl_Autosave.add_row([QApplication.translate('HelpDlg','File Name Prefix'),QApplication.translate('HelpDlg','Defines the file name to use for Autosave. See the Autosave Fields section below.')])
+ tbl_Autosave.add_row([QApplication.translate('HelpDlg','Preview:'),QApplication.translate('HelpDlg','Shows an example of the file name based on the File Name Prefix field.\nA 'While Recording:' example will also be shown if the file name will be different when the scope is sampling.')])
+ tbl_Autosave.add_row([QApplication.translate('HelpDlg','Path'),QApplication.translate('HelpDlg','Where to store the Autosaved files.')])
+ tbl_Autosave.add_row([QApplication.translate('HelpDlg','Save Also'),QApplication.translate('HelpDlg','Allows to save an additional file. Choose the file type from the pull-down menu.')])
+ tbl_Autosave.add_row([QApplication.translate('HelpDlg','Path'),QApplication.translate('HelpDlg','Where to store the additional files.')])
+ strlist.append(tbl_Autosave.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','AUTOSAVE FIELDS'))
+ strlist.append('')
+ tbl_AutosaveFields = prettytable.PrettyTable()
+ tbl_AutosaveFields.field_names = [QApplication.translate('HelpDlg','Prefix Field'),QApplication.translate('HelpDlg','Source'),QApplication.translate('HelpDlg','Example')]
+ tbl_AutosaveFields.add_row(['~batchprefix',QApplication.translate('HelpDlg','The batch prefix set in Config>Batch>Prefix'),'Prod-'])
+ tbl_AutosaveFields.add_row(['~batchcounter',QApplication.translate('HelpDlg','The current batch number'),653])
+ tbl_AutosaveFields.add_row(['~batch',QApplication.translate('HelpDlg','Same as "~batchprefix~batchnum"'),'Prod-653'])
+ tbl_AutosaveFields.add_row(['~batchposition',QApplication.translate('HelpDlg','The current batch position, or "Roast of the Day"'),9])
+ tbl_AutosaveFields.add_row(['~batch_long',QApplication.translate('HelpDlg','Same as Batch field in Roast Properties\n"~batchprefix~batchnum (~batchposition)"'),'Prod-653 (9)'])
+ tbl_AutosaveFields.add_row(['~title',QApplication.translate('HelpDlg','From Roast>Properties>Title'),'Ethiopia Guji'])
+ tbl_AutosaveFields.add_row(['~beans_nn',QApplication.translate('HelpDlg','Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Beans field.\nFrom Roast>Properties>Beans'),'Ethiopia G'])
+ tbl_AutosaveFields.add_row(['~beans_line',QApplication.translate('HelpDlg','The entire first line From Roast>Properties>Beans'),'Ethiopia Guji purchased from Royal'])
+ tbl_AutosaveFields.add_row(['~date',QApplication.translate('HelpDlg','Roast date in format yy-MM-dd'),'20-02-05'])
+ tbl_AutosaveFields.add_row(['~date_long',QApplication.translate('HelpDlg','Roast date in format yyyy-MM-dd'),'2020-02-05'])
+ tbl_AutosaveFields.add_row(['~time',QApplication.translate('HelpDlg','Roast time in format hhmm'),1742])
+ tbl_AutosaveFields.add_row(['~datetime',QApplication.translate('HelpDlg','Roast date and time in format yy-MM-dd_hhmm'),'20-02-05_1742'])
+ tbl_AutosaveFields.add_row(['~datetime_long',QApplication.translate('HelpDlg','Roast date and time in format yyyy-MM-dd_hhmm'),'2020-02-05_1742'])
+ tbl_AutosaveFields.add_row(['~yyyy',QApplication.translate('HelpDlg','Roast year in format yyyy'),2020])
+ tbl_AutosaveFields.add_row(['~yy',QApplication.translate('HelpDlg','Roast year in format yy'),20])
+ tbl_AutosaveFields.add_row(['~mmm',QApplication.translate('HelpDlg','Roast month in format MMM (localized)'),'Feb'])
+ tbl_AutosaveFields.add_row(['~mm',QApplication.translate('HelpDlg','Roast month in format MM'),'02'])
+ tbl_AutosaveFields.add_row(['~ddd',QApplication.translate('HelpDlg','Roast day in format ddd (localized)'),'Wed'])
+ tbl_AutosaveFields.add_row(['~dd',QApplication.translate('HelpDlg','Roast day in format dd'),'05'])
+ tbl_AutosaveFields.add_row(['~hour',QApplication.translate('HelpDlg','Roast hour in format hh'),17])
+ tbl_AutosaveFields.add_row(['~minute',QApplication.translate('HelpDlg','Roast minute in format mm'),42])
+ tbl_AutosaveFields.add_row(['~currtime',QApplication.translate('HelpDlg','Current date and time with seconds in format yy-MM-dd_hhmmss. Not the same as roast time. '),'21-01-18_093609'])
+ tbl_AutosaveFields.add_row(['~operator',QApplication.translate('HelpDlg','From Roast>Properties>Operator'),'Dave'])
+ tbl_AutosaveFields.add_row(['~organization',QApplication.translate('HelpDlg','From Roast>Properties>Organization'),'Dave's Coffee'])
+ tbl_AutosaveFields.add_row(['~machine',QApplication.translate('HelpDlg','From Roast>Properties>Machine'),'SF-6'])
+ tbl_AutosaveFields.add_row(['~weight',QApplication.translate('HelpDlg','From Roast>Properties>Weight Green'),3])
+ tbl_AutosaveFields.add_row(['~roastedweight',QApplication.translate('HelpDlg','From Roast>Properties>Weight Roasted'),2.6])
+ tbl_AutosaveFields.add_row(['~weightunits',QApplication.translate('HelpDlg','From Roast>Properties>Weight'),'Kg'])
+ tbl_AutosaveFields.add_row(['~weightloss',QApplication.translate('HelpDlg','Calculated weight loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)'),14.1])
+ tbl_AutosaveFields.add_row(['~volume',QApplication.translate('HelpDlg','From Roast>Properties>Volume Green'),4.1])
+ tbl_AutosaveFields.add_row(['~roastedvolume',QApplication.translate('HelpDlg','From Roast>Properties>Volume Roasted'),6.8])
+ tbl_AutosaveFields.add_row(['~volumeunits',QApplication.translate('HelpDlg','From Roast>Properties>Volume'),'l'])
+ tbl_AutosaveFields.add_row(['~volumegain',QApplication.translate('HelpDlg','Calculated volume gain in percent'),61.5])
+ tbl_AutosaveFields.add_row(['~density',QApplication.translate('HelpDlg','From Roast>Properties>Density Green'),756.4])
+ tbl_AutosaveFields.add_row(['~roasteddensity',QApplication.translate('HelpDlg','From Roast>Properties>Density Roasted'),375.2])
+ tbl_AutosaveFields.add_row(['~densityunits',QApplication.translate('HelpDlg','From Roast>Properties>Density'),'g_l'])
+ tbl_AutosaveFields.add_row(['~densityloss',QApplication.translate('HelpDlg','Calculated density loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)'),46.8])
+ tbl_AutosaveFields.add_row(['~moisture',QApplication.translate('HelpDlg','From Roast>Properties>Moisture Green'),11.7])
+ tbl_AutosaveFields.add_row(['~roastedmoisture',QApplication.translate('HelpDlg','From Roast>Properties>Moisture Roasted'),2.8])
+ tbl_AutosaveFields.add_row(['~moistureloss',QApplication.translate('HelpDlg','Calculated moisture loss in percent (the “-” sign is not shown, it can be added manually in front of the field if desired)'),8.1])
+ tbl_AutosaveFields.add_row(['~drumspeed',QApplication.translate('HelpDlg','From Roast>Properties>Drum Speed'),64])
+ tbl_AutosaveFields.add_row(['~colorwhole',QApplication.translate('HelpDlg','From Roast>Properties>Color Whole'),103])
+ tbl_AutosaveFields.add_row(['~colorground',QApplication.translate('HelpDlg','From Roast>Properties>Color Ground'),98])
+ tbl_AutosaveFields.add_row(['~colorsystem',QApplication.translate('HelpDlg','From Roast>Properties>Color System'),'Tonino'])
+ tbl_AutosaveFields.add_row(['~screenmin',QApplication.translate('HelpDlg','From Roast>Properties>Screen Min'),16])
+ tbl_AutosaveFields.add_row(['~screenmax',QApplication.translate('HelpDlg','From Roast>Properties>Screen Max'),18])
+ tbl_AutosaveFields.add_row(['~greenstemp',QApplication.translate('HelpDlg','From Roast>Properties>(Green) Beans Temperature'),'68.0'])
+ tbl_AutosaveFields.add_row(['~ambtemp',QApplication.translate('HelpDlg','From Roast>Properties>Ambient Temperature'),'70.0'])
+ tbl_AutosaveFields.add_row(['~ambhumidity',QApplication.translate('HelpDlg','From Roast>Properties>Ambient Humidity'),35.1])
+ tbl_AutosaveFields.add_row(['~ambpressure',QApplication.translate('HelpDlg','From Roast>Properties>Ambient Pressure'),1023.8])
+ tbl_AutosaveFields.add_row(['~devtime',QApplication.translate('HelpDlg','Calculated time from FCs to DROP in seconds'),112])
+ tbl_AutosaveFields.add_row(['~devtime_long',QApplication.translate('HelpDlg','Calculated time from FCs to DROP in min_secs'),'01_52'])
+ tbl_AutosaveFields.add_row(['~dtr',QApplication.translate('HelpDlg','From Profile Statistics - DTR (in percent)'),22.1])
+ tbl_AutosaveFields.add_row(['~auc',QApplication.translate('HelpDlg','From the Profile Statistics - AUC'),218])
+ tbl_AutosaveFields.add_row(['~aucbase',QApplication.translate('HelpDlg','From the Profile Statistics - AUC Base'),300])
+ tbl_AutosaveFields.add_row(['~mode',QApplication.translate('HelpDlg','From Config>Temperature - the current temperature mode C or F. '),'F'])
+ tbl_AutosaveFields.add_row(['~chargeet',QApplication.translate('HelpDlg','From the Profile - ET at CHARGE'),379.4])
+ tbl_AutosaveFields.add_row(['~chargebt',QApplication.translate('HelpDlg','From the Profile - BT at CHARGE'),375.2])
+ tbl_AutosaveFields.add_row(['~fcset',QApplication.translate('HelpDlg','From the Profile - ET at FCs'),397.4])
+ tbl_AutosaveFields.add_row(['~fcsbt',QApplication.translate('HelpDlg','From the Profile -BT at FCs'),386.7])
+ tbl_AutosaveFields.add_row(['~fcstime',QApplication.translate('HelpDlg','From the Profile - FCs time in seconds'),490])
+ tbl_AutosaveFields.add_row(['~fcstime_long',QApplication.translate('HelpDlg','From the Profile - FCs time in min_secs'),'08_10'])
+ tbl_AutosaveFields.add_row(['~dropet',QApplication.translate('HelpDlg','From the Profile - ET at DROP'),378.6])
+ tbl_AutosaveFields.add_row(['~dropbt',QApplication.translate('HelpDlg','From the Profile - BT at DROP'),412.5])
+ tbl_AutosaveFields.add_row(['~droptime',QApplication.translate('HelpDlg','From the Profile - DROP time in seconds'),617])
+ tbl_AutosaveFields.add_row(['~droptime_long',QApplication.translate('HelpDlg','From the Profile - DROP time in min_secs'),'10_17'])
+ tbl_AutosaveFields.add_row(['~dryphasedeltatemp',QApplication.translate('HelpDlg','From the Profile - BT temperature change from TP to DRY'),121.3])
+ tbl_AutosaveFields.add_row(['~midphasedeltatemp',QApplication.translate('HelpDlg','From the Profile - BT temperature change from DRY to FCs'),78.6])
+ tbl_AutosaveFields.add_row(['~finishphasedeltatemp',QApplication.translate('HelpDlg','From the Profile - BT temperature change from FCs to DROP'),19.8])
+ tbl_AutosaveFields.add_row(['~roastingnotes_nn',QApplication.translate('HelpDlg','Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Roasting Notes field.\nFrom Roast>Properties>Roasting Notes'),'No crash, '])
+ tbl_AutosaveFields.add_row(['~roastingnotes_line',QApplication.translate('HelpDlg','The entire first line From Roast>Properties>Roasting Notes'),'No crash, maintained RoR'])
+ tbl_AutosaveFields.add_row(['~cuppingnotes_nn',QApplication.translate('HelpDlg','Replace “nn” with 10, 15, 20, 25, or 30 to show the first “nn” characters of the Cupping Notes field.\nFrom Roast>Properties>Cupping Notes'),'Lots of be'])
+ tbl_AutosaveFields.add_row(['~cuppingnotes_line',QApplication.translate('HelpDlg','The entire first line From Roast>Properties>Cupping Notes'),'Lots of berries and chocolate'])
+ tbl_AutosaveFields.add_row(['~btubatch',QApplication.translate('HelpDlg','From the Profile Energy Use - Total energy used by the batch in BTU'),8943.2])
+ tbl_AutosaveFields.add_row(['~co2batch',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced by the batch in g'),923.3])
+ tbl_AutosaveFields.add_row(['~btupreheat',QApplication.translate('HelpDlg','From the Profile Energy Use - Energy used during preheat in BTU'),2538.8])
+ tbl_AutosaveFields.add_row(['~co2preheat',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced during preheat in g'),443.9])
+ tbl_AutosaveFields.add_row(['~btubbp',QApplication.translate('HelpDlg','From the Profile Energy Use - Energy used during Between Batch Protocol in BTU'),1019.7])
+ tbl_AutosaveFields.add_row(['~co2bbp',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced during Between Batch Protocol in g'),254.1])
+ tbl_AutosaveFields.add_row(['~bturoast',QApplication.translate('HelpDlg','From the Profile Energy Use - Energy used from CHARGE to DROP in BTU'),7843.2])
+ tbl_AutosaveFields.add_row(['~co2roast',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced from CHARGE to DROP in g'),873.9])
+ tbl_AutosaveFields.add_row(['~co2pergreenkg',QApplication.translate('HelpDlg','From the Profile Energy Use - CO2 produced per kg of green beans in g'),354.3])
+ strlist.append(tbl_AutosaveFields.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_AutosaveFieldsbottom = prettytable.PrettyTable()
+ tbl_AutosaveFieldsbottom.header = False
+ tbl_AutosaveFieldsbottom.add_row(['NOTES:\nAnything between single quotes ' will show in the file name only when ON.\nExample: 'REC ~batch'\n\nAnything between double quotes " will show in the file name only when OFF. \nExample: "~operator"\n\nFor backward compatibility, when the Prefix field is text only the date and time are appended to the file name.\nExample: 'Autosave' will result in file name 'Autosave_20-01-13_1705'.\nTo show only the text place a single '!' at the start of the Prefix field\nExample: '!Autosave' will result in file name 'Autosave'.\n\nTo maintain cross platform compatibility, file names may contain only letters, numbers, spaces, \nand the following special characters: \n_ - . ( )'])
+ strlist.append(tbl_AutosaveFieldsbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','EXAMPLES'))
+ strlist.append('')
+ tbl_Examplestop = prettytable.PrettyTable()
+ tbl_Examplestop.header = False
+ tbl_Examplestop.add_row([QApplication.translate('HelpDlg','Data used to replace the fields in the Autosave File Name Prefix are pulled from the current Roast Properties. ')])
+ strlist.append(tbl_Examplestop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Examples = prettytable.PrettyTable()
+ tbl_Examples.field_names = [QApplication.translate('HelpDlg','Autosave Field'),QApplication.translate('HelpDlg','Example File Name')]
+ tbl_Examples.add_row(['~title Roasted on ~date','Burundi Roasted on 20-04-25.alog'])
+ tbl_Examples.add_row(['~batchcounter ~title ~date_long','1380 Burundi 2020-04-25_1136.alog'])
+ tbl_Examples.add_row(['~beans ~machine ~drumspeedRPM ~weight~weightunits ~poisturePCT ~operator ~date ~batch(~batchposition)','Burundi Kiganda Murambi Lot44 SF-25 64RPM 10.3Kg 10.2PCT Roberto 20-04-25 Prod-1380(6).alog'])
+ tbl_Examples.add_row(['~title ~weight~weightunits ~finishphase_deltatemp~mode','Burundi 454.0g 19.8F.alog'])
+ tbl_Examples.add_row(['\u0027Recording ~batchcounter' "~batch" ~title ~datetime_long','When OFF:\nProd-1380 Burundi Kiganda Murambi 2020-04-25_1136.alog\nWhile Recording:\nRecording 1380 Burundi KigandaMurambi 2020-04-25_1136.alog'])
+ tbl_Examples.add_row(['\u0027Recording ~batchcounter' "~batch" ~title ~date_long_'~currtime'"~time"','Creates a unique filename for multiple saves while sampling by using ~currtime.\nWhen OFF:\nProd-1380 Burundi Kiganda Murambi 2020-04-25_1136.alog\nWhile Recording. \nRecording 1380 Burundi KigandaMurambi 2020-04-25_113809.alog'])
+ strlist.append(tbl_Examples.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','Energy and CO2 Calculator'))
- strlist.append('')
- tbl_Introtop = prettytable.PrettyTable()
- tbl_Introtop.header = False
- tbl_Introtop.add_row([QApplication.translate('HelpDlg','The Energy tab displays a roast's energy consumption. CO2 emissions are also calculated to monitor the impact of the roasting operation. Settings must be made for each energy load. Loads are the main burners, motors and blowers, and an afterburner if one is used. The energy used for pre-heating, between batch, and roaster cooling protocols are included in the calculations, and settings are available for them as well.\n\nNote that pre-heating and roaster cooling energy values are applied to the first roast of a roasting session. Between batch energies are applied to every roast except the first. Tick the "Between batches after Pre-Heating box to apply the between batch value to the first roast.\n\nFollow the steps below to set the energy inputs for the roast machine and afterburner.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Blank entries are the same as a zero entry. Negative values are not allowed.')])
- strlist.append(tbl_Introtop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Introbottom = prettytable.PrettyTable()
- tbl_Introbottom.header = False
- tbl_Introbottom.add_row([QApplication.translate('HelpDlg','Once you set up the Loads sub-tab and the Protocols sub-tab, it is a good idea to click "Save Defaults" on both sub-tabs (they are saved separately). When loading a profile with existing energy values, the profile settings will be read and will overwrite the values on the Loads and Profiles sub-tabs. Having them saved as defaults allow for them to be quickly restored by clicking "Restore Defaults" on each sub-tab.')])
- strlist.append(tbl_Introbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','1. Details Sub-Tab'))
- strlist.append('')
- tbl_Detailstop = prettytable.PrettyTable()
- tbl_Detailstop.header = False
- tbl_Detailstop.add_row([QApplication.translate('HelpDlg','This sub-tab shows a detailed table of the energy consumption and CO2 production data for the roast. The values in this table are based on current Profile and the settings made on the Loads and Protocols sub-tabs. Columns may be sorted by clicking on the column title. To return to original sort click on the 'Kind' column title.')])
- strlist.append(tbl_Detailstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Details = prettytable.PrettyTable()
- tbl_Details.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
- tbl_Details.add_row([QApplication.translate('HelpDlg','Results in'),QApplication.translate('HelpDlg','Choose the energy units for the summary displays and the Details sub-tab.')])
- strlist.append(tbl_Details.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','2. Loads Sub-Tab'))
- strlist.append('')
- tbl_Loadstop = prettytable.PrettyTable()
- tbl_Loadstop.header = False
- tbl_Loadstop.add_row([QApplication.translate('HelpDlg','Begin by making entries on the Loads sub-tab to define the sources of energy used by this roast. It might be a good idea to save those settings as defaults to be used to calculate the energy consumption of future roasts')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Power ratings for up to four energy loads may be entered. Loads will be the main burners or heaters, motors and blowers, and the afterburner if one is used. Enter one load per line. Motors and blowers that run continuously may be aggregated and entered as one load.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Loads are assumed to run continuously. Variable loads, such as the main burner setting, can be recorded in Artisan using one of the four special events. The settings can be captured from a button, slider or in some cases read directly from the roaster. The load setup allows linking a load to one of these events. The energy calculator will then determine the setting percentage and the duration of the setting to calculate the energy consumed.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Burner entries require knowing the power rating of the burner. Roasting machine manufacturer's typically provide this information. If this information can not be found for your machine this table provides approximate values based on roaster capacities. https://artisan-scope.org/ratings/')])
- strlist.append(tbl_Loadstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Loads = prettytable.PrettyTable()
- tbl_Loads.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Label'),QApplication.translate('HelpDlg','Enter your personal description for this burner. Examples are 'Main' and 'Afterburner'.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Rating'),QApplication.translate('HelpDlg','This is the power rating of the load Choose the units in the next column. ')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Unit'),QApplication.translate('HelpDlg','Select the appropriate power unit. Some manufacturers incorrectly use BTU. In that case use BTU/h for the unit.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Fuel'),QApplication.translate('HelpDlg','Select the type of fuel used by this load 'Elec' is assumed to be electricity generated from dirty coal. There is a setting below to adjust for renewable clean energy sources.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Event'),QApplication.translate('HelpDlg','Special Events are often used to record load settings, such as a burner setting, in the roast profile. Select the Event that corresponds to the load setting here. \n\nWhen blank the load is assumed to be at a constant setting, which is the percent 'Value 100%' multiplied by the rating. A 10 kW load at '100% Value'= 60 would thus be 10 kW * 60% = 6 kW. Continuous loads are typically motors and blowers and the afterburner.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Pressure %'),QApplication.translate('HelpDlg','For gas loads tick this box when the readings are made in units of pressure. Some roasters and some controllers provide readings in heat energy. When the readings are made in heat energy leave this box unticked.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Value 0%'),QApplication.translate('HelpDlg','When an Event is selected in the previous column this value can be set to match the 0% burner setting to the event setting. In most cases a 0 Event value will correspond to the 0% load setting.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Value 100%'),QApplication.translate('HelpDlg','When an Event is selected this value can be set to match the 100% load setting to the event setting. This is useful when the 100% load setting is recorded as a different number in the Event. For instance, maybe the burner event is recorded as 10x the kPa reading on the gas manometer. An event value of 35 is recoded to signify 3.5 kPa, which is 50% pressure. If the 100% burner setting corresponds to 7 kPa then the 'Value 100%' should be set to 70, which is 7 * 10 = 70. Thus 3.5 kPa will be seen by he energy calculator as 50%. For pressure readings be sure to tick the Pressure box. Heat energy readings are normally 0%-100% and do not require any adjustment to this setting.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Electric Energy Mix'),QApplication.translate('HelpDlg','This setting allows to set a mix of renewable energy that sources the electric loads. 0% assumes all the energy comes from burning dirty coal and maximizes the CO2 in the calculations. 100% assumes the energy comes only from renewable sources with no CO2 produced.')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Save Defaults'),QApplication.translate('HelpDlg','Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file. ')])
- tbl_Loads.add_row([QApplication.translate('HelpDlg','Restore Defaults'),QApplication.translate('HelpDlg','Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.')])
- strlist.append(tbl_Loads.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','3. Protocol Sub-Tab'))
- strlist.append('')
- tbl_Protocoltop = prettytable.PrettyTable()
- tbl_Protocoltop.header = False
- tbl_Protocoltop.add_row([QApplication.translate('HelpDlg','The Protocol settings allow including Pre-Heating, Between Batch (BBP) and Cooling protocol energy consumption. There are two ways to specify these values. The first assumes a constant load setting for a defined period of time. An example for pre-heating is to set a Duration of 45:00 (45 minutes) at 30% Burner setting. Percentages must be entered with the percent sign (30%). When a percentage is entered a corresponding Duration must be entered.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','The second type of entry is a "measured" energy value. This can be any value greater than 1.0. Artisan can inspect the open profile to determine energy values for each Load that is associated with an Event on the Loads sub-tab. Click the [...] button for each Protocol to auto fill the Measured Energy fields. The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','To use the Artisan energy measurement feature you will need to record one or more profiles that include the protocol of interest. For example, to measure the Pre-Heating energy, START recording when the roaster is turned on. Let Artisan record the entire pre-heating procedure. At the end of the pre-heating you can either STOP recording the profile or go forward with the roast. The CHARGE event will mark the end of pre-heating when Artisan measures the pre-heat energy. Similarly a Between Batches protocol can be recorded with START followed by a normal roast. A Cooling protocol would be captured by not turning the Artisan recording OFF until the roaster is fully cooled.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.')])
- strlist.append(tbl_Protocoltop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Protocol = prettytable.PrettyTable()
- tbl_Protocol.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Pre-Heating'),QApplication.translate('HelpDlg','This row sets the values for pre-heating energy. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.\n\nPre-Heating energy is applied only to the first batch of a roasting session.')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Between Batches'),QApplication.translate('HelpDlg','This row sets the values for between batches protocol for the roasting session. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.\n\nBetween Batches energy is applied to each batch of the roasting session, except the first batch. Tick the 'Between Batches after Pre-Heating' box to apply Between Batches energies to the first batch of the session too.')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Cooling'),QApplication.translate('HelpDlg','This row sets the values for the energy used for cooling. Most common loads are motors and blowers that consume energy during the roaster cool down period. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.\n\nPre-Heating energy is applied only to the first batch of a roasting session.')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Duration'),QApplication.translate('HelpDlg','The length (mm:ss) of protocol. It is used with a burner's percentage setting to calculate the energy consumed by that burner. When a percentage entry is made for the burner, the Duration field must be set.')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Measured Energy or Output %'),QApplication.translate('HelpDlg','The value is either the measured energy for the protocol or the burner constant percentage setting for the length of the Duration field.')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Measure Profile [...]'),QApplication.translate('HelpDlg','Energy is measured from the open profile for each load where an event is specified on the Loads tab. Click OK to auto fill in the associated Measured Energy field.')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Between Batches after Pre-Heating'),QApplication.translate('HelpDlg','This box should be ticked when a Between Batches protocol run is done after the Pre-heating and before the roast.')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Save Defaults'),QApplication.translate('HelpDlg','Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file. ')])
- tbl_Protocol.add_row([QApplication.translate('HelpDlg','Restore Defaults'),QApplication.translate('HelpDlg','Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.')])
- strlist.append(tbl_Protocol.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','Energy and CO2 Calculator'))
+ strlist.append('')
+ tbl_Introtop = prettytable.PrettyTable()
+ tbl_Introtop.header = False
+ tbl_Introtop.add_row([QApplication.translate('HelpDlg','The Energy tab displays a roast's energy consumption. CO2 emissions are also calculated to monitor the impact of the roasting operation. Settings must be made for each energy load. Loads are the main burners, motors and blowers, and an afterburner if one is used. The energy used for pre-heating, between batch, and roaster cooling protocols are included in the calculations, and settings are available for them as well.\n\nNote that pre-heating and roaster cooling energy values are applied to the first roast of a roasting session. Between batch energies are applied to every roast except the first. Tick the "Between batches after Pre-Heating box to apply the between batch value to the first roast.\n\nFollow the steps below to set the energy inputs for the roast machine and afterburner.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Blank entries are the same as a zero entry. Negative values are not allowed.')])
+ strlist.append(tbl_Introtop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Introbottom = prettytable.PrettyTable()
+ tbl_Introbottom.header = False
+ tbl_Introbottom.add_row([QApplication.translate('HelpDlg','Once you set up the Loads sub-tab and the Protocols sub-tab, it is a good idea to click "Save Defaults" on both sub-tabs (they are saved separately). When loading a profile with existing energy values, the profile settings will be read and will overwrite the values on the Loads and Profiles sub-tabs. Having them saved as defaults allow for them to be quickly restored by clicking "Restore Defaults" on each sub-tab.')])
+ strlist.append(tbl_Introbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','1. Details Sub-Tab'))
+ strlist.append('')
+ tbl_Detailstop = prettytable.PrettyTable()
+ tbl_Detailstop.header = False
+ tbl_Detailstop.add_row([QApplication.translate('HelpDlg','This sub-tab shows a detailed table of the energy consumption and CO2 production data for the roast. The values in this table are based on current Profile and the settings made on the Loads and Protocols sub-tabs. Columns may be sorted by clicking on the column title. To return to original sort click on the 'Kind' column title.')])
+ strlist.append(tbl_Detailstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Details = prettytable.PrettyTable()
+ tbl_Details.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
+ tbl_Details.add_row([QApplication.translate('HelpDlg','Results in'),QApplication.translate('HelpDlg','Choose the energy units for the summary displays and the Details sub-tab.')])
+ strlist.append(tbl_Details.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','2. Loads Sub-Tab'))
+ strlist.append('')
+ tbl_Loadstop = prettytable.PrettyTable()
+ tbl_Loadstop.header = False
+ tbl_Loadstop.add_row([QApplication.translate('HelpDlg','Begin by making entries on the Loads sub-tab to define the sources of energy used by this roast. It might be a good idea to save those settings as defaults to be used to calculate the energy consumption of future roasts')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Power ratings for up to four energy loads may be entered. Loads will be the main burners or heaters, motors and blowers, and the afterburner if one is used. Enter one load per line. Motors and blowers that run continuously may be aggregated and entered as one load.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Loads are assumed to run continuously. Variable loads, such as the main burner setting, can be recorded in Artisan using one of the four special events. The settings can be captured from a button, slider or in some cases read directly from the roaster. The load setup allows linking a load to one of these events. The energy calculator will then determine the setting percentage and the duration of the setting to calculate the energy consumed.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Burner entries require knowing the power rating of the burner. Roasting machine manufacturer's typically provide this information. If this information can not be found for your machine this table provides approximate values based on roaster capacities. https://artisan-scope.org/ratings/')])
+ strlist.append(tbl_Loadstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Loads = prettytable.PrettyTable()
+ tbl_Loads.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Label'),QApplication.translate('HelpDlg','Enter your personal description for this burner. Examples are 'Main' and 'Afterburner'.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Rating'),QApplication.translate('HelpDlg','This is the power rating of the load Choose the units in the next column. ')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Unit'),QApplication.translate('HelpDlg','Select the appropriate power unit. Some manufacturers incorrectly use BTU. In that case use BTU/h for the unit.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Fuel'),QApplication.translate('HelpDlg','Select the type of fuel used by this load 'Elec' is assumed to be electricity generated from dirty coal. There is a setting below to adjust for renewable clean energy sources.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Event'),QApplication.translate('HelpDlg','Special Events are often used to record load settings, such as a burner setting, in the roast profile. Select the Event that corresponds to the load setting here. \n\nWhen blank the load is assumed to be at a constant setting, which is the percent 'Value 100%' multiplied by the rating. A 10 kW load at '100% Value'= 60 would thus be 10 kW * 60% = 6 kW. Continuous loads are typically motors and blowers and the afterburner.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Pressure %'),QApplication.translate('HelpDlg','For gas loads tick this box when the readings are made in units of pressure. Some roasters and some controllers provide readings in heat energy. When the readings are made in heat energy leave this box unticked.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Value 0%'),QApplication.translate('HelpDlg','When an Event is selected in the previous column this value can be set to match the 0% burner setting to the event setting. In most cases a 0 Event value will correspond to the 0% load setting.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Value 100%'),QApplication.translate('HelpDlg','When an Event is selected this value can be set to match the 100% load setting to the event setting. This is useful when the 100% load setting is recorded as a different number in the Event. For instance, maybe the burner event is recorded as 10x the kPa reading on the gas manometer. An event value of 35 is recoded to signify 3.5 kPa, which is 50% pressure. If the 100% burner setting corresponds to 7 kPa then the 'Value 100%' should be set to 70, which is 7 * 10 = 70. Thus 3.5 kPa will be seen by he energy calculator as 50%. For pressure readings be sure to tick the Pressure box. Heat energy readings are normally 0%-100% and do not require any adjustment to this setting.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Electric Energy Mix'),QApplication.translate('HelpDlg','This setting allows to set a mix of renewable energy that sources the electric loads. 0% assumes all the energy comes from burning dirty coal and maximizes the CO2 in the calculations. 100% assumes the energy comes only from renewable sources with no CO2 produced.')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Save Defaults'),QApplication.translate('HelpDlg','Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file. ')])
+ tbl_Loads.add_row([QApplication.translate('HelpDlg','Restore Defaults'),QApplication.translate('HelpDlg','Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.')])
+ strlist.append(tbl_Loads.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','3. Protocol Sub-Tab'))
+ strlist.append('')
+ tbl_Protocoltop = prettytable.PrettyTable()
+ tbl_Protocoltop.header = False
+ tbl_Protocoltop.add_row([QApplication.translate('HelpDlg','The Protocol settings allow including Pre-Heating, Between Batch (BBP) and Cooling protocol energy consumption. There are two ways to specify these values. The first assumes a constant load setting for a defined period of time. An example for pre-heating is to set a Duration of 45:00 (45 minutes) at 30% Burner setting. Percentages must be entered with the percent sign (30%). When a percentage is entered a corresponding Duration must be entered.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','The second type of entry is a "measured" energy value. This can be any value greater than 1.0. Artisan can inspect the open profile to determine energy values for each Load that is associated with an Event on the Loads sub-tab. Click the [...] button for each Protocol to auto fill the Measured Energy fields. The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','To use the Artisan energy measurement feature you will need to record one or more profiles that include the protocol of interest. For example, to measure the Pre-Heating energy, START recording when the roaster is turned on. Let Artisan record the entire pre-heating procedure. At the end of the pre-heating you can either STOP recording the profile or go forward with the roast. The CHARGE event will mark the end of pre-heating when Artisan measures the pre-heat energy. Similarly a Between Batches protocol can be recorded with START followed by a normal roast. A Cooling protocol would be captured by not turning the Artisan recording OFF until the roaster is fully cooled.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','The Artisan measurements for Pre-Heating and Between Batches are made from the start of the profile until CHARGE. If there is no CHARGE event the measurement is from the start to the end of profile. The values measured for Pre-Heating and Between Batches are the same. Be sure you do not use the same profile to enter both values. The Cooling energy is measured from DROP to the end of the profile. If there is no DROP event the measurement begins at CHARGE. If there is no CHARGE event the measurement is from the start to the end of the profile.')])
+ strlist.append(tbl_Protocoltop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Protocol = prettytable.PrettyTable()
+ tbl_Protocol.field_names = [QApplication.translate('HelpDlg','Field'),QApplication.translate('HelpDlg','Description')]
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Pre-Heating'),QApplication.translate('HelpDlg','This row sets the values for pre-heating energy. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.\n\nPre-Heating energy is applied only to the first batch of a roasting session.')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Between Batches'),QApplication.translate('HelpDlg','This row sets the values for between batches protocol for the roasting session. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.\n\nBetween Batches energy is applied to each batch of the roasting session, except the first batch. Tick the 'Between Batches after Pre-Heating' box to apply Between Batches energies to the first batch of the session too.')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Cooling'),QApplication.translate('HelpDlg','This row sets the values for the energy used for cooling. Most common loads are motors and blowers that consume energy during the roaster cool down period. Percentage or measured values may be entered for each burner. When a percentage is used the Duration field must be set.\n\nPre-Heating energy is applied only to the first batch of a roasting session.')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Duration'),QApplication.translate('HelpDlg','The length (mm:ss) of protocol. It is used with a burner's percentage setting to calculate the energy consumed by that burner. When a percentage entry is made for the burner, the Duration field must be set.')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Measured Energy or Output %'),QApplication.translate('HelpDlg','The value is either the measured energy for the protocol or the burner constant percentage setting for the length of the Duration field.')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Measure Profile [...]'),QApplication.translate('HelpDlg','Energy is measured from the open profile for each load where an event is specified on the Loads tab. Click OK to auto fill in the associated Measured Energy field.')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Between Batches after Pre-Heating'),QApplication.translate('HelpDlg','This box should be ticked when a Between Batches protocol run is done after the Pre-heating and before the roast.')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Save Defaults'),QApplication.translate('HelpDlg','Stores the current settings on this sub-tab as defaults to be recalled later. The default values will be stored when saving settings (Help>Save Settings) to a file. ')])
+ tbl_Protocol.add_row([QApplication.translate('HelpDlg','Restore Defaults'),QApplication.translate('HelpDlg','Overwrites the values on this sub-tab with those stored as the defaults. When a profile with energy settings is opened, the values on this tab will be read from the profile. They will be overwritten when clicking Restore Defaults.')])
+ strlist.append(tbl_Protocol.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','EVENT ANNOTATIONS'))
- strlist.append('')
- tbl_Annotations = prettytable.PrettyTable()
- tbl_Annotations.field_names = [QApplication.translate('HelpDlg','Prefix Field'),QApplication.translate('HelpDlg','Source'),QApplication.translate('HelpDlg','Example')]
- tbl_Annotations.add_row(['~E',QApplication.translate('HelpDlg','The value of Event'),60])
- tbl_Annotations.add_row(['~Y1',QApplication.translate('HelpDlg','ET value'),420])
- tbl_Annotations.add_row(['~Y2',QApplication.translate('HelpDlg','BT value'),372])
- tbl_Annotations.add_row(['~descr',QApplication.translate('HelpDlg','The Description field of the Event'),'Gas 10'])
- tbl_Annotations.add_row(['~type',QApplication.translate('HelpDlg','The Type field of the Event'),'Power'])
- tbl_Annotations.add_row(['~sldrunit',QApplication.translate('HelpDlg','The value of the Slider Unit for this Event'),'kPa'])
- tbl_Annotations.add_row(['~dCHARGE',QApplication.translate('HelpDlg','Number of seconds before or after CHARGE \nBefore CHARGE shows negative \nDisplays '*' when no CHARGE event exists'),522])
- tbl_Annotations.add_row(['~dCHARGE_ms',QApplication.translate('HelpDlg','Time before or after CHARGE in min:sec \nBefore CHARGE shows negative \nDisplays '*' when no CHARGE event exists'),'8:42'])
- tbl_Annotations.add_row(['~dFCs',QApplication.translate('HelpDlg','Number of seconds before or after FCs \nBest used inside double quotes (see notes below) \nNegative value before FCs \nDisplays '*' when no FCs event exists'),47])
- tbl_Annotations.add_row(['~dFCs_ms',QApplication.translate('HelpDlg','Time after FCs in min:sec \nBest used inside double quotes (see notes below) \nNegative value before FCs \nDisplays '*' when no FCs event exists'),'1:35'])
- tbl_Annotations.add_row(['~preFCs',QApplication.translate('HelpDlg','Number of seconds before FCs \nBest used inside single quotes or back ticks (see notes below) \nPositive value only \nDisplays '*' after FCs or when no FCs event exists'),50])
- tbl_Annotations.add_row(['~preFCs_ms',QApplication.translate('HelpDlg','Time before FCs in min:sec \nBest used inside single quotes or back ticks (see notes below) \nPositive value only \nDisplays '*' after FCs or when no FCs event exists'),'1:25'])
- tbl_Annotations.add_row(['~DTR',QApplication.translate('HelpDlg','Development time ratio (percent). Note: DTR=0 before FCs \n100*(t{Event}-t{FCs})/(t{FCs}-t{CHARGE})'),12])
- tbl_Annotations.add_row(['~deg',QApplication.translate('HelpDlg','The degree symbol'),'\u00b0'])
- tbl_Annotations.add_row(['~mode',QApplication.translate('HelpDlg','Temperature mode ('C' or 'F')'),'F'])
- tbl_Annotations.add_row(['~degmode',QApplication.translate('HelpDlg','Degree symbol with Temperature mode'),'\u00b0C'])
- tbl_Annotations.add_row(['~R1',QApplication.translate('HelpDlg','ET RoR value\nDisplays '--' when the RoR value is not available.'),9.9])
- tbl_Annotations.add_row(['~R2',QApplication.translate('HelpDlg','BT RoR value\nShows '--' when the RoR value Is not available.'),18.2])
- tbl_Annotations.add_row(['~degmin',QApplication.translate('HelpDlg','RoR units\nShorthand for '~deg~mode/min''),'\u00b0C/min'])
- tbl_Annotations.add_row(['~R1degmin',QApplication.translate('HelpDlg','ET RoR with units\nField is hidden when the RoR value is not available.'),'9.9\u00b0C/min'])
- tbl_Annotations.add_row(['~R2degmin',QApplication.translate('HelpDlg','BT RoR with units\nField is hidden when the RoR value is not available.'),'18.2\u00b0C/min'])
- tbl_Annotations.add_row(['~quot',QApplication.translate('HelpDlg','Quote symbol'),'"'])
- tbl_Annotations.add_row(['~squot',QApplication.translate('HelpDlg','Single quote symbol'),'''])
- strlist.append(tbl_Annotations.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','EXAMPLES'))
- strlist.append('')
- tbl_Examplestop = prettytable.PrettyTable()
- tbl_Examplestop.header = False
- tbl_Examplestop.add_row([QApplication.translate('HelpDlg','Assumptions: The event value is 50. In the case of Gas the value 50 corresponds to either 5.0kPh or 50%. \nFor a sensory milestone (see notes above) the value 50 corresponds to the "Hay" aroma. ')])
- strlist.append(tbl_Examplestop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Examples = prettytable.PrettyTable()
- tbl_Examples.field_names = [QApplication.translate('HelpDlg','Annotation Field'),QApplication.translate('HelpDlg','Displays')]
- tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E @~Y2~degmode'),QApplication.translate('HelpDlg','Gas 50 @340\u00b0F')])
- tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E% @~Y2~mode'),QApplication.translate('HelpDlg','Gas 50% @340F')])
- tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E/10kPh @~Y2~mode'),QApplication.translate('HelpDlg','Gas 5.0kPh @340F')])
- tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E/10kPh @~Y2~mode and ~R2~degmin'),QApplication.translate('HelpDlg','Gas 5.0kPh @340F and 32.8\u00b0F/min')])
- tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E% '@~Y2 ~degmode'"@~DTR% DTR"'),QApplication.translate('HelpDlg','Before FCs:\nGas 50% @340 \u00b0F\n\nAfter FCs:\nGas 50% @12% DTR')])
- tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E% '@~Y2 ~degmode`, ~preFCs sec before FCs`'"@~DTR% DTR"'),QApplication.translate('HelpDlg','More than 90 seconds before FCs:\nGas 50% @340 \u00b0F\n\nLess than 90 seconds before FCs:\nGas 50% @340 \u00b0F, 50 sec before FCs \n\nAfter FCs:\nGas 50% @12% DTR')])
- tbl_Examples.add_row([QApplication.translate('HelpDlg','{20Fresh Cut Grass|50Hay|80Baking Bread|100A Point} @~Y2~degmode'),QApplication.translate('HelpDlg','Hay @340 \u00b0F')])
- strlist.append(tbl_Examples.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','NOTES:'))
- strlist.append('')
- tbl_Notes = prettytable.PrettyTable()
- tbl_Notes.field_names = [' ']
- tbl_Notes.add_row([QApplication.translate('HelpDlg','Event annotations apply only for 'Step' and 'Step+' Events settings')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','Anything between double quotes " will show only after FCs. Example: "~E1 @~DTR%"')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','Anything between single quotes ' will show only before FCs. Example: '~E1 @~degmode'')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','Anything between back ticks ` will show only within 90 seconds before FCs. Example: `~E1 `FCs~dFCs sec`')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','When combining back ticks with single or double quotes the back ticks should be inside the quotes.')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','Background event annotations can be seen during a roast when 'Annotations' is checked in the Profile Background window.')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','Simple scaling of the event value is possible. Use a single math operator ('*', '/', '+' or '-') immediately following the field name "E". For example: \n'~E/10' will divide the E value by 10. \n'~E+5' adds 5 to the the value of E.')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','Another style of annotations allows to replace an event's numeric value with a text string, known as a nominal value. One example where this can be useful is when an event is used to record sensory milestones. The value 20 might be used for 'Fresh Cut Grass' aroma, 50 for 'Hay', 80 for 'Baking Bread', and 100 to represent the 'A Point'. \n\nThis form of annotation must be enclosed in curly brackets '{}'. Entries are numeric values immediately followed by their nominal representation text. Entries are separated by the vertical bar '|'. The following Annotation string implements this example. \n{~E|20Fresh Cut Grass|50Hay|80Baking Bread|100A Point} \n\nNote that if the event value does not match any value in the Annotation definition a blank string will be returned. In the example above an event value of 30 will return a blank string. The easiest way to ensure these values match is to use Custom Buttons to for the Event.')])
- tbl_Notes.add_row([QApplication.translate('HelpDlg','When annotations overlap to the point they can not be read, try reducing the value of the 'Allowed Annotation Overlap' found on the Annotations configuration page. The default value for this setting is 100%.')])
- strlist.append(tbl_Notes.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','EVENT ANNOTATIONS'))
+ strlist.append('')
+ tbl_Annotations = prettytable.PrettyTable()
+ tbl_Annotations.field_names = [QApplication.translate('HelpDlg','Prefix Field'),QApplication.translate('HelpDlg','Source'),QApplication.translate('HelpDlg','Example')]
+ tbl_Annotations.add_row(['~E',QApplication.translate('HelpDlg','The value of Event'),60])
+ tbl_Annotations.add_row(['~Y1',QApplication.translate('HelpDlg','ET value'),420])
+ tbl_Annotations.add_row(['~Y2',QApplication.translate('HelpDlg','BT value'),372])
+ tbl_Annotations.add_row(['~descr',QApplication.translate('HelpDlg','The Description field of the Event'),'Gas 10'])
+ tbl_Annotations.add_row(['~type',QApplication.translate('HelpDlg','The Type field of the Event'),'Power'])
+ tbl_Annotations.add_row(['~sldrunit',QApplication.translate('HelpDlg','The value of the Slider Unit for this Event'),'kPa'])
+ tbl_Annotations.add_row(['~dCHARGE',QApplication.translate('HelpDlg','Number of seconds before or after CHARGE \nBefore CHARGE shows negative \nDisplays '*' when no CHARGE event exists'),522])
+ tbl_Annotations.add_row(['~dCHARGE_ms',QApplication.translate('HelpDlg','Time before or after CHARGE in min:sec \nBefore CHARGE shows negative \nDisplays '*' when no CHARGE event exists'),'8:42'])
+ tbl_Annotations.add_row(['~dFCs',QApplication.translate('HelpDlg','Number of seconds before or after FCs \nBest used inside double quotes (see notes below) \nNegative value before FCs \nDisplays '*' when no FCs event exists'),47])
+ tbl_Annotations.add_row(['~dFCs_ms',QApplication.translate('HelpDlg','Time after FCs in min:sec \nBest used inside double quotes (see notes below) \nNegative value before FCs \nDisplays '*' when no FCs event exists'),'1:35'])
+ tbl_Annotations.add_row(['~preFCs',QApplication.translate('HelpDlg','Number of seconds before FCs \nBest used inside single quotes or back ticks (see notes below) \nPositive value only \nDisplays '*' after FCs or when no FCs event exists'),50])
+ tbl_Annotations.add_row(['~preFCs_ms',QApplication.translate('HelpDlg','Time before FCs in min:sec \nBest used inside single quotes or back ticks (see notes below) \nPositive value only \nDisplays '*' after FCs or when no FCs event exists'),'1:25'])
+ tbl_Annotations.add_row(['~DTR',QApplication.translate('HelpDlg','Development time ratio (percent). Note: DTR=0 before FCs \n100*(t{Event}-t{FCs})/(t{FCs}-t{CHARGE})'),12])
+ tbl_Annotations.add_row(['~deg',QApplication.translate('HelpDlg','The degree symbol'),'\u00b0'])
+ tbl_Annotations.add_row(['~mode',QApplication.translate('HelpDlg','Temperature mode ('C' or 'F')'),'F'])
+ tbl_Annotations.add_row(['~degmode',QApplication.translate('HelpDlg','Degree symbol with Temperature mode'),'\u00b0C'])
+ tbl_Annotations.add_row(['~R1',QApplication.translate('HelpDlg','ET RoR value\nDisplays '--' when the RoR value is not available.'),9.9])
+ tbl_Annotations.add_row(['~R2',QApplication.translate('HelpDlg','BT RoR value\nShows '--' when the RoR value Is not available.'),18.2])
+ tbl_Annotations.add_row(['~degmin',QApplication.translate('HelpDlg','RoR units\nShorthand for '~deg~mode/min''),'\u00b0C/min'])
+ tbl_Annotations.add_row(['~R1degmin',QApplication.translate('HelpDlg','ET RoR with units\nField is hidden when the RoR value is not available.'),'9.9\u00b0C/min'])
+ tbl_Annotations.add_row(['~R2degmin',QApplication.translate('HelpDlg','BT RoR with units\nField is hidden when the RoR value is not available.'),'18.2\u00b0C/min'])
+ tbl_Annotations.add_row(['~quot',QApplication.translate('HelpDlg','Quote symbol'),'"'])
+ tbl_Annotations.add_row(['~squot',QApplication.translate('HelpDlg','Single quote symbol'),'''])
+ strlist.append(tbl_Annotations.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','EXAMPLES'))
+ strlist.append('')
+ tbl_Examplestop = prettytable.PrettyTable()
+ tbl_Examplestop.header = False
+ tbl_Examplestop.add_row([QApplication.translate('HelpDlg','Assumptions: The event value is 50. In the case of Gas the value 50 corresponds to either 5.0kPh or 50%. \nFor a sensory milestone (see notes above) the value 50 corresponds to the "Hay" aroma. ')])
+ strlist.append(tbl_Examplestop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Examples = prettytable.PrettyTable()
+ tbl_Examples.field_names = [QApplication.translate('HelpDlg','Annotation Field'),QApplication.translate('HelpDlg','Displays')]
+ tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E @~Y2~degmode'),QApplication.translate('HelpDlg','Gas 50 @340\u00b0F')])
+ tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E% @~Y2~mode'),QApplication.translate('HelpDlg','Gas 50% @340F')])
+ tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E/10kPh @~Y2~mode'),QApplication.translate('HelpDlg','Gas 5.0kPh @340F')])
+ tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E/10kPh @~Y2~mode and ~R2~degmin'),QApplication.translate('HelpDlg','Gas 5.0kPh @340F and 32.8\u00b0F/min')])
+ tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E% '@~Y2 ~degmode'"@~DTR% DTR"'),QApplication.translate('HelpDlg','Before FCs:\nGas 50% @340 \u00b0F\n\nAfter FCs:\nGas 50% @12% DTR')])
+ tbl_Examples.add_row([QApplication.translate('HelpDlg','Gas ~E% '@~Y2 ~degmode`, ~preFCs sec before FCs`'"@~DTR% DTR"'),QApplication.translate('HelpDlg','More than 90 seconds before FCs:\nGas 50% @340 \u00b0F\n\nLess than 90 seconds before FCs:\nGas 50% @340 \u00b0F, 50 sec before FCs \n\nAfter FCs:\nGas 50% @12% DTR')])
+ tbl_Examples.add_row([QApplication.translate('HelpDlg','{20Fresh Cut Grass|50Hay|80Baking Bread|100A Point} @~Y2~degmode'),QApplication.translate('HelpDlg','Hay @340 \u00b0F')])
+ strlist.append(tbl_Examples.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','NOTES:'))
+ strlist.append('')
+ tbl_Notes = prettytable.PrettyTable()
+ tbl_Notes.field_names = [' ']
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','Event annotations apply only for 'Step' and 'Step+' Events settings')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','Anything between double quotes " will show only after FCs. Example: "~E1 @~DTR%"')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','Anything between single quotes ' will show only before FCs. Example: '~E1 @~degmode'')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','Anything between back ticks ` will show only within 90 seconds before FCs. Example: `~E1 `FCs~dFCs sec`')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','When combining back ticks with single or double quotes the back ticks should be inside the quotes.')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','Background event annotations can be seen during a roast when 'Annotations' is checked in the Profile Background window.')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','Simple scaling of the event value is possible. Use a single math operator ('*', '/', '+' or '-') immediately following the field name "E". For example: \n'~E/10' will divide the E value by 10. \n'~E+5' adds 5 to the the value of E.')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','Another style of annotations allows to replace an event's numeric value with a text string, known as a nominal value. One example where this can be useful is when an event is used to record sensory milestones. The value 20 might be used for 'Fresh Cut Grass' aroma, 50 for 'Hay', 80 for 'Baking Bread', and 100 to represent the 'A Point'. \n\nThis form of annotation must be enclosed in curly brackets '{}'. Entries are numeric values immediately followed by their nominal representation text. Entries are separated by the vertical bar '|'. The following Annotation string implements this example. \n{~E|20Fresh Cut Grass|50Hay|80Baking Bread|100A Point} \n\nNote that if the event value does not match any value in the Annotation definition a blank string will be returned. In the example above an event value of 30 will return a blank string. The easiest way to ensure these values match is to use Custom Buttons to for the Event.')])
+ tbl_Notes.add_row([QApplication.translate('HelpDlg','When annotations overlap to the point they can not be read, try reducing the value of the 'Allowed Annotation Overlap' found on the Annotations configuration page. The default value for this setting is 100%.')])
+ strlist.append(tbl_Notes.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','EVENT CUSTOM BUTTONS'))
- strlist.append('')
- tbl_Buttonstop = prettytable.PrettyTable()
- tbl_Buttonstop.header = False
- tbl_Buttonstop.add_row([QApplication.translate('HelpDlg','Button numbers can be drag and dropped to a new position. While holding the ALT key (Windows) / OPTION (macOS) buttons are swapped\n')])
- strlist.append(tbl_Buttonstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Buttons = prettytable.PrettyTable()
- tbl_Buttons.field_names = [QApplication.translate('HelpDlg','Column'),QApplication.translate('HelpDlg','Description')]
- tbl_Buttons.add_row([QApplication.translate('HelpDlg','Button Label'),QApplication.translate('HelpDlg','Enter \\n to create labels with multiple lines. \\t is substituted by the event type.')])
- tbl_Buttons.add_row([QApplication.translate('HelpDlg','Event Description'),QApplication.translate('HelpDlg','Description of the Event to be recorded.')])
- tbl_Buttons.add_row([QApplication.translate('HelpDlg','Event Type'),QApplication.translate('HelpDlg','Event type to be recorded or leave blank for no event. \u0027\u00B1\u0027 types add a chosen offset (positive or negative) to the present value of the chosen event.')])
- tbl_Buttons.add_row([QApplication.translate('HelpDlg','Event Value'),QApplication.translate('HelpDlg','Value of event (1-100) to be recorded.')])
- tbl_Buttons.add_row([QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Perform an action at the time of the event.')])
- tbl_Buttons.add_row([QApplication.translate('HelpDlg','Documentation'),QApplication.translate('HelpDlg','The action Command. Depends on the action type, '{}' is replaced by the event value and the offset in case of a \u00B1 event type.')])
- tbl_Buttons.add_row([QApplication.translate('HelpDlg','Button Visibility'),QApplication.translate('HelpDlg','Hides/shows individual button.')])
- strlist.append(tbl_Buttons.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','EVENT BUTTONS CONFIGURATION OPTIONS'))
- strlist.append('')
- tbl_Options = prettytable.PrettyTable()
- tbl_Options.field_names = [QApplication.translate('HelpDlg','Option'),QApplication.translate('HelpDlg','Description')]
- tbl_Options.add_row([QApplication.translate('HelpDlg','Max buttons per row'),QApplication.translate('HelpDlg','Sets a maximum number of buttons to display on a single row.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Button size'),QApplication.translate('HelpDlg','Sets a size for the buttons. Choices are tiny, small and large.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Color Pattern'),QApplication.translate('HelpDlg','Applies one of 99 autogenerated color patterns to the buttons. Set to "0" to manually choose the button colors.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Mark Last Pressed'),QApplication.translate('HelpDlg','Invert state and color of last button pressed')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Tooltips'),QApplication.translate('HelpDlg','Show button specification as tooltips on hovering a button')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Add'),QApplication.translate('HelpDlg','Adds a new button to the bottom of the table.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Insert'),QApplication.translate('HelpDlg','Inserts a new button above the selected button.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Delete'),QApplication.translate('HelpDlg','Deletes the selected button.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Copy Table'),QApplication.translate('HelpDlg','Copy the button table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.')])
- tbl_Options.add_row([QApplication.translate('HelpDlg','Help'),QApplication.translate('HelpDlg','Opens this window.')])
- strlist.append(tbl_Options.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','LABELS'))
- strlist.append('')
- tbl_Labelstop = prettytable.PrettyTable()
- tbl_Labelstop.header = False
- tbl_Labelstop.add_row([QApplication.translate('HelpDlg','The following substitutions are applied to button labels\n')])
- strlist.append(tbl_Labelstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Labels = prettytable.PrettyTable()
- tbl_Labels.field_names = [QApplication.translate('HelpDlg','String'),QApplication.translate('HelpDlg','Substitution')]
- tbl_Labels.add_row(['\\n',QApplication.translate('HelpDlg','New line character')])
- tbl_Labels.add_row(['\\t',QApplication.translate('HelpDlg','Event name (translated if using default event names)')])
- tbl_Labels.add_row(['\\q',QApplication.translate('HelpDlg','Event type 1')])
- tbl_Labels.add_row(['\\w',QApplication.translate('HelpDlg','Event type 2')])
- tbl_Labels.add_row(['\\e',QApplication.translate('HelpDlg','Event type 3')])
- tbl_Labels.add_row(['\\r',QApplication.translate('HelpDlg','Event type 4')])
- tbl_Labels.add_row(['\\0',QApplication.translate('HelpDlg','OFF (translated)')])
- tbl_Labels.add_row(['\\1',QApplication.translate('HelpDlg','ON (translated)')])
- tbl_Labels.add_row(['\\2',QApplication.translate('HelpDlg','OFF (translated, respecting button state)')])
- tbl_Labels.add_row(['\\3',QApplication.translate('HelpDlg','ON (translated, respecting button state)')])
- tbl_Labels.add_row(['\\p',QApplication.translate('HelpDlg','STOP (translated)')])
- tbl_Labels.add_row(['\\s',QApplication.translate('HelpDlg','START (translated)')])
- tbl_Labels.add_row(['\\P',QApplication.translate('HelpDlg','STOP (translated, respecting button state)')])
- tbl_Labels.add_row(['\\S',QApplication.translate('HelpDlg','START (translated, respecting button state)')])
- tbl_Labels.add_row(['\\c',QApplication.translate('HelpDlg','CLOSE (translated)')])
- tbl_Labels.add_row(['\\o',QApplication.translate('HelpDlg','OPEN (translated)')])
- tbl_Labels.add_row(['\\C',QApplication.translate('HelpDlg','CLOSE (translated, respecting button state)')])
- tbl_Labels.add_row(['\\O',QApplication.translate('HelpDlg','OPEN (translated, respecting button state)')])
- tbl_Labels.add_row(['\\a',QApplication.translate('HelpDlg','AUTO (translated)')])
- tbl_Labels.add_row(['\\m',QApplication.translate('HelpDlg','MANUAL (translated)')])
- tbl_Labels.add_row(['\\A',QApplication.translate('HelpDlg','AUTO (translated, respecting button state)')])
- tbl_Labels.add_row(['\\M',QApplication.translate('HelpDlg','MANUAL (translated, respecting button state)')])
- tbl_Labels.add_row(['\\i',QApplication.translate('HelpDlg','STIRRER')])
- tbl_Labels.add_row(['\\f',QApplication.translate('HelpDlg','FILL')])
- tbl_Labels.add_row(['\\f',QApplication.translate('HelpDlg','DISCHARGE')])
- tbl_Labels.add_row(['\\R',QApplication.translate('HelpDlg','RELEASE')])
- tbl_Labels.add_row(['\\h',QApplication.translate('HelpDlg','HEATING')])
- tbl_Labels.add_row(['\\l',QApplication.translate('HelpDlg','COOLING')])
- tbl_Labels.add_row(['\\b',QApplication.translate('HelpDlg','FLAP')])
- tbl_Labels.add_row(['\\d',QApplication.translate('HelpDlg','CONTROL')])
- tbl_Labels.add_row(['\\V',QApplication.translate('HelpDlg','event value')])
- tbl_Labels.add_row(['\\F',QApplication.translate('HelpDlg','event value interpreted as temperature in Fahrenheit converted to the current temperature mode')])
- tbl_Labels.add_row(['\\T',QApplication.translate('HelpDlg','event value interpreted as temperature in Celsius converted to the current temperature mode')])
- strlist.append(tbl_Labels.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','COMMANDS'))
- strlist.append('')
- tbl_Commandstop = prettytable.PrettyTable()
- tbl_Commandstop.header = False
- tbl_Commandstop.add_row([QApplication.translate('HelpDlg','Note: "{}" can be used as a placeholder, it will be substituted by the current button value plus the offset for \u00B1 event types. If a placeholder occurs several times in a description/command, all those occurrences are replaced by the value.\n')+newline+QApplication.translate('HelpDlg','Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands\n')+newline+QApplication.translate('HelpDlg','Note: Commands can be sequenced, separated by semicolons like in “;;”\n')+newline+QApplication.translate('HelpDlg','Note: All characters given as documentation to a Serial Command action are sent as one string to the connected device. If the device can interpret this string as separate commands separated by semicolon this is fine. Otherwise you can use a Multiple Event referencing a number of event buttons (using a comma separated list of event button numbers as documentation string) where each of the referenced event buttons issues one of the commands via a corresponding Serial Command action. Those event buttons can be hidden thus having the same effect as if the Serial Command allowed a sequence of commands.\n')+newline+QApplication.translate('HelpDlg','Note: In PHIDGET commands, the optional parameter has the form [:] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.\n')+newline+QApplication.translate('HelpDlg','Note: In YOCTOPUCE commands, the optional parameter holds either the modules serial number or its name')])
- strlist.append(tbl_Commandstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Commands = prettytable.PrettyTable()
- tbl_Commands.field_names = [QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Description')]
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Serial Command'),QApplication.translate('HelpDlg','ASCII serial command or binary a2b_uu(serial command)'),' '])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Call Program'),QApplication.translate('HelpDlg','A program/script path (absolute or relative)'),QApplication.translate('HelpDlg','start an external program')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Multiple Event'),QApplication.translate('HelpDlg','button numbers or sleep() separated by a comma: 1,2,sleep(2.5), 3..'),QApplication.translate('HelpDlg','triggers other buttons')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Modbus Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via MODBUS')])
- tbl_Commands.add_row([' ','$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument is 1 or True')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
- tbl_Commands.add_row([' ','read(slaveID,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','readSigned(slaveId,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','readBCD(slaveID,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','read32(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','read32Signed(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','read32BCD(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','readFloat(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write register: MODBUS function 6 (int) or function 16 (float)')])
- tbl_Commands.add_row([' ','wcoil(slaveId,register,)',QApplication.translate('HelpDlg','write coil: MODBUS function 5')])
- tbl_Commands.add_row([' ','wcoils(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write coils: MODBUS function 15')])
- tbl_Commands.add_row([' ','mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)',QApplication.translate('HelpDlg','mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v')])
- tbl_Commands.add_row([' ','writem(slaveId,register,value) or writem(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write registers: MODBUS function 16')])
- tbl_Commands.add_row([' ','writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])',QApplication.translate('HelpDlg','write 16bit BCD encoded value v to register r of slave s ')])
- tbl_Commands.add_row([' ','writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit float to two 16bit int registers: MODBUS function 16')])
- tbl_Commands.add_row([' ','writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit integer to two 16bit int registers: MODBUS function 16')])
- tbl_Commands.add_row([' ','writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 16bit integer to a single 16bit register: MODBUS function 6 (int)')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','DTA Command'),QApplication.translate('HelpDlg','Insert Data address : value, ex. 4701:1000 and sv is 100. \nAlways multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating'),' '])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','IO Command'),'_',QApplication.translate('HelpDlg','variable holding the last result value')])
- tbl_Commands.add_row([' ','$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
- tbl_Commands.add_row([' ','set(c,b[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)')])
- tbl_Commands.add_row([' ','toggle(c[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: toggles channel c')])
- tbl_Commands.add_row([' ','pulse(c,t[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds')])
- tbl_Commands.add_row([' ','out(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET Voltage Output: sets voltage output of channel c to v (float)')])
- tbl_Commands.add_row([' ','accel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets acceleration of channel c to v (float)')])
- tbl_Commands.add_row([' ','vel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets target velocity of channel c to v (float)')])
- tbl_Commands.add_row([' ','limit(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets current limit of channel c to v (float)')])
- tbl_Commands.add_row([' ','on(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module on')])
- tbl_Commands.add_row([' ','off(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module off')])
- tbl_Commands.add_row([' ','yset(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)')])
- tbl_Commands.add_row([' ','flip(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: toggle the state of channel c')])
- tbl_Commands.add_row([' ','pip(c,delay,duration[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds')])
- tbl_Commands.add_row([' ','powerReset([sn])',QApplication.translate('HelpDlg','YOCTOPUCE resets the power counter of the Yocto-Watt module')])
- tbl_Commands.add_row([' ','slider(c,v)',QApplication.translate('HelpDlg','move slider c to value v')])
- tbl_Commands.add_row([' ','button(i,c,b[,sn])',QApplication.translate('HelpDlg','switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b')])
- tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button(b)',QApplication.translate('HelpDlg','sets button to pressed if value b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','santoker(,)',QApplication.translate('HelpDlg','sends integer to register specified by as byte in hex notation like “fa” via the Santoker Network protocol')])
- tbl_Commands.add_row([' ','kaleido(,)',QApplication.translate('HelpDlg','sends to via the Kaleido Serial or Network protocol')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Command'),'motor(n),solenoid(n),stirrer(n),heater(h),fan(f) ',QApplication.translate('HelpDlg','with n={0 ,1},h={0,..100},f={0,..10}')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','p-i-d'),'
;;',QApplication.translate('HelpDlg','configures PID to the values
;;')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Fuji Command'),'write(,,)',' '])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','PWM Command'),'out(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: in [0-100]')])
- tbl_Commands.add_row([' ','toggle([,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: toggles ')])
- tbl_Commands.add_row([' ','pulse(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: turn on for milliseconds')])
- tbl_Commands.add_row([' ','outhub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: in [0-100]')])
- tbl_Commands.add_row([' ','togglehub([,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: toggles ')])
- tbl_Commands.add_row([' ','pulsehub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: turn on for milliseconds')])
- tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: PWM running state')])
- tbl_Commands.add_row([' ','freq(c,f[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM frequency to f (Hz)')])
- tbl_Commands.add_row([' ','duty(c,d[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]')])
- tbl_Commands.add_row([' ','move(c,d,t[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','VOUT Command'),'range(c,r[,sn])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for 5V and r=10 for 10V)')])
- tbl_Commands.add_row([' ','out(,[,])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)')])
- tbl_Commands.add_row([' ','vout(c,v[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]')])
- tbl_Commands.add_row([' ','cout(c[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','S7 Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via S7')])
- tbl_Commands.add_row([' ','$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument is 1 or True')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
- tbl_Commands.add_row([' ','getDBbool(,,)',QApplication.translate('HelpDlg','read bool from S7 DB')])
- tbl_Commands.add_row([' ','getDBint(,)',QApplication.translate('HelpDlg','read int from S7 DB')])
- tbl_Commands.add_row([' ','getDBfloat(,)',QApplication.translate('HelpDlg','read float from S7 DB')])
- tbl_Commands.add_row([' ','setDBbool(,,,)',QApplication.translate('HelpDlg','write bool to S7 DB')])
- tbl_Commands.add_row([' ','setDBint(,,)',QApplication.translate('HelpDlg','write int to S7 DB')])
- tbl_Commands.add_row([' ','msetDBint(,,,,)',QApplication.translate('HelpDlg','write value where bits are replaced by those from orMask at positions where andMask bits are not set')])
- tbl_Commands.add_row([' ','setDBfloat(,,)',QApplication.translate('HelpDlg','write float to S7 DB')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Drum'),' ',QApplication.translate('HelpDlg','sets drum speed to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Command'),'PRS',QApplication.translate('HelpDlg','Sends PRS command')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Artisan Command'),'$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
- tbl_Commands.add_row([' ','alarms()',QApplication.translate('HelpDlg','enables/disables alarms')])
- tbl_Commands.add_row([' ','autoCHARGE()',QApplication.translate('HelpDlg','enables/disables autoCHARGE')])
- tbl_Commands.add_row([' ','autoDROP()',QApplication.translate('HelpDlg','enables/disables autoDROP')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','tare()',QApplication.translate('HelpDlg','tare channel with 1 => ET, 2 => BT, 3 => E1c1, 4: E1c2,..')])
- tbl_Commands.add_row([' ','PIDon',QApplication.translate('HelpDlg','turns PID on')])
- tbl_Commands.add_row([' ','PIDoff',QApplication.translate('HelpDlg','turns PID off')])
- tbl_Commands.add_row([' ','PIDtoggle',QApplication.translate('HelpDlg','toggles the PID state')])
- tbl_Commands.add_row([' ','pidmode()',QApplication.translate('HelpDlg','sets PID mode to 0: manual, 1: RS, 2: background follow')])
- tbl_Commands.add_row([' ','p-i-d(
,,)',QApplication.translate('HelpDlg','sets the p-i-d parameters of the PID')])
- tbl_Commands.add_row([' ','adjustSV()',QApplication.translate('HelpDlg','increases or decreases the current target SV value by ')])
- tbl_Commands.add_row([' ','pidSV()',QApplication.translate('HelpDlg','sets the PID target set value SV')])
- tbl_Commands.add_row([' ','pidSVC()',QApplication.translate('HelpDlg','sets the PID target set value SV given in C')])
- tbl_Commands.add_row([' ','pidRS()',QApplication.translate('HelpDlg','activates the PID Ramp-Soak pattern number (1-based!) or the one labeled ')])
- tbl_Commands.add_row([' ','pidSource()',QApplication.translate('HelpDlg','selects the PID input source with 0: BT, 1: ET (Software PID); in {0,..,3} (Arduino PID)')])
- tbl_Commands.add_row([' ','pidLookahead()',QApplication.translate('HelpDlg','sets the PID lookahead')])
- tbl_Commands.add_row([' ','popup([,])',QApplication.translate('HelpDlg','shows popup with message which optionally automatically closes after seconds')])
- tbl_Commands.add_row([' ','message()',QApplication.translate('HelpDlg','shows message in the message line')])
- tbl_Commands.add_row([' ','notifications()',QApplication.translate('HelpDlg','enables/disables notifications; while disabled issued notifications are ignored')])
- tbl_Commands.add_row([' ','notify(,[])',QApplication.translate('HelpDlg','sends notification with title and optional message ')])
- tbl_Commands.add_row([' ','setCanvasColor()',QApplication.translate('HelpDlg','sets canvas color to the RGB-hex like #27f1d3')])
- tbl_Commands.add_row([' ','resetCanvasColor',QApplication.translate('HelpDlg','resets canvas color')])
- tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value of b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button(|)',QApplication.translate('HelpDlg','activates button from { START, CHARGE, DRY, FCs, FCe, SCs, SCe, DROP, COOL, OFF } ; sets calling button to “pressed” if argument is 1 or True')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
- tbl_Commands.add_row([' ','visible(i,b)',QApplication.translate('HelpDlg','sets button i to visible if value of b is yes, true, t, or 1, otherwise to hidden')])
- tbl_Commands.add_row([' ','palette(
either a number 0-9 or a palette label')])
- tbl_Commands.add_row([' ','playbackmode()',QApplication.translate('HelpDlg','sets playback mode to 0: off, 1: time, 2: BT, 3: ET')])
- tbl_Commands.add_row([' ','openProperties',QApplication.translate('HelpDlg','opens the Roast Properties dialog')])
- tbl_Commands.add_row([' ','loadBackground()',QApplication.translate('HelpDlg','loads the .alog profile at the given filepath as background profile')])
- tbl_Commands.add_row([' ','clearBackground',QApplication.translate('HelpDlg','clears the current background profile')])
- tbl_Commands.add_row([' ','alarmset()',QApplication.translate('HelpDlg','activates the alarmset with the given number or label')])
- tbl_Commands.add_row([' ','moveBackground(,)',QApplication.translate('HelpDlg','moves the background profile the indicated number of steps towards , with one of up, down, left, right')])
- tbl_Commands.add_row([' ','keyboard()',QApplication.translate('HelpDlg','enables/disables keyboard mode')])
- tbl_Commands.add_row([' ','keepON()',QApplication.translate('HelpDlg','enables/disables the Keep ON flag')])
- tbl_Commands.add_row([' ','showCurve(,)',QApplication.translate('HelpDlg','shows/hides the curve indicated by which is one of { ET, BT, DeltaET, DeltaBT, BackgroundET, BackgroundBT}')])
- tbl_Commands.add_row([' ','showExtraCurve(,,)',QApplication.translate('HelpDlg','shows/hides the (one of {T1,T2}) of the zero-based number')])
- tbl_Commands.add_row([' ','showEvents(, )',QApplication.translate('HelpDlg','shows/hides the events of in [1,..,5]')])
- tbl_Commands.add_row([' ','showBackgroundEvents()',QApplication.translate('HelpDlg','shows/hides the events of the background profile')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','RC Command'),'pulse(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max pulse width in microseconds')])
- tbl_Commands.add_row([' ','pos(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max position')])
- tbl_Commands.add_row([' ','engaged(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: engage (b=1) or disengage (b = 0)')])
- tbl_Commands.add_row([' ','ramp(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: activates or deactivates the speed ramping state')])
- tbl_Commands.add_row([' ','volt(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the voltage to one of 5, 6 or 7.4 in Volt')])
- tbl_Commands.add_row([' ','accel(ch,a[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the acceleration')])
- tbl_Commands.add_row([' ','veloc(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the velocity')])
- tbl_Commands.add_row([' ','set(ch,pos[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the target position')])
- tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, b a bool (eg. enabled(0,1) or enabled(0,True))')])
- tbl_Commands.add_row([' ','move(c,p[,t][,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, p:int the target position, the optional t the duration in ms, sn the optional modules serial number or logical name')])
- tbl_Commands.add_row([' ','neutral(c,n[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with n an int [0..65000] in us')])
- tbl_Commands.add_row([' ','range(c,r[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with r an int in %')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','WebSocket Command'),'$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
- tbl_Commands.add_row([' ','send()',QApplication.translate('HelpDlg','If {} substitutions are used, json brackets need to be duplicated to escape them like in send({{ “value”: {}}})')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument evaluates to 1 or True')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
- tbl_Commands.add_row([' ','read()',QApplication.translate('HelpDlg','if the `` text respects the JSON format it is send to the connected WebSocket server and the response is bound to the variable `_`')])
- strlist.append(tbl_Commands.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','EVENT CUSTOM BUTTONS'))
+ strlist.append('')
+ tbl_Buttonstop = prettytable.PrettyTable()
+ tbl_Buttonstop.header = False
+ tbl_Buttonstop.add_row([QApplication.translate('HelpDlg','Button numbers can be drag and dropped to a new position. While holding the ALT key (Windows) / OPTION (macOS) buttons are swapped\n')])
+ strlist.append(tbl_Buttonstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Buttons = prettytable.PrettyTable()
+ tbl_Buttons.field_names = [QApplication.translate('HelpDlg','Column'),QApplication.translate('HelpDlg','Description')]
+ tbl_Buttons.add_row([QApplication.translate('HelpDlg','Button Label'),QApplication.translate('HelpDlg','Enter \\n to create labels with multiple lines. \\t is substituted by the event type.')])
+ tbl_Buttons.add_row([QApplication.translate('HelpDlg','Event Description'),QApplication.translate('HelpDlg','Description of the Event to be recorded.')])
+ tbl_Buttons.add_row([QApplication.translate('HelpDlg','Event Type'),QApplication.translate('HelpDlg','Event type to be recorded or leave blank for no event. \u0027\u00B1\u0027 types add a chosen offset (positive or negative) to the present value of the chosen event.')])
+ tbl_Buttons.add_row([QApplication.translate('HelpDlg','Event Value'),QApplication.translate('HelpDlg','Value of event (1-100) to be recorded.')])
+ tbl_Buttons.add_row([QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Perform an action at the time of the event.')])
+ tbl_Buttons.add_row([QApplication.translate('HelpDlg','Documentation'),QApplication.translate('HelpDlg','The action Command. Depends on the action type, '{}' is replaced by the event value and the offset in case of a \u00B1 event type.')])
+ tbl_Buttons.add_row([QApplication.translate('HelpDlg','Button Visibility'),QApplication.translate('HelpDlg','Hides/shows individual button.')])
+ strlist.append(tbl_Buttons.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','EVENT BUTTONS CONFIGURATION OPTIONS'))
+ strlist.append('')
+ tbl_Options = prettytable.PrettyTable()
+ tbl_Options.field_names = [QApplication.translate('HelpDlg','Option'),QApplication.translate('HelpDlg','Description')]
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Max buttons per row'),QApplication.translate('HelpDlg','Sets a maximum number of buttons to display on a single row.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Button size'),QApplication.translate('HelpDlg','Sets a size for the buttons. Choices are tiny, small and large.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Color Pattern'),QApplication.translate('HelpDlg','Applies one of 99 autogenerated color patterns to the buttons. Set to "0" to manually choose the button colors.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Mark Last Pressed'),QApplication.translate('HelpDlg','Invert state and color of last button pressed')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Tooltips'),QApplication.translate('HelpDlg','Show button specification as tooltips on hovering a button')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Add'),QApplication.translate('HelpDlg','Adds a new button to the bottom of the table.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Insert'),QApplication.translate('HelpDlg','Inserts a new button above the selected button.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Delete'),QApplication.translate('HelpDlg','Deletes the selected button.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Copy Table'),QApplication.translate('HelpDlg','Copy the button table in tab separated format to the clipboard. Option or ALT click to copy a tabular format to the clipboard.')])
+ tbl_Options.add_row([QApplication.translate('HelpDlg','Help'),QApplication.translate('HelpDlg','Opens this window.')])
+ strlist.append(tbl_Options.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','LABELS'))
+ strlist.append('')
+ tbl_Labelstop = prettytable.PrettyTable()
+ tbl_Labelstop.header = False
+ tbl_Labelstop.add_row([QApplication.translate('HelpDlg','The following substitutions are applied to button labels\n')])
+ strlist.append(tbl_Labelstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Labels = prettytable.PrettyTable()
+ tbl_Labels.field_names = [QApplication.translate('HelpDlg','String'),QApplication.translate('HelpDlg','Substitution')]
+ tbl_Labels.add_row(['\\n',QApplication.translate('HelpDlg','New line character')])
+ tbl_Labels.add_row(['\\t',QApplication.translate('HelpDlg','Event name (translated if using default event names)')])
+ tbl_Labels.add_row(['\\q',QApplication.translate('HelpDlg','Event type 1')])
+ tbl_Labels.add_row(['\\w',QApplication.translate('HelpDlg','Event type 2')])
+ tbl_Labels.add_row(['\\e',QApplication.translate('HelpDlg','Event type 3')])
+ tbl_Labels.add_row(['\\r',QApplication.translate('HelpDlg','Event type 4')])
+ tbl_Labels.add_row(['\\0',QApplication.translate('HelpDlg','OFF (translated)')])
+ tbl_Labels.add_row(['\\1',QApplication.translate('HelpDlg','ON (translated)')])
+ tbl_Labels.add_row(['\\2',QApplication.translate('HelpDlg','OFF (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\3',QApplication.translate('HelpDlg','ON (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\p',QApplication.translate('HelpDlg','STOP (translated)')])
+ tbl_Labels.add_row(['\\s',QApplication.translate('HelpDlg','START (translated)')])
+ tbl_Labels.add_row(['\\P',QApplication.translate('HelpDlg','STOP (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\S',QApplication.translate('HelpDlg','START (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\c',QApplication.translate('HelpDlg','CLOSE (translated)')])
+ tbl_Labels.add_row(['\\o',QApplication.translate('HelpDlg','OPEN (translated)')])
+ tbl_Labels.add_row(['\\C',QApplication.translate('HelpDlg','CLOSE (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\O',QApplication.translate('HelpDlg','OPEN (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\a',QApplication.translate('HelpDlg','AUTO (translated)')])
+ tbl_Labels.add_row(['\\m',QApplication.translate('HelpDlg','MANUAL (translated)')])
+ tbl_Labels.add_row(['\\A',QApplication.translate('HelpDlg','AUTO (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\M',QApplication.translate('HelpDlg','MANUAL (translated, respecting button state)')])
+ tbl_Labels.add_row(['\\i',QApplication.translate('HelpDlg','STIRRER')])
+ tbl_Labels.add_row(['\\f',QApplication.translate('HelpDlg','FILL')])
+ tbl_Labels.add_row(['\\f',QApplication.translate('HelpDlg','DISCHARGE')])
+ tbl_Labels.add_row(['\\R',QApplication.translate('HelpDlg','RELEASE')])
+ tbl_Labels.add_row(['\\h',QApplication.translate('HelpDlg','HEATING')])
+ tbl_Labels.add_row(['\\l',QApplication.translate('HelpDlg','COOLING')])
+ tbl_Labels.add_row(['\\b',QApplication.translate('HelpDlg','FLAP')])
+ tbl_Labels.add_row(['\\d',QApplication.translate('HelpDlg','CONTROL')])
+ tbl_Labels.add_row(['\\V',QApplication.translate('HelpDlg','event value')])
+ tbl_Labels.add_row(['\\F',QApplication.translate('HelpDlg','event value interpreted as temperature in Fahrenheit converted to the current temperature mode')])
+ tbl_Labels.add_row(['\\T',QApplication.translate('HelpDlg','event value interpreted as temperature in Celsius converted to the current temperature mode')])
+ strlist.append(tbl_Labels.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','COMMANDS'))
+ strlist.append('')
+ tbl_Commandstop = prettytable.PrettyTable()
+ tbl_Commandstop.header = False
+ tbl_Commandstop.add_row([QApplication.translate('HelpDlg','Note: "{}" can be used as a placeholder, it will be substituted by the current button value plus the offset for \u00B1 event types. If a placeholder occurs several times in a description/command, all those occurrences are replaced by the value.\n')+newline+QApplication.translate('HelpDlg','Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands\n')+newline+QApplication.translate('HelpDlg','Note: Commands can be sequenced, separated by semicolons like in “;;”\n')+newline+QApplication.translate('HelpDlg','Note: All characters given as documentation to a Serial Command action are sent as one string to the connected device. If the device can interpret this string as separate commands separated by semicolon this is fine. Otherwise you can use a Multiple Event referencing a number of event buttons (using a comma separated list of event button numbers as documentation string) where each of the referenced event buttons issues one of the commands via a corresponding Serial Command action. Those event buttons can be hidden thus having the same effect as if the Serial Command allowed a sequence of commands.\n')+newline+QApplication.translate('HelpDlg','Note: In PHIDGET commands, the optional parameter has the form [:] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.\n')+newline+QApplication.translate('HelpDlg','Note: In YOCTOPUCE commands, the optional parameter holds either the modules serial number or its name')])
+ strlist.append(tbl_Commandstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Commands = prettytable.PrettyTable()
+ tbl_Commands.field_names = [QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Description')]
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Serial Command'),QApplication.translate('HelpDlg','ASCII serial command or binary a2b_uu(serial command)'),' '])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Call Program'),QApplication.translate('HelpDlg','A program/script path (absolute or relative)'),QApplication.translate('HelpDlg','start an external program')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Multiple Event'),QApplication.translate('HelpDlg','button numbers or sleep() separated by a comma: 1,2,sleep(2.5), 3..'),QApplication.translate('HelpDlg','triggers other buttons')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Modbus Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via MODBUS')])
+ tbl_Commands.add_row([' ','$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument is 1 or True')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
+ tbl_Commands.add_row([' ','read(slaveID,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','readSigned(slaveId,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','readBCD(slaveID,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','read32(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','read32Signed(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','read32BCD(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','readFloat(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write register: MODBUS function 6 (int) or function 16 (float)')])
+ tbl_Commands.add_row([' ','wcoil(slaveId,register,)',QApplication.translate('HelpDlg','write coil: MODBUS function 5')])
+ tbl_Commands.add_row([' ','wcoils(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write coils: MODBUS function 15')])
+ tbl_Commands.add_row([' ','mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)',QApplication.translate('HelpDlg','mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v')])
+ tbl_Commands.add_row([' ','writem(slaveId,register,value) or writem(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write registers: MODBUS function 16')])
+ tbl_Commands.add_row([' ','writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])',QApplication.translate('HelpDlg','write 16bit BCD encoded value v to register r of slave s ')])
+ tbl_Commands.add_row([' ','writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit float to two 16bit int registers: MODBUS function 16')])
+ tbl_Commands.add_row([' ','writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit integer to two 16bit int registers: MODBUS function 16')])
+ tbl_Commands.add_row([' ','writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 16bit integer to a single 16bit register: MODBUS function 6 (int)')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','DTA Command'),QApplication.translate('HelpDlg','Insert Data address : value, ex. 4701:1000 and sv is 100. \nAlways multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating'),' '])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','IO Command'),'_',QApplication.translate('HelpDlg','variable holding the last result value')])
+ tbl_Commands.add_row([' ','$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
+ tbl_Commands.add_row([' ','set(c,b[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)')])
+ tbl_Commands.add_row([' ','toggle(c[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: toggles channel c')])
+ tbl_Commands.add_row([' ','pulse(c,t[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds')])
+ tbl_Commands.add_row([' ','out(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET Voltage Output: sets voltage output of channel c to v (float)')])
+ tbl_Commands.add_row([' ','accel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets acceleration of channel c to v (float)')])
+ tbl_Commands.add_row([' ','vel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets target velocity of channel c to v (float)')])
+ tbl_Commands.add_row([' ','limit(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets current limit of channel c to v (float)')])
+ tbl_Commands.add_row([' ','on(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module on')])
+ tbl_Commands.add_row([' ','off(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module off')])
+ tbl_Commands.add_row([' ','yset(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)')])
+ tbl_Commands.add_row([' ','flip(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: toggle the state of channel c')])
+ tbl_Commands.add_row([' ','pip(c,delay,duration[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds')])
+ tbl_Commands.add_row([' ','powerReset([sn])',QApplication.translate('HelpDlg','YOCTOPUCE resets the power counter of the Yocto-Watt module')])
+ tbl_Commands.add_row([' ','slider(c,v)',QApplication.translate('HelpDlg','move slider c to value v')])
+ tbl_Commands.add_row([' ','button(i,c,b[,sn])',QApplication.translate('HelpDlg','switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b')])
+ tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button(b)',QApplication.translate('HelpDlg','sets button to pressed if value b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','santoker(,)',QApplication.translate('HelpDlg','sends integer to register specified by as byte in hex notation like “fa” via the Santoker Network protocol')])
+ tbl_Commands.add_row([' ','kaleido(,)',QApplication.translate('HelpDlg','sends to via the Kaleido Serial or Network protocol')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Command'),'motor(n),solenoid(n),stirrer(n),heater(h),fan(f) ',QApplication.translate('HelpDlg','with n={0 ,1},h={0,..100},f={0,..10}')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','p-i-d'),'
;;',QApplication.translate('HelpDlg','configures PID to the values
;;')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Fuji Command'),'write(,,)',' '])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','PWM Command'),'out(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: in [0-100]')])
+ tbl_Commands.add_row([' ','toggle([,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: toggles ')])
+ tbl_Commands.add_row([' ','pulse(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: turn on for milliseconds')])
+ tbl_Commands.add_row([' ','outhub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: in [0-100]')])
+ tbl_Commands.add_row([' ','togglehub([,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: toggles ')])
+ tbl_Commands.add_row([' ','pulsehub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: turn on for milliseconds')])
+ tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: PWM running state')])
+ tbl_Commands.add_row([' ','freq(c,f[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM frequency to f (Hz)')])
+ tbl_Commands.add_row([' ','duty(c,d[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]')])
+ tbl_Commands.add_row([' ','move(c,d,t[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','VOUT Command'),'range(c,r[,sn])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for 5V and r=10 for 10V)')])
+ tbl_Commands.add_row([' ','out(,[,])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)')])
+ tbl_Commands.add_row([' ','vout(c,v[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]')])
+ tbl_Commands.add_row([' ','cout(c[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','S7 Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via S7')])
+ tbl_Commands.add_row([' ','$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument is 1 or True')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
+ tbl_Commands.add_row([' ','getDBbool(,,)',QApplication.translate('HelpDlg','read bool from S7 DB')])
+ tbl_Commands.add_row([' ','getDBint(,)',QApplication.translate('HelpDlg','read int from S7 DB')])
+ tbl_Commands.add_row([' ','getDBfloat(,)',QApplication.translate('HelpDlg','read float from S7 DB')])
+ tbl_Commands.add_row([' ','setDBbool(,,,)',QApplication.translate('HelpDlg','write bool to S7 DB')])
+ tbl_Commands.add_row([' ','setDBint(,,)',QApplication.translate('HelpDlg','write int to S7 DB')])
+ tbl_Commands.add_row([' ','msetDBint(,,,,)',QApplication.translate('HelpDlg','write value where bits are replaced by those from orMask at positions where andMask bits are not set')])
+ tbl_Commands.add_row([' ','setDBfloat(,,)',QApplication.translate('HelpDlg','write float to S7 DB')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Drum'),' ',QApplication.translate('HelpDlg','sets drum speed to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Command'),'PRS',QApplication.translate('HelpDlg','Sends PRS command')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Artisan Command'),'$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
+ tbl_Commands.add_row([' ','alarms()',QApplication.translate('HelpDlg','enables/disables alarms')])
+ tbl_Commands.add_row([' ','autoCHARGE()',QApplication.translate('HelpDlg','enables/disables autoCHARGE')])
+ tbl_Commands.add_row([' ','autoDROP()',QApplication.translate('HelpDlg','enables/disables autoDROP')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','tare()',QApplication.translate('HelpDlg','tare channel with 1 => ET, 2 => BT, 3 => E1c1, 4: E1c2,..')])
+ tbl_Commands.add_row([' ','PIDon',QApplication.translate('HelpDlg','turns PID on')])
+ tbl_Commands.add_row([' ','PIDoff',QApplication.translate('HelpDlg','turns PID off')])
+ tbl_Commands.add_row([' ','PIDtoggle',QApplication.translate('HelpDlg','toggles the PID state')])
+ tbl_Commands.add_row([' ','pidmode()',QApplication.translate('HelpDlg','sets PID mode to 0: manual, 1: RS, 2: background follow')])
+ tbl_Commands.add_row([' ','p-i-d(
,,)',QApplication.translate('HelpDlg','sets the p-i-d parameters of the PID')])
+ tbl_Commands.add_row([' ','adjustSV()',QApplication.translate('HelpDlg','increases or decreases the current target SV value by ')])
+ tbl_Commands.add_row([' ','pidSV()',QApplication.translate('HelpDlg','sets the PID target set value SV')])
+ tbl_Commands.add_row([' ','pidSVC()',QApplication.translate('HelpDlg','sets the PID target set value SV given in C')])
+ tbl_Commands.add_row([' ','pidRS()',QApplication.translate('HelpDlg','activates the PID Ramp-Soak pattern number (1-based!) or the one labeled ')])
+ tbl_Commands.add_row([' ','pidSource()',QApplication.translate('HelpDlg','selects the PID input source with 0: BT, 1: ET (Software PID); in {0,..,3} (Arduino PID)')])
+ tbl_Commands.add_row([' ','pidLookahead()',QApplication.translate('HelpDlg','sets the PID lookahead')])
+ tbl_Commands.add_row([' ','popup([,])',QApplication.translate('HelpDlg','shows popup with message which optionally automatically closes after seconds')])
+ tbl_Commands.add_row([' ','message()',QApplication.translate('HelpDlg','shows message in the message line')])
+ tbl_Commands.add_row([' ','notifications()',QApplication.translate('HelpDlg','enables/disables notifications; while disabled issued notifications are ignored')])
+ tbl_Commands.add_row([' ','notify(,[])',QApplication.translate('HelpDlg','sends notification with title and optional message ')])
+ tbl_Commands.add_row([' ','setCanvasColor()',QApplication.translate('HelpDlg','sets canvas color to the RGB-hex like #27f1d3')])
+ tbl_Commands.add_row([' ','resetCanvasColor',QApplication.translate('HelpDlg','resets canvas color')])
+ tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value of b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button(|)',QApplication.translate('HelpDlg','activates button from { START, CHARGE, DRY, FCs, FCe, SCs, SCe, DROP, COOL, OFF } ; sets calling button to “pressed” if argument is 1 or True')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
+ tbl_Commands.add_row([' ','visible(i,b)',QApplication.translate('HelpDlg','sets button i to visible if value of b is yes, true, t, or 1, otherwise to hidden')])
+ tbl_Commands.add_row([' ','palette(
either a number 0-9 or a palette label')])
+ tbl_Commands.add_row([' ','playbackmode()',QApplication.translate('HelpDlg','sets playback mode to 0: off, 1: time, 2: BT, 3: ET')])
+ tbl_Commands.add_row([' ','openProperties',QApplication.translate('HelpDlg','opens the Roast Properties dialog')])
+ tbl_Commands.add_row([' ','loadBackground()',QApplication.translate('HelpDlg','loads the .alog profile at the given filepath as background profile')])
+ tbl_Commands.add_row([' ','clearBackground',QApplication.translate('HelpDlg','clears the current background profile')])
+ tbl_Commands.add_row([' ','alarmset()',QApplication.translate('HelpDlg','activates the alarmset with the given number or label')])
+ tbl_Commands.add_row([' ','moveBackground(,)',QApplication.translate('HelpDlg','moves the background profile the indicated number of steps towards , with one of up, down, left, right')])
+ tbl_Commands.add_row([' ','keyboard()',QApplication.translate('HelpDlg','enables/disables keyboard mode')])
+ tbl_Commands.add_row([' ','keepON()',QApplication.translate('HelpDlg','enables/disables the Keep ON flag')])
+ tbl_Commands.add_row([' ','showCurve(,)',QApplication.translate('HelpDlg','shows/hides the curve indicated by which is one of { ET, BT, DeltaET, DeltaBT, BackgroundET, BackgroundBT}')])
+ tbl_Commands.add_row([' ','showExtraCurve(,,)',QApplication.translate('HelpDlg','shows/hides the (one of {T1,T2}) of the zero-based number')])
+ tbl_Commands.add_row([' ','showEvents(, )',QApplication.translate('HelpDlg','shows/hides the events of in [1,..,5]')])
+ tbl_Commands.add_row([' ','showBackgroundEvents()',QApplication.translate('HelpDlg','shows/hides the events of the background profile')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','RC Command'),'pulse(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max pulse width in microseconds')])
+ tbl_Commands.add_row([' ','pos(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max position')])
+ tbl_Commands.add_row([' ','engaged(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: engage (b=1) or disengage (b = 0)')])
+ tbl_Commands.add_row([' ','ramp(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: activates or deactivates the speed ramping state')])
+ tbl_Commands.add_row([' ','volt(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the voltage to one of 5, 6 or 7.4 in Volt')])
+ tbl_Commands.add_row([' ','accel(ch,a[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the acceleration')])
+ tbl_Commands.add_row([' ','veloc(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the velocity')])
+ tbl_Commands.add_row([' ','set(ch,pos[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the target position')])
+ tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, b a bool (eg. enabled(0,1) or enabled(0,True))')])
+ tbl_Commands.add_row([' ','move(c,p[,t][,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, p:int the target position, the optional t the duration in ms, sn the optional modules serial number or logical name')])
+ tbl_Commands.add_row([' ','neutral(c,n[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with n an int [0..65000] in us')])
+ tbl_Commands.add_row([' ','range(c,r[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with r an int in %')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','WebSocket Command'),'$',QApplication.translate('HelpDlg','variable holding the last state of the button pressed (1 or 0)')])
+ tbl_Commands.add_row([' ','send()',QApplication.translate('HelpDlg','If {} substitutions are used, json brackets need to be duplicated to escape them like in send({{ “value”: {}}})')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument evaluates to 1 or True')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
+ tbl_Commands.add_row([' ','read()',QApplication.translate('HelpDlg','if the `` text respects the JSON format it is send to the connected WebSocket server and the response is bound to the variable `_`')])
+ strlist.append(tbl_Commands.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','EVENT CUSTOM SLIDERS'))
- strlist.append('')
- tbl_Sliders = prettytable.PrettyTable()
- tbl_Sliders.field_names = [QApplication.translate('HelpDlg','Column'),QApplication.translate('HelpDlg','Description')]
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Event'),QApplication.translate('HelpDlg','Hide or show the corresponding slider.')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Perform an action on the slider release.')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Command to perform, depends on the Action type. ('{}' is replaced by the slider value*Factor + Offset)')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Offset'),QApplication.translate('HelpDlg','Offset to be added to the Slider value (after scaling by Factor).')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Factor'),QApplication.translate('HelpDlg','Scale factor, Slider value is multiplied by this value.')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Min'),QApplication.translate('HelpDlg','Sets the minimum value for the range of the slider.')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Max'),QApplication.translate('HelpDlg','Sets the maximum value for the range of the slider.')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Course'),QApplication.translate('HelpDlg','When ticked the slider moves in steps of 10.')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Temp'),QApplication.translate('HelpDlg','Should be ticked when the slider's value is a temperature to allow Artisan to properly scale the value between Centigrade and Fahrenheit.')])
- tbl_Sliders.add_row([QApplication.translate('HelpDlg','Unit'),QApplication.translate('HelpDlg','Optional text used in annotations to the the units used for the slider value.')])
- strlist.append(tbl_Sliders.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','COMMANDS'))
- strlist.append('')
- tbl_Commandstop = prettytable.PrettyTable()
- tbl_Commandstop.header = False
- tbl_Commandstop.add_row([QApplication.translate('HelpDlg','Note: "{}" can be used as a placeholder, it will be substituted by (value*factor + offset). In all slider command actions, but for IO, VOUT, S7 and RC Commands, the bound value is converted from a float to an int.\n')+newline+QApplication.translate('HelpDlg','Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands\n')+newline+QApplication.translate('HelpDlg','Note: commands can be sequenced, separated by semicolons like in “;;”\n')+newline+QApplication.translate('HelpDlg','Note: in PHIDGET commands, the optional parameter has the form [:] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.\n')+newline+QApplication.translate('HelpDlg','Note: in YOCTOPUCE commands, the optional parameters holds either the modules serial number or its name')])
- strlist.append(tbl_Commandstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Commands = prettytable.PrettyTable()
- tbl_Commands.field_names = [QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Description')]
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Serial Command'),QApplication.translate('HelpDlg','ASCII serial command or binary a2b_uu(serial command)'),' '])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Modbus Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via MODBUS')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument is 1 or True')])
- tbl_Commands.add_row([' ','read(slaveID,register)',QApplication.translate('HelpDlg','reads register from slave slaveID using function 3 (Read Multiple Holding Registers). The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','readSigned(slaveId,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','readBCD(slaveID,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','read32(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','read32Signed(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','read32BCD(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','readFloat(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
- tbl_Commands.add_row([' ','write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write register: MODBUS function 6 (int) or function 16 (float)')])
- tbl_Commands.add_row([' ','wcoil(slaveId,register,)',QApplication.translate('HelpDlg','write coil: MODBUS function 5')])
- tbl_Commands.add_row([' ','wcoils(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write coils: MODBUS function 15')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg',' '),'mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)',QApplication.translate('HelpDlg','mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v')])
- tbl_Commands.add_row([' ','writem(slaveId,register,value) or writem(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write registers: MODBUS function 16')])
- tbl_Commands.add_row([' ','writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])',QApplication.translate('HelpDlg','write 16bit BCD encoded value v to register r of slave s ')])
- tbl_Commands.add_row([' ','writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit float to two 16bit int registers: MODBUS function 16')])
- tbl_Commands.add_row([' ','writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit integer to two 16bit int registers: MODBUS function 16')])
- tbl_Commands.add_row([' ','writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 16bit integer to a single 16bit register: MODBUS function 6 (int)')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','DTA Command'),QApplication.translate('HelpDlg','Insert Data address : value, ex. 4701:1000 and sv is 100. '),QApplication.translate('HelpDlg','Always multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Call Program'),QApplication.translate('HelpDlg','A program/script path (absolute or relative)'),QApplication.translate('HelpDlg','start and external program')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Command'),'motor(n),solenoid(n),stirrer(n),heater(h),fan(f) ',QApplication.translate('HelpDlg','with n={0 ,1},h={0,..100},f={0,..10}')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Fuji Command'),'write(,,)',' '])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','PWM Command'),'out(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: in [0-100]')])
- tbl_Commands.add_row([' ','toggle([,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: toggles ')])
- tbl_Commands.add_row([' ','pulse(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: turn on for milliseconds')])
- tbl_Commands.add_row([' ','outhub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: in [0-100]')])
- tbl_Commands.add_row([' ','togglehub([,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: toggles ')])
- tbl_Commands.add_row([' ','pulsehub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: turn on for milliseconds')])
- tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: PWM running state')])
- tbl_Commands.add_row([' ','freq(c,f[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM frequency to f (Hz)')])
- tbl_Commands.add_row([' ','duty(c,d[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]')])
- tbl_Commands.add_row([' ','move(c,d,t[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','VOUT Command'),'range(c,r[,sn])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for r5V and r=10 for 10V)')])
- tbl_Commands.add_row([' ','out(n,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)')])
- tbl_Commands.add_row([' ','vout(c,v[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]')])
- tbl_Commands.add_row([' ','cout(c[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','IO Command'),'set(c,b[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)')])
- tbl_Commands.add_row([' ','toggle(c[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: toggles channel c')])
- tbl_Commands.add_row([' ','pulse(c,t[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds')])
- tbl_Commands.add_row([' ','out(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET Voltage Output: sets voltage output of channel c to v (float)')])
- tbl_Commands.add_row([' ','accel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets acceleration of channel c to v (float)')])
- tbl_Commands.add_row([' ','vel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets target velocity of channel c to v (float)')])
- tbl_Commands.add_row([' ','limit(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets current limit of channel c to v (float)')])
- tbl_Commands.add_row([' ','on(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module on')])
- tbl_Commands.add_row([' ','off(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module off')])
- tbl_Commands.add_row([' ','yset(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)')])
- tbl_Commands.add_row([' ','flip(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: toggle the state of channel c')])
- tbl_Commands.add_row([' ','pip(c,delay,duration[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds')])
- tbl_Commands.add_row([' ','powerReset([sn])',QApplication.translate('HelpDlg','YOCTOPUCE resets the power counter of the Yocto-Watt module')])
- tbl_Commands.add_row([' ','slider(c,v)',QApplication.translate('HelpDlg','move slider c to value v')])
- tbl_Commands.add_row([' ','button(i,c,b[,sn])',QApplication.translate('HelpDlg','switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b')])
- tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button(b)',QApplication.translate('HelpDlg','sets button to pressed if value b is yes, true, t, or 1, otherwise to normal')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','santoker(,)',QApplication.translate('HelpDlg','sends integer to register specified by as byte in hex notation like “fa” via the Santoker Network protocol')])
- tbl_Commands.add_row([' ','kaleido(,)',QApplication.translate('HelpDlg','sends to via the Kaleido Serial or Network protocol')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','S7 Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via S7')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument evaluates to 1 or True')])
- tbl_Commands.add_row([' ','getDBbool(,,)',QApplication.translate('HelpDlg','read bool from S7 DB')])
- tbl_Commands.add_row([' ','getDBint(,)',QApplication.translate('HelpDlg','read int from S7 DB')])
- tbl_Commands.add_row([' ','getDBfloat(,)',QApplication.translate('HelpDlg','read float from S7 DB')])
- tbl_Commands.add_row([' ','setDBbool(,,,)',QApplication.translate('HelpDlg','write bool to S7 DB')])
- tbl_Commands.add_row([' ','setDBint(,,)',QApplication.translate('HelpDlg','write int to S7 DB')])
- tbl_Commands.add_row([' ','setDBfloat(,,)',QApplication.translate('HelpDlg','write float to S7 DB')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Drum'),' ',QApplication.translate('HelpDlg','sets drum speed to value')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','Artisan Command'),'alarms()',QApplication.translate('HelpDlg','enables/disables alarms')])
- tbl_Commands.add_row([' ','autoCHARGE()',QApplication.translate('HelpDlg','enables/disables autoCHARGE')])
- tbl_Commands.add_row([' ','autoDROP()',QApplication.translate('HelpDlg','enables/disables autoDROP')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','tare()',QApplication.translate('HelpDlg','tare channel with 1 => ET, 2 => BT, 3 => E1c1, 4: E1c2,..')])
- tbl_Commands.add_row([' ','PIDon',QApplication.translate('HelpDlg','turns PID on')])
- tbl_Commands.add_row([' ','PIDoff',QApplication.translate('HelpDlg','turns PID off')])
- tbl_Commands.add_row([' ','PIDtoggle',QApplication.translate('HelpDlg','toggles the PID state')])
- tbl_Commands.add_row([' ','pidmode()',QApplication.translate('HelpDlg','sets PID mode to 0: manual, 1: RS, 2: background follow')])
- tbl_Commands.add_row([' ','p-i-d(
,,)',QApplication.translate('HelpDlg','sets the p-i-d parameters of the PID')])
- tbl_Commands.add_row([' ','adjustSV()',QApplication.translate('HelpDlg','increases or decreases the current target SV value by ')])
- tbl_Commands.add_row([' ','pidSV()',QApplication.translate('HelpDlg','sets the PID target set value SV')])
- tbl_Commands.add_row([' ','pidSVC()',QApplication.translate('HelpDlg','sets the PID target set value SV given in C')])
- tbl_Commands.add_row([' ','pidRS()',QApplication.translate('HelpDlg','activates the PID Ramp-Soak pattern number (1-based!) or the one labeled ')])
- tbl_Commands.add_row([' ','pidSource()',QApplication.translate('HelpDlg','selects the PID input source with 0: BT, 1: ET (Software PID); in {0,..,3} (Arduino PID)')])
- tbl_Commands.add_row([' ','pidLookahead()',QApplication.translate('HelpDlg','sets the PID lookahead')])
- tbl_Commands.add_row([' ','popup([,])',QApplication.translate('HelpDlg','shows popup with message which optionally automatically closes after seconds')])
- tbl_Commands.add_row([' ','message()',QApplication.translate('HelpDlg','shows message in the message line')])
- tbl_Commands.add_row([' ','notifications()',QApplication.translate('HelpDlg','enables/disables notifications; while disabled issued notifications are ignored')])
- tbl_Commands.add_row([' ','notify(,[])',QApplication.translate('HelpDlg','sends notification with title and optional message ')])
- tbl_Commands.add_row([' ','setCanvasColor()',QApplication.translate('HelpDlg','sets canvas color to the RGB-hex like #27f1d3')])
- tbl_Commands.add_row([' ','resetCanvasColor',QApplication.translate('HelpDlg','resets canvas color')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','activates button from { START, CHARGE, DRY, FCs, FCe, SCs, SCe, DROP, COOL, OFF } ')])
- tbl_Commands.add_row([' ','palette(
either a number 0-9 or a palette label')])
- tbl_Commands.add_row([' ','playbackmode()',QApplication.translate('HelpDlg','sets playback mode to 0: off, 1: time, 2: BT, 3: ET')])
- tbl_Commands.add_row([' ','openProperties',QApplication.translate('HelpDlg','opens the Roast Properties dialog')])
- tbl_Commands.add_row([' ','loadBackground()',QApplication.translate('HelpDlg','loads the .alog profile at the given filepath as background profile')])
- tbl_Commands.add_row([' ','clearBackground',QApplication.translate('HelpDlg','clears the current background profile')])
- tbl_Commands.add_row([' ','alarmset()',QApplication.translate('HelpDlg','activates the alarmset with the given number or label')])
- tbl_Commands.add_row([' ','moveBackground(,)',QApplication.translate('HelpDlg','moves the background profile the indicated number of steps towards , with one of up, down, left, right')])
- tbl_Commands.add_row([' ','keyboard()',QApplication.translate('HelpDlg','enables/disables keyboard mode')])
- tbl_Commands.add_row([' ','keepON()',QApplication.translate('HelpDlg','enables/disables the Keep ON flag')])
- tbl_Commands.add_row([' ','showCurve(,)',QApplication.translate('HelpDlg','shows/hides the curve indicated by which is one of { ET, BT, DeltaET, DeltaBT, BackgroundET, BackgroundBT}')])
- tbl_Commands.add_row([' ','showExtraCurve(,,)',QApplication.translate('HelpDlg','shows/hides the (one of {T1,T2}) of the zero-based number')])
- tbl_Commands.add_row([' ','showEvents(, )',QApplication.translate('HelpDlg','shows/hides the events of in [1,..,5]')])
- tbl_Commands.add_row([' ','showBackgroundEvents()',QApplication.translate('HelpDlg','shows/hides the events of the background profile')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','RC Command'),'pulse(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max pulse width in microseconds')])
- tbl_Commands.add_row([' ','pos(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max position')])
- tbl_Commands.add_row([' ','engaged(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: engage (b=1) or disengage (b = 0)')])
- tbl_Commands.add_row([' ','ramp(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: activates or deactivates the speed ramping state')])
- tbl_Commands.add_row([' ','volt(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the voltage to one of 5, 6 or 7.4 in Volt')])
- tbl_Commands.add_row([' ','accel(ch,a[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the acceleration')])
- tbl_Commands.add_row([' ','veloc(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the velocity')])
- tbl_Commands.add_row([' ','set(ch,pos[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the target position')])
- tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, b a bool (eg. enabled(0,1) or enabled(0,True))')])
- tbl_Commands.add_row([' ','move(c,p[,t][,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, p:int the target position, the optional t the duration in ms')])
- tbl_Commands.add_row([' ','neutral(c,n[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with n an int [0..65000] in us')])
- tbl_Commands.add_row([' ','range(c,r[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with r an int in %')])
- tbl_Commands.add_row([QApplication.translate('HelpDlg','WebSocket Command'),'send()',QApplication.translate('HelpDlg','If {} substitutions are used, json brackets need to be duplicated to escape them like in send({{ “value”: {}}})')])
- tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
- tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument evaluates to 1 or True')])
- tbl_Commands.add_row([' ','read()',QApplication.translate('HelpDlg','if the `` text respects the JSON format it is send to the connected WebSocket server and the response is bound to the variable `_`')])
- strlist.append(tbl_Commands.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','EVENT CUSTOM SLIDERS'))
+ strlist.append('')
+ tbl_Sliders = prettytable.PrettyTable()
+ tbl_Sliders.field_names = [QApplication.translate('HelpDlg','Column'),QApplication.translate('HelpDlg','Description')]
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Event'),QApplication.translate('HelpDlg','Hide or show the corresponding slider.')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Perform an action on the slider release.')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Command to perform, depends on the Action type. ('{}' is replaced by the slider value*Factor + Offset)')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Offset'),QApplication.translate('HelpDlg','Offset to be added to the Slider value (after scaling by Factor).')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Factor'),QApplication.translate('HelpDlg','Scale factor, Slider value is multiplied by this value.')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Min'),QApplication.translate('HelpDlg','Sets the minimum value for the range of the slider.')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Max'),QApplication.translate('HelpDlg','Sets the maximum value for the range of the slider.')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Course'),QApplication.translate('HelpDlg','When ticked the slider moves in steps of 10.')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Temp'),QApplication.translate('HelpDlg','Should be ticked when the slider's value is a temperature to allow Artisan to properly scale the value between Centigrade and Fahrenheit.')])
+ tbl_Sliders.add_row([QApplication.translate('HelpDlg','Unit'),QApplication.translate('HelpDlg','Optional text used in annotations to the the units used for the slider value.')])
+ strlist.append(tbl_Sliders.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','COMMANDS'))
+ strlist.append('')
+ tbl_Commandstop = prettytable.PrettyTable()
+ tbl_Commandstop.header = False
+ tbl_Commandstop.add_row([QApplication.translate('HelpDlg','Note: "{}" can be used as a placeholder, it will be substituted by (value*factor + offset). In all slider command actions, but for IO, VOUT, S7 and RC Commands, the bound value is converted from a float to an int.\n')+newline+QApplication.translate('HelpDlg','Note: The placeholders {ET}, {BT}, {time}, {ETB}, {BTB}, and {WEIGHTin} will be substituted by the current ET, BT, time, ET background, BT background value, and batch size (in g) in Serial/Artisan/CallProgram/MODBUS/S7/WebSocket commands\n')+newline+QApplication.translate('HelpDlg','Note: commands can be sequenced, separated by semicolons like in “;;”\n')+newline+QApplication.translate('HelpDlg','Note: in PHIDGET commands, the optional parameter has the form [:] allows to refer to a specific Phidget HUB by given its serial number, and optionally specifying the port number the addressed module is connected to.\n')+newline+QApplication.translate('HelpDlg','Note: in YOCTOPUCE commands, the optional parameters holds either the modules serial number or its name')])
+ strlist.append(tbl_Commandstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Commands = prettytable.PrettyTable()
+ tbl_Commands.field_names = [QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Command'),QApplication.translate('HelpDlg','Description')]
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Serial Command'),QApplication.translate('HelpDlg','ASCII serial command or binary a2b_uu(serial command)'),' '])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Modbus Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via MODBUS')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument is 1 or True')])
+ tbl_Commands.add_row([' ','read(slaveID,register)',QApplication.translate('HelpDlg','reads register from slave slaveID using function 3 (Read Multiple Holding Registers). The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','readSigned(slaveId,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','readBCD(slaveID,register)',QApplication.translate('HelpDlg','reads 1 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','read32(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as unsigned integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','read32Signed(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as signed integer. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','read32BCD(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit register from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as BCD. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','readFloat(slaveID,register)',QApplication.translate('HelpDlg','reads 2 16bit registers from slave slaveID using function 3 (Read Multiple Holding Registers) interpreted as float. The result is bound to the placeholder `_` and thus can be accessed in later commands.')])
+ tbl_Commands.add_row([' ','write(slaveId,register,value) or write([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write register: MODBUS function 6 (int) or function 16 (float)')])
+ tbl_Commands.add_row([' ','wcoil(slaveId,register,)',QApplication.translate('HelpDlg','write coil: MODBUS function 5')])
+ tbl_Commands.add_row([' ','wcoils(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write coils: MODBUS function 15')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg',' '),'mwrite(slaveId,register,andMask,orMask) or mwrite(s,r,am,om,v)',QApplication.translate('HelpDlg','mask write register: MODBUS function 22 or simulates function 22 with function 6 and the given value v')])
+ tbl_Commands.add_row([' ','writem(slaveId,register,value) or writem(slaveId,register,[,..,])',QApplication.translate('HelpDlg','write registers: MODBUS function 16')])
+ tbl_Commands.add_row([' ','writeBCD(s,r,v) or writeBCD([s,r,v],..,[s,r,v])',QApplication.translate('HelpDlg','write 16bit BCD encoded value v to register r of slave s ')])
+ tbl_Commands.add_row([' ','writeWord(slaveId,register,value) or writeWord([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit float to two 16bit int registers: MODBUS function 16')])
+ tbl_Commands.add_row([' ','writeLong(slaveId,register,value) or writeLong([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 32bit integer to two 16bit int registers: MODBUS function 16')])
+ tbl_Commands.add_row([' ','writeSingle(slaveId,register,value) or writeSingle([slaveId,register,value],..,[slaveId,register,value])',QApplication.translate('HelpDlg','write 16bit integer to a single 16bit register: MODBUS function 6 (int)')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','DTA Command'),QApplication.translate('HelpDlg','Insert Data address : value, ex. 4701:1000 and sv is 100. '),QApplication.translate('HelpDlg','Always multiply with 10 if value Unit: 0.1 / ex. 4719:0 stops heating')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Call Program'),QApplication.translate('HelpDlg','A program/script path (absolute or relative)'),QApplication.translate('HelpDlg','start and external program')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Hottop Command'),'motor(n),solenoid(n),stirrer(n),heater(h),fan(f) ',QApplication.translate('HelpDlg','with n={0 ,1},h={0,..100},f={0,..10}')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Fuji Command'),'write(,,)',' '])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','PWM Command'),'out(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: in [0-100]')])
+ tbl_Commands.add_row([' ','toggle([,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: toggles ')])
+ tbl_Commands.add_row([' ','pulse(,[,])',QApplication.translate('HelpDlg','PHIDGET PWM Output: turn on for milliseconds')])
+ tbl_Commands.add_row([' ','outhub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: in [0-100]')])
+ tbl_Commands.add_row([' ','togglehub([,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: toggles ')])
+ tbl_Commands.add_row([' ','pulsehub(,[,])',QApplication.translate('HelpDlg','PHIDGET HUB PWM Output: turn on for milliseconds')])
+ tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: PWM running state')])
+ tbl_Commands.add_row([' ','freq(c,f[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM frequency to f (Hz)')])
+ tbl_Commands.add_row([' ','duty(c,d[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: set PWM period with the duty cycle in % as a float [0.0-100.0]')])
+ tbl_Commands.add_row([' ','move(c,d,t[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE PWM Output: changes progressively the PWM to the specified value over the given time interval')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','VOUT Command'),'range(c,r[,sn])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: sets voltage voltage range (r=5 for r5V and r=10 for 10V)')])
+ tbl_Commands.add_row([' ','out(n,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET OUTPUT modules: set analog output channel n to output voltage value v in V (eg. 5.5 for 5.5V)')])
+ tbl_Commands.add_row([' ','vout(c,v[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE VOLTAGE OUT modules with c the channel (1 or 2),v the voltage as float [0.0-10.0]')])
+ tbl_Commands.add_row([' ','cout(c[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE CURRENT OUT modules with c the current as float [3.0-21.0]')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','IO Command'),'set(c,b[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: switches channel c off (b=0) and on (b=1)')])
+ tbl_Commands.add_row([' ','toggle(c[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: toggles channel c')])
+ tbl_Commands.add_row([' ','pulse(c,t[,sn])',QApplication.translate('HelpDlg','PHIDGET Binary Output: sets the output of channel c to on for time t in milliseconds')])
+ tbl_Commands.add_row([' ','out(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET Voltage Output: sets voltage output of channel c to v (float)')])
+ tbl_Commands.add_row([' ','accel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets acceleration of channel c to v (float)')])
+ tbl_Commands.add_row([' ','vel(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets target velocity of channel c to v (float)')])
+ tbl_Commands.add_row([' ','limit(c,v[,sn])',QApplication.translate('HelpDlg','PHIDGET DCMotor: sets current limit of channel c to v (float)')])
+ tbl_Commands.add_row([' ','on(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module on')])
+ tbl_Commands.add_row([' ','off(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: turn channel c of the relay module off')])
+ tbl_Commands.add_row([' ','yset(c,b[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: switches channel c of the relay module off (b=0) and on (b=1)')])
+ tbl_Commands.add_row([' ','flip(c[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: toggle the state of channel c')])
+ tbl_Commands.add_row([' ','pip(c,delay,duration[,sn])',QApplication.translate('HelpDlg','YOCTOPUCE Relay Output: pulse the channel c on after a delay of delay milliseconds for the duration of duration milliseconds')])
+ tbl_Commands.add_row([' ','powerReset([sn])',QApplication.translate('HelpDlg','YOCTOPUCE resets the power counter of the Yocto-Watt module')])
+ tbl_Commands.add_row([' ','slider(c,v)',QApplication.translate('HelpDlg','move slider c to value v')])
+ tbl_Commands.add_row([' ','button(i,c,b[,sn])',QApplication.translate('HelpDlg','switches PHIDGET Binary Output channel c off (b=0) and on (b=1) and sets button i to pressed or normal depending on the value b')])
+ tbl_Commands.add_row([' ','button(i,b)',QApplication.translate('HelpDlg','sets button i to pressed if value b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button(b)',QApplication.translate('HelpDlg','sets button to pressed if value b is yes, true, t, or 1, otherwise to normal')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','toggles the state of the button')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','santoker(,)',QApplication.translate('HelpDlg','sends integer to register specified by as byte in hex notation like “fa” via the Santoker Network protocol')])
+ tbl_Commands.add_row([' ','kaleido(,)',QApplication.translate('HelpDlg','sends to via the Kaleido Serial or Network protocol')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','S7 Command'),'_',QApplication.translate('HelpDlg','variable holding the last value read via S7')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument evaluates to 1 or True')])
+ tbl_Commands.add_row([' ','getDBbool(,,)',QApplication.translate('HelpDlg','read bool from S7 DB')])
+ tbl_Commands.add_row([' ','getDBint(,)',QApplication.translate('HelpDlg','read int from S7 DB')])
+ tbl_Commands.add_row([' ','getDBfloat(,)',QApplication.translate('HelpDlg','read float from S7 DB')])
+ tbl_Commands.add_row([' ','setDBbool(,,,)',QApplication.translate('HelpDlg','write bool to S7 DB')])
+ tbl_Commands.add_row([' ','setDBint(,,)',QApplication.translate('HelpDlg','write int to S7 DB')])
+ tbl_Commands.add_row([' ','setDBfloat(,,)',QApplication.translate('HelpDlg','write float to S7 DB')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Heater'),' ',QApplication.translate('HelpDlg','sets heater to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Fan'),' ',QApplication.translate('HelpDlg','sets fan to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Aillio R1 Drum'),' ',QApplication.translate('HelpDlg','sets drum speed to value')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','Artisan Command'),'alarms()',QApplication.translate('HelpDlg','enables/disables alarms')])
+ tbl_Commands.add_row([' ','autoCHARGE()',QApplication.translate('HelpDlg','enables/disables autoCHARGE')])
+ tbl_Commands.add_row([' ','autoDROP()',QApplication.translate('HelpDlg','enables/disables autoDROP')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','tare()',QApplication.translate('HelpDlg','tare channel with 1 => ET, 2 => BT, 3 => E1c1, 4: E1c2,..')])
+ tbl_Commands.add_row([' ','PIDon',QApplication.translate('HelpDlg','turns PID on')])
+ tbl_Commands.add_row([' ','PIDoff',QApplication.translate('HelpDlg','turns PID off')])
+ tbl_Commands.add_row([' ','PIDtoggle',QApplication.translate('HelpDlg','toggles the PID state')])
+ tbl_Commands.add_row([' ','pidmode()',QApplication.translate('HelpDlg','sets PID mode to 0: manual, 1: RS, 2: background follow')])
+ tbl_Commands.add_row([' ','p-i-d(
,,)',QApplication.translate('HelpDlg','sets the p-i-d parameters of the PID')])
+ tbl_Commands.add_row([' ','adjustSV()',QApplication.translate('HelpDlg','increases or decreases the current target SV value by ')])
+ tbl_Commands.add_row([' ','pidSV()',QApplication.translate('HelpDlg','sets the PID target set value SV')])
+ tbl_Commands.add_row([' ','pidSVC()',QApplication.translate('HelpDlg','sets the PID target set value SV given in C')])
+ tbl_Commands.add_row([' ','pidRS()',QApplication.translate('HelpDlg','activates the PID Ramp-Soak pattern number (1-based!) or the one labeled ')])
+ tbl_Commands.add_row([' ','pidSource()',QApplication.translate('HelpDlg','selects the PID input source with 0: BT, 1: ET (Software PID); in {0,..,3} (Arduino PID)')])
+ tbl_Commands.add_row([' ','pidLookahead()',QApplication.translate('HelpDlg','sets the PID lookahead')])
+ tbl_Commands.add_row([' ','popup([,])',QApplication.translate('HelpDlg','shows popup with message which optionally automatically closes after seconds')])
+ tbl_Commands.add_row([' ','message()',QApplication.translate('HelpDlg','shows message in the message line')])
+ tbl_Commands.add_row([' ','notifications()',QApplication.translate('HelpDlg','enables/disables notifications; while disabled issued notifications are ignored')])
+ tbl_Commands.add_row([' ','notify(,[])',QApplication.translate('HelpDlg','sends notification with title and optional message ')])
+ tbl_Commands.add_row([' ','setCanvasColor()',QApplication.translate('HelpDlg','sets canvas color to the RGB-hex like #27f1d3')])
+ tbl_Commands.add_row([' ','resetCanvasColor',QApplication.translate('HelpDlg','resets canvas color')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','activates button from { START, CHARGE, DRY, FCs, FCe, SCs, SCe, DROP, COOL, OFF } ')])
+ tbl_Commands.add_row([' ','palette(
either a number 0-9 or a palette label')])
+ tbl_Commands.add_row([' ','playbackmode()',QApplication.translate('HelpDlg','sets playback mode to 0: off, 1: time, 2: BT, 3: ET')])
+ tbl_Commands.add_row([' ','openProperties',QApplication.translate('HelpDlg','opens the Roast Properties dialog')])
+ tbl_Commands.add_row([' ','loadBackground()',QApplication.translate('HelpDlg','loads the .alog profile at the given filepath as background profile')])
+ tbl_Commands.add_row([' ','clearBackground',QApplication.translate('HelpDlg','clears the current background profile')])
+ tbl_Commands.add_row([' ','alarmset()',QApplication.translate('HelpDlg','activates the alarmset with the given number or label')])
+ tbl_Commands.add_row([' ','moveBackground(,)',QApplication.translate('HelpDlg','moves the background profile the indicated number of steps towards , with one of up, down, left, right')])
+ tbl_Commands.add_row([' ','keyboard()',QApplication.translate('HelpDlg','enables/disables keyboard mode')])
+ tbl_Commands.add_row([' ','keepON()',QApplication.translate('HelpDlg','enables/disables the Keep ON flag')])
+ tbl_Commands.add_row([' ','showCurve(,)',QApplication.translate('HelpDlg','shows/hides the curve indicated by which is one of { ET, BT, DeltaET, DeltaBT, BackgroundET, BackgroundBT}')])
+ tbl_Commands.add_row([' ','showExtraCurve(,,)',QApplication.translate('HelpDlg','shows/hides the (one of {T1,T2}) of the zero-based number')])
+ tbl_Commands.add_row([' ','showEvents(, )',QApplication.translate('HelpDlg','shows/hides the events of in [1,..,5]')])
+ tbl_Commands.add_row([' ','showBackgroundEvents()',QApplication.translate('HelpDlg','shows/hides the events of the background profile')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','RC Command'),'pulse(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max pulse width in microseconds')])
+ tbl_Commands.add_row([' ','pos(ch,min,max[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: sets the min/max position')])
+ tbl_Commands.add_row([' ','engaged(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: engage (b=1) or disengage (b = 0)')])
+ tbl_Commands.add_row([' ','ramp(ch,b[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: activates or deactivates the speed ramping state')])
+ tbl_Commands.add_row([' ','volt(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the voltage to one of 5, 6 or 7.4 in Volt')])
+ tbl_Commands.add_row([' ','accel(ch,a[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the acceleration')])
+ tbl_Commands.add_row([' ','veloc(ch,v[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the velocity')])
+ tbl_Commands.add_row([' ','set(ch,pos[,sn])',QApplication.translate('HelpDlg','for PHIDGET RC modules: set the target position')])
+ tbl_Commands.add_row([' ','enabled(c,b[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, b a bool (eg. enabled(0,1) or enabled(0,True))')])
+ tbl_Commands.add_row([' ','move(c,p[,t][,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with c:int the channel, p:int the target position, the optional t the duration in ms')])
+ tbl_Commands.add_row([' ','neutral(c,n[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with n an int [0..65000] in us')])
+ tbl_Commands.add_row([' ','range(c,r[,sn])',QApplication.translate('HelpDlg','for YOCTOPUCE RC modules: with r an int in %')])
+ tbl_Commands.add_row([QApplication.translate('HelpDlg','WebSocket Command'),'send()',QApplication.translate('HelpDlg','If {} substitutions are used, json brackets need to be duplicated to escape them like in send({{ “value”: {}}})')])
+ tbl_Commands.add_row([' ','sleep()',QApplication.translate('HelpDlg','sleep: add a delay of seconds')])
+ tbl_Commands.add_row([' ','button()',QApplication.translate('HelpDlg','sets calling button to “pressed” if argument evaluates to 1 or True')])
+ tbl_Commands.add_row([' ','read()',QApplication.translate('HelpDlg','if the `` text respects the JSON format it is send to the connected WebSocket server and the response is bound to the variable `_`')])
+ strlist.append(tbl_Commands.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','KEYBOARD SHORTCUTS'))
- strlist.append('')
- tbl_KeyboardShortcuts = prettytable.PrettyTable()
- tbl_KeyboardShortcuts.field_names = [QApplication.translate('HelpDlg','Keys'),QApplication.translate('HelpDlg','Description')]
- tbl_KeyboardShortcuts.add_row(['ENTER',QApplication.translate('HelpDlg','Turns ON/OFF Keyboard Shortcuts')])
- tbl_KeyboardShortcuts.add_row(['⌘-ENTER [Mac]\nCTRL+ENTER [Win]',QApplication.translate('HelpDlg','Starts recording')])
- tbl_KeyboardShortcuts.add_row(['SHIFT-ENTER',QApplication.translate('HelpDlg','Turns Artisan OFF')])
- tbl_KeyboardShortcuts.add_row(['SPACE',QApplication.translate('HelpDlg','When Keyboard Shortcuts are ON chooses the current button\nWhen Keyboard Shortcuts are OFF adds a custom event\nWhen Meter=NONE opens dialog to manually enter temperatures during roast')])
- tbl_KeyboardShortcuts.add_row(['LEFT,RIGHT',QApplication.translate('HelpDlg','Change roast event key focus')])
- tbl_KeyboardShortcuts.add_row(['LEFT,RIGHT,UP,DOWN',QApplication.translate('HelpDlg','Move background (when sliders not visible or when Config>> Events>> Sliders tab>> Keyboard Control is not selected)')])
- tbl_KeyboardShortcuts.add_row(['A',QApplication.translate('HelpDlg','Autosave')])
- tbl_KeyboardShortcuts.add_row(['⌘-N [Mac]\nCRTL+N [Win]',QApplication.translate('HelpDlg','Autosave + RESET + START')])
- tbl_KeyboardShortcuts.add_row(['T [Mac]\nCTRL+SHIFT+T [Win]',QApplication.translate('HelpDlg','Toggle mouse cross lines')])
- tbl_KeyboardShortcuts.add_row(['G',QApplication.translate('HelpDlg','Toggle auto axis mode between Roast, BBP+Roast and BBP')])
- tbl_KeyboardShortcuts.add_row(['D',QApplication.translate('HelpDlg','Toggle xy cursor mode (off/temp/delta)')])
- tbl_KeyboardShortcuts.add_row(['Z',QApplication.translate('HelpDlg','Toggle xy cursor clamp mode (off/BT/ET/BTB/ETB)')])
- tbl_KeyboardShortcuts.add_row(['U',QApplication.translate('HelpDlg','Toggle LCD cursor (off/profile/background)')])
- tbl_KeyboardShortcuts.add_row(['C',QApplication.translate('HelpDlg','Shows/Hides Controls')])
- tbl_KeyboardShortcuts.add_row(['X',QApplication.translate('HelpDlg','Shows/Hides LCD Readings')])
- tbl_KeyboardShortcuts.add_row(['Y',QApplication.translate('HelpDlg','Shows/Hides Mini Event editor (on recording)')])
- tbl_KeyboardShortcuts.add_row(['M',QApplication.translate('HelpDlg','Shows/Hides Event Buttons')])
- tbl_KeyboardShortcuts.add_row(['B',QApplication.translate('HelpDlg','Shows/Hides Extra Event Buttons')])
- tbl_KeyboardShortcuts.add_row(['S',QApplication.translate('HelpDlg','Shows/Hides Event Sliders')])
- tbl_KeyboardShortcuts.add_row(['P',QApplication.translate('HelpDlg','Toggle PID mode')])
- tbl_KeyboardShortcuts.add_row(['J',QApplication.translate('HelpDlg','Toggle Playback Events')])
- tbl_KeyboardShortcuts.add_row(['H\nCTRL+H [Win]',QApplication.translate('HelpDlg','Load background profile')])
- tbl_KeyboardShortcuts.add_row(['OPTION+H [Mac]\nCTRL+SHIFT+H [Win]',QApplication.translate('HelpDlg','Remove background profile')])
- tbl_KeyboardShortcuts.add_row(['I',QApplication.translate('HelpDlg','Toggle foreground curves “show full”')])
- tbl_KeyboardShortcuts.add_row(['O',QApplication.translate('HelpDlg','Toggle background curves “show full”')])
- tbl_KeyboardShortcuts.add_row(['L',QApplication.translate('HelpDlg','Load alarms')])
- tbl_KeyboardShortcuts.add_row(['+,-',QApplication.translate('HelpDlg','Inc/dec PID lookahead')])
- tbl_KeyboardShortcuts.add_row(['⌘ +,- [Mac]\nCRTL +,- [Win]',QApplication.translate('HelpDlg','Inc/dec graph resolution')])
- tbl_KeyboardShortcuts.add_row(['⌘ 0-9 [Mac]\nCRTL 0-9 [Win]',QApplication.translate('HelpDlg','Changes Event Button Palettes')])
- tbl_KeyboardShortcuts.add_row([';',QApplication.translate('HelpDlg','Application ScreenShot')])
- tbl_KeyboardShortcuts.add_row([':',QApplication.translate('HelpDlg','Desktop ScreenShot')])
- tbl_KeyboardShortcuts.add_row(['Q,W,E,R + ',QApplication.translate('HelpDlg','Quick Special Event Entry. The keys q,w,e, and r correspond to special events 1,2,3 and 4. A two digit numeric value must follow the shortcut letter, e.g. 'q75', when the corresponding event slider max value is 100 or less (default setting). When the slider max value is greater than 100, three digits must be entered and for values less than 100 a leading zero is required, e.g. 'q075'. ')])
- tbl_KeyboardShortcuts.add_row(['V + ',QApplication.translate('HelpDlg','Quick PID SV Entry. Value is a three digit number. For values less than 100 must be entered with a leading zero, e.g. 'v075'.')])
- tbl_KeyboardShortcuts.add_row(['OPTION+B + [Mac]\nCTRL+SHIFT+B + [Win]',QApplication.translate('HelpDlg','Fire custom event button action. Value is a two digit number indicating the button number.')])
- tbl_KeyboardShortcuts.add_row(['F\nCTRL+SHIFT+F [Win]',QApplication.translate('HelpDlg','Full Screen Mode')])
- strlist.append(tbl_KeyboardShortcuts.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','ADDITIONAL SHORTCUTS'))
- strlist.append('')
- tbl_AddlShortcuts = prettytable.PrettyTable()
- tbl_AddlShortcuts.field_names = [QApplication.translate('HelpDlg','Key/mouse stroke(s)'),QApplication.translate('HelpDlg','Where'),QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Additional Information')]
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Double click on Roast Title'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Open the roast in artisan.plus'),QApplication.translate('HelpDlg','Requires an artisan.plus account')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Double Click on Background Profile Title'),QApplication.translate('HelpDlg','Graph & Designer'),QApplication.translate('HelpDlg','Toggle Show/Hide Background Profile'),QApplication.translate('HelpDlg','Only when a Background profile is loaded')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Right click on BT curve'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Place or re-place events'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Right click on timer'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle super mode'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Right click on characteristics line below graph'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle set of characteristics displayed'),QApplication.translate('HelpDlg','Characteristics must be enabled in Config>> Statistics')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on plus icon (when not red)'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle connect/disconnect to plus'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on plus icon (when it is red)'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Sync the roast with artisan.plus'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click on plus icon [Mac]\nCTRL click on plus icon [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','When connected to plus, disconnect and clear credentials'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click on plus icon [Mac]\nALT click on plus icon [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Generate email message with Artisan Logs'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+OPTION click on plus icon [Mac]\nCTRL+ALT click on plus icon [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle debug logging mode'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on LCD'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Hide or Show corresponding Curve'),QApplication.translate('HelpDlg','In OFF state this changes the Artisan Settings, in ON/START states the change is temporary until OFF state')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on label in the Legend'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Hide or Show corresponding Curve'),QApplication.translate('HelpDlg','Only in OFF state when the Legend is displayed')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click 'RESET' Button [Mac]\nALT click 'RESET' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Detach IO Phidgets'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click 'CONTROL' Button [Mac]\nCTRL click 'CONTROL' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle PID Standby on and off'),QApplication.translate('HelpDlg','Device = Fuji or Delta')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click 'CONTROL' Button [Mac]\nCTRL click 'CONTROL' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Opens PID dialog'),QApplication.translate('HelpDlg','Device = Hottop')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click 'CONTROL' Button [Mac]\nCTRL click 'CONTROL' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle PID'),QApplication.translate('HelpDlg','Device = , Control enabled in Config>> Device')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+PLUS, ⌘+MINUS [Mac]\nCTRL+SHIFT+PLUS, CTRL+MINUS [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Increase or Decrease Graph Resolution %'),QApplication.translate('HelpDlg','Same as Config>> Curves>> UI tab>> Graph % +/-')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','TAB'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Sequence slider select'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be turned off (ENTER)')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','UP,DOWN,RIGHT,LEFT'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Increment selected slider up or down by step amount'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be turned off (ENTER)')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION+UP, OPTION+DOWN [Mac]\nPAGEUP,PAGEDOWN [Win]'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Increment selected slider up or down by 10'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be turned off (ENTER)')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','HOME,END'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Set selected slider to minimum or maximum value'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be disabled (ENTER)')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on timer'),QApplication.translate('HelpDlg','Simulator'),QApplication.translate('HelpDlg','Toggle Pause/Continue Simulation'),QApplication.translate('HelpDlg','Simulator speed may be changd while paused (hold shift (1x), OPTION/ALT (2x) or COMMAND/CTRL (4x) on restart).')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION Tools>>Simulator [Mac]\nALT Tools>>Simulator [Win]'),QApplication.translate('HelpDlg','Graph/Simulator'),QApplication.translate('HelpDlg','Start or change Simulator speed to 2x mode'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ Tools>>Simulator [Mac]\nCTRL Tools>>Simulator [Win]'),QApplication.translate('HelpDlg','Graph/Simulator'),QApplication.translate('HelpDlg','Start or change Simulator speed to 4x mode'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+L [Mac]\nCTRL+L [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Open volume calculator'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click Stock [Mac]\nALT click Stock [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Show plus Stock in alternate weight unit from Artisan setting (imperial <-> metric)'),QApplication.translate('HelpDlg','Requires a connection to plus')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click '+' button [Mac]\nALT click '+' button [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Adds Weight Roasted, Volume Roasted, Moisture Roasted, ColorWhole, and Color Ground to the recent roast'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION File>> New>> [Mac]\nALT File>> New>> [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Sets roast properties to without starting a new roast'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+I [Mac]\nCTRL+I [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Adds scale weight to Green Weight field (same action as 'in' button)'),QApplication.translate('HelpDlg','Requires a connected scale')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+O [Mac]\nCTRL+O [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Adds scale weight to Roasted Weight field (same action as 'out' button)'),QApplication.translate('HelpDlg','Requires a connected scale')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+P [Mac]\nCTRL+P [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Clear accumulated scale weight preview display (same as clicking on the preview display)'),QApplication.translate('HelpDlg','Requires a connected scale')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Enter'),QApplication.translate('HelpDlg','Roast Properties Roast Tab\nVolume Calculator Unit, Green Unit Weight or Roasted Unit Weight field'),QApplication.translate('HelpDlg','Overwrite with current scale weight (same action as 'unit', 'in', 'out' buttons)'),QApplication.translate('HelpDlg','Requires a connected scale')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Enter'),QApplication.translate('HelpDlg','Roast Properties Roast tab\nGreen Weight or Roasted Weight field'),QApplication.translate('HelpDlg','Overwrite with current scale weight'),QApplication.translate('HelpDlg','Requires a connected scale')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+C [Mac]\nCTRL+C [Win]'),QApplication.translate('HelpDlg','Roast Properties Data tab'),QApplication.translate('HelpDlg','Copy table'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click 'Copy Table' Button [Mac]\nALT click 'Copy Table' Button [Win]'),QApplication.translate('HelpDlg','Various'),QApplication.translate('HelpDlg','For various tables this copies the table in tabular form'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on Home Icon\nWhile recording only'),QApplication.translate('HelpDlg','Navigation Toolbar'),QApplication.translate('HelpDlg','Toggle Zoom Follow (automatic panning)'),QApplication.translate('HelpDlg','Zoom action while recording sets Follow ON')])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Hold Shift+Option [Mac]\nHold Shift+Alt [Win]'),QApplication.translate('HelpDlg','When starting Artisan'),QApplication.translate('HelpDlg','Skip Settings Load'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Hold Shift+Option [Mac]\nHold Shift+Alt [Win]'),QApplication.translate('HelpDlg','When quitting Artisan'),QApplication.translate('HelpDlg','Skip Settings Save'),' '])
- tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Hold Shift+Option [Mac]\nHold Shift+Alt [Win]'),QApplication.translate('HelpDlg','When opening a profile (.alog file)'),QApplication.translate('HelpDlg','Skip creating settings cache and ask user to apply existing settings or settings from profile'),' '])
- strlist.append(tbl_AddlShortcuts.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','MENU SHORTCUTS'))
- strlist.append('')
- tbl_MenuShortcuts = prettytable.PrettyTable()
- tbl_MenuShortcuts.field_names = [QApplication.translate('HelpDlg','Keys'),QApplication.translate('HelpDlg','Menu'),QApplication.translate('HelpDlg','Action')]
- tbl_MenuShortcuts.add_row(['⌘+O [Mac]\nCTRL+O [Win]',QApplication.translate('HelpDlg','File'),QApplication.translate('HelpDlg','Open')])
- tbl_MenuShortcuts.add_row(['⌘+S [Mac]\nCTRL+S [Win]',QApplication.translate('HelpDlg','File'),QApplication.translate('HelpDlg','Save')])
- tbl_MenuShortcuts.add_row(['⌘+P [Mac]\nCTRL+P [Win]',QApplication.translate('HelpDlg','File'),QApplication.translate('HelpDlg','Print')])
- tbl_MenuShortcuts.add_row(['⌘+X [Mac]\nCTRL+X [Win]',QApplication.translate('HelpDlg','Edit'),QApplication.translate('HelpDlg','Cut')])
- tbl_MenuShortcuts.add_row(['⌘+C [Mac]\nCTRL+C [Win]',QApplication.translate('HelpDlg','Edit'),QApplication.translate('HelpDlg','Copy')])
- tbl_MenuShortcuts.add_row(['⌘+V [Mac]\nCTRL+V [Win]',QApplication.translate('HelpDlg','Edit'),QApplication.translate('HelpDlg','Paste')])
- tbl_MenuShortcuts.add_row(['⌘+T [Mac]\nCTRL+T [Win]',QApplication.translate('HelpDlg','Roast'),QApplication.translate('HelpDlg','Open Roast Properties dialog')])
- tbl_MenuShortcuts.add_row(['⌘+B [Mac]\nCTRL+B [Win]',QApplication.translate('HelpDlg','Roast'),QApplication.translate('HelpDlg','Open Profile Background dialog')])
- tbl_MenuShortcuts.add_row(['⌘+F4 [Mac]\nCTRL+F4 [Win]',QApplication.translate('HelpDlg','Roast'),QApplication.translate('HelpDlg','Switch Profiles (Foreground<=>Background)')])
- tbl_MenuShortcuts.add_row(['⌘+D [Mac]\nCTRL+D [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Devices dialog')])
- tbl_MenuShortcuts.add_row(['⌘+U [Mac]\nCTRL+U [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Curves dialog')])
- tbl_MenuShortcuts.add_row(['⌘+E [Mac]\nCTRL+E [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Events dialog')])
- tbl_MenuShortcuts.add_row(['⌘+A [Mac]\nCTRL+A [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Alarms dialog')])
- tbl_MenuShortcuts.add_row(['⌘+SHIFT+A [Mac]\nCTRL+SHIFT+A [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Axes dialog')])
- tbl_MenuShortcuts.add_row(['⌘+K [Mac]\nCTRL+K [Win]',QApplication.translate('HelpDlg','Tools'),QApplication.translate('HelpDlg','Analyzer Auto All')])
- tbl_MenuShortcuts.add_row(['⌘+OPTION+A [Mac]\nCTRL+ALT+K [Win]',QApplication.translate('HelpDlg','Tools'),QApplication.translate('HelpDlg','Analyzer Clear Results')])
- tbl_MenuShortcuts.add_row(['⌘+L [Mac]\nCTRL+L [Win]',QApplication.translate('HelpDlg','View'),QApplication.translate('HelpDlg','Show/Hide Large Main LCDs')])
- tbl_MenuShortcuts.add_row(['⌘+F [Mac]\nCTRL+SHIFT+F [Win]',QApplication.translate('HelpDlg','View'),QApplication.translate('HelpDlg','Toggle Full Screen Mode \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 ')])
- tbl_MenuShortcuts.add_row(['F1',QApplication.translate('HelpDlg','Help'),QApplication.translate('HelpDlg','Open QuickStart Guide in the system browser')])
- strlist.append(tbl_MenuShortcuts.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','KEYBOARD SHORTCUTS'))
+ strlist.append('')
+ tbl_KeyboardShortcuts = prettytable.PrettyTable()
+ tbl_KeyboardShortcuts.field_names = [QApplication.translate('HelpDlg','Keys'),QApplication.translate('HelpDlg','Description')]
+ tbl_KeyboardShortcuts.add_row(['ENTER',QApplication.translate('HelpDlg','Turns ON/OFF Keyboard Shortcuts')])
+ tbl_KeyboardShortcuts.add_row(['⌘-ENTER [Mac]\nCTRL+ENTER [Win]',QApplication.translate('HelpDlg','Starts recording')])
+ tbl_KeyboardShortcuts.add_row(['SHIFT-ENTER',QApplication.translate('HelpDlg','Turns Artisan OFF')])
+ tbl_KeyboardShortcuts.add_row(['SPACE',QApplication.translate('HelpDlg','When Keyboard Shortcuts are ON chooses the current button\nWhen Keyboard Shortcuts are OFF adds a custom event\nWhen Meter=NONE opens dialog to manually enter temperatures during roast')])
+ tbl_KeyboardShortcuts.add_row(['LEFT,RIGHT',QApplication.translate('HelpDlg','Change roast event key focus')])
+ tbl_KeyboardShortcuts.add_row(['LEFT,RIGHT,UP,DOWN',QApplication.translate('HelpDlg','Move background (when sliders not visible or when Config>> Events>> Sliders tab>> Keyboard Control is not selected)')])
+ tbl_KeyboardShortcuts.add_row(['A',QApplication.translate('HelpDlg','Autosave')])
+ tbl_KeyboardShortcuts.add_row(['⌘-N [Mac]\nCRTL+N [Win]',QApplication.translate('HelpDlg','Autosave + RESET + START')])
+ tbl_KeyboardShortcuts.add_row(['T [Mac]\nCTRL+SHIFT+T [Win]',QApplication.translate('HelpDlg','Toggle mouse cross lines')])
+ tbl_KeyboardShortcuts.add_row(['G',QApplication.translate('HelpDlg','Toggle auto axis mode between Roast, BBP+Roast and BBP')])
+ tbl_KeyboardShortcuts.add_row(['D',QApplication.translate('HelpDlg','Toggle xy cursor mode (off/temp/delta)')])
+ tbl_KeyboardShortcuts.add_row(['Z',QApplication.translate('HelpDlg','Toggle xy cursor clamp mode (off/BT/ET/BTB/ETB)')])
+ tbl_KeyboardShortcuts.add_row(['U',QApplication.translate('HelpDlg','Toggle LCD cursor (off/profile/background)')])
+ tbl_KeyboardShortcuts.add_row(['C',QApplication.translate('HelpDlg','Shows/Hides Controls')])
+ tbl_KeyboardShortcuts.add_row(['X',QApplication.translate('HelpDlg','Shows/Hides LCD Readings')])
+ tbl_KeyboardShortcuts.add_row(['Y',QApplication.translate('HelpDlg','Shows/Hides Mini Event editor (on recording)')])
+ tbl_KeyboardShortcuts.add_row(['M',QApplication.translate('HelpDlg','Shows/Hides Event Buttons')])
+ tbl_KeyboardShortcuts.add_row(['B',QApplication.translate('HelpDlg','Shows/Hides Extra Event Buttons')])
+ tbl_KeyboardShortcuts.add_row(['S',QApplication.translate('HelpDlg','Shows/Hides Event Sliders')])
+ tbl_KeyboardShortcuts.add_row(['P',QApplication.translate('HelpDlg','Toggle PID mode')])
+ tbl_KeyboardShortcuts.add_row(['J',QApplication.translate('HelpDlg','Toggle Playback Events')])
+ tbl_KeyboardShortcuts.add_row(['H\nCTRL+H [Win]',QApplication.translate('HelpDlg','Load background profile')])
+ tbl_KeyboardShortcuts.add_row(['OPTION+H [Mac]\nCTRL+SHIFT+H [Win]',QApplication.translate('HelpDlg','Remove background profile')])
+ tbl_KeyboardShortcuts.add_row(['I',QApplication.translate('HelpDlg','Toggle foreground curves “show full”')])
+ tbl_KeyboardShortcuts.add_row(['O',QApplication.translate('HelpDlg','Toggle background curves “show full”')])
+ tbl_KeyboardShortcuts.add_row(['L',QApplication.translate('HelpDlg','Load alarms')])
+ tbl_KeyboardShortcuts.add_row(['+,-',QApplication.translate('HelpDlg','Inc/dec PID lookahead')])
+ tbl_KeyboardShortcuts.add_row(['⌘ +,- [Mac]\nCRTL +,- [Win]',QApplication.translate('HelpDlg','Inc/dec graph resolution')])
+ tbl_KeyboardShortcuts.add_row(['⌘ 0-9 [Mac]\nCRTL 0-9 [Win]',QApplication.translate('HelpDlg','Changes Event Button Palettes')])
+ tbl_KeyboardShortcuts.add_row([';',QApplication.translate('HelpDlg','Application ScreenShot')])
+ tbl_KeyboardShortcuts.add_row([':',QApplication.translate('HelpDlg','Desktop ScreenShot')])
+ tbl_KeyboardShortcuts.add_row(['Q,W,E,R + ',QApplication.translate('HelpDlg','Quick Special Event Entry. The keys q,w,e, and r correspond to special events 1,2,3 and 4. A two digit numeric value must follow the shortcut letter, e.g. 'q75', when the corresponding event slider max value is 100 or less (default setting). When the slider max value is greater than 100, three digits must be entered and for values less than 100 a leading zero is required, e.g. 'q075'. ')])
+ tbl_KeyboardShortcuts.add_row(['V + ',QApplication.translate('HelpDlg','Quick PID SV Entry. Value is a three digit number. For values less than 100 must be entered with a leading zero, e.g. 'v075'.')])
+ tbl_KeyboardShortcuts.add_row(['OPTION+B + [Mac]\nCTRL+SHIFT+B + [Win]',QApplication.translate('HelpDlg','Fire custom event button action. Value is a two digit number indicating the button number.')])
+ tbl_KeyboardShortcuts.add_row(['F\nCTRL+SHIFT+F [Win]',QApplication.translate('HelpDlg','Full Screen Mode')])
+ strlist.append(tbl_KeyboardShortcuts.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','ADDITIONAL SHORTCUTS'))
+ strlist.append('')
+ tbl_AddlShortcuts = prettytable.PrettyTable()
+ tbl_AddlShortcuts.field_names = [QApplication.translate('HelpDlg','Key/mouse stroke(s)'),QApplication.translate('HelpDlg','Where'),QApplication.translate('HelpDlg','Action'),QApplication.translate('HelpDlg','Additional Information')]
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Double click on Roast Title'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Open the roast in artisan.plus'),QApplication.translate('HelpDlg','Requires an artisan.plus account')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Double Click on Background Profile Title'),QApplication.translate('HelpDlg','Graph & Designer'),QApplication.translate('HelpDlg','Toggle Show/Hide Background Profile'),QApplication.translate('HelpDlg','Only when a Background profile is loaded')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Right click on BT curve'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Place or re-place events'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Right click on timer'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle super mode'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Right click on characteristics line below graph'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle set of characteristics displayed'),QApplication.translate('HelpDlg','Characteristics must be enabled in Config>> Statistics')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on plus icon (when not red)'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle connect/disconnect to plus'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on plus icon (when it is red)'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Sync the roast with artisan.plus'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click on plus icon [Mac]\nCTRL click on plus icon [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','When connected to plus, disconnect and clear credentials'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click on plus icon [Mac]\nALT click on plus icon [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Generate email message with Artisan Logs'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+OPTION click on plus icon [Mac]\nCTRL+ALT click on plus icon [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle debug logging mode'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on LCD'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Hide or Show corresponding Curve'),QApplication.translate('HelpDlg','In OFF state this changes the Artisan Settings, in ON/START states the change is temporary until OFF state')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on label in the Legend'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Hide or Show corresponding Curve'),QApplication.translate('HelpDlg','Only in OFF state when the Legend is displayed')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click 'RESET' Button [Mac]\nALT click 'RESET' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Detach IO Phidgets'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click 'CONTROL' Button [Mac]\nCTRL click 'CONTROL' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle PID Standby on and off'),QApplication.translate('HelpDlg','Device = Fuji or Delta')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click 'CONTROL' Button [Mac]\nCTRL click 'CONTROL' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Opens PID dialog'),QApplication.translate('HelpDlg','Device = Hottop')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ click 'CONTROL' Button [Mac]\nCTRL click 'CONTROL' Button [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Toggle PID'),QApplication.translate('HelpDlg','Device = , Control enabled in Config>> Device')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+PLUS, ⌘+MINUS [Mac]\nCTRL+SHIFT+PLUS, CTRL+MINUS [Win]'),QApplication.translate('HelpDlg','Graph'),QApplication.translate('HelpDlg','Increase or Decrease Graph Resolution %'),QApplication.translate('HelpDlg','Same as Config>> Curves>> UI tab>> Graph % +/-')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','TAB'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Sequence slider select'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be turned off (ENTER)')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','UP,DOWN,RIGHT,LEFT'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Increment selected slider up or down by step amount'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be turned off (ENTER)')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION+UP, OPTION+DOWN [Mac]\nPAGEUP,PAGEDOWN [Win]'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Increment selected slider up or down by 10'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be turned off (ENTER)')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','HOME,END'),QApplication.translate('HelpDlg','Graph when Sliders visible'),QApplication.translate('HelpDlg','Set selected slider to minimum or maximum value'),QApplication.translate('HelpDlg','Requires Keyboard Control enabled in Config>> Events\nKeyboard Shortcuts must be disabled (ENTER)')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on timer'),QApplication.translate('HelpDlg','Simulator'),QApplication.translate('HelpDlg','Toggle Pause/Continue Simulation'),QApplication.translate('HelpDlg','Simulator speed may be changd while paused (hold shift (1x), OPTION/ALT (2x) or COMMAND/CTRL (4x) on restart).')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION Tools>>Simulator [Mac]\nALT Tools>>Simulator [Win]'),QApplication.translate('HelpDlg','Graph/Simulator'),QApplication.translate('HelpDlg','Start or change Simulator speed to 2x mode'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘ Tools>>Simulator [Mac]\nCTRL Tools>>Simulator [Win]'),QApplication.translate('HelpDlg','Graph/Simulator'),QApplication.translate('HelpDlg','Start or change Simulator speed to 4x mode'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+L [Mac]\nCTRL+L [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Open volume calculator'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click Stock [Mac]\nALT click Stock [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Show plus Stock in alternate weight unit from Artisan setting (imperial <-> metric)'),QApplication.translate('HelpDlg','Requires a connection to plus')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click '+' button [Mac]\nALT click '+' button [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Adds Weight Roasted, Volume Roasted, Moisture Roasted, ColorWhole, and Color Ground to the recent roast'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION File>> New>> [Mac]\nALT File>> New>> [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Sets roast properties to without starting a new roast'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+I [Mac]\nCTRL+I [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Adds scale weight to Green Weight field (same action as 'in' button)'),QApplication.translate('HelpDlg','Requires a connected scale')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+O [Mac]\nCTRL+O [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Adds scale weight to Roasted Weight field (same action as 'out' button)'),QApplication.translate('HelpDlg','Requires a connected scale')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+P [Mac]\nCTRL+P [Win]'),QApplication.translate('HelpDlg','Roast Properties Roast tab'),QApplication.translate('HelpDlg','Clear accumulated scale weight preview display (same as clicking on the preview display)'),QApplication.translate('HelpDlg','Requires a connected scale')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Enter'),QApplication.translate('HelpDlg','Roast Properties Roast Tab\nVolume Calculator Unit, Green Unit Weight or Roasted Unit Weight field'),QApplication.translate('HelpDlg','Overwrite with current scale weight (same action as 'unit', 'in', 'out' buttons)'),QApplication.translate('HelpDlg','Requires a connected scale')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Enter'),QApplication.translate('HelpDlg','Roast Properties Roast tab\nGreen Weight or Roasted Weight field'),QApplication.translate('HelpDlg','Overwrite with current scale weight'),QApplication.translate('HelpDlg','Requires a connected scale')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','⌘+C [Mac]\nCTRL+C [Win]'),QApplication.translate('HelpDlg','Roast Properties Data tab'),QApplication.translate('HelpDlg','Copy table'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','OPTION click 'Copy Table' Button [Mac]\nALT click 'Copy Table' Button [Win]'),QApplication.translate('HelpDlg','Various'),QApplication.translate('HelpDlg','For various tables this copies the table in tabular form'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Click on Home Icon\nWhile recording only'),QApplication.translate('HelpDlg','Navigation Toolbar'),QApplication.translate('HelpDlg','Toggle Zoom Follow (automatic panning)'),QApplication.translate('HelpDlg','Zoom action while recording sets Follow ON')])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Hold Shift+Option [Mac]\nHold Shift+Alt [Win]'),QApplication.translate('HelpDlg','When starting Artisan'),QApplication.translate('HelpDlg','Skip Settings Load'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Hold Shift+Option [Mac]\nHold Shift+Alt [Win]'),QApplication.translate('HelpDlg','When quitting Artisan'),QApplication.translate('HelpDlg','Skip Settings Save'),' '])
+ tbl_AddlShortcuts.add_row([QApplication.translate('HelpDlg','Hold Shift+Option [Mac]\nHold Shift+Alt [Win]'),QApplication.translate('HelpDlg','When opening a profile (.alog file)'),QApplication.translate('HelpDlg','Skip creating settings cache and ask user to apply existing settings or settings from profile'),' '])
+ strlist.append(tbl_AddlShortcuts.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','MENU SHORTCUTS'))
+ strlist.append('')
+ tbl_MenuShortcuts = prettytable.PrettyTable()
+ tbl_MenuShortcuts.field_names = [QApplication.translate('HelpDlg','Keys'),QApplication.translate('HelpDlg','Menu'),QApplication.translate('HelpDlg','Action')]
+ tbl_MenuShortcuts.add_row(['⌘+O [Mac]\nCTRL+O [Win]',QApplication.translate('HelpDlg','File'),QApplication.translate('HelpDlg','Open')])
+ tbl_MenuShortcuts.add_row(['⌘+S [Mac]\nCTRL+S [Win]',QApplication.translate('HelpDlg','File'),QApplication.translate('HelpDlg','Save')])
+ tbl_MenuShortcuts.add_row(['⌘+P [Mac]\nCTRL+P [Win]',QApplication.translate('HelpDlg','File'),QApplication.translate('HelpDlg','Print')])
+ tbl_MenuShortcuts.add_row(['⌘+X [Mac]\nCTRL+X [Win]',QApplication.translate('HelpDlg','Edit'),QApplication.translate('HelpDlg','Cut')])
+ tbl_MenuShortcuts.add_row(['⌘+C [Mac]\nCTRL+C [Win]',QApplication.translate('HelpDlg','Edit'),QApplication.translate('HelpDlg','Copy')])
+ tbl_MenuShortcuts.add_row(['⌘+V [Mac]\nCTRL+V [Win]',QApplication.translate('HelpDlg','Edit'),QApplication.translate('HelpDlg','Paste')])
+ tbl_MenuShortcuts.add_row(['⌘+T [Mac]\nCTRL+T [Win]',QApplication.translate('HelpDlg','Roast'),QApplication.translate('HelpDlg','Open Roast Properties dialog')])
+ tbl_MenuShortcuts.add_row(['⌘+B [Mac]\nCTRL+B [Win]',QApplication.translate('HelpDlg','Roast'),QApplication.translate('HelpDlg','Open Profile Background dialog')])
+ tbl_MenuShortcuts.add_row(['⌘+F4 [Mac]\nCTRL+F4 [Win]',QApplication.translate('HelpDlg','Roast'),QApplication.translate('HelpDlg','Switch Profiles (Foreground<=>Background)')])
+ tbl_MenuShortcuts.add_row(['⌘+D [Mac]\nCTRL+D [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Devices dialog')])
+ tbl_MenuShortcuts.add_row(['⌘+U [Mac]\nCTRL+U [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Curves dialog')])
+ tbl_MenuShortcuts.add_row(['⌘+E [Mac]\nCTRL+E [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Events dialog')])
+ tbl_MenuShortcuts.add_row(['⌘+A [Mac]\nCTRL+A [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Alarms dialog')])
+ tbl_MenuShortcuts.add_row(['⌘+SHIFT+A [Mac]\nCTRL+SHIFT+A [Win]',QApplication.translate('HelpDlg','Config'),QApplication.translate('HelpDlg','Open Axes dialog')])
+ tbl_MenuShortcuts.add_row(['⌘+K [Mac]\nCTRL+K [Win]',QApplication.translate('HelpDlg','Tools'),QApplication.translate('HelpDlg','Analyzer Auto All')])
+ tbl_MenuShortcuts.add_row(['⌘+OPTION+A [Mac]\nCTRL+ALT+K [Win]',QApplication.translate('HelpDlg','Tools'),QApplication.translate('HelpDlg','Analyzer Clear Results')])
+ tbl_MenuShortcuts.add_row(['⌘+L [Mac]\nCTRL+L [Win]',QApplication.translate('HelpDlg','View'),QApplication.translate('HelpDlg','Show/Hide Large Main LCDs')])
+ tbl_MenuShortcuts.add_row(['⌘+F [Mac]\nCTRL+SHIFT+F [Win]',QApplication.translate('HelpDlg','View'),QApplication.translate('HelpDlg','Toggle Full Screen Mode \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 \u00A0\u00A0\u00A0\u00A0\u00A0 ')])
+ tbl_MenuShortcuts.add_row(['F1',QApplication.translate('HelpDlg','Help'),QApplication.translate('HelpDlg','Open QuickStart Guide in the system browser')])
+ strlist.append(tbl_MenuShortcuts.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','PORTS CONFIGURATION'))
- strlist.append('')
- tbl_Modbus = prettytable.PrettyTable()
- tbl_Modbus.field_names = [QApplication.translate('HelpDlg','MODBUS SETTINGS')]
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The MODBUS serial protocols RTU, ASCII, and Binary is using the specified serial port parameters. The MODBUS IP protocol on TCP and UDP is respecting the host IP and port.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The inputs 1+2 configure the MODBUS device, inputs 3+4 configure the MODBUS_34 device and so on.\nInputs with the slave id set to 0 are turned off.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','Function 1 (Read Coils): registers 0 to 65535 corresponding to numbers 000001 to 065536\nFunction 2 (Read Discrete Inputs): registers 0 to 65535 corresponding to numbers 100001 to 165536\nFunction 3 (Read Multiple Holding Registers): registers 0 to 65535 corresponding to numbers 400001 to 465536\nFunction 4 (Read Input Registers): registers 0 to 65535 corresponding to numbers 300001 to 365536')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','Dividers 1/10 and 1/100 can be set to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','Temperature readings are automatically converted based on the specified unit per input channel.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','If a 32bit decoder is set two succeeding 16bit registers are requested and the received 4 bytes are interpreted using the byte and word order as specified by the corresponding flag.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). MODBUS commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available MODBUS write commands.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.')])
- strlist.append(tbl_Modbus.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','PORTS CONFIGURATION'))
+ strlist.append('')
+ tbl_Modbus = prettytable.PrettyTable()
+ tbl_Modbus.field_names = [QApplication.translate('HelpDlg','MODBUS SETTINGS')]
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The MODBUS serial protocols RTU, ASCII, and Binary is using the specified serial port parameters. The MODBUS IP protocol on TCP and UDP is respecting the host IP and port.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The inputs 1+2 configure the MODBUS device, inputs 3+4 configure the MODBUS_34 device and so on.\nInputs with the slave id set to 0 are turned off.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','Function 1 (Read Coils): registers 0 to 65535 corresponding to numbers 000001 to 065536\nFunction 2 (Read Discrete Inputs): registers 0 to 65535 corresponding to numbers 100001 to 165536\nFunction 3 (Read Multiple Holding Registers): registers 0 to 65535 corresponding to numbers 400001 to 465536\nFunction 4 (Read Input Registers): registers 0 to 65535 corresponding to numbers 300001 to 365536')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','Dividers 1/10 and 1/100 can be set to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','Temperature readings are automatically converted based on the specified unit per input channel.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','If a 32bit decoder is set two succeeding 16bit registers are requested and the received 4 bytes are interpreted using the byte and word order as specified by the corresponding flag.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). MODBUS commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available MODBUS write commands.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.')])
+ strlist.append(tbl_Modbus.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','EXTERNAL PROGRAMS'))
- strlist.append('')
- tbl_Programstop = prettytable.PrettyTable()
- tbl_Programstop.header = False
- tbl_Programstop.add_row([QApplication.translate('HelpDlg','Link external programs that print temperature when called. This allows to connect meters that use any program language.\n\nArtisan will start the program each sample period. The program output must be to stdout (like when using print statements). The program must exit and must not be persistent.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','If only one temperature is provided it will be interpreted as BT. If more than one temperature is provided the values are order dependent with ET first and BT second.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Data may also be provided to the "Program" extra devices. Extra device "Program" are the first two values, typically ET and BT. "Program 34" are the third and fourth values. Up to 10 values may be supplied.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Example of output needed from program for single temperature (BT):\n"100.4" (note: "" not needed)')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Example of output needed from program for double temperature (ET,BT)\n"200.4,100.4" (note: temperatures are separated by a comma "ET,BT")')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Example of output needed from program for double temperature (ET,BT) and extra devices (Program and Program 34)\n"200.4,100.4,312.4,345.6,299.0,275.5"')])
- strlist.append(tbl_Programstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Programsbottom = prettytable.PrettyTable()
- tbl_Programsbottom.header = False
- tbl_Programsbottom.add_row([QApplication.translate('HelpDlg','Example of a file written in Python called test.py:')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','#comment: print a string with two numbers separated by a comma')+newline+QApplication.translate('HelpDlg','#!/usr/bin/env python')+newline+QApplication.translate('HelpDlg','print("237.1,100.4")')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Note: In many cases the path to the Python or other language executatable should be provided along with the external program path. On Windows it is advised to enclose the paths with quotation marks if there are any spaces, and use forward slashes '/' in the path.\n"C:/Python38-64/python.exe" "c:/scripts/test.py"')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg',' Under Output a script can be specified which is called per sample interval with 4 arguments, ET, BT, Background ET and Background BT')+newline+QApplication.translate('HelpDlg',' the output script also called if Prog is not selected as input source')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg',' Example of a file written in Python called out.py:')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','#comment: adds the script arguments ET, BT, ETB, BTB to "/tmp/out.txt"')+newline+QApplication.translate('HelpDlg','#!/usr/bin/env python')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','import sys')+newline+QApplication.translate('HelpDlg','ET, BT, ETB, BTB = sys.argv[1:]')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','with open("/tmp/out.txt", "w+") as file:')+newline+QApplication.translate('HelpDlg',' file.write(f'ET: {ET}, BT: {ET}, ETB: {ETB}, BTB: {BTB};')')])
- strlist.append(tbl_Programsbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','EXTERNAL PROGRAMS'))
+ strlist.append('')
+ tbl_Programstop = prettytable.PrettyTable()
+ tbl_Programstop.header = False
+ tbl_Programstop.add_row([QApplication.translate('HelpDlg','Link external programs that print temperature when called. This allows to connect meters that use any program language.\n\nArtisan will start the program each sample period. The program output must be to stdout (like when using print statements). The program must exit and must not be persistent.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','If only one temperature is provided it will be interpreted as BT. If more than one temperature is provided the values are order dependent with ET first and BT second.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Data may also be provided to the "Program" extra devices. Extra device "Program" are the first two values, typically ET and BT. "Program 34" are the third and fourth values. Up to 10 values may be supplied.')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Example of output needed from program for single temperature (BT):\n"100.4" (note: "" not needed)')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Example of output needed from program for double temperature (ET,BT)\n"200.4,100.4" (note: temperatures are separated by a comma "ET,BT")')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Example of output needed from program for double temperature (ET,BT) and extra devices (Program and Program 34)\n"200.4,100.4,312.4,345.6,299.0,275.5"')])
+ strlist.append(tbl_Programstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Programsbottom = prettytable.PrettyTable()
+ tbl_Programsbottom.header = False
+ tbl_Programsbottom.add_row([QApplication.translate('HelpDlg','Example of a file written in Python called test.py:')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','#comment: print a string with two numbers separated by a comma')+newline+QApplication.translate('HelpDlg','#!/usr/bin/env python')+newline+QApplication.translate('HelpDlg','print("237.1,100.4")')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','Note: In many cases the path to the Python or other language executatable should be provided along with the external program path. On Windows it is advised to enclose the paths with quotation marks if there are any spaces, and use forward slashes '/' in the path.\n"C:/Python38-64/python.exe" "c:/scripts/test.py"')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg',' Under Output a script can be specified which is called per sample interval with 4 arguments, ET, BT, Background ET and Background BT')+newline+QApplication.translate('HelpDlg',' the output script also called if Prog is not selected as input source')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg',' Example of a file written in Python called out.py:')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','#comment: adds the script arguments ET, BT, ETB, BTB to "/tmp/out.txt"')+newline+QApplication.translate('HelpDlg','#!/usr/bin/env python')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','import sys')+newline+QApplication.translate('HelpDlg','ET, BT, ETB, BTB = sys.argv[1:]')+newline+QApplication.translate('HelpDlg','')+newline+QApplication.translate('HelpDlg','with open("/tmp/out.txt", "w+") as file:')+newline+QApplication.translate('HelpDlg',' file.write(f'ET: {ET}, BT: {ET}, ETB: {ETB}, BTB: {BTB};')')])
+ strlist.append(tbl_Programsbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','PORTS CONFIGURATION'))
- strlist.append('')
- tbl_Modbus = prettytable.PrettyTable()
- tbl_Modbus.field_names = [QApplication.translate('HelpDlg','S7 SETTINGS')]
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The Siemens S7 is respecting the host IP and port.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The inputs 1+2 configure the S7 device, inputs 3+4 configure the S7_34 device and so on.\nInputs with the area set to the empty input are turned off.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','Factors 1/10 and 1/100 can be set as dividers to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','Temperature readings are automatically converted based on the specified unit per input channel.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','If mode is set to C or F, readings are automatically converted to the temperature unit set for display.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). S7 commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available S7 write commands.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.')])
- tbl_Modbus.add_row([QApplication.translate('HelpDlg','Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.')])
- strlist.append(tbl_Modbus.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','PORTS CONFIGURATION'))
+ strlist.append('')
+ tbl_Modbus = prettytable.PrettyTable()
+ tbl_Modbus.field_names = [QApplication.translate('HelpDlg','S7 SETTINGS')]
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The Siemens S7 is respecting the host IP and port.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The inputs 1+2 configure the S7 device, inputs 3+4 configure the S7_34 device and so on.\nInputs with the area set to the empty input are turned off.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','Factors 1/10 and 1/100 can be set as dividers to recreate decimals of floats transported as integers multiplied by 10 or 100. Eg. a value of 145.2 might be transmitted as 1452, which is turned back into 145.2 by the 1/10 divider.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','Temperature readings are automatically converted based on the specified unit per input channel.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','If mode is set to C or F, readings are automatically converted to the temperature unit set for display.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The PID Control dialog can operate a connected PID slave using the given PID registers to set the p-i-d parameters and the set value (SV). S7 commands can be specified to turn the PID slave on and off from that PID Control dialog. See the help page in the Events Dialog for documentation of available S7 write commands.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','The Scan button opens a simple MODBUS scanner to search for data holding registers in the connected device.')])
+ tbl_Modbus.add_row([QApplication.translate('HelpDlg','Refer to the User Manual of your MODBUS device for information specific to the setup required for your device.')])
+ strlist.append(tbl_Modbus.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','SYMBOLIC VARIABLES'))
- strlist.append('')
- tbl_SymbolicVariables = prettytable.PrettyTable()
- tbl_SymbolicVariables.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description'),QApplication.translate('HelpDlg','Can shift?\n(see below)')]
- tbl_SymbolicVariables.add_row(['t',QApplication.translate('HelpDlg','Absolute time (seconds) from begin of recording (not only the time after CHARGE!)'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['b',QApplication.translate('HelpDlg','Absolute time (seconds) from begin of recording of the background profile'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['x',QApplication.translate('HelpDlg','Current channel reading (not available in the Plotter)'),' '])
- tbl_SymbolicVariables.add_row(['Y1',QApplication.translate('HelpDlg','ET value'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['Y2',QApplication.translate('HelpDlg','BT value'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['Y3',QApplication.translate('HelpDlg','Extra #1 T1 value'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['Y4',QApplication.translate('HelpDlg','Extra #1 T2 value'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['Y5',QApplication.translate('HelpDlg','Extra #2 T1 value'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['Y6',QApplication.translate('HelpDlg','Extra #2 T2 value'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['...',QApplication.translate('HelpDlg','...and so forth'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['B1',QApplication.translate('HelpDlg','ET background'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['B2',QApplication.translate('HelpDlg','BT background'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['B3',QApplication.translate('HelpDlg','ExtraBackground #1-A'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['B4',QApplication.translate('HelpDlg','ExtraBackground #1-B'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['B5',QApplication.translate('HelpDlg','ExtraBackground #2-A'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['...',QApplication.translate('HelpDlg','...and so forth'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['T1',QApplication.translate('HelpDlg','ET tare value'),' '])
- tbl_SymbolicVariables.add_row(['T2',QApplication.translate('HelpDlg','BT tare value'),' '])
- tbl_SymbolicVariables.add_row(['T3',QApplication.translate('HelpDlg','Extra Device #1 channel 1 tare value'),' '])
- tbl_SymbolicVariables.add_row(['T4',QApplication.translate('HelpDlg','Extra Device #1 channel 2 tare value'),' '])
- tbl_SymbolicVariables.add_row(['T5',QApplication.translate('HelpDlg','Extra Device #2 channel 1 tare value'),' '])
- tbl_SymbolicVariables.add_row(['...',QApplication.translate('HelpDlg','...and so forth'),' '])
- tbl_SymbolicVariables.add_row(['E1',QApplication.translate('HelpDlg','Last event value of the first event type'),' '])
- tbl_SymbolicVariables.add_row(['E2',QApplication.translate('HelpDlg','Last event value of the second event type'),' '])
- tbl_SymbolicVariables.add_row(['E3',QApplication.translate('HelpDlg','Last event value of the third event type'),' '])
- tbl_SymbolicVariables.add_row(['E4',QApplication.translate('HelpDlg','Last event value of the fourth event type'),' '])
- tbl_SymbolicVariables.add_row([' ',' ',' '])
- tbl_SymbolicVariables.add_row(['R1',QApplication.translate('HelpDlg','ET rate of rise'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['R2',QApplication.translate('HelpDlg','BT rate of rise'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['RB1',QApplication.translate('HelpDlg','Background ET rate of rise'),QApplication.translate('HelpDlg','Yes')])
- tbl_SymbolicVariables.add_row(['RB2',QApplication.translate('HelpDlg','Background BT rate of rise'),QApplication.translate('HelpDlg','Yes')])
- strlist.append(tbl_SymbolicVariables.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','SHIFTED SYMBOLIC VARIABLES'))
- strlist.append('')
- tbl_ShiftedSymbolicVariablestop = prettytable.PrettyTable()
- tbl_ShiftedSymbolicVariablestop.header = False
- tbl_ShiftedSymbolicVariablestop.add_row([QApplication.translate('HelpDlg','The symbolic variables t, b, Y, B and R evaluate to the current value of a sequence of values that define a roast profile. To access earlier or later values one can apply a shift value.')+newline+QApplication.translate('HelpDlg','\nFor example, while "Y2" returns the current bean temperature (BT), "Y2[-1]" returns the previous BT temperature and "Y2[-2]" the one before that. Formulas used in the Plotter are applied in sequence to all values, thus there "Y2" points to the current BT temperature processed, "Y2[-1]" the previous BT temperature processed and "Y2[+1]" the next BT temperature to be processed. A positive shift is only available in the Plotter, obviously not during recording.')])
- strlist.append(tbl_ShiftedSymbolicVariablestop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_ShiftedSymbolicVariables = prettytable.PrettyTable()
- tbl_ShiftedSymbolicVariables.field_names = [QApplication.translate('HelpDlg','Example'),QApplication.translate('HelpDlg','Description')]
- tbl_ShiftedSymbolicVariables.add_row(['t[+1]',QApplication.translate('HelpDlg','Time one index ahead (plotter only)')])
- tbl_ShiftedSymbolicVariables.add_row(['t[-3]',QApplication.translate('HelpDlg','Time three indexes delayed')])
- tbl_ShiftedSymbolicVariables.add_row(['Y1[-2]',QApplication.translate('HelpDlg','ET value delayed by 2 indexes')])
- tbl_ShiftedSymbolicVariables.add_row(['Y2[+1]',QApplication.translate('HelpDlg','BT value index advanced by one index (plotter only)')])
- tbl_ShiftedSymbolicVariables.add_row(['B4[-6]',QApplication.translate('HelpDlg','ExtraBackground #1-B delayed 6 indexes')])
- tbl_ShiftedSymbolicVariables.add_row(['B5[+2]',QApplication.translate('HelpDlg','ExtraBackground #2-A advanced 2 indexes (plotter only)')])
- tbl_ShiftedSymbolicVariables.add_row(['R1[-2]',QApplication.translate('HelpDlg','ET rate of rise delayed two indexes')])
- strlist.append(tbl_ShiftedSymbolicVariables.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','INDEXED SYMBOLIC VARIABLES'))
- strlist.append('')
- tbl_IndexedSymbolic = prettytable.PrettyTable()
- tbl_IndexedSymbolic.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
- tbl_IndexedSymbolic.add_row([QApplication.translate('HelpDlg','t, b, Y, B and R'),QApplication.translate('HelpDlg','Previously recorded data assigned to the symbolic variables t, b, Y, B and R can also directly accessed by index. "Y2{0}" evaluates to the first recorded bean temperature (BT) and "Y2{CHARGE}" to the bean temperature at CHARGE. Additionally, the symbolic variable b can be used to access the recording time at a certain index of the background profile. Thus "b{CHARGE}" returns the recording time at CHARGE of the background profile.')])
- strlist.append(tbl_IndexedSymbolic.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','AXIS MAPPING'))
- strlist.append('')
- tbl_AxisMapping = prettytable.PrettyTable()
- tbl_AxisMapping.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
- tbl_AxisMapping.add_row(['k',QApplication.translate('HelpDlg','Scaling factor from RoR to Temp axis. The range of the temperature scale divided by the range of the delta scale. ')])
- tbl_AxisMapping.add_row(['o',QApplication.translate('HelpDlg','Offset from RoR to Temp axis. ')])
- strlist.append(tbl_AxisMapping.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_AxisMappingbottom = prettytable.PrettyTable()
- tbl_AxisMappingbottom.header = False
- tbl_AxisMappingbottom.add_row([QApplication.translate('HelpDlg','Note: RoR values r can be scaled to the temperature axis using a linear approximation of the form "r*k + o". As the variables k and o depend on the actual axis settings which can be changed by the user without triggering a recomputation, those variable are less useful for use in a recording, but useful in the Plotter to plot w.r.t. the RoR y-axis instead of the temperature y-axis.')])
- strlist.append(tbl_AxisMappingbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','EVENT INDEX and TIME DELTA'))
- strlist.append('')
- tbl_EventIndex = prettytable.PrettyTable()
- tbl_EventIndex.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
- tbl_EventIndex.add_row(['CHARGE, DRY, FCs, FCe, SCs, SCe, DROP',QApplication.translate('HelpDlg','Index of the corresponding event of the profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.')])
- tbl_EventIndex.add_row(['bCHARGE, bDRY, bFCs, bFCe, bSCs, bSCe, bDROP',QApplication.translate('HelpDlg','Index of the corresponding event of the background profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.')])
- tbl_EventIndex.add_row([' ',' '])
- tbl_EventIndex.add_row(['dCHARGE, dDRY, dFCs, dFCe, dSCs, dSCe, dDROP',QApplication.translate('HelpDlg','Time distance in seconds after the corresponding event. Thus dCHARGE is bound to the current roast time (after CHARGE) in seconds while t is bound to the time in seconds from the start of the recording.')])
- strlist.append(tbl_EventIndex.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','AREA UNDER THE CURVE (AUC)'))
- strlist.append('')
- tbl_AUC = prettytable.PrettyTable()
- tbl_AUC.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
- tbl_AUC.add_row(['AUCbase',QApplication.translate('HelpDlg','AUC base temperature (could be from the selected event, if set)')])
- tbl_AUC.add_row(['AUCtarget',QApplication.translate('HelpDlg','AUC target value (could be from the background profile, if set)')])
- tbl_AUC.add_row(['AUCvalue',QApplication.translate('HelpDlg','the current AUC value. -1 if none available.')])
- strlist.append(tbl_AUC.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','PREDICTIONS'))
- strlist.append('')
- tbl_Predictions = prettytable.PrettyTable()
- tbl_Predictions.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
- tbl_Predictions.add_row(['pDRY',QApplication.translate('HelpDlg','Prediction of the time distance to the DRY event based on the current RoR. Evaluates to -1 on negative RoR and to 0 if the DRY event is already set.')])
- tbl_Predictions.add_row(['pFCs',QApplication.translate('HelpDlg','Same as pDRY, just for the FCs event.')])
- strlist.append(tbl_Predictions.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Predictionsbottom = prettytable.PrettyTable()
- tbl_Predictionsbottom.header = False
- tbl_Predictionsbottom.add_row([QApplication.translate('HelpDlg','Note: The same rules as for the corresponding PhasesLCDs apply to pDRY and pFCs:')+newline+QApplication.translate('HelpDlg','\nIf there is no background profile the DRY or FCs bean temperature used for the prediction is taken from the Config>Phases setup.')+newline+QApplication.translate('HelpDlg','\nIf there is a background profile and there is DRY or FCs event in the background profile, the DRY or FCs bean temperature used for the prediction is taken from the background profile.')+newline+QApplication.translate('HelpDlg','\nException to the above for DRY only: if AutoDRY is checked the DRY temperature used for the prediction is taken from the Config>Phases setup. This does not apply to FCs and AutoFCs.')+newline+QApplication.translate('HelpDlg','\nThe prediction value is the calculated time in seconds to reach the DRY or FCs temperature.')])
- strlist.append(tbl_Predictionsbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','AMBIENT'))
- strlist.append('')
- tbl_Ambient = prettytable.PrettyTable()
- tbl_Ambient.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
- tbl_Ambient.add_row(['aTMP',QApplication.translate('HelpDlg','ambient temperature (default 0)')])
- tbl_Ambient.add_row(['aHUM',QApplication.translate('HelpDlg','ambient humidity (default 0)')])
- tbl_Ambient.add_row(['aPRE',QApplication.translate('HelpDlg','ambient pressure (default 0)')])
- strlist.append(tbl_Ambient.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_Ambientbottom = prettytable.PrettyTable()
- tbl_Ambientbottom.header = False
- tbl_Ambientbottom.add_row([QApplication.translate('HelpDlg','Note: The data is (re-)sampled some seconds after the start of recording')])
- strlist.append(tbl_Ambientbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','EXPRESSIONS'))
- strlist.append('')
- tbl_Expressions = prettytable.PrettyTable()
- tbl_Expressions.field_names = [QApplication.translate('HelpDlg','Expression'),QApplication.translate('HelpDlg','Description')]
- tbl_Expressions.add_row(['( if else )',QApplication.translate('HelpDlg','Conditional. Evaluates to the value of the expression if the condition holds, otherwise to the value of the expression . The rules of Python are applied to decide if a value holds or not. Thus the boolean values "True" and "False" have the obvious semantic. Any number unequal to 0 evaluates to True and 0 evaluates to False. The value "None" is also evaluated to False.')])
- strlist.append(tbl_Expressions.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','MATHEMATICAL FORMULAS'))
- strlist.append('')
- tbl_MathFormulas = prettytable.PrettyTable()
- tbl_MathFormulas.field_names = [QApplication.translate('HelpDlg','Formula'),QApplication.translate('HelpDlg','Description')]
- tbl_MathFormulas.add_row(['abs(x)',QApplication.translate('HelpDlg','Return the absolute value of x.')])
- tbl_MathFormulas.add_row(['acos(x)',QApplication.translate('HelpDlg','Return the arc cosine (measured in radians) of x.')])
- tbl_MathFormulas.add_row(['asin(x)',QApplication.translate('HelpDlg','Return the arc sine (measured in radians) of x.')])
- tbl_MathFormulas.add_row(['atan(x)',QApplication.translate('HelpDlg','Return the arc tangent (measured in radians) of x.')])
- tbl_MathFormulas.add_row(['cos(x)',QApplication.translate('HelpDlg','Return the cosine of x (measured in radians).')])
- tbl_MathFormulas.add_row(['degrees(x)',QApplication.translate('HelpDlg','Convert angle x from radians to degrees.')])
- tbl_MathFormulas.add_row(['exp(x)',QApplication.translate('HelpDlg','Return e raised to the power of x.')])
- tbl_MathFormulas.add_row(['log(x[, base])',QApplication.translate('HelpDlg','Return the logarithm of x to the given base.')])
- tbl_MathFormulas.add_row(['min(x1,...,xn)',QApplication.translate('HelpDlg','Return the minimum of the given values.')])
- tbl_MathFormulas.add_row(['max(x1,...,xn)',QApplication.translate('HelpDlg','Return the maximum of the given values.')])
- tbl_MathFormulas.add_row(['pow(x, y)',QApplication.translate('HelpDlg','Return x**y (x to the power of y).')])
- tbl_MathFormulas.add_row(['radians(x)',QApplication.translate('HelpDlg','Convert angle x from degrees to radians.')])
- tbl_MathFormulas.add_row(['sin(x)',QApplication.translate('HelpDlg','Return the sine of x (measured in radians).')])
- tbl_MathFormulas.add_row(['sqrt(x)',QApplication.translate('HelpDlg','Return the square root of x.')])
- tbl_MathFormulas.add_row(['tan(x)',QApplication.translate('HelpDlg','Return the tangent of x (measured in radians).')])
- tbl_MathFormulas.add_row(['bit(n,x)',QApplication.translate('HelpDlg','Return 1 if the bit n of value x (interpreted as integer) is set, otherwise 0.')])
- strlist.append(tbl_MathFormulas.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','PLOTTER EXTENSIONS'))
- strlist.append('')
- tbl_PlotterExtensionstop = prettytable.PrettyTable()
- tbl_PlotterExtensionstop.header = False
- tbl_PlotterExtensionstop.add_row([QApplication.translate('HelpDlg','Note: This section applies only to the Plotter\nUsing math formulas in the plotter also allows to use the symbolic variables P and F (see Signals, Symbolic Assignments and the Plotter).')])
- strlist.append(tbl_PlotterExtensionstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- tbl_PlotterExtensions = prettytable.PrettyTable()
- tbl_PlotterExtensions.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
- tbl_PlotterExtensions.add_row(['P1...P9',QApplication.translate('HelpDlg','The variables P1,..,P9 represent the results from plot #1,..,#9. You can perform calculations in a later plot on variables of an earlier plot. That way, the plot variables P1,..,P9 allow the cascading or intermediate results. For example, plot #3 can refer to the results of plot 1 using the variable P1.')])
- tbl_PlotterExtensions.add_row(['F1...F9',QApplication.translate('HelpDlg','F1 refers to the previous result of the actual formula to realize a feedback loop. This is useful in filter designs. Similarly, F2 refers to the second previous result etc.')])
- strlist.append(tbl_PlotterExtensions.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','SYMBOLIC VARIABLES'))
+ strlist.append('')
+ tbl_SymbolicVariables = prettytable.PrettyTable()
+ tbl_SymbolicVariables.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description'),QApplication.translate('HelpDlg','Can shift?\n(see below)')]
+ tbl_SymbolicVariables.add_row(['t',QApplication.translate('HelpDlg','Absolute time (seconds) from begin of recording (not only the time after CHARGE!)'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['b',QApplication.translate('HelpDlg','Absolute time (seconds) from begin of recording of the background profile'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['x',QApplication.translate('HelpDlg','Current channel reading (not available in the Plotter)'),' '])
+ tbl_SymbolicVariables.add_row(['Y1',QApplication.translate('HelpDlg','ET value'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['Y2',QApplication.translate('HelpDlg','BT value'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['Y3',QApplication.translate('HelpDlg','Extra #1 T1 value'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['Y4',QApplication.translate('HelpDlg','Extra #1 T2 value'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['Y5',QApplication.translate('HelpDlg','Extra #2 T1 value'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['Y6',QApplication.translate('HelpDlg','Extra #2 T2 value'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['...',QApplication.translate('HelpDlg','...and so forth'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['B1',QApplication.translate('HelpDlg','ET background'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['B2',QApplication.translate('HelpDlg','BT background'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['B3',QApplication.translate('HelpDlg','ExtraBackground #1-A'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['B4',QApplication.translate('HelpDlg','ExtraBackground #1-B'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['B5',QApplication.translate('HelpDlg','ExtraBackground #2-A'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['...',QApplication.translate('HelpDlg','...and so forth'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['T1',QApplication.translate('HelpDlg','ET tare value'),' '])
+ tbl_SymbolicVariables.add_row(['T2',QApplication.translate('HelpDlg','BT tare value'),' '])
+ tbl_SymbolicVariables.add_row(['T3',QApplication.translate('HelpDlg','Extra Device #1 channel 1 tare value'),' '])
+ tbl_SymbolicVariables.add_row(['T4',QApplication.translate('HelpDlg','Extra Device #1 channel 2 tare value'),' '])
+ tbl_SymbolicVariables.add_row(['T5',QApplication.translate('HelpDlg','Extra Device #2 channel 1 tare value'),' '])
+ tbl_SymbolicVariables.add_row(['...',QApplication.translate('HelpDlg','...and so forth'),' '])
+ tbl_SymbolicVariables.add_row(['E1',QApplication.translate('HelpDlg','Last event value of the first event type'),' '])
+ tbl_SymbolicVariables.add_row(['E2',QApplication.translate('HelpDlg','Last event value of the second event type'),' '])
+ tbl_SymbolicVariables.add_row(['E3',QApplication.translate('HelpDlg','Last event value of the third event type'),' '])
+ tbl_SymbolicVariables.add_row(['E4',QApplication.translate('HelpDlg','Last event value of the fourth event type'),' '])
+ tbl_SymbolicVariables.add_row([' ',' ',' '])
+ tbl_SymbolicVariables.add_row(['R1',QApplication.translate('HelpDlg','ET rate of rise'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['R2',QApplication.translate('HelpDlg','BT rate of rise'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['RB1',QApplication.translate('HelpDlg','Background ET rate of rise'),QApplication.translate('HelpDlg','Yes')])
+ tbl_SymbolicVariables.add_row(['RB2',QApplication.translate('HelpDlg','Background BT rate of rise'),QApplication.translate('HelpDlg','Yes')])
+ strlist.append(tbl_SymbolicVariables.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','SHIFTED SYMBOLIC VARIABLES'))
+ strlist.append('')
+ tbl_ShiftedSymbolicVariablestop = prettytable.PrettyTable()
+ tbl_ShiftedSymbolicVariablestop.header = False
+ tbl_ShiftedSymbolicVariablestop.add_row([QApplication.translate('HelpDlg','The symbolic variables t, b, Y, B and R evaluate to the current value of a sequence of values that define a roast profile. To access earlier or later values one can apply a shift value.')+newline+QApplication.translate('HelpDlg','\nFor example, while "Y2" returns the current bean temperature (BT), "Y2[-1]" returns the previous BT temperature and "Y2[-2]" the one before that. Formulas used in the Plotter are applied in sequence to all values, thus there "Y2" points to the current BT temperature processed, "Y2[-1]" the previous BT temperature processed and "Y2[+1]" the next BT temperature to be processed. A positive shift is only available in the Plotter, obviously not during recording.')])
+ strlist.append(tbl_ShiftedSymbolicVariablestop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_ShiftedSymbolicVariables = prettytable.PrettyTable()
+ tbl_ShiftedSymbolicVariables.field_names = [QApplication.translate('HelpDlg','Example'),QApplication.translate('HelpDlg','Description')]
+ tbl_ShiftedSymbolicVariables.add_row(['t[+1]',QApplication.translate('HelpDlg','Time one index ahead (plotter only)')])
+ tbl_ShiftedSymbolicVariables.add_row(['t[-3]',QApplication.translate('HelpDlg','Time three indexes delayed')])
+ tbl_ShiftedSymbolicVariables.add_row(['Y1[-2]',QApplication.translate('HelpDlg','ET value delayed by 2 indexes')])
+ tbl_ShiftedSymbolicVariables.add_row(['Y2[+1]',QApplication.translate('HelpDlg','BT value index advanced by one index (plotter only)')])
+ tbl_ShiftedSymbolicVariables.add_row(['B4[-6]',QApplication.translate('HelpDlg','ExtraBackground #1-B delayed 6 indexes')])
+ tbl_ShiftedSymbolicVariables.add_row(['B5[+2]',QApplication.translate('HelpDlg','ExtraBackground #2-A advanced 2 indexes (plotter only)')])
+ tbl_ShiftedSymbolicVariables.add_row(['R1[-2]',QApplication.translate('HelpDlg','ET rate of rise delayed two indexes')])
+ strlist.append(tbl_ShiftedSymbolicVariables.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','INDEXED SYMBOLIC VARIABLES'))
+ strlist.append('')
+ tbl_IndexedSymbolic = prettytable.PrettyTable()
+ tbl_IndexedSymbolic.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
+ tbl_IndexedSymbolic.add_row([QApplication.translate('HelpDlg','t, b, Y, B and R'),QApplication.translate('HelpDlg','Previously recorded data assigned to the symbolic variables t, b, Y, B and R can also directly accessed by index. "Y2{0}" evaluates to the first recorded bean temperature (BT) and "Y2{CHARGE}" to the bean temperature at CHARGE. Additionally, the symbolic variable b can be used to access the recording time at a certain index of the background profile. Thus "b{CHARGE}" returns the recording time at CHARGE of the background profile.')])
+ strlist.append(tbl_IndexedSymbolic.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','AXIS MAPPING'))
+ strlist.append('')
+ tbl_AxisMapping = prettytable.PrettyTable()
+ tbl_AxisMapping.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
+ tbl_AxisMapping.add_row(['k',QApplication.translate('HelpDlg','Scaling factor from RoR to Temp axis. The range of the temperature scale divided by the range of the delta scale. ')])
+ tbl_AxisMapping.add_row(['o',QApplication.translate('HelpDlg','Offset from RoR to Temp axis. ')])
+ strlist.append(tbl_AxisMapping.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_AxisMappingbottom = prettytable.PrettyTable()
+ tbl_AxisMappingbottom.header = False
+ tbl_AxisMappingbottom.add_row([QApplication.translate('HelpDlg','Note: RoR values r can be scaled to the temperature axis using a linear approximation of the form "r*k + o". As the variables k and o depend on the actual axis settings which can be changed by the user without triggering a recomputation, those variable are less useful for use in a recording, but useful in the Plotter to plot w.r.t. the RoR y-axis instead of the temperature y-axis.')])
+ strlist.append(tbl_AxisMappingbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','EVENT INDEX and TIME DELTA'))
+ strlist.append('')
+ tbl_EventIndex = prettytable.PrettyTable()
+ tbl_EventIndex.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
+ tbl_EventIndex.add_row(['CHARGE, DRY, FCs, FCe, SCs, SCe, DROP',QApplication.translate('HelpDlg','Index of the corresponding event of the profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.')])
+ tbl_EventIndex.add_row(['bCHARGE, bDRY, bFCs, bFCe, bSCs, bSCe, bDROP',QApplication.translate('HelpDlg','Index of the corresponding event of the background profile to retrieve time and values from the corresponding data structures. Evaluates to -1 if not set.')])
+ tbl_EventIndex.add_row([' ',' '])
+ tbl_EventIndex.add_row(['dCHARGE, dDRY, dFCs, dFCe, dSCs, dSCe, dDROP',QApplication.translate('HelpDlg','Time distance in seconds after the corresponding event. Thus dCHARGE is bound to the current roast time (after CHARGE) in seconds while t is bound to the time in seconds from the start of the recording.')])
+ strlist.append(tbl_EventIndex.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','AREA UNDER THE CURVE (AUC)'))
+ strlist.append('')
+ tbl_AUC = prettytable.PrettyTable()
+ tbl_AUC.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
+ tbl_AUC.add_row(['AUCbase',QApplication.translate('HelpDlg','AUC base temperature (could be from the selected event, if set)')])
+ tbl_AUC.add_row(['AUCtarget',QApplication.translate('HelpDlg','AUC target value (could be from the background profile, if set)')])
+ tbl_AUC.add_row(['AUCvalue',QApplication.translate('HelpDlg','the current AUC value. -1 if none available.')])
+ strlist.append(tbl_AUC.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','PREDICTIONS'))
+ strlist.append('')
+ tbl_Predictions = prettytable.PrettyTable()
+ tbl_Predictions.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
+ tbl_Predictions.add_row(['pDRY',QApplication.translate('HelpDlg','Prediction of the time distance to the DRY event based on the current RoR. Evaluates to -1 on negative RoR and to 0 if the DRY event is already set.')])
+ tbl_Predictions.add_row(['pFCs',QApplication.translate('HelpDlg','Same as pDRY, just for the FCs event.')])
+ strlist.append(tbl_Predictions.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Predictionsbottom = prettytable.PrettyTable()
+ tbl_Predictionsbottom.header = False
+ tbl_Predictionsbottom.add_row([QApplication.translate('HelpDlg','Note: The same rules as for the corresponding PhasesLCDs apply to pDRY and pFCs:')+newline+QApplication.translate('HelpDlg','\nIf there is no background profile the DRY or FCs bean temperature used for the prediction is taken from the Config>Phases setup.')+newline+QApplication.translate('HelpDlg','\nIf there is a background profile and there is DRY or FCs event in the background profile, the DRY or FCs bean temperature used for the prediction is taken from the background profile.')+newline+QApplication.translate('HelpDlg','\nException to the above for DRY only: if AutoDRY is checked the DRY temperature used for the prediction is taken from the Config>Phases setup. This does not apply to FCs and AutoFCs.')+newline+QApplication.translate('HelpDlg','\nThe prediction value is the calculated time in seconds to reach the DRY or FCs temperature.')])
+ strlist.append(tbl_Predictionsbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','AMBIENT'))
+ strlist.append('')
+ tbl_Ambient = prettytable.PrettyTable()
+ tbl_Ambient.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
+ tbl_Ambient.add_row(['aTMP',QApplication.translate('HelpDlg','ambient temperature (default 0)')])
+ tbl_Ambient.add_row(['aHUM',QApplication.translate('HelpDlg','ambient humidity (default 0)')])
+ tbl_Ambient.add_row(['aPRE',QApplication.translate('HelpDlg','ambient pressure (default 0)')])
+ strlist.append(tbl_Ambient.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_Ambientbottom = prettytable.PrettyTable()
+ tbl_Ambientbottom.header = False
+ tbl_Ambientbottom.add_row([QApplication.translate('HelpDlg','Note: The data is (re-)sampled some seconds after the start of recording')])
+ strlist.append(tbl_Ambientbottom.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','EXPRESSIONS'))
+ strlist.append('')
+ tbl_Expressions = prettytable.PrettyTable()
+ tbl_Expressions.field_names = [QApplication.translate('HelpDlg','Expression'),QApplication.translate('HelpDlg','Description')]
+ tbl_Expressions.add_row(['( if else )',QApplication.translate('HelpDlg','Conditional. Evaluates to the value of the expression if the condition holds, otherwise to the value of the expression . The rules of Python are applied to decide if a value holds or not. Thus the boolean values "True" and "False" have the obvious semantic. Any number unequal to 0 evaluates to True and 0 evaluates to False. The value "None" is also evaluated to False.')])
+ strlist.append(tbl_Expressions.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','MATHEMATICAL FORMULAS'))
+ strlist.append('')
+ tbl_MathFormulas = prettytable.PrettyTable()
+ tbl_MathFormulas.field_names = [QApplication.translate('HelpDlg','Formula'),QApplication.translate('HelpDlg','Description')]
+ tbl_MathFormulas.add_row(['abs(x)',QApplication.translate('HelpDlg','Return the absolute value of x.')])
+ tbl_MathFormulas.add_row(['acos(x)',QApplication.translate('HelpDlg','Return the arc cosine (measured in radians) of x.')])
+ tbl_MathFormulas.add_row(['asin(x)',QApplication.translate('HelpDlg','Return the arc sine (measured in radians) of x.')])
+ tbl_MathFormulas.add_row(['atan(x)',QApplication.translate('HelpDlg','Return the arc tangent (measured in radians) of x.')])
+ tbl_MathFormulas.add_row(['cos(x)',QApplication.translate('HelpDlg','Return the cosine of x (measured in radians).')])
+ tbl_MathFormulas.add_row(['degrees(x)',QApplication.translate('HelpDlg','Convert angle x from radians to degrees.')])
+ tbl_MathFormulas.add_row(['exp(x)',QApplication.translate('HelpDlg','Return e raised to the power of x.')])
+ tbl_MathFormulas.add_row(['log(x[, base])',QApplication.translate('HelpDlg','Return the logarithm of x to the given base.')])
+ tbl_MathFormulas.add_row(['min(x1,...,xn)',QApplication.translate('HelpDlg','Return the minimum of the given values.')])
+ tbl_MathFormulas.add_row(['max(x1,...,xn)',QApplication.translate('HelpDlg','Return the maximum of the given values.')])
+ tbl_MathFormulas.add_row(['pow(x, y)',QApplication.translate('HelpDlg','Return x**y (x to the power of y).')])
+ tbl_MathFormulas.add_row(['radians(x)',QApplication.translate('HelpDlg','Convert angle x from degrees to radians.')])
+ tbl_MathFormulas.add_row(['sin(x)',QApplication.translate('HelpDlg','Return the sine of x (measured in radians).')])
+ tbl_MathFormulas.add_row(['sqrt(x)',QApplication.translate('HelpDlg','Return the square root of x.')])
+ tbl_MathFormulas.add_row(['tan(x)',QApplication.translate('HelpDlg','Return the tangent of x (measured in radians).')])
+ tbl_MathFormulas.add_row(['bit(n,x)',QApplication.translate('HelpDlg','Return 1 if the bit n of value x (interpreted as integer) is set, otherwise 0.')])
+ strlist.append(tbl_MathFormulas.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','PLOTTER EXTENSIONS'))
+ strlist.append('')
+ tbl_PlotterExtensionstop = prettytable.PrettyTable()
+ tbl_PlotterExtensionstop.header = False
+ tbl_PlotterExtensionstop.add_row([QApplication.translate('HelpDlg','Note: This section applies only to the Plotter\nUsing math formulas in the plotter also allows to use the symbolic variables P and F (see Signals, Symbolic Assignments and the Plotter).')])
+ strlist.append(tbl_PlotterExtensionstop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ tbl_PlotterExtensions = prettytable.PrettyTable()
+ tbl_PlotterExtensions.field_names = [QApplication.translate('HelpDlg','Symbol'),QApplication.translate('HelpDlg','Description')]
+ tbl_PlotterExtensions.add_row(['P1...P9',QApplication.translate('HelpDlg','The variables P1,..,P9 represent the results from plot #1,..,#9. You can perform calculations in a later plot on variables of an earlier plot. That way, the plot variables P1,..,P9 allow the cascading or intermediate results. For example, plot #3 can refer to the results of plot 1 using the variable P1.')])
+ tbl_PlotterExtensions.add_row(['F1...F9',QApplication.translate('HelpDlg','F1 refers to the previous result of the actual formula to realize a feedback loop. This is useful in filter designs. Similarly, F2 refers to the second previous result etc.')])
+ strlist.append(tbl_PlotterExtensions.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('')
- strlist.append('')
- strlist.append(QApplication.translate('HelpDlg','TRANSPOSER'))
- strlist.append('')
- tbl_Transposertop = prettytable.PrettyTable()
- tbl_Transposertop.header = False
- tbl_Transposertop.add_row([QApplication.translate('HelpDlg','The Transposer allows to map the current profile w.r.t. the time and temperature axis by setting targets time and temperature at major events like yellow point (DRY END) or first crack (FC START) or for time transformations also by target phases duration. Temperature transformation are only applied to the bean temperature (BT) curve while time transformations are applied to the whole profile.\n\nThree different mapping methods are available to compute from the current profile and the given targets a resulting profile. The linear and quadratic mappings are continuous functions while the discrete option is defined stepwise between the given source/target pairs and extended at the borders\n\nPressing the "Apply" button applies the current computed mapping to the loaded profile for inspection. "Reset" returns to the original profile shape. Leaving the Transposer with "OK" applies the current mapping to the profile. Leaving the Transposer with "Cancel" returns to the unchanged initially loaded profile.')])
- strlist.append(tbl_Transposertop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','EXAMPLE 1: ADJUST TOTAL ROAST TIME'))
- strlist.append('')
- tbl_Ex1AdjustTotalRoastTimetop = prettytable.PrettyTable()
- tbl_Ex1AdjustTotalRoastTimetop.header = False
- tbl_Ex1AdjustTotalRoastTimetop.add_row([QApplication.translate('HelpDlg','You might want to re-roast a profile, but extended/restricted to a total length of 10:00. \n\nLoad the profile and start the Transposer under Tools. Enter our target roast time of "10:00" minutes into the target DROP field under Time and select "linear" as mapping. Check the resulting times of the main events in the time tables last row, press "Apply" to view the transposed profile in the graph. If you are happy with the result, press "OK" and save the newly generated transposed profile such that you can use it as a template for future roasts.')])
- strlist.append(tbl_Ex1AdjustTotalRoastTimetop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('
')
- strlist.append(QApplication.translate('HelpDlg','EXAMPLE 2: MAP BETWEEN TWO ROASTING MACHINES'))
- strlist.append('')
- tbl_Ex2MapBetweenTwoRoastingMatop = prettytable.PrettyTable()
- tbl_Ex2MapBetweenTwoRoastingMatop.header = False
- tbl_Ex2MapBetweenTwoRoastingMatop.add_row([QApplication.translate('HelpDlg','Transpose temperature readings from your smaller machine to your larger machine assuming on your larger machine the DRY and FC START events happen at different temperatures than on your smaller one.\n\nLoad the profile recorded on the smaller machine and open the Transposer. Select the linear mapping and put the DRY and FC START target temperatures as observed on your larger machine into the into the corresponding fields under BT. Underneath the table you see the calculated symbolic formula that can be copy-pasted into the BT symbolic formula under Config >> Devices to adjust the computed mapping automatically while roasting on your smaller machine to see the temperature reading as you expect them on the larger machine.')])
- strlist.append(tbl_Ex2MapBetweenTwoRoastingMatop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
- strlist.append('')
+ strlist.append('')
+ strlist.append(QApplication.translate('HelpDlg','TRANSPOSER'))
+ strlist.append('')
+ tbl_Transposertop = prettytable.PrettyTable()
+ tbl_Transposertop.header = False
+ tbl_Transposertop.add_row([QApplication.translate('HelpDlg','The Transposer allows to map the current profile w.r.t. the time and temperature axis by setting targets time and temperature at major events like yellow point (DRY END) or first crack (FC START) or for time transformations also by target phases duration. Temperature transformation are only applied to the bean temperature (BT) curve while time transformations are applied to the whole profile.\n\nThree different mapping methods are available to compute from the current profile and the given targets a resulting profile. The linear and quadratic mappings are continuous functions while the discrete option is defined stepwise between the given source/target pairs and extended at the borders\n\nPressing the "Apply" button applies the current computed mapping to the loaded profile for inspection. "Reset" returns to the original profile shape. Leaving the Transposer with "OK" applies the current mapping to the profile. Leaving the Transposer with "Cancel" returns to the unchanged initially loaded profile.')])
+ strlist.append(tbl_Transposertop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','EXAMPLE 1: ADJUST TOTAL ROAST TIME'))
+ strlist.append('')
+ tbl_Ex1AdjustTotalRoastTimetop = prettytable.PrettyTable()
+ tbl_Ex1AdjustTotalRoastTimetop.header = False
+ tbl_Ex1AdjustTotalRoastTimetop.add_row([QApplication.translate('HelpDlg','You might want to re-roast a profile, but extended/restricted to a total length of 10:00. \n\nLoad the profile and start the Transposer under Tools. Enter our target roast time of "10:00" minutes into the target DROP field under Time and select "linear" as mapping. Check the resulting times of the main events in the time tables last row, press "Apply" to view the transposed profile in the graph. If you are happy with the result, press "OK" and save the newly generated transposed profile such that you can use it as a template for future roasts.')])
+ strlist.append(tbl_Ex1AdjustTotalRoastTimetop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('
')
+ strlist.append(QApplication.translate('HelpDlg','EXAMPLE 2: MAP BETWEEN TWO ROASTING MACHINES'))
+ strlist.append('')
+ tbl_Ex2MapBetweenTwoRoastingMatop = prettytable.PrettyTable()
+ tbl_Ex2MapBetweenTwoRoastingMatop.header = False
+ tbl_Ex2MapBetweenTwoRoastingMatop.add_row([QApplication.translate('HelpDlg','Transpose temperature readings from your smaller machine to your larger machine assuming on your larger machine the DRY and FC START events happen at different temperatures than on your smaller one.\n\nLoad the profile recorded on the smaller machine and open the Transposer. Select the linear mapping and put the DRY and FC START target temperatures as observed on your larger machine into the into the corresponding fields under BT. Underneath the table you see the calculated symbolic formula that can be copy-pasted into the BT symbolic formula under Config >> Devices to adjust the computed mapping automatically while roasting on your smaller machine to see the temperature reading as you expect them on the larger machine.')])
+ strlist.append(tbl_Ex2MapBetweenTwoRoastingMatop.get_html_string(attributes={'width':'100%','border':'1','padding':'1','border-collapse':'collapse'}))
+ strlist.append('