@roastbook/open-coffee-schema 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +65 -2
- package/brew-methods/latest.json +312 -0
- package/brew-methods/v0.1.0.json +265 -0
- package/brew-methods/v0.2.0.json +265 -0
- package/brew-methods/v0.3.0.json +272 -0
- package/brew-methods/v0.4.0.json +312 -0
- package/coffee-places/context.latest.json +246 -0
- package/coffee-places/context.v0.1.0.json +241 -0
- package/coffee-places/context.v0.3.0.json +246 -0
- package/coffee-places/context.v0.4.0.json +246 -0
- package/coffee-places/latest.json +577 -0
- package/coffee-places/v0.1.0.json +518 -0
- package/coffee-places/v0.2.0.json +518 -0
- package/coffee-places/v0.3.0.json +577 -0
- package/coffee-places/v0.4.0.json +577 -0
- package/common/latest.json +197 -0
- package/common/v0.1.0.json +192 -0
- package/common/v0.2.0.json +197 -0
- package/common/v0.3.0.json +197 -0
- package/common/v0.4.0.json +197 -0
- package/equipment/latest.json +895 -0
- package/equipment/v0.1.0.json +1122 -0
- package/equipment/v0.2.0.json +1122 -0
- package/equipment/v0.3.0.json +895 -0
- package/equipment/v0.4.0.json +895 -0
- package/index.d.ts +1114 -0
- package/index.js +94 -0
- package/package.json +67 -4
- package/schemas.d.ts +5 -0
- package/schemas.js +3 -0
|
@@ -0,0 +1,895 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://schema.roastbook.coffee/equipment/equipment.schema.v0.3.0.json",
|
|
4
|
+
"title": "Open Coffee equipment catalog",
|
|
5
|
+
"description": "Coffee equipment models (machines, grinders, brewers, kettles, scales and accessories) as sold, not individual owned items. Measurements put the unit in the property name. Part of Roastbook Open Coffee; derived from the Roastbook journal gear model.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"$schema",
|
|
9
|
+
"meta",
|
|
10
|
+
"equipment"
|
|
11
|
+
],
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"properties": {
|
|
14
|
+
"$schema": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"pattern": "^https://schema\\.roastbook\\.coffee/equipment/equipment\\.schema\\.v[0-9]+\\.[0-9]+\\.[0-9]+\\.json$",
|
|
17
|
+
"description": "Canonical URL of the schema version this file follows."
|
|
18
|
+
},
|
|
19
|
+
"meta": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/dataset_meta",
|
|
22
|
+
"unevaluatedProperties": false
|
|
23
|
+
},
|
|
24
|
+
"equipment": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": {
|
|
27
|
+
"$ref": "#/$defs/item"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"$defs": {
|
|
32
|
+
"type": {
|
|
33
|
+
"title": "Equipment type",
|
|
34
|
+
"enum": [
|
|
35
|
+
"espresso_machine",
|
|
36
|
+
"espresso_machine_with_grinder",
|
|
37
|
+
"grinder",
|
|
38
|
+
"brewer",
|
|
39
|
+
"kettle",
|
|
40
|
+
"scale",
|
|
41
|
+
"tamper",
|
|
42
|
+
"wdt",
|
|
43
|
+
"basket",
|
|
44
|
+
"filter",
|
|
45
|
+
"roaster",
|
|
46
|
+
"milk_frother",
|
|
47
|
+
"accessory"
|
|
48
|
+
],
|
|
49
|
+
"description": "espresso_machine_with_grinder is an espresso machine with a built-in grinder; filter covers paper and metal filters; accessory covers everything without a dedicated type (puck screens, distribution tools, thermometers, dosing cups)."
|
|
50
|
+
},
|
|
51
|
+
"espresso_machine": {
|
|
52
|
+
"title": "Espresso machine details",
|
|
53
|
+
"type": "object",
|
|
54
|
+
"additionalProperties": false,
|
|
55
|
+
"properties": {
|
|
56
|
+
"heating_architecture": {
|
|
57
|
+
"enum": [
|
|
58
|
+
"single_boiler",
|
|
59
|
+
"heat_exchanger",
|
|
60
|
+
"dual_boiler",
|
|
61
|
+
"multi_boiler",
|
|
62
|
+
"single_thermoblock",
|
|
63
|
+
"dual_thermoblock",
|
|
64
|
+
"hybrid",
|
|
65
|
+
"manual",
|
|
66
|
+
"other"
|
|
67
|
+
],
|
|
68
|
+
"description": "How the machine heats water. single_boiler: one boiler for brewing and steam, used in turn; heat_exchanger: one steam boiler that heats brew water passing through a pipe inside it; dual_boiler: separate brew and steam boilers; multi_boiler: more than two boilers, for example one per group; single_thermoblock and dual_thermoblock: water heated on the fly in one or two thermoblocks; hybrid: a boiler combined with a thermoblock; manual: no heater, you pour in hot water."
|
|
69
|
+
},
|
|
70
|
+
"temperature_control": {
|
|
71
|
+
"enum": [
|
|
72
|
+
"none",
|
|
73
|
+
"fixed",
|
|
74
|
+
"adjustable",
|
|
75
|
+
"programmable"
|
|
76
|
+
],
|
|
77
|
+
"description": "How brew temperature is set. none: no control; fixed: set at the factory; adjustable: the user can change it (for example with a PID); programmable: can change during the shot or follow profiles."
|
|
78
|
+
},
|
|
79
|
+
"pressure_control": {
|
|
80
|
+
"enum": [
|
|
81
|
+
"fixed",
|
|
82
|
+
"adjustable_opv",
|
|
83
|
+
"manual",
|
|
84
|
+
"programmable"
|
|
85
|
+
],
|
|
86
|
+
"description": "How brew pressure is set. fixed: set by the factory; adjustable_opv: the over-pressure valve can be adjusted; manual: controlled by hand, for example with a lever; programmable: follows set pressure profiles."
|
|
87
|
+
},
|
|
88
|
+
"flow_control": {
|
|
89
|
+
"enum": [
|
|
90
|
+
"none",
|
|
91
|
+
"manual",
|
|
92
|
+
"programmable"
|
|
93
|
+
],
|
|
94
|
+
"description": "Whether water flow during the shot can be controlled. none: no control; manual: by hand, for example a needle valve paddle; programmable: follows set profiles."
|
|
95
|
+
},
|
|
96
|
+
"preinfusion_control": {
|
|
97
|
+
"enum": [
|
|
98
|
+
"none",
|
|
99
|
+
"supported",
|
|
100
|
+
"fixed",
|
|
101
|
+
"adjustable",
|
|
102
|
+
"programmable"
|
|
103
|
+
],
|
|
104
|
+
"description": "Wetting the coffee at low pressure before full pressure. none: no preinfusion; supported: possible by hand or by technique; fixed: built in with a fixed duration; adjustable: duration or pressure can be set; programmable: part of a programmable profile."
|
|
105
|
+
},
|
|
106
|
+
"steam_system": {
|
|
107
|
+
"enum": [
|
|
108
|
+
"none",
|
|
109
|
+
"shared_heater",
|
|
110
|
+
"dedicated_heater"
|
|
111
|
+
],
|
|
112
|
+
"description": "How milk steam is produced. none: no steam wand; shared_heater: the same heater as for brewing, so the machine switches between modes; dedicated_heater: a separate boiler or thermoblock for steam."
|
|
113
|
+
},
|
|
114
|
+
"simultaneous_brew_and_steam": {
|
|
115
|
+
"type": "boolean",
|
|
116
|
+
"description": "Whether you can pull a shot and steam milk at the same time. true: possible; false: confirmed not possible; absent: unknown."
|
|
117
|
+
},
|
|
118
|
+
"pump_type": {
|
|
119
|
+
"enum": [
|
|
120
|
+
"vibration",
|
|
121
|
+
"rotary",
|
|
122
|
+
"gear",
|
|
123
|
+
"peristaltic",
|
|
124
|
+
"manual",
|
|
125
|
+
"other"
|
|
126
|
+
],
|
|
127
|
+
"description": "How pressure is made. vibration: small vibratory pump; rotary: quieter rotary vane pump; gear: gear pump, often used for flow profiling; peristaltic: squeezed-tube pump; manual: lever or hand pump, no motor."
|
|
128
|
+
},
|
|
129
|
+
"water_source_modes": {
|
|
130
|
+
"type": "array",
|
|
131
|
+
"uniqueItems": true,
|
|
132
|
+
"minItems": 1,
|
|
133
|
+
"items": {
|
|
134
|
+
"enum": [
|
|
135
|
+
"reservoir",
|
|
136
|
+
"plumbed"
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
"description": "Where water comes from. reservoir: a tank you fill; plumbed: connected to the mains water supply."
|
|
140
|
+
},
|
|
141
|
+
"shot_stop_modes": {
|
|
142
|
+
"type": "array",
|
|
143
|
+
"uniqueItems": true,
|
|
144
|
+
"items": {
|
|
145
|
+
"enum": [
|
|
146
|
+
"manual",
|
|
147
|
+
"weight",
|
|
148
|
+
"time",
|
|
149
|
+
"volume"
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
"description": "How a shot can be stopped. manual: by the user; weight: automatically at a target weight with a scale; time: after a set time; volume: after a set volume (volumetric dosing)."
|
|
153
|
+
},
|
|
154
|
+
"group_count": {
|
|
155
|
+
"type": "integer",
|
|
156
|
+
"minimum": 1,
|
|
157
|
+
"description": "Number of brew groups (where portafilters lock in), for example 1 for most home machines."
|
|
158
|
+
},
|
|
159
|
+
"portafilter_diameter_mm": {
|
|
160
|
+
"type": "number",
|
|
161
|
+
"exclusiveMinimum": 0,
|
|
162
|
+
"description": "Inner diameter of the portafilter basket in millimetres, for example 58."
|
|
163
|
+
},
|
|
164
|
+
"brew_pressure_min_bar": {
|
|
165
|
+
"type": "number",
|
|
166
|
+
"exclusiveMinimum": 0,
|
|
167
|
+
"description": "Lowest brew pressure the machine can deliver, in bar."
|
|
168
|
+
},
|
|
169
|
+
"brew_pressure_max_bar": {
|
|
170
|
+
"type": "number",
|
|
171
|
+
"exclusiveMinimum": 0,
|
|
172
|
+
"description": "Highest brew pressure the machine can deliver, in bar."
|
|
173
|
+
},
|
|
174
|
+
"brew_temperature_min_celsius": {
|
|
175
|
+
"type": "number",
|
|
176
|
+
"exclusiveMinimum": 0,
|
|
177
|
+
"description": "Lowest brew water temperature that can be set, in degrees Celsius."
|
|
178
|
+
},
|
|
179
|
+
"brew_temperature_max_celsius": {
|
|
180
|
+
"type": "number",
|
|
181
|
+
"exclusiveMinimum": 0,
|
|
182
|
+
"description": "Highest brew water temperature that can be set, in degrees Celsius."
|
|
183
|
+
},
|
|
184
|
+
"reservoir_capacity_ml": {
|
|
185
|
+
"type": "number",
|
|
186
|
+
"exclusiveMinimum": 0,
|
|
187
|
+
"description": "Size of the water tank in millilitres."
|
|
188
|
+
},
|
|
189
|
+
"power_w": {
|
|
190
|
+
"type": "number",
|
|
191
|
+
"exclusiveMinimum": 0,
|
|
192
|
+
"description": "Rated electrical power in watts."
|
|
193
|
+
},
|
|
194
|
+
"group_type": {
|
|
195
|
+
"enum": [
|
|
196
|
+
"e61",
|
|
197
|
+
"saturated",
|
|
198
|
+
"semi_saturated",
|
|
199
|
+
"lever",
|
|
200
|
+
"integrated",
|
|
201
|
+
"other"
|
|
202
|
+
],
|
|
203
|
+
"description": "Type of brew group. e61: the classic heated E61 group; saturated: group filled with boiler water and kept at its temperature; semi_saturated: group attached to the boiler but not fully filled; lever: piston group driven by a lever; integrated: group built into a thermoblock or the machine body; other: anything else."
|
|
204
|
+
},
|
|
205
|
+
"boiler_count": {
|
|
206
|
+
"type": "integer",
|
|
207
|
+
"minimum": 0,
|
|
208
|
+
"description": "Number of boilers, 0 for thermoblock or manual machines."
|
|
209
|
+
},
|
|
210
|
+
"connectivity": {
|
|
211
|
+
"type": "array",
|
|
212
|
+
"uniqueItems": true,
|
|
213
|
+
"items": {
|
|
214
|
+
"enum": [
|
|
215
|
+
"bluetooth",
|
|
216
|
+
"wifi",
|
|
217
|
+
"usb"
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
"description": "Wireless or wired connections for apps or updates: bluetooth, wifi or usb."
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
"grinder": {
|
|
225
|
+
"title": "Grinder details",
|
|
226
|
+
"type": "object",
|
|
227
|
+
"additionalProperties": false,
|
|
228
|
+
"properties": {
|
|
229
|
+
"burr_mechanism": {
|
|
230
|
+
"enum": [
|
|
231
|
+
"conical",
|
|
232
|
+
"flat",
|
|
233
|
+
"ghost",
|
|
234
|
+
"roller",
|
|
235
|
+
"blade",
|
|
236
|
+
"other"
|
|
237
|
+
],
|
|
238
|
+
"description": "Type of cutting parts. conical: cone-shaped burrs; flat: two flat discs; ghost: flat burrs in a design without a burr carrier contact, sold as \"ghost burrs\"; roller: industrial-style roller mill; blade: spinning blade that chops rather than grinds; other: anything else."
|
|
239
|
+
},
|
|
240
|
+
"burr_diameter_mm": {
|
|
241
|
+
"type": "number",
|
|
242
|
+
"exclusiveMinimum": 0,
|
|
243
|
+
"description": "Diameter of the burrs in millimetres, for example 64 for many flat-burr grinders."
|
|
244
|
+
},
|
|
245
|
+
"burr_material": {
|
|
246
|
+
"enum": [
|
|
247
|
+
"steel",
|
|
248
|
+
"ceramic",
|
|
249
|
+
"titanium_coated",
|
|
250
|
+
"other"
|
|
251
|
+
],
|
|
252
|
+
"description": "What the burrs are made of. steel: hardened steel; ceramic: ceramic burrs; titanium_coated: steel with a titanium or similar hard coating; other: anything else."
|
|
253
|
+
},
|
|
254
|
+
"adjustment_type": {
|
|
255
|
+
"enum": [
|
|
256
|
+
"fixed",
|
|
257
|
+
"stepped",
|
|
258
|
+
"stepless"
|
|
259
|
+
],
|
|
260
|
+
"description": "How grind size is changed. fixed: cannot be changed; stepped: clicks between set positions; stepless: any position in between."
|
|
261
|
+
},
|
|
262
|
+
"grind_setting_format": {
|
|
263
|
+
"enum": [
|
|
264
|
+
"whole_number",
|
|
265
|
+
"decimal",
|
|
266
|
+
"string"
|
|
267
|
+
],
|
|
268
|
+
"description": "How the dial reads, so journals can store settings."
|
|
269
|
+
},
|
|
270
|
+
"grind_setting_min": {
|
|
271
|
+
"type": "number",
|
|
272
|
+
"description": "Lowest number on the grind dial, as printed by the maker."
|
|
273
|
+
},
|
|
274
|
+
"grind_setting_max": {
|
|
275
|
+
"type": "number",
|
|
276
|
+
"description": "Highest number on the grind dial, as printed by the maker."
|
|
277
|
+
},
|
|
278
|
+
"brew_range": {
|
|
279
|
+
"type": "array",
|
|
280
|
+
"uniqueItems": true,
|
|
281
|
+
"minItems": 1,
|
|
282
|
+
"items": {
|
|
283
|
+
"enum": [
|
|
284
|
+
"espresso",
|
|
285
|
+
"filter",
|
|
286
|
+
"turkish"
|
|
287
|
+
]
|
|
288
|
+
},
|
|
289
|
+
"description": "Brew styles the grinder can grind for, as stated by the maker: espresso, filter or turkish (extra fine)."
|
|
290
|
+
},
|
|
291
|
+
"bean_feed": {
|
|
292
|
+
"enum": [
|
|
293
|
+
"single_dose",
|
|
294
|
+
"hopper",
|
|
295
|
+
"both"
|
|
296
|
+
],
|
|
297
|
+
"description": "How beans go in. single_dose: weighed dose for each brew; hopper: a container holding beans for many brews; both: works either way."
|
|
298
|
+
},
|
|
299
|
+
"dose_control_modes": {
|
|
300
|
+
"type": "array",
|
|
301
|
+
"uniqueItems": true,
|
|
302
|
+
"items": {
|
|
303
|
+
"enum": [
|
|
304
|
+
"manual",
|
|
305
|
+
"time",
|
|
306
|
+
"weight"
|
|
307
|
+
]
|
|
308
|
+
},
|
|
309
|
+
"description": "How the amount of ground coffee is controlled. manual: the user stops grinding; time: grinds for a set time; weight: stops at a target weight with a built-in scale."
|
|
310
|
+
},
|
|
311
|
+
"drive": {
|
|
312
|
+
"enum": [
|
|
313
|
+
"manual",
|
|
314
|
+
"electric"
|
|
315
|
+
],
|
|
316
|
+
"description": "manual: turned by hand; electric: driven by a motor."
|
|
317
|
+
},
|
|
318
|
+
"motor_power_w": {
|
|
319
|
+
"type": "number",
|
|
320
|
+
"exclusiveMinimum": 0,
|
|
321
|
+
"description": "Rated motor power in watts."
|
|
322
|
+
},
|
|
323
|
+
"grind_setting_step": {
|
|
324
|
+
"type": "number",
|
|
325
|
+
"exclusiveMinimum": 0,
|
|
326
|
+
"description": "Smallest step between settings on a stepped dial."
|
|
327
|
+
},
|
|
328
|
+
"microns_per_step": {
|
|
329
|
+
"type": "number",
|
|
330
|
+
"exclusiveMinimum": 0,
|
|
331
|
+
"description": "Burr gap change per setting step, as stated by the maker or measured."
|
|
332
|
+
},
|
|
333
|
+
"retention_g": {
|
|
334
|
+
"type": "number",
|
|
335
|
+
"minimum": 0,
|
|
336
|
+
"description": "Ground coffee left inside the grinder after grinding, in grams, as measured or stated by the maker."
|
|
337
|
+
},
|
|
338
|
+
"rpm_min": {
|
|
339
|
+
"type": "number",
|
|
340
|
+
"exclusiveMinimum": 0,
|
|
341
|
+
"description": "Lowest motor speed in revolutions per minute."
|
|
342
|
+
},
|
|
343
|
+
"rpm_max": {
|
|
344
|
+
"type": "number",
|
|
345
|
+
"exclusiveMinimum": 0,
|
|
346
|
+
"description": "Highest motor speed in revolutions per minute. Equal to rpm_min for fixed-speed grinders."
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
"brewer": {
|
|
351
|
+
"title": "Brewer details",
|
|
352
|
+
"type": "object",
|
|
353
|
+
"additionalProperties": false,
|
|
354
|
+
"properties": {
|
|
355
|
+
"mechanism": {
|
|
356
|
+
"enum": [
|
|
357
|
+
"percolation",
|
|
358
|
+
"immersion",
|
|
359
|
+
"hybrid",
|
|
360
|
+
"press",
|
|
361
|
+
"vacuum",
|
|
362
|
+
"boiling",
|
|
363
|
+
"other"
|
|
364
|
+
],
|
|
365
|
+
"description": "How water and coffee meet; matches brew method categories."
|
|
366
|
+
},
|
|
367
|
+
"capacity_ml": {
|
|
368
|
+
"type": "number",
|
|
369
|
+
"exclusiveMinimum": 0,
|
|
370
|
+
"description": "Largest amount of brewed coffee it holds or makes at once, in millilitres."
|
|
371
|
+
},
|
|
372
|
+
"cup_capacity": {
|
|
373
|
+
"type": "integer",
|
|
374
|
+
"minimum": 1,
|
|
375
|
+
"description": "Nominal number of cups the maker states."
|
|
376
|
+
},
|
|
377
|
+
"material": {
|
|
378
|
+
"type": "array",
|
|
379
|
+
"uniqueItems": true,
|
|
380
|
+
"items": {
|
|
381
|
+
"enum": [
|
|
382
|
+
"ceramic",
|
|
383
|
+
"glass",
|
|
384
|
+
"plastic",
|
|
385
|
+
"stainless_steel",
|
|
386
|
+
"copper",
|
|
387
|
+
"aluminium",
|
|
388
|
+
"porcelain",
|
|
389
|
+
"wood",
|
|
390
|
+
"silicone",
|
|
391
|
+
"other"
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
"description": "What the brewer is made of; list every material sold under this model, such as ceramic and plastic."
|
|
395
|
+
},
|
|
396
|
+
"filter_format": {
|
|
397
|
+
"type": "string",
|
|
398
|
+
"pattern": "^[a-z0-9_-]+$",
|
|
399
|
+
"description": "Filter shape or size, e.g. cone_02, flat_185, chemex_6cup, aeropress_round, metal_mesh."
|
|
400
|
+
},
|
|
401
|
+
"filter_shape": {
|
|
402
|
+
"enum": [
|
|
403
|
+
"cone",
|
|
404
|
+
"flat_bottom",
|
|
405
|
+
"basket",
|
|
406
|
+
"disc",
|
|
407
|
+
"none"
|
|
408
|
+
],
|
|
409
|
+
"description": "Shape of the filter it uses. cone: pointed cone; flat_bottom: flat base, for example wave filters; basket: basket-shaped paper filter used in drip machines; disc: round disc, as in AeroPress; none: no separate filter."
|
|
410
|
+
},
|
|
411
|
+
"flow_control": {
|
|
412
|
+
"enum": [
|
|
413
|
+
"fixed",
|
|
414
|
+
"manual_valve",
|
|
415
|
+
"programmable"
|
|
416
|
+
],
|
|
417
|
+
"description": "How fast water drains. fixed: set by the design; manual_valve: a valve or switch you open and close; programmable: controlled by the machine."
|
|
418
|
+
},
|
|
419
|
+
"drive": {
|
|
420
|
+
"enum": [
|
|
421
|
+
"manual",
|
|
422
|
+
"electric",
|
|
423
|
+
"stovetop"
|
|
424
|
+
],
|
|
425
|
+
"description": "manual: you pour or press by hand; electric: a machine heats and pours the water; stovetop: heated on a hob, such as a moka pot."
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
"kettle": {
|
|
430
|
+
"title": "Kettle details",
|
|
431
|
+
"type": "object",
|
|
432
|
+
"additionalProperties": false,
|
|
433
|
+
"properties": {
|
|
434
|
+
"capacity_ml": {
|
|
435
|
+
"type": "number",
|
|
436
|
+
"exclusiveMinimum": 0,
|
|
437
|
+
"description": "Largest amount of water it holds, in millilitres."
|
|
438
|
+
},
|
|
439
|
+
"spout_type": {
|
|
440
|
+
"enum": [
|
|
441
|
+
"gooseneck",
|
|
442
|
+
"standard",
|
|
443
|
+
"other"
|
|
444
|
+
],
|
|
445
|
+
"description": "gooseneck: thin curved spout for a slow, precise pour; standard: ordinary spout; other: anything else."
|
|
446
|
+
},
|
|
447
|
+
"temperature_control": {
|
|
448
|
+
"enum": [
|
|
449
|
+
"none",
|
|
450
|
+
"fixed",
|
|
451
|
+
"adjustable"
|
|
452
|
+
],
|
|
453
|
+
"description": "none: just boils; fixed: a few preset temperatures; adjustable: any temperature in a range can be set."
|
|
454
|
+
},
|
|
455
|
+
"temperature_min_celsius": {
|
|
456
|
+
"type": "number",
|
|
457
|
+
"exclusiveMinimum": 0,
|
|
458
|
+
"description": "Lowest temperature that can be set, in degrees Celsius."
|
|
459
|
+
},
|
|
460
|
+
"temperature_max_celsius": {
|
|
461
|
+
"type": "number",
|
|
462
|
+
"exclusiveMinimum": 0,
|
|
463
|
+
"description": "Highest temperature that can be set, in degrees Celsius."
|
|
464
|
+
},
|
|
465
|
+
"supports_temperature_hold": {
|
|
466
|
+
"type": "boolean",
|
|
467
|
+
"description": "Whether the kettle can keep water at the set temperature. true: can hold; false: confirmed cannot hold; absent: unknown."
|
|
468
|
+
},
|
|
469
|
+
"heat_source": {
|
|
470
|
+
"enum": [
|
|
471
|
+
"electric",
|
|
472
|
+
"stovetop",
|
|
473
|
+
"induction_compatible",
|
|
474
|
+
"other"
|
|
475
|
+
],
|
|
476
|
+
"description": "electric: has its own heating base; stovetop: heated on a hob; induction_compatible: stovetop kettle that also works on induction hobs; other: anything else."
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
"scale": {
|
|
481
|
+
"title": "Scale details",
|
|
482
|
+
"type": "object",
|
|
483
|
+
"additionalProperties": false,
|
|
484
|
+
"properties": {
|
|
485
|
+
"resolution_g": {
|
|
486
|
+
"type": "number",
|
|
487
|
+
"exclusiveMinimum": 0,
|
|
488
|
+
"description": "Smallest weight step the display shows, in grams, for example 0.1."
|
|
489
|
+
},
|
|
490
|
+
"capacity_g": {
|
|
491
|
+
"type": "number",
|
|
492
|
+
"exclusiveMinimum": 0,
|
|
493
|
+
"description": "Largest weight the scale can measure, in grams."
|
|
494
|
+
},
|
|
495
|
+
"has_timer": {
|
|
496
|
+
"type": "boolean",
|
|
497
|
+
"description": "Built-in timer. true: has one; false: confirmed none; absent: unknown."
|
|
498
|
+
},
|
|
499
|
+
"supports_auto_tare": {
|
|
500
|
+
"type": "boolean",
|
|
501
|
+
"description": "Sets itself to zero when a cup or brewer is put on. true: supported; false: confirmed not supported; absent: unknown."
|
|
502
|
+
},
|
|
503
|
+
"supports_auto_timer": {
|
|
504
|
+
"type": "boolean",
|
|
505
|
+
"description": "Starts the timer by itself when liquid starts to flow or water is poured. true: supported; false: confirmed not supported; absent: unknown."
|
|
506
|
+
},
|
|
507
|
+
"has_flow_rate_display": {
|
|
508
|
+
"type": "boolean",
|
|
509
|
+
"description": "Shows how fast weight changes, in grams per second. true: shown; false: confirmed not shown; absent: unknown."
|
|
510
|
+
},
|
|
511
|
+
"connectivity": {
|
|
512
|
+
"type": "array",
|
|
513
|
+
"uniqueItems": true,
|
|
514
|
+
"items": {
|
|
515
|
+
"enum": [
|
|
516
|
+
"bluetooth",
|
|
517
|
+
"wifi",
|
|
518
|
+
"usb"
|
|
519
|
+
]
|
|
520
|
+
},
|
|
521
|
+
"description": "Wireless or wired connections to apps or machines: bluetooth, wifi or usb."
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
},
|
|
525
|
+
"tamper": {
|
|
526
|
+
"title": "Tamper details",
|
|
527
|
+
"type": "object",
|
|
528
|
+
"additionalProperties": false,
|
|
529
|
+
"properties": {
|
|
530
|
+
"diameter_mm": {
|
|
531
|
+
"type": "number",
|
|
532
|
+
"exclusiveMinimum": 0,
|
|
533
|
+
"description": "Diameter of the tamper base in millimetres, for example 58."
|
|
534
|
+
},
|
|
535
|
+
"force_control": {
|
|
536
|
+
"enum": [
|
|
537
|
+
"none",
|
|
538
|
+
"fixed",
|
|
539
|
+
"adjustable"
|
|
540
|
+
],
|
|
541
|
+
"description": "none: the user decides how hard to press; fixed: a spring gives a set force; adjustable: the spring force can be set."
|
|
542
|
+
},
|
|
543
|
+
"base_shape": {
|
|
544
|
+
"enum": [
|
|
545
|
+
"flat",
|
|
546
|
+
"convex",
|
|
547
|
+
"rippled",
|
|
548
|
+
"other"
|
|
549
|
+
],
|
|
550
|
+
"description": "Shape of the pressing surface. flat; convex: slightly curved outward; rippled: grooved surface; other: anything else."
|
|
551
|
+
},
|
|
552
|
+
"self_leveling": {
|
|
553
|
+
"type": "boolean",
|
|
554
|
+
"description": "Whether the tamper sits on the basket rim so it always presses level. true: self-levelling; false: confirmed not self-levelling; absent: unknown."
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
},
|
|
558
|
+
"wdt": {
|
|
559
|
+
"title": "WDT tool details",
|
|
560
|
+
"type": "object",
|
|
561
|
+
"additionalProperties": false,
|
|
562
|
+
"properties": {
|
|
563
|
+
"needle_diameter_mm": {
|
|
564
|
+
"type": "number",
|
|
565
|
+
"exclusiveMinimum": 0,
|
|
566
|
+
"description": "Thickness of each needle in millimetres, for example 0.3."
|
|
567
|
+
},
|
|
568
|
+
"needle_count": {
|
|
569
|
+
"type": "integer",
|
|
570
|
+
"minimum": 1,
|
|
571
|
+
"description": "Number of needles."
|
|
572
|
+
},
|
|
573
|
+
"depth_control": {
|
|
574
|
+
"enum": [
|
|
575
|
+
"none",
|
|
576
|
+
"fixed",
|
|
577
|
+
"adjustable"
|
|
578
|
+
],
|
|
579
|
+
"description": "Whether you can limit how deep the needles reach. none: no limit; fixed: set depth; adjustable: depth can be set."
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
"basket": {
|
|
584
|
+
"title": "Portafilter basket details",
|
|
585
|
+
"type": "object",
|
|
586
|
+
"additionalProperties": false,
|
|
587
|
+
"properties": {
|
|
588
|
+
"kind": {
|
|
589
|
+
"enum": [
|
|
590
|
+
"single",
|
|
591
|
+
"double",
|
|
592
|
+
"triple",
|
|
593
|
+
"other"
|
|
594
|
+
],
|
|
595
|
+
"description": "single, double or triple: the shot size the basket is made for; other: anything else."
|
|
596
|
+
},
|
|
597
|
+
"diameter_mm": {
|
|
598
|
+
"type": "number",
|
|
599
|
+
"exclusiveMinimum": 0,
|
|
600
|
+
"description": "Diameter of the basket in millimetres, for example 58."
|
|
601
|
+
},
|
|
602
|
+
"nominal_dose_g": {
|
|
603
|
+
"type": "number",
|
|
604
|
+
"exclusiveMinimum": 0,
|
|
605
|
+
"description": "Dose of ground coffee the basket is designed for, in grams."
|
|
606
|
+
},
|
|
607
|
+
"dose_min_g": {
|
|
608
|
+
"type": "number",
|
|
609
|
+
"exclusiveMinimum": 0,
|
|
610
|
+
"description": "Smallest recommended dose in grams."
|
|
611
|
+
},
|
|
612
|
+
"dose_max_g": {
|
|
613
|
+
"type": "number",
|
|
614
|
+
"exclusiveMinimum": 0,
|
|
615
|
+
"description": "Largest recommended dose in grams."
|
|
616
|
+
},
|
|
617
|
+
"pressurized": {
|
|
618
|
+
"type": "boolean",
|
|
619
|
+
"description": "A pressurised basket has a single small exit hole that builds pressure even with a coarse grind. true: pressurised; false: standard unpressurised basket; absent: unknown."
|
|
620
|
+
},
|
|
621
|
+
"precision": {
|
|
622
|
+
"type": "boolean",
|
|
623
|
+
"description": "A precision basket has tightly controlled hole sizes, sold for consistent extraction. true: precision basket; false: ordinary basket; absent: unknown."
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
},
|
|
627
|
+
"item": {
|
|
628
|
+
"title": "Equipment model",
|
|
629
|
+
"type": "object",
|
|
630
|
+
"additionalProperties": false,
|
|
631
|
+
"required": [
|
|
632
|
+
"id",
|
|
633
|
+
"name",
|
|
634
|
+
"type",
|
|
635
|
+
"manufacturer",
|
|
636
|
+
"checked_at"
|
|
637
|
+
],
|
|
638
|
+
"properties": {
|
|
639
|
+
"id": {
|
|
640
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/id",
|
|
641
|
+
"description": "Stable readable slug of manufacturer and model, e.g. hario-v60-02. Never reused.",
|
|
642
|
+
"examples": [
|
|
643
|
+
"hario-v60-02"
|
|
644
|
+
]
|
|
645
|
+
},
|
|
646
|
+
"name": {
|
|
647
|
+
"type": "string",
|
|
648
|
+
"minLength": 1,
|
|
649
|
+
"description": "Full display name, e.g. Hario V60 02."
|
|
650
|
+
},
|
|
651
|
+
"manufacturer": {
|
|
652
|
+
"title": "Manufacturer",
|
|
653
|
+
"type": "object",
|
|
654
|
+
"additionalProperties": false,
|
|
655
|
+
"properties": {
|
|
656
|
+
"name": {
|
|
657
|
+
"type": "string",
|
|
658
|
+
"minLength": 1,
|
|
659
|
+
"description": "Brand or company name as printed on the product, for example Hario."
|
|
660
|
+
},
|
|
661
|
+
"manufacturer_id": {
|
|
662
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/id",
|
|
663
|
+
"description": "Reserved for a future manufacturers dataset."
|
|
664
|
+
},
|
|
665
|
+
"country_code": {
|
|
666
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/country_code"
|
|
667
|
+
},
|
|
668
|
+
"website": {
|
|
669
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/url"
|
|
670
|
+
}
|
|
671
|
+
},
|
|
672
|
+
"required": [
|
|
673
|
+
"name"
|
|
674
|
+
]
|
|
675
|
+
},
|
|
676
|
+
"model": {
|
|
677
|
+
"type": "string",
|
|
678
|
+
"minLength": 1,
|
|
679
|
+
"description": "Model name without the brand, for example V60."
|
|
680
|
+
},
|
|
681
|
+
"variants": {
|
|
682
|
+
"type": "array",
|
|
683
|
+
"description": "Sizes or materials sold under the same model, e.g. 01 and 02, ceramic and plastic.",
|
|
684
|
+
"items": {
|
|
685
|
+
"type": "string",
|
|
686
|
+
"minLength": 1
|
|
687
|
+
}
|
|
688
|
+
},
|
|
689
|
+
"type": {
|
|
690
|
+
"$ref": "#/$defs/type"
|
|
691
|
+
},
|
|
692
|
+
"brew_methods": {
|
|
693
|
+
"type": "array",
|
|
694
|
+
"uniqueItems": true,
|
|
695
|
+
"description": "Brew method ids from the Open Coffee brew methods dataset this equipment is made for.",
|
|
696
|
+
"items": {
|
|
697
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/id"
|
|
698
|
+
}
|
|
699
|
+
},
|
|
700
|
+
"released_year": {
|
|
701
|
+
"type": "integer",
|
|
702
|
+
"minimum": 1800,
|
|
703
|
+
"maximum": 2100,
|
|
704
|
+
"description": "Year the model first went on sale."
|
|
705
|
+
},
|
|
706
|
+
"discontinued": {
|
|
707
|
+
"type": "boolean",
|
|
708
|
+
"description": "Whether the maker has stopped selling the model. true: discontinued; false: still sold; absent: unknown."
|
|
709
|
+
},
|
|
710
|
+
"links": {
|
|
711
|
+
"title": "Links",
|
|
712
|
+
"type": "object",
|
|
713
|
+
"additionalProperties": false,
|
|
714
|
+
"properties": {
|
|
715
|
+
"product": {
|
|
716
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/url"
|
|
717
|
+
},
|
|
718
|
+
"manual": {
|
|
719
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/url"
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
},
|
|
723
|
+
"image": {
|
|
724
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/image"
|
|
725
|
+
},
|
|
726
|
+
"xref": {
|
|
727
|
+
"title": "Identifiers elsewhere",
|
|
728
|
+
"type": "object",
|
|
729
|
+
"additionalProperties": false,
|
|
730
|
+
"properties": {
|
|
731
|
+
"wikidata": {
|
|
732
|
+
"type": "string",
|
|
733
|
+
"pattern": "^Q[1-9][0-9]*$",
|
|
734
|
+
"description": "Wikidata item id of the model or product line, for example Q1234567."
|
|
735
|
+
},
|
|
736
|
+
"gtin": {
|
|
737
|
+
"type": "array",
|
|
738
|
+
"items": {
|
|
739
|
+
"type": "string",
|
|
740
|
+
"pattern": "^[0-9]{8,14}$"
|
|
741
|
+
},
|
|
742
|
+
"description": "Barcode numbers (GTIN, EAN or UPC; 8 to 14 digits) printed on the packaging, one per variant."
|
|
743
|
+
},
|
|
744
|
+
"google_product_category": {
|
|
745
|
+
"type": "integer",
|
|
746
|
+
"minimum": 1,
|
|
747
|
+
"description": "Google Product Taxonomy id (Wikidata P11302)."
|
|
748
|
+
},
|
|
749
|
+
"gs1_gpc_brick": {
|
|
750
|
+
"type": "string",
|
|
751
|
+
"pattern": "^[0-9]{8}$",
|
|
752
|
+
"description": "GS1 Global Product Classification brick code (Wikidata P8957)."
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
},
|
|
756
|
+
"espresso_machine": {
|
|
757
|
+
"$ref": "#/$defs/espresso_machine"
|
|
758
|
+
},
|
|
759
|
+
"grinder": {
|
|
760
|
+
"$ref": "#/$defs/grinder"
|
|
761
|
+
},
|
|
762
|
+
"brewer": {
|
|
763
|
+
"$ref": "#/$defs/brewer"
|
|
764
|
+
},
|
|
765
|
+
"kettle": {
|
|
766
|
+
"$ref": "#/$defs/kettle"
|
|
767
|
+
},
|
|
768
|
+
"scale": {
|
|
769
|
+
"$ref": "#/$defs/scale"
|
|
770
|
+
},
|
|
771
|
+
"tamper": {
|
|
772
|
+
"$ref": "#/$defs/tamper"
|
|
773
|
+
},
|
|
774
|
+
"wdt": {
|
|
775
|
+
"$ref": "#/$defs/wdt"
|
|
776
|
+
},
|
|
777
|
+
"basket": {
|
|
778
|
+
"$ref": "#/$defs/basket"
|
|
779
|
+
},
|
|
780
|
+
"checked_at": {
|
|
781
|
+
"$ref": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json#/$defs/datetime"
|
|
782
|
+
},
|
|
783
|
+
"mpn": {
|
|
784
|
+
"type": "string",
|
|
785
|
+
"minLength": 1,
|
|
786
|
+
"description": "Manufacturer part number."
|
|
787
|
+
},
|
|
788
|
+
"weight_g": {
|
|
789
|
+
"type": "number",
|
|
790
|
+
"exclusiveMinimum": 0,
|
|
791
|
+
"description": "Weight of the product without packaging, in grams."
|
|
792
|
+
},
|
|
793
|
+
"dimensions_mm": {
|
|
794
|
+
"type": "object",
|
|
795
|
+
"additionalProperties": false,
|
|
796
|
+
"properties": {
|
|
797
|
+
"width": {
|
|
798
|
+
"type": "number",
|
|
799
|
+
"exclusiveMinimum": 0,
|
|
800
|
+
"description": "Width in millimetres, seen from the front."
|
|
801
|
+
},
|
|
802
|
+
"depth": {
|
|
803
|
+
"type": "number",
|
|
804
|
+
"exclusiveMinimum": 0,
|
|
805
|
+
"description": "Depth in millimetres, from front to back."
|
|
806
|
+
},
|
|
807
|
+
"height": {
|
|
808
|
+
"type": "number",
|
|
809
|
+
"exclusiveMinimum": 0,
|
|
810
|
+
"description": "Height in millimetres."
|
|
811
|
+
}
|
|
812
|
+
},
|
|
813
|
+
"description": "Outside size of the product in millimetres."
|
|
814
|
+
}
|
|
815
|
+
},
|
|
816
|
+
"dependentSchemas": {
|
|
817
|
+
"espresso_machine": {
|
|
818
|
+
"properties": {
|
|
819
|
+
"type": {
|
|
820
|
+
"enum": [
|
|
821
|
+
"espresso_machine",
|
|
822
|
+
"espresso_machine_with_grinder"
|
|
823
|
+
]
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
},
|
|
827
|
+
"grinder": {
|
|
828
|
+
"properties": {
|
|
829
|
+
"type": {
|
|
830
|
+
"enum": [
|
|
831
|
+
"espresso_machine_with_grinder",
|
|
832
|
+
"grinder"
|
|
833
|
+
]
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
},
|
|
837
|
+
"brewer": {
|
|
838
|
+
"properties": {
|
|
839
|
+
"type": {
|
|
840
|
+
"enum": [
|
|
841
|
+
"brewer"
|
|
842
|
+
]
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
},
|
|
846
|
+
"kettle": {
|
|
847
|
+
"properties": {
|
|
848
|
+
"type": {
|
|
849
|
+
"enum": [
|
|
850
|
+
"kettle"
|
|
851
|
+
]
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
},
|
|
855
|
+
"scale": {
|
|
856
|
+
"properties": {
|
|
857
|
+
"type": {
|
|
858
|
+
"enum": [
|
|
859
|
+
"scale"
|
|
860
|
+
]
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
},
|
|
864
|
+
"tamper": {
|
|
865
|
+
"properties": {
|
|
866
|
+
"type": {
|
|
867
|
+
"enum": [
|
|
868
|
+
"tamper"
|
|
869
|
+
]
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
},
|
|
873
|
+
"wdt": {
|
|
874
|
+
"properties": {
|
|
875
|
+
"type": {
|
|
876
|
+
"enum": [
|
|
877
|
+
"wdt"
|
|
878
|
+
]
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
},
|
|
882
|
+
"basket": {
|
|
883
|
+
"properties": {
|
|
884
|
+
"type": {
|
|
885
|
+
"enum": [
|
|
886
|
+
"basket"
|
|
887
|
+
]
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
},
|
|
892
|
+
"description": "Each details object (espresso_machine, grinder, brewer, …) is only allowed for the types it describes."
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
}
|