Thu, 10 Jan 2019 20:22:06 +0100
Added configuration settings for MQTT in config.php. Finished screen box sizes for the fermenters monitor. Select beername and code from the current brew products and send it to the fermenter. Added switch commands to the fermenter. Delay data get from the fermenter after sending any command so there is time to process the commands. Turn switches off when the mode changes. Removed 0.2 degrees setpoint diffs for low and high, the fermenter must deal with it. Prevent turning the heater and cooler together on.
177 | 1 | <?php |
2 | require_once('config.php'); | |
3 | require_once('includes/formulas.php'); | |
4 | //require_once($_SERVER['DOCUMENT_ROOT'].'/config.php'); | |
5 | //require_once($_SERVER['DOCUMENT_ROOT'].'/includes/formulas.php'); | |
6 | ||
7 | ||
8 | $link = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME); | |
9 | if (! $link) { | |
10 | die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); | |
11 | } | |
12 | if (! mysqli_set_charset($link, "utf8" )) { | |
13 | echo "error"; | |
14 | return 1; | |
15 | } | |
16 | ||
17 | //setlocale ( LC_ALL, 'nl_NL.UTF-8'); | |
18 | if (isset($_GET["record"])) | |
19 | $record = $_GET["record"]; | |
20 | else | |
21 | $record = 14; | |
22 | $result = mysqli_query($link, "SELECT * FROM products WHERE record='".$record."'"); | |
23 | $row = mysqli_fetch_array($result); | |
24 | ||
25 | ||
26 | ||
27 | /* | |
28 | * Create beerxml output | |
29 | */ | |
30 | $xw = xmlwriter_open_memory(); | |
31 | xmlwriter_set_indent($xw, 1); | |
32 | $res = xmlwriter_set_indent_string($xw, ' '); | |
33 | ||
34 | xmlwriter_start_document($xw, '1.0', 'UTF-8'); | |
35 | ||
36 | xmlwriter_start_element($xw, 'RECIPES'); | |
37 | xmlwriter_start_element($xw, 'RECIPE'); | |
38 | ||
39 | // Recipe basics | |
40 | xmlwriter_start_element($xw, 'VERSION'); | |
41 | xmlwriter_text($xw, '1'); | |
42 | xmlwriter_end_element($xw); | |
43 | ||
44 | xmlwriter_start_element($xw, 'NAME'); | |
45 | xmlwriter_text($xw, $row['name']); | |
46 | xmlwriter_end_element($xw); | |
47 | ||
48 | xmlwriter_start_element($xw, 'NOTES'); | |
49 | xmlwriter_text($xw, $row['notes']); | |
50 | xmlwriter_end_element($xw); | |
51 | ||
52 | xmlwriter_start_element($xw, 'TYPE'); | |
53 | xmlwriter_text($xw, $row['type']); | |
54 | xmlwriter_end_element($xw); | |
55 | ||
56 | xmlwriter_start_element($xw, 'BREWER'); | |
57 | xmlwriter_text($xw, 'Anonymous'); | |
58 | xmlwriter_end_element($xw); | |
59 | ||
60 | xmlwriter_start_element($xw, 'BATCH_SIZE'); | |
61 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['batch_size']))); | |
62 | xmlwriter_end_element($xw); | |
63 | ||
64 | xmlwriter_start_element($xw, 'BOIL_SIZE'); | |
65 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['boil_size']))); | |
66 | xmlwriter_end_element($xw); | |
67 | ||
68 | xmlwriter_start_element($xw, 'BOIL_TIME'); | |
69 | xmlwriter_text($xw, sprintf("%.0f",floatval($row['boil_time']))); | |
70 | xmlwriter_end_element($xw); | |
71 | ||
72 | xmlwriter_start_element($xw, 'EFFICIENCY'); | |
73 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['efficiency']))); | |
74 | xmlwriter_end_element($xw); | |
75 | ||
76 | xmlwriter_start_element($xw, 'OG'); | |
77 | xmlwriter_text($xw, sprintf("%.3f",floatval($row['og']))); | |
78 | xmlwriter_end_element($xw); | |
79 | ||
80 | xmlwriter_start_element($xw, 'FG'); | |
81 | xmlwriter_text($xw, sprintf("%.3f",floatval($row['fg']))); | |
82 | xmlwriter_end_element($xw); | |
83 | ||
84 | // Style | |
85 | xmlwriter_start_element($xw, 'STYLE'); | |
86 | ||
87 | xmlwriter_start_element($xw, 'VERSION'); | |
88 | xmlwriter_text($xw, '1'); | |
89 | xmlwriter_end_element($xw); | |
90 | ||
91 | xmlwriter_start_element($xw, 'NAME'); | |
92 | xmlwriter_text($xw, $row['st_name']); | |
93 | xmlwriter_end_element($xw); | |
94 | ||
95 | xmlwriter_start_element($xw, 'CATEGORY'); | |
96 | xmlwriter_text($xw, $row['st_category']); | |
97 | xmlwriter_end_element($xw); | |
98 | ||
99 | xmlwriter_start_element($xw, 'CATEGORY_NUMBER'); | |
100 | xmlwriter_text($xw, $row['st_category_number']); | |
101 | xmlwriter_end_element($xw); | |
102 | ||
103 | xmlwriter_start_element($xw, 'STYLE_LETTER'); | |
104 | xmlwriter_text($xw, $row['st_letter']); | |
105 | xmlwriter_end_element($xw); | |
106 | ||
107 | xmlwriter_start_element($xw, 'STYLE_GUIDE'); | |
108 | xmlwriter_text($xw, $row['st_guide']); | |
109 | xmlwriter_end_element($xw); | |
110 | ||
111 | xmlwriter_start_element($xw, 'TYPE'); | |
112 | xmlwriter_text($xw, $row['st_type']); | |
113 | xmlwriter_end_element($xw); | |
114 | ||
115 | xmlwriter_start_element($xw, 'OG_MIN'); | |
116 | xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_min']))); | |
117 | xmlwriter_end_element($xw); | |
118 | ||
119 | xmlwriter_start_element($xw, 'OG_MAX'); | |
120 | xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_max']))); | |
121 | xmlwriter_end_element($xw); | |
122 | ||
123 | xmlwriter_start_element($xw, 'FG_MIN'); | |
124 | xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_og_min']))); | |
125 | xmlwriter_end_element($xw); | |
126 | ||
127 | xmlwriter_start_element($xw, 'OG_MAX'); | |
128 | xmlwriter_text($xw, sprintf("%.3f",floatval($row['st_fg_max']))); | |
129 | xmlwriter_end_element($xw); | |
130 | ||
131 | xmlwriter_start_element($xw, 'IBU_MIN'); | |
132 | xmlwriter_text($xw, sprintf("%.0f",floatval($row['st_ibu_min']))); | |
133 | xmlwriter_end_element($xw); | |
134 | ||
135 | xmlwriter_start_element($xw, 'IBU_MAX'); | |
136 | xmlwriter_text($xw, sprintf("%.0f",floatval($row['st_ibu_max']))); | |
137 | xmlwriter_end_element($xw); | |
138 | ||
139 | xmlwriter_start_element($xw, 'COLOR_MIN'); | |
140 | xmlwriter_text($xw, sprintf("%.2f",ebc_to_srm(floatval($row['st_color_min'])))); | |
141 | xmlwriter_end_element($xw); | |
142 | ||
143 | xmlwriter_start_element($xw, 'COLOR_MAX'); | |
144 | xmlwriter_text($xw, sprintf("%.2f",ebc_to_srm(floatval($row['st_color_max'])))); | |
145 | xmlwriter_end_element($xw); | |
146 | ||
147 | xmlwriter_start_element($xw, 'CARB_MIN'); | |
148 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_carb_min']))); | |
149 | xmlwriter_end_element($xw); | |
150 | ||
151 | xmlwriter_start_element($xw, 'CARB_MAX'); | |
152 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_carb_max']))); | |
153 | xmlwriter_end_element($xw); | |
154 | ||
155 | xmlwriter_start_element($xw, 'ABV_MIN'); | |
156 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_abv_min']))); | |
157 | xmlwriter_end_element($xw); | |
158 | ||
159 | xmlwriter_start_element($xw, 'ABV_MAX'); | |
160 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['st_abv_max']))); | |
161 | xmlwriter_end_element($xw); | |
162 | ||
163 | xmlwriter_end_element($xw); // STYLE | |
164 | ||
165 | xmlwriter_start_element($xw, 'EQUIPMENT'); | |
166 | ||
167 | xmlwriter_start_element($xw, 'VERSION'); | |
168 | xmlwriter_text($xw, '1'); | |
169 | xmlwriter_end_element($xw); | |
170 | ||
171 | xmlwriter_start_element($xw, 'NAME'); | |
172 | xmlwriter_text($xw, $row['eq_name']); | |
173 | xmlwriter_end_element($xw); | |
174 | ||
175 | xmlwriter_start_element($xw, 'NOTES'); | |
176 | xmlwriter_text($xw, $row['eq_notes']); | |
177 | xmlwriter_end_element($xw); | |
178 | ||
179 | xmlwriter_start_element($xw, 'BATCH_SIZE'); | |
180 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['eq_batch_size']))); | |
181 | xmlwriter_end_element($xw); | |
182 | ||
183 | xmlwriter_start_element($xw, 'BOIL_SIZE'); | |
184 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['eq_boil_size']))); | |
185 | xmlwriter_end_element($xw); | |
186 | ||
187 | xmlwriter_start_element($xw, 'BOIL_TIME'); | |
188 | xmlwriter_text($xw, sprintf("%.0f",floatval($row['eq_boil_time']))); | |
189 | xmlwriter_end_element($xw); | |
190 | ||
191 | xmlwriter_end_element($xw); // EQUIPMENT | |
192 | ||
193 | xmlwriter_start_element($xw, 'HOPS'); | |
194 | $arr = json_decode($row['json_hops'], true); | |
195 | foreach($arr as $item) { //foreach element in $arr | |
196 | ||
197 | xmlwriter_start_element($xw, 'HOP'); | |
198 | ||
199 | xmlwriter_start_element($xw, 'VERSION'); | |
200 | xmlwriter_text($xw, '1'); | |
201 | xmlwriter_end_element($xw); | |
202 | ||
203 | xmlwriter_start_element($xw, 'NAME'); | |
204 | xmlwriter_text($xw, $item['h_name']); | |
205 | xmlwriter_end_element($xw); | |
206 | ||
207 | xmlwriter_start_element($xw, 'ALPHA'); | |
208 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_alpha']))); | |
209 | xmlwriter_end_element($xw); | |
210 | ||
211 | xmlwriter_start_element($xw, 'AMOUNT'); | |
212 | xmlwriter_text($xw, sprintf("%.4f",floatval($item['h_amount']))); | |
213 | xmlwriter_end_element($xw); | |
214 | ||
215 | xmlwriter_start_element($xw, 'USE'); | |
216 | xmlwriter_text($xw, $item['h_useat']); | |
217 | xmlwriter_end_element($xw); | |
218 | ||
219 | xmlwriter_start_element($xw, 'TIME'); | |
220 | xmlwriter_text($xw, $item['h_time']); | |
221 | xmlwriter_end_element($xw); | |
222 | ||
223 | xmlwriter_start_element($xw, 'TYPE'); | |
224 | xmlwriter_text($xw, $item['h_type']); | |
225 | xmlwriter_end_element($xw); | |
226 | ||
227 | xmlwriter_start_element($xw, 'FORM'); | |
228 | xmlwriter_text($xw, $item['h_form']); | |
229 | xmlwriter_end_element($xw); | |
230 | ||
231 | xmlwriter_start_element($xw, 'BETA'); | |
232 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_beta']))); | |
233 | xmlwriter_end_element($xw); | |
234 | ||
235 | xmlwriter_start_element($xw, 'HSI'); | |
236 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['h_hsi']))); | |
237 | xmlwriter_end_element($xw); | |
238 | ||
239 | xmlwriter_start_element($xw, 'ORIGIN'); | |
240 | xmlwriter_text($xw, $item['h_origin']); | |
241 | xmlwriter_end_element($xw); | |
242 | ||
243 | xmlwriter_end_element($xw); // HOP | |
244 | } | |
245 | xmlwriter_end_element($xw); // HOPS | |
246 | ||
247 | xmlwriter_start_element($xw, 'FERMENTABLES'); | |
248 | $arr = json_decode($row['json_fermentables'], true); | |
249 | foreach($arr as $item) { //foreach element in $arr | |
250 | xmlwriter_start_element($xw, 'FERMENTABLE'); | |
251 | ||
252 | xmlwriter_start_element($xw, 'VERSION'); | |
253 | xmlwriter_text($xw, '1'); | |
254 | xmlwriter_end_element($xw); | |
255 | ||
256 | xmlwriter_start_element($xw, 'NAME'); | |
257 | xmlwriter_text($xw, $item['f_name']); | |
258 | xmlwriter_end_element($xw); | |
259 | ||
260 | xmlwriter_start_element($xw, 'TYPE'); | |
261 | xmlwriter_text($xw, $item['f_type']); | |
262 | xmlwriter_end_element($xw); | |
263 | ||
264 | xmlwriter_start_element($xw, 'AMOUNT'); | |
265 | xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_amount']))); | |
266 | xmlwriter_end_element($xw); | |
267 | ||
268 | xmlwriter_start_element($xw, 'YIELD'); | |
269 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['f_yield']))); | |
270 | xmlwriter_end_element($xw); | |
271 | ||
272 | xmlwriter_start_element($xw, 'COLOR'); | |
273 | xmlwriter_text($xw, sprintf("%.1f",ebc_to_srm(floatval($item['f_color'])))); | |
274 | xmlwriter_end_element($xw); | |
275 | ||
276 | xmlwriter_start_element($xw, 'ADD_AFTER_BOIL'); | |
277 | ($item['f_add_after_boil']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); | |
278 | xmlwriter_end_element($xw); | |
279 | ||
280 | xmlwriter_start_element($xw, 'ORIGIN'); | |
281 | xmlwriter_text($xw, $item['f_origin']); | |
282 | xmlwriter_end_element($xw); | |
283 | ||
284 | xmlwriter_start_element($xw, 'SUPPLIER'); | |
285 | xmlwriter_text($xw, $item['f_supplier']); | |
286 | xmlwriter_end_element($xw); | |
287 | ||
288 | if (floatval($item['f_coarse_fine_diff'])) { | |
289 | xmlwriter_start_element($xw, 'COARSE_FINE_DIFF'); | |
290 | xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_coarse_fine_diff']))); | |
291 | xmlwriter_end_element($xw); | |
292 | } | |
293 | ||
294 | if (floatval($item['f_moisture'])) { | |
295 | xmlwriter_start_element($xw, 'MOISTURE'); | |
296 | xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_moisture']))); | |
297 | xmlwriter_end_element($xw); | |
298 | } | |
299 | ||
300 | if (floatval($item['f_diastatic_power'])) { | |
301 | xmlwriter_start_element($xw, 'DIASTATIC_POWER'); | |
302 | xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_diastatic_power']))); | |
303 | xmlwriter_end_element($xw); | |
304 | } | |
305 | ||
306 | if (floatval($item['f_protein'])) { | |
307 | xmlwriter_start_element($xw, 'PROTEIN'); | |
308 | xmlwriter_text($xw, sprintf("%.4f",floatval($item['f_protein']))); | |
309 | xmlwriter_end_element($xw); | |
310 | } | |
311 | ||
312 | if (floatval($item['f_max_in_batch'])) { | |
313 | xmlwriter_start_element($xw, 'MAX_IN_BATCH'); | |
314 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['f_max_in_batch']))); | |
315 | xmlwriter_end_element($xw); | |
316 | } | |
317 | ||
318 | xmlwriter_start_element($xw, 'RECOMMEND_MASH'); | |
319 | ($item['f_recommend_mash']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); | |
320 | xmlwriter_end_element($xw); | |
321 | ||
322 | xmlwriter_start_element($xw, 'GRAINTYPE'); | |
323 | xmlwriter_text($xw, $item['f_graintype']); | |
324 | xmlwriter_end_element($xw); | |
325 | ||
326 | xmlwriter_end_element($xw); // FERMENTABLE | |
327 | } | |
328 | xmlwriter_end_element($xw); // FERMENTABLES | |
329 | ||
330 | xmlwriter_start_element($xw, 'MISCS'); | |
331 | $arr = json_decode($row['json_miscs'], true); | |
332 | foreach($arr as $item) { | |
333 | ||
334 | xmlwriter_start_element($xw, 'MISC'); | |
335 | ||
336 | xmlwriter_start_element($xw, 'VERSION'); | |
337 | xmlwriter_text($xw, '1'); | |
338 | xmlwriter_end_element($xw); | |
339 | ||
340 | xmlwriter_start_element($xw, 'NAME'); | |
341 | xmlwriter_text($xw, $item['m_name']); | |
342 | xmlwriter_end_element($xw); | |
343 | ||
344 | xmlwriter_start_element($xw, 'TYPE'); | |
345 | xmlwriter_text($xw, $item['m_type']); | |
346 | xmlwriter_end_element($xw); | |
347 | ||
348 | xmlwriter_start_element($xw, 'AMOUNT'); | |
349 | xmlwriter_text($xw, sprintf("%.5f",floatval($item['m_amount']))); | |
350 | xmlwriter_end_element($xw); | |
351 | ||
352 | xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT'); | |
353 | ($item['m_amount_is_weight']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); | |
354 | xmlwriter_end_element($xw); | |
355 | ||
356 | xmlwriter_start_element($xw, 'USE'); | |
357 | xmlwriter_text($xw, $item['m_use_use']); | |
358 | xmlwriter_end_element($xw); | |
359 | ||
360 | xmlwriter_start_element($xw, 'TIME'); | |
361 | xmlwriter_text($xw, sprintf("%.0f",floatval($item['m_time']))); | |
362 | xmlwriter_end_element($xw); | |
363 | ||
364 | xmlwriter_end_element($xw); // MISC | |
365 | } | |
366 | xmlwriter_end_element($xw); // MISCS | |
367 | ||
368 | xmlwriter_start_element($xw, 'YEASTS'); | |
369 | $arr = json_decode($row['json_yeasts'], true); | |
370 | foreach($arr as $item) { //foreach element in $arr | |
371 | ||
372 | xmlwriter_start_element($xw, 'YEAST'); | |
373 | ||
374 | xmlwriter_start_element($xw, 'VERSION'); | |
375 | xmlwriter_text($xw, '1'); | |
376 | xmlwriter_end_element($xw); | |
377 | ||
378 | xmlwriter_start_element($xw, 'NAME'); | |
379 | xmlwriter_text($xw, $item['y_name']); | |
380 | xmlwriter_end_element($xw); | |
381 | ||
382 | xmlwriter_start_element($xw, 'TYPE'); | |
383 | xmlwriter_text($xw, $item['y_type']); | |
384 | xmlwriter_end_element($xw); | |
385 | ||
386 | xmlwriter_start_element($xw, 'FORM'); | |
387 | xmlwriter_text($xw, $item['y_form']); | |
388 | xmlwriter_end_element($xw); | |
389 | ||
390 | xmlwriter_start_element($xw, 'AMOUNT'); | |
391 | xmlwriter_text($xw, sprintf("%.5f",floatval($item['y_amount']))); | |
392 | xmlwriter_end_element($xw); | |
393 | ||
394 | xmlwriter_start_element($xw, 'AMOUNT_IS_WEIGHT'); | |
395 | ($item['y_amount_is_weight']) ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); | |
396 | xmlwriter_end_element($xw); | |
397 | ||
398 | xmlwriter_start_element($xw, 'LABORATORY'); | |
399 | xmlwriter_text($xw, $item['y_laboratory']); | |
400 | xmlwriter_end_element($xw); | |
401 | ||
402 | xmlwriter_start_element($xw, 'PRODUCT_ID'); | |
403 | xmlwriter_text($xw, $item['y_product_id']); | |
404 | xmlwriter_end_element($xw); | |
405 | ||
406 | xmlwriter_start_element($xw, 'MIN_TEMPERATURE'); | |
407 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_min_temperature']))); | |
408 | xmlwriter_end_element($xw); | |
409 | ||
410 | xmlwriter_start_element($xw, 'MAX_TEMPERATURE'); | |
411 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_max_temperature']))); | |
412 | xmlwriter_end_element($xw); | |
413 | ||
414 | xmlwriter_start_element($xw, 'ATTENUATION'); | |
415 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['y_attenuation']))); | |
416 | xmlwriter_end_element($xw); | |
417 | ||
418 | xmlwriter_start_element($xw, 'ADD_TO_SECONDARY'); | |
419 | ($item['y_use'] == 'Secondary') ? xmlwriter_text($xw, 'TRUE') : xmlwriter_text($xw, 'FALSE'); | |
420 | xmlwriter_end_element($xw); | |
421 | ||
422 | xmlwriter_end_element($xw); // YEAST | |
423 | } | |
424 | xmlwriter_end_element($xw); // YEASTS | |
425 | ||
426 | xmlwriter_start_element($xw, 'WATERS'); | |
427 | xmlwriter_start_element($xw, 'WATER'); // Source 1 | |
428 | ||
429 | xmlwriter_start_element($xw, 'VERSION'); | |
430 | xmlwriter_text($xw, '1'); | |
431 | xmlwriter_end_element($xw); | |
432 | ||
433 | xmlwriter_start_element($xw, 'NAME'); | |
434 | xmlwriter_text($xw, $row['w1_name']); | |
435 | xmlwriter_end_element($xw); | |
436 | ||
437 | xmlwriter_start_element($xw, 'AMOUNT'); | |
438 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_amount']))); | |
439 | xmlwriter_end_element($xw); | |
440 | ||
441 | xmlwriter_start_element($xw, 'CALCIUM'); | |
442 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_calcium']))); | |
443 | xmlwriter_end_element($xw); | |
444 | ||
445 | xmlwriter_start_element($xw, 'BICARBONATE'); | |
446 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_total_alkalinity']) * 1.22)); | |
447 | xmlwriter_end_element($xw); | |
448 | ||
449 | xmlwriter_start_element($xw, 'SULFATE'); | |
450 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_sulfate']))); | |
451 | xmlwriter_end_element($xw); | |
452 | ||
453 | xmlwriter_start_element($xw, 'CHLORIDE'); | |
454 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_chloride']))); | |
455 | xmlwriter_end_element($xw); | |
456 | ||
457 | xmlwriter_start_element($xw, 'SODIUM'); | |
458 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_sodium']))); | |
459 | xmlwriter_end_element($xw); | |
460 | ||
461 | xmlwriter_start_element($xw, 'PH'); | |
462 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['w1_ph']))); | |
463 | xmlwriter_end_element($xw); | |
464 | ||
465 | xmlwriter_start_element($xw, 'TOTAL_ALKALINITY'); | |
466 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w1_total_alkalinity']))); | |
467 | xmlwriter_end_element($xw); | |
468 | ||
469 | xmlwriter_end_element($xw); // WATER | |
470 | ||
471 | if (strlen($row['w2_name'])) { | |
472 | xmlwriter_start_element($xw, 'WATER'); // Source 2 | |
473 | ||
474 | xmlwriter_start_element($xw, 'VERSION'); | |
475 | xmlwriter_text($xw, '1'); | |
476 | xmlwriter_end_element($xw); | |
477 | ||
478 | xmlwriter_start_element($xw, 'NAME'); | |
479 | xmlwriter_text($xw, $row['w2_name']); | |
480 | xmlwriter_end_element($xw); | |
481 | ||
482 | xmlwriter_start_element($xw, 'AMOUNT'); | |
483 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_amount']))); | |
484 | xmlwriter_end_element($xw); | |
485 | ||
486 | xmlwriter_start_element($xw, 'CALCIUM'); | |
487 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_calcium']))); | |
488 | xmlwriter_end_element($xw); | |
489 | ||
490 | xmlwriter_start_element($xw, 'BICARBONATE'); | |
491 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_total_alkalinity']) * 1.22)); | |
492 | xmlwriter_end_element($xw); | |
493 | ||
494 | xmlwriter_start_element($xw, 'SULFATE'); | |
495 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_sulfate']))); | |
496 | xmlwriter_end_element($xw); | |
497 | ||
498 | xmlwriter_start_element($xw, 'CHLORIDE'); | |
499 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_chloride']))); | |
500 | xmlwriter_end_element($xw); | |
501 | ||
502 | xmlwriter_start_element($xw, 'SODIUM'); | |
503 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_sodium']))); | |
504 | xmlwriter_end_element($xw); | |
505 | ||
506 | xmlwriter_start_element($xw, 'PH'); | |
507 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['w2_ph']))); | |
508 | xmlwriter_end_element($xw); | |
509 | ||
510 | xmlwriter_start_element($xw, 'TOTAL_ALKALINITY'); | |
511 | xmlwriter_text($xw, sprintf("%.2f",floatval($row['w2_total_alkalinity']))); | |
512 | xmlwriter_end_element($xw); | |
513 | ||
514 | xmlwriter_end_element($xw); // WATER | |
515 | } | |
516 | xmlwriter_end_element($xw); // WATERS | |
517 | ||
518 | xmlwriter_start_element($xw, 'MASH'); | |
519 | ||
520 | xmlwriter_start_element($xw, 'VERSION'); | |
521 | xmlwriter_text($xw, '1'); | |
522 | xmlwriter_end_element($xw); | |
523 | ||
524 | xmlwriter_start_element($xw, 'NAME'); | |
525 | xmlwriter_text($xw, $row['mash_name']); | |
526 | xmlwriter_end_element($xw); | |
527 | ||
528 | xmlwriter_start_element($xw, 'GRAIN_TEMP'); | |
529 | xmlwriter_text($xw, '10.0'); | |
530 | xmlwriter_end_element($xw); | |
531 | ||
532 | xmlwriter_start_element($xw, 'PH'); | |
533 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['sparge_ph']))); | |
534 | xmlwriter_end_element($xw); | |
535 | ||
536 | xmlwriter_start_element($xw, 'SPARGE_TEMP'); | |
537 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['sparge_temp']))); | |
538 | xmlwriter_end_element($xw); | |
539 | ||
540 | xmlwriter_start_element($xw, 'MASH_STEPS'); | |
541 | $arr = json_decode($row['json_mashs'], true); | |
542 | foreach($arr as $item) { //foreach element in $arr | |
543 | xmlwriter_start_element($xw, 'MASH_STEP'); | |
544 | ||
545 | xmlwriter_start_element($xw, 'VERSION'); | |
546 | xmlwriter_text($xw, '1'); | |
547 | xmlwriter_end_element($xw); | |
548 | ||
549 | xmlwriter_start_element($xw, 'NAME'); | |
550 | xmlwriter_text($xw, $item['step_name']); | |
551 | xmlwriter_end_element($xw); | |
552 | ||
553 | xmlwriter_start_element($xw, 'TYPE'); | |
554 | xmlwriter_text($xw, $item['step_type']); | |
555 | xmlwriter_end_element($xw); | |
556 | ||
557 | if ($item['step_type'] == 'Infusion') { | |
558 | xmlwriter_start_element($xw, 'INFUSE_AMOUNT'); | |
559 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_infuse_amount']))); | |
560 | xmlwriter_end_element($xw); | |
561 | } | |
562 | ||
563 | xmlwriter_start_element($xw, 'STEP_TEMP'); | |
564 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_temp']))); | |
565 | xmlwriter_end_element($xw); | |
566 | ||
567 | xmlwriter_start_element($xw, 'STEP_TIME'); | |
568 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['step_time']))); | |
569 | xmlwriter_end_element($xw); | |
570 | ||
571 | xmlwriter_start_element($xw, 'RAMP_TIME'); | |
572 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['ramp_time']))); | |
573 | xmlwriter_end_element($xw); | |
574 | ||
575 | xmlwriter_start_element($xw, 'END_TEMP'); | |
576 | xmlwriter_text($xw, sprintf("%.1f",floatval($item['end_temp']))); | |
577 | xmlwriter_end_element($xw); | |
578 | ||
579 | xmlwriter_start_element($xw, 'PH'); | |
580 | xmlwriter_text($xw, sprintf("%.1f",floatval($row['mash_ph']))); | |
581 | xmlwriter_end_element($xw); | |
582 | ||
583 | xmlwriter_end_element($xw); // MASH_STEP | |
584 | } | |
585 | xmlwriter_end_element($xw); // MASH_STEPS | |
586 | xmlwriter_end_element($xw); // MASH | |
587 | xmlwriter_end_element($xw); // RECIPE | |
588 | xmlwriter_end_element($xw); // RECIPES | |
589 | xmlwriter_end_document($xw); | |
590 | ||
591 | $beerxml = xmlwriter_output_memory($xw); | |
592 | ||
593 | Header('Content-type: text/xml'); | |
594 | header('Content-Disposition: attachment; filename="' . $row['name'] . '.xml"'); | |
595 | header('Content-Transfer-Encoding: binary'); | |
596 | header('Expires: 0'); | |
597 | header('Pragma: no-cache'); | |
598 | header('Content-Length: '.strlen($beerxml)); | |
599 | exit($beerxml); |