← Back to API Reference
API: Recipe Management
Recipes control your Annaboto's grow parameters — nutrient dosing, light schedule, and duration across 16 weeks. You can read the default recipe, view your custom overlay, or save a new one.
GET /recipe_base
Returns the device's default (base) recipe template. This is the starting point that custom overlays modify.
Endpoint:
GET http://<device-ip>:8080/annaboto/api/recipe_base
Example Request
curl http://192.168.0.103:8080/annaboto/api/recipe_base
GET /recipe_overlay/{name}
Returns the current custom recipe overlay for a specific device. The {name} is the device's MAC address (without colons, lowercase).
Endpoint:
GET http://<device-ip>:8080/annaboto/api/recipe_overlay/{name}
Example Request
curl http://192.168.0.103:8080/annaboto/api/recipe_overlay/0025ca1799c6
PUT /recipe_overlay
Saves a custom recipe overlay. This is the main endpoint for customizing your grow schedule.
Endpoint:
Content-Type:
Returns:
PUT http://<device-ip>:8080/annaboto/api/recipe_overlayContent-Type:
application/jsonReturns:
201 on success, 400 with validation message on error
Request Body Format
The request uses CSV column names from the device's internal recipe format. All rows must have the same set of columns.
{
"name": "0025ca1799c6",
"data": [
{
"label": "start",
"in.step ==": "start",
"in.days >=": "",
"in.days <": "",
"((in.op == 'cycle') or (in.button == 1)) ==": 1,
"in.op ==": "",
"out.recipe": "",
"out.step": "next",
"out.bubbler": "",
"out.micro": "",
"out.bloom": "",
"out.grow": "",
"out.cal_mag": "",
"out.lamp_fan1": "",
"out.light_hours": "",
"out.lamp_light1": "",
"out.lamp_light2": ""
},
{
"label": "week1",
"in.step ==": "week1",
"in.days >=": "",
"in.days <": "",
"((in.op == 'cycle') or (in.button == 1)) ==": "",
"in.op ==": "",
"out.recipe": "",
"out.step": "",
"out.bubbler": "0.3",
"out.micro": "0",
"out.bloom": "0",
"out.grow": "0",
"out.cal_mag": "0",
"out.lamp_fan1": "0.0",
"out.light_hours": "18",
"out.lamp_light1": "0.99",
"out.lamp_light2": "0.0"
},
{
"label": "week2",
"in.step ==": "week2",
"in.days >=": "",
"in.days <": "",
"((in.op == 'cycle') or (in.button == 1)) ==": "",
"in.op ==": "",
"out.recipe": "",
"out.step": "",
"out.bubbler": "0.3",
"out.micro": "0.3",
"out.bloom": "0.3",
"out.grow": "0.3",
"out.cal_mag": "1",
"out.lamp_fan1": "0.0",
"out.light_hours": "18",
"out.lamp_light1": "0.99",
"out.lamp_light2": "0.99"
}
]
}
Column Reference
| Column | Type | Description |
|---|---|---|
label |
string | Row identifier: "start", "week1" through "week16" |
in.step == |
string | Must match label value |
((in.op == 'cycle') or (in.button == 1)) == |
number | Cycle trigger condition. Set to 1 on start row only. |
out.step |
string | Set to "next" on start row, empty on week rows |
out.bubbler |
string | Bubbler intensity (e.g., "0.3") |
out.micro |
string | FloraMicro nutrient amount |
out.bloom |
string | FloraBloom nutrient amount |
out.grow |
string | FloraGrow nutrient amount |
out.cal_mag |
string | CALiMAGic amount |
out.lamp_fan1 |
string | Lamp fan speed (e.g., "0.0") |
out.light_hours |
string | Hours of light per day (e.g., "18" for 18/6 schedule) |
out.lamp_light1 |
string | Light 1 brightness, 0.0–1.0 (e.g., "0.99") |
out.lamp_light2 |
string | Light 2 brightness, 0.0–1.0 (e.g., "0.99") |
Important Rules
- All
out.*values must be strings (e.g.,"0.3"not0.3). The CSV-based recipe engine treats them as string data. - The cycle condition field must be a number — specifically
1on the start row. This is the one exception to the strings rule. - All rows must have the same set of column keys. Empty values should be empty strings
"". - Include the start row. It triggers the grow cycle to begin.
- Send all week rows (week1 through week16) even if values are the same — the device writes the complete overlay.
- The device auto-expands your columns to the full 25-column template internally. You only need to send the 17 columns listed above.
- The
namefield is the device MAC address (lowercase, no colons), e.g.,"0025ca1799c6".
Example: Saving a Custom Recipe with curl
curl -X PUT \
http://192.168.0.103:8080/annaboto/api/recipe_overlay \
-H "Content-Type: application/json" \
-d '{
"name": "0025ca1799c6",
"data": [
{"label":"start","in.step ==":"start","in.days >=":"","in.days <":"","((in.op == '\''cycle'\'') or (in.button == 1)) ==":1,"in.op ==":"","out.recipe":"","out.step":"next","out.bubbler":"","out.micro":"","out.bloom":"","out.grow":"","out.cal_mag":"","out.lamp_fan1":"","out.light_hours":"","out.lamp_light1":"","out.lamp_light2":""},
{"label":"week1","in.step ==":"week1","in.days >=":"","in.days <":"","((in.op == '\''cycle'\'') or (in.button == 1)) ==":"","in.op ==":"","out.recipe":"","out.step":"","out.bubbler":"0.3","out.micro":"0","out.bloom":"0","out.grow":"0","out.cal_mag":"0","out.lamp_fan1":"0.0","out.light_hours":"18","out.lamp_light1":"0.99","out.lamp_light2":"0.0"}
]
}'