rice: Gut a lot of stuff after some discussions. Flesh some out.

This commit is contained in:
William Floyd 2018-07-05 15:12:41 -05:00
parent 4e805873a5
commit 828648083d
Signed by untrusted user who does not match committer: william
GPG key ID: B3EEEDD81893CAF9
3 changed files with 340 additions and 242 deletions

View file

@ -36,9 +36,20 @@ Many of my parts have arrived (rice cooker, thermistors, relay, and NodeMCU), so
***
# Terminology
### Directive
A directive is an instruction for the rice cooker.
User facing directives have, at most, a single input.
Internally, directives chain each other with conditions to achieve their given goal.
***
# Thoughts
Having received shipment of the rice cooker, and beginning to use it, I realise there's nothing about it that makes it fit only for rice, if I can control the heating myself.
Having received shipment of the rice cooker, and beginning to use it, I realize there's nothing about it that makes it fit only for rice, if I can control the heating myself.
Everything about it is like any other hot pot, it's just tuned for cooking rice.
Thus, once I convert the thing to being smart, I will be able to use it for, say, ramen, or any number of other things.
@ -46,37 +57,18 @@ The possibility of steaming things only furthers this goal.
## Recipes
The question is raised, how should I deal with parametric recipes, and more specifically, internally governed parametric recipes.
That is, recipes that have no prior knowledge of the volume of rice and water added, but infer it from the time it takes to reach temperature.
This value, that is, the duration taken to reach temperature, only holds value when a set heating cycle is used, such as full heat, or constant PWM.
Typically however, no PWM is required during initial heat, only once at heat.
Recipes should be submitted as simple JSON structures.
These may be linted, and will contain no logic.
All calculations are to be done when producing the recipe.
This is done so as to ease the technical burden on the cooker.
As such, a value that any directive may rely upon should be the duration taken by some prior directive.
This then leads me to say that each and every step in a recipe must have a unique identity, so that later directives may rely on them.
## Heating / Cooling
This, then, immediately appears to be far more complicated than I should worry about, instead, this behaviour aught to be offloaded to Lua or some other scripting system.
As such, the NodeMCU should be ideal, as it supports a variation of Lua.
Ideally, this will allow branching logic also, and storing of values, simplifying my technical burden.
Active cooling is not something worth designing for, as it is not an issue to begin with.
Alternatively, it does not sound impossible to write a simple translator to emit both a Lua scripted version of a recipe, and a version that may be embedded directly into the compiled code (so that non-Lua boards may be used).
## Coding
## Heating
The contents of the rice cooker should be considered when heating/cooling, as they will absorb the heat and thermal lag will be an issue.
If possible, look into either weighing the contents for a rough approximation (hard/complicated) or use recipe provided portion sizes to calculate the thermal capacity of the contents (water, mainly).
Seeing as the dumb rice cooker still manages to kick itself off when needed, even given different serving sizes, there must be a simple way to find the time needed to cook the rice, even without predefines portion sizes.
On the face of it, I would assume the time rice is kept at full heat will only slightly increase in duration as the volume of rice increases, if at all.
The time it takes to get up to heat shouln't be ignored, as some cooking must be done during that time.
The variety of rice should not be discounted either.
Further research into the dynamics of rice cooking are meritted, once internet and more rice is available once again.
## Cooling
I am planning my setup in such a way as to allow actively cooling the cooking pot, but upon further consideration, it is likely not an issue worth worrying about.
As such, I'll continue my planning as I am, but not be too worried about the details for now.
Internally, a temperature kill switch should be enacted, which will kick in if the
***
@ -84,11 +76,10 @@ As such, I'll continue my planning as I am, but not be too worried about the det
I tentatively (with no real experience designing them) plan on my API being something like the following.
- `/action/light/kill` - *Stops all light activity*
- `/action/light/kill` - *Kill all light activity*
- `/action/light/set` - *Change lighting mode, with optional duration*
- `/action/temperature/kill` - *Stops all heating/cooling, lets the cooker cool to room temperature alone*
- `/action/temperature/set` - *Heat/cool to given temperature, then hold. Should allow setting a target heat/cool rate. Should allow setting a hold duration*
*(proxy to `/settings/cook/recipe/list`)*
- `/action/temperature/kill` - *Stops all heating*
- `/action/temperature/set` - *Heat/cool to given temperature.*
- `/routine/cook/kill` - *Kill any current running routine*
- `/routine/cook/list` - *List known cooking routines*
- `/routine/cook/schedule/list` - *List any scheduled routines*
@ -97,47 +88,66 @@ I tentatively (with no real experience designing them) plan on my API being some
- `/sensor/temperature` - *Returns temperature*
- `/settings/cook/recipe/list` - *List known cooking routines*
- `/settings/cook/recipe/set` - *Submit/modify/delete a cooking routine*
- `/settings/cook/warm/duration` - *Determine post-cook warming duration*
- `/settings/cook/warm/set` - *Turn post-cook warming on/off*
- `/settings/cook/warm/temperature` - *Set post-cook warming temperature*
- `/settings/lighting/list` - *List lighting modes*
- `/settings/lighting/set` - *Submit/modify/delete a lighting mode*
- `/settings/time/set` - *Set/read date and time*
# Cooking schedule definition specifications
# Cooking recipe definition specifications
Directives are distinct actions to be taken.
They may be catagorised as follows:
They may be categorized as follows:
#### Primary Directives
* Sleep
* Heat
* Cooling
* Sleep
#### Secondary Directives
* Temperature
* Lighting Change
* Lighting Kill
* Temperature Change
* Temperature Hold
* Temperature Kill
## Definitions
These are defined as such:
### Sleep
Just wait for given duration, or until a given condition is met.
Wait for a given duration.
No need to expose to recipes directly, see `Kill`, `Temperature Change`, and `Temperature Hold` instead.
Will keep things like LED lights going still.
### Heat
Heat for a given duration, or until a given condition is met.
Takes a bool, turns the heating element on or off.
Non-blocking so that conditions may be checked without unnecessarily cycling the relay.
Dangerous to expose to recipes directly, see `Kill`
### Cool
Cool for a given duration, or until a given condition is met.
If I someday choose to use a fan, this should be an active feature.
Instead, it's the same as `Sleep` for now.
### Lighting Change
Change lighting mode.
### Temperature
Heat/cool to given temperature, optionally at a given rate of change (may be difficult for cooling if no fan is included), or percentage load (which will set a PWM rate, or if full, run constant).
This should just be a proxy directive to `Heat`, `Cool`, and `Sleep`.
For now that should work, but in due course, with tuning and benchmarks, this should run cooling at a variable rate (using a fan, I wouldn't want to cut on and off all the time).
Heating should be fine be fine with fairly large PWM, as the thermal lag I expect to be significant, and we want to try to hit our deadline as quickly as possible.
### Lighting Kill
Kill any running lighting mode.
### Temperature Change
Heat/cool to given temperature.
This should just be a proxy directive to `Heat` and `Sleep`.
That is, `Heat` if under temp, `Sleep` if over temp.
As heating during cooking tends to be a matter of getting to temperature as quickly as possible, there is no need for a duration setting.
### Temperature Hold
Hold at current temperature for given duration.
This should just be a proxy directive to `Heat` and `Sleep`.
That is, `Heat` if under temp, `Sleep` if over temp, until an internal clock has ticked over the time required.
### Temperature Kill
Turns off heat, cancels any running recipe.
Takes no input.
Just a proxy to `Heat`, but only as a false bool.
*Might* be used at the end of a recipe, unnecessary though.
Mostly to be used as a soft kill switch, invoked from a physical button or via API.
Examples might be canceling an infinite temperature holding cycle (e.g rice warming).
# Dep Graph

View file

@ -20,12 +20,14 @@ digraph {
"Depend on value"
"Proxy to value"
"Depend on function"
"Proxy to function"
}
"Depend on value" -> "Node"[depend_value]
"Proxy to value" -> "Node"[proxy_value]
"Depend on function" -> "Node"[depend_function]
"Proxy to function" -> "Node"[proxy_function]
label="Key"
@ -33,14 +35,33 @@ digraph {
subgraph cluster_directives {
"Sleep"
"Heat"
"Cool"
"Temperature"
subgraph cluster_primary {
"Sleep"
"Heat"
label="Primary"
}
subgraph cluster_secondary {
"Lighting Change"
"Lighting Kill"
"Temperature Kill"
"Temperature Change"
"Temperature Hold"
label="Secondary"
}
label="Directives"
}
subgraph cluster_sensor {
"Temperature"
label="Sensors"
}
subgraph cluster_api {
subgraph cluster_action {
@ -66,7 +87,7 @@ digraph {
label="action"
}
subgraph cluster_sensor {
subgraph cluster_api_sensor {
"/api/sensor/temperature"[label="temperature"]
@ -119,16 +140,6 @@ digraph {
subgraph cluster_settings_cook {
subgraph cluster_warm {
"/api/settings/cook/warm/temperature"[label="temperature"]
"/api/settings/cook/warm/set"[label="set"]
"/api/settings/cook/warm/duration"[label="duration"]
label="warm"
}
subgraph cluster_recipe {
"/api/settings/cook/recipe/list"[label="list"]
@ -149,7 +160,14 @@ digraph {
label="api"
}
"Temperature" -> { "Heat" "Cool" "Sleep" }[depend_function]
"Temperature Change" -> { "Heat" "Sleep" }[depend_function]
"Temperature Hold" -> { "Heat" "Sleep" }[depend_function]
"Temperature Kill" -> "Heat"[proxy_function]
{ "Temperature Change" "Temperature Hold" } -> "Temperature"[depend_value]
"/api/action/temperature/set" -> "Temperature Change"[proxy_function]
"/api/action/temperature/kill" -> "Temperature Kill"[proxy_function]
"/api/action/temperature/kill" -> "Temperature"[proxy_value]
"/api/routine/cook/list" -> "/api/settings/cook/recipe/list"[proxy_value]
// Description checklist ///////////////////////////////////////////////////////
@ -166,17 +184,17 @@ digraph {
"/api/sensor/temperature"[documented]
"/api/settings/cook/recipe/list"[documented]
"/api/settings/cook/recipe/set"[documented]
"/api/settings/cook/warm/duration"[documented]
"/api/settings/cook/warm/set"[documented]
"/api/settings/cook/warm/temperature"[documented]
"/api/settings/lighting/list"[documented]
"/api/settings/lighting/set"[documented]
"/api/settings/time/set"[documented]
"Temperature"[documented]
"Heat"[documented]
"Cool"[documented]
"Lighting Change"[documented]
"Lighting Kill"[documented]
"Sleep"[documented]
"Temperature Change"[documented]
"Temperature Hold"[documented]
"Temperature Kill"[documented]
////////////////////////////////////////////////////////////////////////////////

View file

@ -4,314 +4,384 @@
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: %3 Pages: 1 -->
<svg width="1305pt" height="1103pt"
viewBox="0.00 0.00 1305.00 1103.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1099)">
<svg width="1459pt" height="1057pt"
viewBox="0.00 0.00 1459.00 1057.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1053)">
<title>%3</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1099 1301,-1099 1301,4 -4,4"/>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1053 1455,-1053 1455,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_key</title>
<polygon fill="none" stroke="#000000" points="839.7381,-840.1409 839.7381,-1095.1409 1296.7381,-1095.1409 1296.7381,-840.1409 839.7381,-840.1409"/>
<text text-anchor="middle" x="1068.2381" y="-1079.9409" font-family="Times,serif" font-size="14.00" fill="#000000">Key</text>
<polygon fill="none" stroke="#000000" points="983.7381,-.1409 983.7381,-293.1409 1450.7381,-293.1409 1450.7381,-.1409 983.7381,-.1409"/>
<text text-anchor="middle" x="1217.2381" y="-277.9409" font-family="Times,serif" font-size="14.00" fill="#000000">Key</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_doc</title>
<polygon fill="none" stroke="#000000" points="1067.4762,-947.7818 1067.4762,-1063.7818 1288.4762,-1063.7818 1288.4762,-947.7818 1067.4762,-947.7818"/>
<polygon fill="none" stroke="#000000" points="1221.4762,-145.7818 1221.4762,-261.7818 1442.4762,-261.7818 1442.4762,-145.7818 1221.4762,-145.7818"/>
</g>
<g id="clust3" class="cluster">
<title>cluster_sub</title>
<polygon fill="none" stroke="#000000" points="847.7866,-847.6918 847.7866,-993.6918 1024.7866,-993.6918 1024.7866,-847.6918 847.7866,-847.6918"/>
<polygon fill="none" stroke="#000000" points="992.1124,-8.1466 992.1124,-226.1466 1185.1124,-226.1466 1185.1124,-8.1466 992.1124,-8.1466"/>
</g>
<g id="clust4" class="cluster">
<title>cluster_directives</title>
<polygon fill="none" stroke="#000000" points="560.2381,-839.6409 560.2381,-1023.6409 756.2381,-1023.6409 756.2381,-839.6409 560.2381,-839.6409"/>
<text text-anchor="middle" x="658.2381" y="-1008.4409" font-family="Times,serif" font-size="14.00" fill="#000000">Directives</text>
<polygon fill="none" stroke="#000000" points="-.0126,-623.898 -.0126,-1048.898 511.9874,-1048.898 511.9874,-623.898 -.0126,-623.898"/>
<text text-anchor="middle" x="255.9874" y="-1033.698" font-family="Times,serif" font-size="14.00" fill="#000000">Directives</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_api</title>
<polygon fill="none" stroke="#000000" points=".2381,.3591 .2381,-745.6409 824.2381,-745.6409 824.2381,.3591 .2381,.3591"/>
<text text-anchor="middle" x="412.2381" y="-730.4409" font-family="Times,serif" font-size="14.00" fill="#000000">api</text>
<title>cluster_primary</title>
<polygon fill="none" stroke="#000000" points="372.2255,-891.5389 372.2255,-1017.5389 504.2255,-1017.5389 504.2255,-891.5389 372.2255,-891.5389"/>
<text text-anchor="middle" x="438.2255" y="-1002.3389" font-family="Times,serif" font-size="14.00" fill="#000000">Primary</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_action</title>
<polygon fill="none" stroke="#000000" points="520.4762,-487.2818 520.4762,-667.2818 816.4762,-667.2818 816.4762,-487.2818 520.4762,-487.2818"/>
<text text-anchor="middle" x="668.4762" y="-652.0818" font-family="Times,serif" font-size="14.00" fill="#000000">action</text>
<title>cluster_secondary</title>
<polygon fill="none" stroke="#000000" points="7.8531,-632.1826 7.8531,-844.1826 427.8531,-844.1826 427.8531,-632.1826 7.8531,-632.1826"/>
<text text-anchor="middle" x="217.8531" y="-828.9826" font-family="Times,serif" font-size="14.00" fill="#000000">Secondary</text>
</g>
<g id="clust7" class="cluster">
<title>cluster_light</title>
<polygon fill="none" stroke="#000000" points="678.7144,-494.9227 678.7144,-620.9227 808.7144,-620.9227 808.7144,-494.9227 678.7144,-494.9227"/>
<text text-anchor="middle" x="743.7144" y="-605.7227" font-family="Times,serif" font-size="14.00" fill="#000000">light</text>
<title>cluster_sensor</title>
<polygon fill="none" stroke="#000000" points="790.4786,-790.4494 790.4786,-866.4494 916.4786,-866.4494 916.4786,-790.4494 790.4786,-790.4494"/>
<text text-anchor="middle" x="853.4786" y="-851.2494" font-family="Times,serif" font-size="14.00" fill="#000000">Sensors</text>
</g>
<g id="clust8" class="cluster">
<title>cluster_temperature</title>
<polygon fill="none" stroke="#000000" points="528.7144,-509.9227 528.7144,-635.9227 658.7144,-635.9227 658.7144,-509.9227 528.7144,-509.9227"/>
<text text-anchor="middle" x="593.7144" y="-620.7227" font-family="Times,serif" font-size="14.00" fill="#000000">temperature</text>
<title>cluster_api</title>
<polygon fill="none" stroke="#000000" points="251.5635,.1548 251.5635,-615.8452 844.5635,-615.8452 844.5635,.1548 251.5635,.1548"/>
<text text-anchor="middle" x="548.0635" y="-600.6452" font-family="Times,serif" font-size="14.00" fill="#000000">api</text>
</g>
<g id="clust9" class="cluster">
<title>cluster_sensor</title>
<polygon fill="none" stroke="#000000" points="71.9762,-487.2818 71.9762,-563.2818 194.9762,-563.2818 194.9762,-487.2818 71.9762,-487.2818"/>
<text text-anchor="middle" x="133.4762" y="-548.0818" font-family="Times,serif" font-size="14.00" fill="#000000">sensor</text>
<title>cluster_action</title>
<polygon fill="none" stroke="#000000" points="559.1506,-357.5416 559.1506,-536.5416 836.1506,-536.5416 836.1506,-357.5416 559.1506,-357.5416"/>
<text text-anchor="middle" x="697.6506" y="-521.3416" font-family="Times,serif" font-size="14.00" fill="#000000">action</text>
</g>
<g id="clust10" class="cluster">
<title>cluster_routine</title>
<polygon fill="none" stroke="#000000" points="232.4762,-487.7818 232.4762,-714.7818 462.4762,-714.7818 462.4762,-487.7818 232.4762,-487.7818"/>
<text text-anchor="middle" x="347.4762" y="-699.5818" font-family="Times,serif" font-size="14.00" fill="#000000">routine</text>
<title>cluster_light</title>
<polygon fill="none" stroke="#000000" points="567.3888,-379.1825 567.3888,-505.1825 697.3888,-505.1825 697.3888,-379.1825 567.3888,-379.1825"/>
<text text-anchor="middle" x="632.3888" y="-489.9825" font-family="Times,serif" font-size="14.00" fill="#000000">light</text>
</g>
<g id="clust11" class="cluster">
<title>cluster_routine_cook</title>
<polygon fill="none" stroke="#000000" points="240.7144,-495.4227 240.7144,-683.4227 454.7144,-683.4227 454.7144,-495.4227 240.7144,-495.4227"/>
<text text-anchor="middle" x="347.7144" y="-668.2227" font-family="Times,serif" font-size="14.00" fill="#000000">cook</text>
<title>cluster_temperature</title>
<polygon fill="none" stroke="#000000" points="721.4259,-365.3657 721.4259,-486.3657 828.4259,-486.3657 828.4259,-365.3657 721.4259,-365.3657"/>
<text text-anchor="middle" x="774.9259" y="-471.1657" font-family="Times,serif" font-size="14.00" fill="#000000">temperature</text>
</g>
<g id="clust12" class="cluster">
<title>cluster_schedule</title>
<polygon fill="none" stroke="#000000" points="248.9525,-511.0636 248.9525,-637.0636 378.9525,-637.0636 378.9525,-511.0636 248.9525,-511.0636"/>
<text text-anchor="middle" x="313.9525" y="-621.8636" font-family="Times,serif" font-size="14.00" fill="#000000">schedule</text>
<title>cluster_api_sensor</title>
<polygon fill="none" stroke="#000000" points="609.3016,-7.4861 609.3016,-83.4861 732.3016,-83.4861 732.3016,-7.4861 609.3016,-7.4861"/>
<text text-anchor="middle" x="670.8016" y="-68.2861" font-family="Times,serif" font-size="14.00" fill="#000000">sensor</text>
</g>
<g id="clust13" class="cluster">
<title>cluster_settings</title>
<polygon fill="none" stroke="#000000" points="8.4762,-7.2818 8.4762,-435.2818 538.4762,-435.2818 538.4762,-7.2818 8.4762,-7.2818"/>
<text text-anchor="middle" x="273.4762" y="-420.0818" font-family="Times,serif" font-size="14.00" fill="#000000">settings</text>
<title>cluster_routine</title>
<polygon fill="none" stroke="#000000" points="284.8016,-357.9861 284.8016,-584.9861 514.8016,-584.9861 514.8016,-357.9861 284.8016,-357.9861"/>
<text text-anchor="middle" x="399.8016" y="-569.7861" font-family="Times,serif" font-size="14.00" fill="#000000">routine</text>
</g>
<g id="clust14" class="cluster">
<title>cluster_time</title>
<polygon fill="none" stroke="#000000" points="400.7144,-182.9227 400.7144,-258.9227 470.7144,-258.9227 470.7144,-182.9227 400.7144,-182.9227"/>
<text text-anchor="middle" x="435.7144" y="-243.7227" font-family="Times,serif" font-size="14.00" fill="#000000">time</text>
<title>cluster_routine_cook</title>
<polygon fill="none" stroke="#000000" points="293.0397,-365.627 293.0397,-553.627 507.0397,-553.627 507.0397,-365.627 293.0397,-365.627"/>
<text text-anchor="middle" x="400.0397" y="-538.427" font-family="Times,serif" font-size="14.00" fill="#000000">cook</text>
</g>
<g id="clust15" class="cluster">
<title>cluster_lighting</title>
<polygon fill="none" stroke="#000000" points="400.7144,-14.9227 400.7144,-140.9227 530.7144,-140.9227 530.7144,-14.9227 400.7144,-14.9227"/>
<text text-anchor="middle" x="465.7144" y="-125.7227" font-family="Times,serif" font-size="14.00" fill="#000000">lighting</text>
<title>cluster_schedule</title>
<polygon fill="none" stroke="#000000" points="301.2778,-381.2679 301.2778,-507.2679 431.2778,-507.2679 431.2778,-381.2679 301.2778,-381.2679"/>
<text text-anchor="middle" x="366.2778" y="-492.0679" font-family="Times,serif" font-size="14.00" fill="#000000">schedule</text>
</g>
<g id="clust16" class="cluster">
<title>cluster_settings_cook</title>
<polygon fill="none" stroke="#000000" points="16.7144,-63.4227 16.7144,-404.4227 354.7144,-404.4227 354.7144,-63.4227 16.7144,-63.4227"/>
<text text-anchor="middle" x="185.7144" y="-389.2227" font-family="Times,serif" font-size="14.00" fill="#000000">cook</text>
<title>cluster_settings</title>
<polygon fill="none" stroke="#000000" points="259.8016,-57.9861 259.8016,-326.9861 573.8016,-326.9861 573.8016,-57.9861 259.8016,-57.9861"/>
<text text-anchor="middle" x="416.8016" y="-311.7861" font-family="Times,serif" font-size="14.00" fill="#000000">settings</text>
</g>
<g id="clust17" class="cluster">
<title>cluster_warm</title>
<polygon fill="none" stroke="#000000" points="24.4525,-71.0636 24.4525,-213.0636 201.4525,-213.0636 201.4525,-71.0636 24.4525,-71.0636"/>
<text text-anchor="middle" x="112.9525" y="-197.8636" font-family="Times,serif" font-size="14.00" fill="#000000">warm</text>
<title>cluster_time</title>
<polygon fill="none" stroke="#000000" points="436.0397,-219.627 436.0397,-295.627 506.0397,-295.627 506.0397,-219.627 436.0397,-219.627"/>
<text text-anchor="middle" x="471.0397" y="-280.427" font-family="Times,serif" font-size="14.00" fill="#000000">time</text>
</g>
<g id="clust18" class="cluster">
<title>cluster_lighting</title>
<polygon fill="none" stroke="#000000" points="436.0397,-65.627 436.0397,-191.627 566.0397,-191.627 566.0397,-65.627 436.0397,-65.627"/>
<text text-anchor="middle" x="501.0397" y="-176.427" font-family="Times,serif" font-size="14.00" fill="#000000">lighting</text>
</g>
<g id="clust19" class="cluster">
<title>cluster_settings_cook</title>
<polygon fill="none" stroke="#000000" points="268.0397,-80.127 268.0397,-245.127 414.0397,-245.127 414.0397,-80.127 268.0397,-80.127"/>
<text text-anchor="middle" x="341.0397" y="-229.927" font-family="Times,serif" font-size="14.00" fill="#000000">cook</text>
</g>
<g id="clust20" class="cluster">
<title>cluster_recipe</title>
<polygon fill="none" stroke="#000000" points="216.9525,-247.0636 216.9525,-373.0636 346.9525,-373.0636 346.9525,-247.0636 216.9525,-247.0636"/>
<text text-anchor="middle" x="281.9525" y="-357.8636" font-family="Times,serif" font-size="14.00" fill="#000000">recipe</text>
<polygon fill="none" stroke="#000000" points="276.2778,-87.7679 276.2778,-213.7679 406.2778,-213.7679 406.2778,-87.7679 276.2778,-87.7679"/>
<text text-anchor="middle" x="341.2778" y="-198.5679" font-family="Times,serif" font-size="14.00" fill="#000000">recipe</text>
</g>
<!-- Done -->
<g id="node1" class="node">
<title>Done</title>
<polygon fill="#7fff00" stroke="#000000" points="1103.7144,-1019.4227 1103.7144,-1055.4227 1157.7144,-1055.4227 1157.7144,-1019.4227 1103.7144,-1019.4227"/>
<text text-anchor="middle" x="1130.7144" y="-1033.7227" font-family="Times,serif" font-size="14.00" fill="#000000">Done</text>
<polygon fill="#7fff00" stroke="#000000" points="1257.7144,-217.4227 1257.7144,-253.4227 1311.7144,-253.4227 1311.7144,-217.4227 1257.7144,-217.4227"/>
<text text-anchor="middle" x="1284.7144" y="-231.7227" font-family="Times,serif" font-size="14.00" fill="#000000">Done</text>
</g>
<!-- Documented -->
<g id="node2" class="node">
<title>Documented</title>
<polygon fill="#caff70" stroke="#000000" points="1173.2144,-1005.4227 1173.2144,-1041.4227 1280.2144,-1041.4227 1280.2144,-1005.4227 1173.2144,-1005.4227"/>
<text text-anchor="middle" x="1226.7144" y="-1019.7227" font-family="Times,serif" font-size="14.00" fill="#000000">Documented</text>
<polygon fill="#caff70" stroke="#000000" points="1327.2144,-203.4227 1327.2144,-239.4227 1434.2144,-239.4227 1434.2144,-203.4227 1327.2144,-203.4227"/>
<text text-anchor="middle" x="1380.7144" y="-217.7227" font-family="Times,serif" font-size="14.00" fill="#000000">Documented</text>
</g>
<!-- Undocumented -->
<g id="node3" class="node">
<title>Undocumented</title>
<polygon fill="#ff6347" stroke="#000000" points="1075.7144,-956.4227 1075.7144,-992.4227 1201.7144,-992.4227 1201.7144,-956.4227 1075.7144,-956.4227"/>
<text text-anchor="middle" x="1138.7144" y="-970.7227" font-family="Times,serif" font-size="14.00" fill="#000000">Undocumented</text>
<polygon fill="#ff6347" stroke="#000000" points="1229.7144,-154.4227 1229.7144,-190.4227 1355.7144,-190.4227 1355.7144,-154.4227 1229.7144,-154.4227"/>
<text text-anchor="middle" x="1292.7144" y="-168.7227" font-family="Times,serif" font-size="14.00" fill="#000000">Undocumented</text>
</g>
<!-- Depend on value -->
<g id="node4" class="node">
<title>Depend on value</title>
<polygon fill="transparent" stroke="#000000" points="881.0548,-949.3938 881.0548,-985.3938 1017.0548,-985.3938 1017.0548,-949.3938 881.0548,-949.3938"/>
<text text-anchor="middle" x="949.0548" y="-963.6938" font-family="Times,serif" font-size="14.00" fill="#000000">Depend on value</text>
<polygon fill="transparent" stroke="#000000" points="1013.0629,-17.0879 1013.0629,-53.0879 1149.0629,-53.0879 1149.0629,-17.0879 1013.0629,-17.0879"/>
<text text-anchor="middle" x="1081.0629" y="-31.3879" font-family="Times,serif" font-size="14.00" fill="#000000">Depend on value</text>
</g>
<!-- Node -->
<g id="node7" class="node">
<g id="node8" class="node">
<title>Node</title>
<polygon fill="transparent" stroke="#000000" points="1032.799,-884.1636 1032.799,-920.1636 1087.799,-920.1636 1087.799,-884.1636 1032.799,-884.1636"/>
<text text-anchor="middle" x="1060.299" y="-898.4636" font-family="Times,serif" font-size="14.00" fill="#000000">Node</text>
<polygon fill="transparent" stroke="#000000" points="1193.1256,-79.4232 1193.1256,-115.4232 1248.1256,-115.4232 1248.1256,-79.4232 1193.1256,-79.4232"/>
<text text-anchor="middle" x="1220.6256" y="-93.7232" font-family="Times,serif" font-size="14.00" fill="#000000">Node</text>
</g>
<!-- Depend on value&#45;&gt;Node -->
<g id="edge1" class="edge">
<title>Depend on value&#45;&gt;Node</title>
<path fill="none" stroke="#0000ff" d="M980.0425,-949.2236C993.5434,-941.3071 1009.4707,-931.9678 1023.5628,-923.7046"/>
<polygon fill="#0000ff" stroke="#0000ff" points="1025.6584,-926.5332 1032.5144,-918.4557 1022.1176,-920.4947 1025.6584,-926.5332"/>
<path fill="none" stroke="#0000ff" d="M1121.4302,-53.1178C1140.989,-61.8537 1164.3213,-72.275 1183.442,-80.8152"/>
<polygon fill="#0000ff" stroke="#0000ff" points="1182.1761,-84.083 1192.7341,-84.9655 1185.0308,-77.6915 1182.1761,-84.083"/>
</g>
<!-- Proxy to value -->
<g id="node5" class="node">
<title>Proxy to value</title>
<polygon fill="transparent" stroke="#000000" points="866.7255,-904.3893 866.7255,-940.3893 985.7255,-940.3893 985.7255,-904.3893 866.7255,-904.3893"/>
<text text-anchor="middle" x="926.2255" y="-918.6893" font-family="Times,serif" font-size="14.00" fill="#000000">Proxy to value</text>
<polygon fill="transparent" stroke="#000000" points="1048.3692,-85.2431 1048.3692,-121.2431 1167.3692,-121.2431 1167.3692,-85.2431 1048.3692,-85.2431"/>
<text text-anchor="middle" x="1107.8692" y="-99.5431" font-family="Times,serif" font-size="14.00" fill="#000000">Proxy to value</text>
</g>
<!-- Proxy to value&#45;&gt;Node -->
<g id="edge2" class="edge">
<title>Proxy to value&#45;&gt;Node</title>
<path fill="none" stroke="#00bfff" d="M985.8129,-913.4002C998.3426,-911.5101 1011.2237,-909.5669 1022.6762,-907.8392"/>
<polygon fill="#00bfff" stroke="#00bfff" points="1023.3751,-911.2735 1032.7411,-906.3209 1022.3309,-904.3518 1023.3751,-911.2735"/>
<path fill="none" stroke="#00bfff" d="M1167.5491,-100.1627C1172.6798,-99.8979 1177.7739,-99.635 1182.6606,-99.3827"/>
<polygon fill="#00bfff" stroke="#00bfff" points="1183.1548,-102.862 1192.9611,-98.8511 1182.7939,-95.8713 1183.1548,-102.862"/>
</g>
<!-- Depend on function -->
<g id="node6" class="node">
<title>Depend on function</title>
<polygon fill="transparent" stroke="#000000" points="855.9052,-855.7921 855.9052,-891.7921 1012.9052,-891.7921 1012.9052,-855.7921 855.9052,-855.7921"/>
<text text-anchor="middle" x="934.4052" y="-870.0921" font-family="Times,serif" font-size="14.00" fill="#000000">Depend on function</text>
<polygon fill="transparent" stroke="#000000" points="999.9595,-130.2476 999.9595,-166.2476 1156.9595,-166.2476 1156.9595,-130.2476 999.9595,-130.2476"/>
<text text-anchor="middle" x="1078.4595" y="-144.5476" font-family="Times,serif" font-size="14.00" fill="#000000">Depend on function</text>
</g>
<!-- Depend on function&#45;&gt;Node -->
<g id="edge3" class="edge">
<title>Depend on function&#45;&gt;Node</title>
<path fill="none" stroke="#6495ed" d="M1013.0626,-891.5184C1016.4331,-892.278 1019.7394,-893.0231 1022.9394,-893.7442"/>
<polygon fill="#6495ed" stroke="#6495ed" points="1022.2216,-897.1702 1032.7465,-895.9544 1023.7606,-890.3414 1022.2216,-897.1702"/>
<path fill="none" stroke="#6495ed" d="M1146.188,-130.1398C1154.1959,-127.5897 1162.1998,-124.8469 1169.7492,-121.9631 1174.3182,-120.2178 1179.038,-118.2211 1183.6764,-116.1372"/>
<polygon fill="#6495ed" stroke="#6495ed" points="1185.4219,-119.1853 1193.0086,-111.7899 1182.4659,-112.84 1185.4219,-119.1853"/>
</g>
<!-- Proxy to function -->
<g id="node7" class="node">
<title>Proxy to function</title>
<polygon fill="transparent" stroke="#000000" points="1036.7213,-181.4596 1036.7213,-217.4596 1176.7213,-217.4596 1176.7213,-181.4596 1036.7213,-181.4596"/>
<text text-anchor="middle" x="1106.7213" y="-195.7596" font-family="Times,serif" font-size="14.00" fill="#000000">Proxy to function</text>
</g>
<!-- Proxy to function&#45;&gt;Node -->
<g id="edge4" class="edge">
<title>Proxy to function&#45;&gt;Node</title>
<path fill="none" stroke="#1e90ff" d="M1139.9927,-181.3916C1146.9139,-177.0425 1153.9629,-172.1439 1160.0995,-166.9676 1175.196,-154.2336 1189.801,-137.6186 1200.881,-123.8221"/>
<polygon fill="#1e90ff" stroke="#1e90ff" points="1203.8712,-125.6816 1207.2973,-115.656 1198.3669,-121.3568 1203.8712,-125.6816"/>
</g>
<!-- Sleep -->
<g id="node8" class="node">
<g id="node9" class="node">
<title>Sleep</title>
<polygon fill="#caff70" stroke="#000000" points="652.4762,-938.2818 652.4762,-974.2818 708.4762,-974.2818 708.4762,-938.2818 652.4762,-938.2818"/>
<text text-anchor="middle" x="680.4762" y="-952.5818" font-family="Times,serif" font-size="14.00" fill="#000000">Sleep</text>
<polygon fill="#caff70" stroke="#000000" points="440.4636,-950.1798 440.4636,-986.1798 496.4636,-986.1798 496.4636,-950.1798 440.4636,-950.1798"/>
<text text-anchor="middle" x="468.4636" y="-964.4798" font-family="Times,serif" font-size="14.00" fill="#000000">Sleep</text>
</g>
<!-- Heat -->
<g id="node9" class="node">
<title>Heat</title>
<polygon fill="#caff70" stroke="#000000" points="694.4762,-848.2818 694.4762,-884.2818 748.4762,-884.2818 748.4762,-848.2818 694.4762,-848.2818"/>
<text text-anchor="middle" x="721.4762" y="-862.5818" font-family="Times,serif" font-size="14.00" fill="#000000">Heat</text>
</g>
<!-- Cool -->
<g id="node10" class="node">
<title>Cool</title>
<polygon fill="#caff70" stroke="#000000" points="586.4762,-956.2818 586.4762,-992.2818 640.4762,-992.2818 640.4762,-956.2818 586.4762,-956.2818"/>
<text text-anchor="middle" x="613.4762" y="-970.5818" font-family="Times,serif" font-size="14.00" fill="#000000">Cool</text>
<title>Heat</title>
<polygon fill="#caff70" stroke="#000000" points="380.4636,-900.1798 380.4636,-936.1798 434.4636,-936.1798 434.4636,-900.1798 380.4636,-900.1798"/>
<text text-anchor="middle" x="407.4636" y="-914.4798" font-family="Times,serif" font-size="14.00" fill="#000000">Heat</text>
</g>
<!-- Lighting Change -->
<g id="node11" class="node">
<title>Lighting Change</title>
<polygon fill="#caff70" stroke="#000000" points="270.5912,-708.8235 270.5912,-744.8235 407.5912,-744.8235 407.5912,-708.8235 270.5912,-708.8235"/>
<text text-anchor="middle" x="339.0912" y="-723.1235" font-family="Times,serif" font-size="14.00" fill="#000000">Lighting Change</text>
</g>
<!-- Lighting Kill -->
<g id="node12" class="node">
<title>Lighting Kill</title>
<polygon fill="#caff70" stroke="#000000" points="271.0912,-776.8235 271.0912,-812.8235 377.0912,-812.8235 377.0912,-776.8235 271.0912,-776.8235"/>
<text text-anchor="middle" x="324.0912" y="-791.1235" font-family="Times,serif" font-size="14.00" fill="#000000">Lighting Kill</text>
</g>
<!-- Temperature Kill -->
<g id="node13" class="node">
<title>Temperature Kill</title>
<polygon fill="#caff70" stroke="#000000" points="15.7163,-703.8979 15.7163,-739.8979 153.7163,-739.8979 153.7163,-703.8979 15.7163,-703.8979"/>
<text text-anchor="middle" x="84.7163" y="-718.1979" font-family="Times,serif" font-size="14.00" fill="#000000">Temperature Kill</text>
</g>
<!-- Temperature Kill&#45;&gt;Heat -->
<g id="edge9" class="edge">
<title>Temperature Kill&#45;&gt;Heat</title>
<path fill="none" stroke="#1e90ff" d="M153.9652,-719.0004C183.9257,-721.1425 217.6814,-728.5348 242.271,-748.1824 266.7862,-767.7705 249.8364,-788.673 268.9712,-813.5435 296.9853,-849.9548 340.7481,-880.1071 371.5678,-898.5422"/>
<polygon fill="#1e90ff" stroke="#1e90ff" points="369.8916,-901.6166 380.2887,-903.6538 373.4313,-895.5775 369.8916,-901.6166"/>
</g>
<!-- Temperature Change -->
<g id="node14" class="node">
<title>Temperature Change</title>
<polygon fill="#caff70" stroke="#000000" points="251.3143,-640.3257 251.3143,-676.3257 420.3143,-676.3257 420.3143,-640.3257 251.3143,-640.3257"/>
<text text-anchor="middle" x="335.8143" y="-654.6257" font-family="Times,serif" font-size="14.00" fill="#000000">Temperature Change</text>
</g>
<!-- Temperature Change&#45;&gt;Sleep -->
<g id="edge5" class="edge">
<title>Temperature Change&#45;&gt;Sleep</title>
<path fill="none" stroke="#6495ed" d="M374.5286,-676.4834C387.7071,-684.453 401.3593,-695.0142 410.3312,-708.1035 460.0453,-780.6323 467.984,-888.8137 468.7751,-939.7357"/>
<polygon fill="#6495ed" stroke="#6495ed" points="465.2769,-940.0084 468.8475,-949.9834 472.2767,-939.9589 465.2769,-940.0084"/>
</g>
<!-- Temperature Change&#45;&gt;Heat -->
<g id="edge6" class="edge">
<title>Temperature Change&#45;&gt;Heat</title>
<path fill="none" stroke="#6495ed" d="M377.7173,-676.4388C390.5383,-684.2114 403.1431,-694.6575 410.3312,-708.1035 441.5609,-766.5219 427.038,-847.7789 415.9606,-890.0707"/>
<polygon fill="#6495ed" stroke="#6495ed" points="412.5219,-889.3758 413.2484,-899.9457 419.2719,-891.2297 412.5219,-889.3758"/>
</g>
<!-- Temperature -->
<g id="node11" class="node">
<g id="node16" class="node">
<title>Temperature</title>
<polygon fill="#caff70" stroke="#000000" points="568.4762,-890.2818 568.4762,-926.2818 678.4762,-926.2818 678.4762,-890.2818 568.4762,-890.2818"/>
<text text-anchor="middle" x="623.4762" y="-904.5818" font-family="Times,serif" font-size="14.00" fill="#000000">Temperature</text>
<polygon fill="#ff6347" stroke="#000000" points="798.8816,-799.2222 798.8816,-835.2222 908.8816,-835.2222 908.8816,-799.2222 798.8816,-799.2222"/>
<text text-anchor="middle" x="853.8816" y="-813.5222" font-family="Times,serif" font-size="14.00" fill="#000000">Temperature</text>
</g>
<!-- Temperature&#45;&gt;Sleep -->
<g id="edge4" class="edge">
<title>Temperature&#45;&gt;Sleep</title>
<path fill="none" stroke="#6495ed" d="M645.0255,-926.4285C647.0116,-928.1011 649.0458,-929.814 651.086,-931.5321"/>
<polygon fill="#6495ed" stroke="#6495ed" points="648.9929,-934.3452 658.8965,-938.1094 653.5019,-928.9908 648.9929,-934.3452"/>
<!-- Temperature Change&#45;&gt;Temperature -->
<g id="edge10" class="edge">
<title>Temperature Change&#45;&gt;Temperature</title>
<path fill="none" stroke="#0000ff" d="M394.7388,-676.3985C492.3973,-706.3513 687.0816,-766.0629 788.7111,-797.2338"/>
<polygon fill="#0000ff" stroke="#0000ff" points="787.9605,-800.6644 798.5473,-800.2506 790.0132,-793.9721 787.9605,-800.6644"/>
</g>
<!-- Temperature&#45;&gt;Heat -->
<g id="edge5" class="edge">
<title>Temperature&#45;&gt;Heat</title>
<path fill="none" stroke="#6495ed" d="M665.6058,-890.2262C672.0062,-887.4832 678.5662,-884.6718 684.8371,-881.9843"/>
<polygon fill="#6495ed" stroke="#6495ed" points="686.5764,-885.0468 694.3892,-877.8905 683.819,-878.6128 686.5764,-885.0468"/>
<!-- Temperature Hold -->
<g id="node15" class="node">
<title>Temperature Hold</title>
<polygon fill="#caff70" stroke="#000000" points="90.291,-748.9024 90.291,-784.9024 239.291,-784.9024 239.291,-748.9024 90.291,-748.9024"/>
<text text-anchor="middle" x="164.791" y="-763.2024" font-family="Times,serif" font-size="14.00" fill="#000000">Temperature Hold</text>
</g>
<!-- Temperature&#45;&gt;Cool -->
<g id="edge6" class="edge">
<title>Temperature&#45;&gt;Cool</title>
<path fill="none" stroke="#6495ed" d="M620.7437,-926.3166C619.8177,-932.428 618.7601,-939.4083 617.7438,-946.1161"/>
<polygon fill="#6495ed" stroke="#6495ed" points="614.2431,-945.8573 616.2055,-956.2688 621.1641,-946.906 614.2431,-945.8573"/>
<!-- Temperature Hold&#45;&gt;Sleep -->
<g id="edge7" class="edge">
<title>Temperature Hold&#45;&gt;Sleep</title>
<path fill="none" stroke="#6495ed" d="M183.0612,-784.9387C218.2963,-818.8645 299.2587,-892.7285 379.3836,-936.8998 395.3124,-945.6811 414.1697,-952.7269 430.4238,-957.8919"/>
<polygon fill="#6495ed" stroke="#6495ed" points="429.5722,-961.2913 440.1583,-960.8634 431.6159,-954.5963 429.5722,-961.2913"/>
</g>
<!-- Temperature Hold&#45;&gt;Heat -->
<g id="edge8" class="edge">
<title>Temperature Hold&#45;&gt;Heat</title>
<path fill="none" stroke="#6495ed" d="M194.063,-785.15C238.6848,-812.9664 323.6051,-865.904 371.7761,-895.9329"/>
<polygon fill="#6495ed" stroke="#6495ed" points="369.9873,-898.9422 380.325,-901.2622 373.6904,-893.0018 369.9873,-898.9422"/>
</g>
<!-- Temperature Hold&#45;&gt;Temperature -->
<g id="edge11" class="edge">
<title>Temperature Hold&#45;&gt;Temperature</title>
<path fill="none" stroke="#0000ff" d="M239.7538,-769.3194C280.94,-770.8486 332.9194,-773.1067 379.2112,-776.1035 525.6545,-785.584 697.0939,-801.6724 788.5511,-810.6567"/>
<polygon fill="#0000ff" stroke="#0000ff" points="788.4678,-814.1654 798.7628,-811.663 789.1543,-807.1991 788.4678,-814.1654"/>
</g>
<!-- /api/action/light/kill -->
<g id="node12" class="node">
<g id="node17" class="node">
<title>/api/action/light/kill</title>
<polygon fill="#caff70" stroke="#000000" points="686.9525,-503.5636 686.9525,-539.5636 740.9525,-539.5636 740.9525,-503.5636 686.9525,-503.5636"/>
<text text-anchor="middle" x="713.9525" y="-517.8636" font-family="Times,serif" font-size="14.00" fill="#000000">kill</text>
<polygon fill="#caff70" stroke="#000000" points="575.6269,-387.8233 575.6269,-423.8233 629.6269,-423.8233 629.6269,-387.8233 575.6269,-387.8233"/>
<text text-anchor="middle" x="602.6269" y="-402.1233" font-family="Times,serif" font-size="14.00" fill="#000000">kill</text>
</g>
<!-- /api/action/light/set -->
<g id="node13" class="node">
<g id="node18" class="node">
<title>/api/action/light/set</title>
<polygon fill="#caff70" stroke="#000000" points="746.9525,-553.5636 746.9525,-589.5636 800.9525,-589.5636 800.9525,-553.5636 746.9525,-553.5636"/>
<text text-anchor="middle" x="773.9525" y="-567.8636" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
<polygon fill="#caff70" stroke="#000000" points="635.6269,-437.8233 635.6269,-473.8233 689.6269,-473.8233 689.6269,-437.8233 635.6269,-437.8233"/>
<text text-anchor="middle" x="662.6269" y="-452.1233" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
<!-- /api/action/temperature/kill -->
<g id="node14" class="node">
<g id="node19" class="node">
<title>/api/action/temperature/kill</title>
<polygon fill="#caff70" stroke="#000000" points="596.9525,-568.5636 596.9525,-604.5636 650.9525,-604.5636 650.9525,-568.5636 596.9525,-568.5636"/>
<text text-anchor="middle" x="623.9525" y="-582.8636" font-family="Times,serif" font-size="14.00" fill="#000000">kill</text>
<polygon fill="#caff70" stroke="#000000" points="746.1925,-374.1479 746.1925,-410.1479 800.1925,-410.1479 800.1925,-374.1479 746.1925,-374.1479"/>
<text text-anchor="middle" x="773.1925" y="-388.4479" font-family="Times,serif" font-size="14.00" fill="#000000">kill</text>
</g>
<!-- /api/action/temperature/kill&#45;&gt;Temperature Kill -->
<g id="edge13" class="edge">
<title>/api/action/temperature/kill&#45;&gt;Temperature Kill</title>
<path fill="none" stroke="#1e90ff" d="M746.0959,-398.7275C717.5679,-406.1567 671.7243,-419.5354 634.5469,-437.1033 570.526,-467.3559 562.4625,-488.9746 500.3578,-522.9879 391.9669,-582.351 359.2196,-585.8644 247.9343,-639.6058 207.3599,-659.1997 161.5852,-682.373 128.8598,-699.1279"/>
<polygon fill="#1e90ff" stroke="#1e90ff" points="126.8691,-696.2152 119.5675,-703.8924 130.0629,-702.4442 126.8691,-696.2152"/>
</g>
<!-- /api/action/temperature/kill&#45;&gt;Temperature -->
<g id="edge14" class="edge">
<title>/api/action/temperature/kill&#45;&gt;Temperature</title>
<path fill="none" stroke="#00bfff" d="M798.753,-410.3934C801.0069,-412.8717 803.0217,-415.5603 804.5846,-418.4324 872.3188,-542.9043 863.599,-720.9294 857.1089,-789.1498"/>
<polygon fill="#00bfff" stroke="#00bfff" points="853.6235,-788.8293 856.0984,-799.131 860.5879,-789.5344 853.6235,-788.8293"/>
</g>
<!-- /api/action/temperature/set -->
<g id="node15" class="node">
<g id="node20" class="node">
<title>/api/action/temperature/set</title>
<polygon fill="#caff70" stroke="#000000" points="536.9525,-518.5636 536.9525,-554.5636 590.9525,-554.5636 590.9525,-518.5636 536.9525,-518.5636"/>
<text text-anchor="middle" x="563.9525" y="-532.8636" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
<polygon fill="#caff70" stroke="#000000" points="749.5046,-419.1524 749.5046,-455.1524 803.5046,-455.1524 803.5046,-419.1524 749.5046,-419.1524"/>
<text text-anchor="middle" x="776.5046" y="-433.4524" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
<!-- /api/action/temperature/set&#45;&gt;Temperature Change -->
<g id="edge12" class="edge">
<title>/api/action/temperature/set&#45;&gt;Temperature Change</title>
<path fill="none" stroke="#1e90ff" d="M749.27,-450.8208C675.6109,-487.7888 471.8888,-590.0328 380.8187,-635.7389"/>
<polygon fill="#1e90ff" stroke="#1e90ff" points="379.2118,-632.6293 371.8442,-640.2431 382.3517,-638.8856 379.2118,-632.6293"/>
</g>
<!-- /api/sensor/temperature -->
<g id="node16" class="node">
<g id="node21" class="node">
<title>/api/sensor/temperature</title>
<polygon fill="#caff70" stroke="#000000" points="79.7144,-495.9227 79.7144,-531.9227 186.7144,-531.9227 186.7144,-495.9227 79.7144,-495.9227"/>
<text text-anchor="middle" x="133.2144" y="-510.2227" font-family="Times,serif" font-size="14.00" fill="#000000">temperature</text>
<polygon fill="#caff70" stroke="#000000" points="617.0397,-16.127 617.0397,-52.127 724.0397,-52.127 724.0397,-16.127 617.0397,-16.127"/>
<text text-anchor="middle" x="670.5397" y="-30.427" font-family="Times,serif" font-size="14.00" fill="#000000">temperature</text>
</g>
<!-- /api/routine/cook/list -->
<g id="node17" class="node">
<g id="node22" class="node">
<title>/api/routine/cook/list</title>
<polygon fill="#caff70" stroke="#000000" points="392.9525,-560.0636 392.9525,-596.0636 446.9525,-596.0636 446.9525,-560.0636 392.9525,-560.0636"/>
<text text-anchor="middle" x="419.9525" y="-574.3636" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
<polygon fill="#caff70" stroke="#000000" points="445.2778,-430.2679 445.2778,-466.2679 499.2778,-466.2679 499.2778,-430.2679 445.2778,-430.2679"/>
<text text-anchor="middle" x="472.2778" y="-444.5679" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
</g>
<!-- /api/settings/cook/recipe/list -->
<g id="node28" class="node">
<g id="node30" class="node">
<title>/api/settings/cook/recipe/list</title>
<polygon fill="#caff70" stroke="#000000" points="225.1906,-255.7044 225.1906,-291.7044 279.1906,-291.7044 279.1906,-255.7044 225.1906,-255.7044"/>
<text text-anchor="middle" x="252.1906" y="-270.0044" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
<polygon fill="#caff70" stroke="#000000" points="284.516,-96.4087 284.516,-132.4087 338.516,-132.4087 338.516,-96.4087 284.516,-96.4087"/>
<text text-anchor="middle" x="311.516" y="-110.7087" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
</g>
<!-- /api/routine/cook/list&#45;&gt;/api/settings/cook/recipe/list -->
<g id="edge7" class="edge">
<g id="edge15" class="edge">
<title>/api/routine/cook/list&#45;&gt;/api/settings/cook/recipe/list</title>
<path fill="none" stroke="#00bfff" d="M405.4001,-559.867C400.8734,-553.9173 395.993,-547.1894 391.8725,-540.7836 337.5958,-456.4034 329.2126,-432.0446 284.1106,-342.4244 277.3247,-328.9406 270.2089,-313.7375 264.4223,-301.0656"/>
<polygon fill="#00bfff" stroke="#00bfff" points="267.6013,-299.6011 260.2839,-291.9392 261.2261,-302.492 267.6013,-299.6011"/>
<path fill="none" stroke="#00bfff" d="M457.4257,-430.2561C452.8829,-424.3163 448.0687,-417.5475 444.1978,-410.9879 388.7191,-316.9732 341.2948,-195.6118 321.4524,-141.9781"/>
<polygon fill="#00bfff" stroke="#00bfff" points="324.6966,-140.659 317.9649,-132.4776 318.1253,-143.0712 324.6966,-140.659"/>
</g>
<!-- /api/routine/cook/start -->
<g id="node18" class="node">
<g id="node23" class="node">
<title>/api/routine/cook/start</title>
<polygon fill="#caff70" stroke="#000000" points="392.9525,-616.0636 392.9525,-652.0636 446.9525,-652.0636 446.9525,-616.0636 392.9525,-616.0636"/>
<text text-anchor="middle" x="419.9525" y="-630.3636" font-family="Times,serif" font-size="14.00" fill="#000000">start</text>
<polygon fill="#caff70" stroke="#000000" points="445.2778,-486.2679 445.2778,-522.2679 499.2778,-522.2679 499.2778,-486.2679 445.2778,-486.2679"/>
<text text-anchor="middle" x="472.2778" y="-500.5679" font-family="Times,serif" font-size="14.00" fill="#000000">start</text>
</g>
<!-- /api/routine/cook/kill -->
<g id="node19" class="node">
<g id="node24" class="node">
<title>/api/routine/cook/kill</title>
<polygon fill="#caff70" stroke="#000000" points="392.9525,-504.0636 392.9525,-540.0636 446.9525,-540.0636 446.9525,-504.0636 392.9525,-504.0636"/>
<text text-anchor="middle" x="419.9525" y="-518.3636" font-family="Times,serif" font-size="14.00" fill="#000000">kill</text>
<polygon fill="#caff70" stroke="#000000" points="445.2778,-374.2679 445.2778,-410.2679 499.2778,-410.2679 499.2778,-374.2679 445.2778,-374.2679"/>
<text text-anchor="middle" x="472.2778" y="-388.5679" font-family="Times,serif" font-size="14.00" fill="#000000">kill</text>
</g>
<!-- /api/routine/cook/schedule/list -->
<g id="node20" class="node">
<g id="node25" class="node">
<title>/api/routine/cook/schedule/list</title>
<polygon fill="#caff70" stroke="#000000" points="317.1906,-569.7044 317.1906,-605.7044 371.1906,-605.7044 371.1906,-569.7044 317.1906,-569.7044"/>
<text text-anchor="middle" x="344.1906" y="-584.0044" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
<polygon fill="#caff70" stroke="#000000" points="309.516,-389.9087 309.516,-425.9087 363.516,-425.9087 363.516,-389.9087 309.516,-389.9087"/>
<text text-anchor="middle" x="336.516" y="-404.2087" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
</g>
<!-- /api/routine/cook/schedule/set -->
<g id="node21" class="node">
<g id="node26" class="node">
<title>/api/routine/cook/schedule/set</title>
<polygon fill="#caff70" stroke="#000000" points="257.1906,-519.7044 257.1906,-555.7044 311.1906,-555.7044 311.1906,-519.7044 257.1906,-519.7044"/>
<text text-anchor="middle" x="284.1906" y="-534.0044" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
<polygon fill="#caff70" stroke="#000000" points="369.516,-439.9087 369.516,-475.9087 423.516,-475.9087 423.516,-439.9087 369.516,-439.9087"/>
<text text-anchor="middle" x="396.516" y="-454.2087" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
<!-- /api/settings/time/set -->
<g id="node22" class="node">
<g id="node27" class="node">
<title>/api/settings/time/set</title>
<polygon fill="#caff70" stroke="#000000" points="408.9525,-191.5636 408.9525,-227.5636 462.9525,-227.5636 462.9525,-191.5636 408.9525,-191.5636"/>
<text text-anchor="middle" x="435.9525" y="-205.8636" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
<polygon fill="#caff70" stroke="#000000" points="444.2778,-228.2679 444.2778,-264.2679 498.2778,-264.2679 498.2778,-228.2679 444.2778,-228.2679"/>
<text text-anchor="middle" x="471.2778" y="-242.5679" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
<!-- /api/settings/lighting/list -->
<g id="node23" class="node">
<g id="node28" class="node">
<title>/api/settings/lighting/list</title>
<polygon fill="#caff70" stroke="#000000" points="468.9525,-73.5636 468.9525,-109.5636 522.9525,-109.5636 522.9525,-73.5636 468.9525,-73.5636"/>
<text text-anchor="middle" x="495.9525" y="-87.8636" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
<polygon fill="#caff70" stroke="#000000" points="504.2778,-124.2679 504.2778,-160.2679 558.2778,-160.2679 558.2778,-124.2679 504.2778,-124.2679"/>
<text text-anchor="middle" x="531.2778" y="-138.5679" font-family="Times,serif" font-size="14.00" fill="#000000">list</text>
</g>
<!-- /api/settings/lighting/set -->
<g id="node24" class="node">
<g id="node29" class="node">
<title>/api/settings/lighting/set</title>
<polygon fill="#caff70" stroke="#000000" points="408.9525,-23.5636 408.9525,-59.5636 462.9525,-59.5636 462.9525,-23.5636 408.9525,-23.5636"/>
<text text-anchor="middle" x="435.9525" y="-37.8636" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
<!-- /api/settings/cook/warm/temperature -->
<g id="node25" class="node">
<title>/api/settings/cook/warm/temperature</title>
<polygon fill="#caff70" stroke="#000000" points="32.1906,-79.7044 32.1906,-115.7044 139.1906,-115.7044 139.1906,-79.7044 32.1906,-79.7044"/>
<text text-anchor="middle" x="85.6906" y="-94.0044" font-family="Times,serif" font-size="14.00" fill="#000000">temperature</text>
</g>
<!-- /api/settings/cook/warm/set -->
<g id="node26" class="node">
<title>/api/settings/cook/warm/set</title>
<polygon fill="#caff70" stroke="#000000" points="50.6906,-145.7044 50.6906,-181.7044 104.6906,-181.7044 104.6906,-145.7044 50.6906,-145.7044"/>
<text text-anchor="middle" x="77.6906" y="-160.0044" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
<!-- /api/settings/cook/warm/duration -->
<g id="node27" class="node">
<title>/api/settings/cook/warm/duration</title>
<polygon fill="#caff70" stroke="#000000" points="116.1906,-127.7044 116.1906,-163.7044 193.1906,-163.7044 193.1906,-127.7044 116.1906,-127.7044"/>
<text text-anchor="middle" x="154.6906" y="-142.0044" font-family="Times,serif" font-size="14.00" fill="#000000">duration</text>
<polygon fill="#caff70" stroke="#000000" points="444.2778,-74.2679 444.2778,-110.2679 498.2778,-110.2679 498.2778,-74.2679 444.2778,-74.2679"/>
<text text-anchor="middle" x="471.2778" y="-88.5679" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
<!-- /api/settings/cook/recipe/set -->
<g id="node29" class="node">
<g id="node31" class="node">
<title>/api/settings/cook/recipe/set</title>
<polygon fill="#caff70" stroke="#000000" points="285.1906,-305.7044 285.1906,-341.7044 339.1906,-341.7044 339.1906,-305.7044 285.1906,-305.7044"/>
<text text-anchor="middle" x="312.1906" y="-320.0044" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
<polygon fill="#caff70" stroke="#000000" points="344.516,-146.4087 344.516,-182.4087 398.516,-182.4087 398.516,-146.4087 344.516,-146.4087"/>
<text text-anchor="middle" x="371.516" y="-160.7087" font-family="Times,serif" font-size="14.00" fill="#000000">set</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 24 KiB