234 bool comma = false; |
234 bool comma = false; |
235 profiles_list *profile; |
235 profiles_list *profile; |
236 prof_step *pstep; |
236 prof_step *pstep; |
237 |
237 |
238 payload = xstrcat(payload, (char *)"{"); |
238 payload = xstrcat(payload, (char *)"{"); |
|
239 |
|
240 /* |
|
241 * Fixed unit values, never change these! |
|
242 */ |
239 if (birth) { |
243 if (birth) { |
240 payload = xstrcat(payload, (char *)"\"uuid\":\""); |
244 payload = xstrcat(payload, (char *)"\"uuid\":\""); |
241 payload = xstrcat(payload, unit->uuid); |
245 payload = xstrcat(payload, unit->uuid); |
242 payload = xstrcat(payload, (char *)"\",\"alias\":\""); |
246 payload = xstrcat(payload, (char *)"\",\"alias\":\""); |
243 payload = xstrcat(payload, unit->alias); |
247 payload = xstrcat(payload, unit->alias); |
244 payload = xstrcat(payload, (char *)"\","); |
248 payload = xstrcat(payload, (char *)"\","); |
245 } |
249 } |
246 |
250 |
247 payload = xstrcat(payload, (char *)"\"name\":\""); |
251 /* |
248 payload = xstrcat(payload, unit->name); |
252 * Product (beer) loaded information. |
|
253 * TODO: extend with uuid and product code. |
|
254 */ |
|
255 if (unit->name || strlen(unit->name)) { |
|
256 payload = xstrcat(payload, (char *)"\"product\":{\"code\":null,\"name\":\""); |
|
257 payload = xstrcat(payload, unit->name); |
|
258 payload = xstrcat(payload, (char *)"\"}"); |
|
259 } else { |
|
260 payload = xstrcat(payload, (char *)"\"product\":null"); |
|
261 } |
|
262 |
|
263 /* |
|
264 * Air temperature sensor |
|
265 */ |
249 if (unit->air_address) { |
266 if (unit->air_address) { |
250 payload = xstrcat(payload, (char *)"\",\"air\":{\"address\":\""); |
267 payload = xstrcat(payload, (char *)",\"air\":{\"address\":\""); |
251 payload = xstrcat(payload, unit->air_address); |
268 payload = xstrcat(payload, unit->air_address); |
252 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
269 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
253 payload = xstrcat(payload, (char *)TEMPSTATE[unit->air_state]); |
270 payload = xstrcat(payload, (char *)TEMPSTATE[unit->air_state]); |
254 payload = xstrcat(payload, (char *)"\",\"temperature\":"); |
271 payload = xstrcat(payload, (char *)"\",\"temperature\":"); |
255 sprintf(buf, "%.3f", unit->air_temperature / 1000.0); |
272 sprintf(buf, "%.3f", unit->air_temperature / 1000.0); |
256 payload = xstrcat(payload, buf); |
273 payload = xstrcat(payload, buf); |
257 payload = xstrcat(payload, (char *)"}"); |
274 payload = xstrcat(payload, (char *)"}"); |
258 } else { |
275 } else { |
259 payload = xstrcat(payload, (char *)"\",\"air\":null"); |
276 payload = xstrcat(payload, (char *)",\"air\":null"); |
260 } |
277 } |
261 |
278 |
|
279 /* |
|
280 * Beer temperature sensor |
|
281 */ |
262 if (unit->beer_address) { |
282 if (unit->beer_address) { |
263 payload = xstrcat(payload, (char *)",\"beer\":{\"address\":\""); |
283 payload = xstrcat(payload, (char *)",\"beer\":{\"address\":\""); |
264 payload = xstrcat(payload, unit->beer_address); |
284 payload = xstrcat(payload, unit->beer_address); |
265 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
285 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
266 payload = xstrcat(payload, (char *)TEMPSTATE[unit->beer_state]); |
286 payload = xstrcat(payload, (char *)TEMPSTATE[unit->beer_state]); |
283 payload = xstrcat(payload, (char *)"}"); |
306 payload = xstrcat(payload, (char *)"}"); |
284 } else { |
307 } else { |
285 payload = xstrcat(payload, (char *)",\"chiller\":null"); |
308 payload = xstrcat(payload, (char *)",\"chiller\":null"); |
286 } |
309 } |
287 |
310 |
|
311 /* |
|
312 * Heater control, power 0..100% and usage count. |
|
313 */ |
288 if (unit->heater_address) { |
314 if (unit->heater_address) { |
289 payload = xstrcat(payload, (char *)",\"heater\":{\"address\":\""); |
315 payload = xstrcat(payload, (char *)",\"heater\":{\"address\":\""); |
290 payload = xstrcat(payload, unit->heater_address); |
316 payload = xstrcat(payload, unit->heater_address); |
291 payload = xstrcat(payload, (char *)"\",\"state\":"); |
317 payload = xstrcat(payload, (char *)"\",\"state\":"); |
292 sprintf(buf, "%d", unit->heater_state); |
318 sprintf(buf, "%d", unit->heater_state); |
293 payload = xstrcat(payload, buf); |
319 payload = xstrcat(payload, buf); |
|
320 payload = xstrcat(payload, (char *)",\"usage\":"); |
|
321 sprintf(buf, "%d", unit->heater_usage); |
|
322 payload = xstrcat(payload, buf); |
294 payload = xstrcat(payload, (char *)"}"); |
323 payload = xstrcat(payload, (char *)"}"); |
295 } else { |
324 } else { |
296 payload = xstrcat(payload, (char *)",\"heater\":null"); |
325 payload = xstrcat(payload, (char *)",\"heater\":null"); |
297 } |
326 } |
298 |
327 |
|
328 /* |
|
329 * Cooler control, power 0..100% and usage counter. |
|
330 */ |
299 if (unit->cooler_address) { |
331 if (unit->cooler_address) { |
300 payload = xstrcat(payload, (char *)",\"cooler\":{\"address\":\""); |
332 payload = xstrcat(payload, (char *)",\"cooler\":{\"address\":\""); |
301 payload = xstrcat(payload, unit->cooler_address); |
333 payload = xstrcat(payload, unit->cooler_address); |
302 payload = xstrcat(payload, (char *)"\",\"state\":"); |
334 payload = xstrcat(payload, (char *)"\",\"state\":"); |
303 sprintf(buf, "%d", unit->cooler_state); |
335 sprintf(buf, "%d", unit->cooler_state); |
304 payload = xstrcat(payload, buf); |
336 payload = xstrcat(payload, buf); |
|
337 payload = xstrcat(payload, (char *)",\"usage\":"); |
|
338 sprintf(buf, "%d", unit->cooler_usage); |
|
339 payload = xstrcat(payload, buf); |
305 payload = xstrcat(payload, (char *)"}"); |
340 payload = xstrcat(payload, (char *)"}"); |
306 } else { |
341 } else { |
307 payload = xstrcat(payload, (char *)",\"cooler\":null"); |
342 payload = xstrcat(payload, (char *)",\"cooler\":null"); |
308 } |
343 } |
309 |
344 |
|
345 /* |
|
346 * Fan control, 0..100% and usage counter. |
|
347 */ |
310 if (unit->fan_address) { |
348 if (unit->fan_address) { |
311 payload = xstrcat(payload, (char *)",\"fan\":{\"address\":\""); |
349 payload = xstrcat(payload, (char *)",\"fan\":{\"address\":\""); |
312 payload = xstrcat(payload, unit->fan_address); |
350 payload = xstrcat(payload, unit->fan_address); |
313 payload = xstrcat(payload, (char *)"\",\"state\":"); |
351 payload = xstrcat(payload, (char *)"\",\"state\":"); |
314 sprintf(buf, "%d", unit->fan_state); |
352 sprintf(buf, "%d", unit->fan_state); |
315 payload = xstrcat(payload, buf); |
353 payload = xstrcat(payload, buf); |
|
354 payload = xstrcat(payload, (char *)",\"usage\":"); |
|
355 sprintf(buf, "%d", unit->fan_usage); |
|
356 payload = xstrcat(payload, buf); |
316 payload = xstrcat(payload, (char *)"}"); |
357 payload = xstrcat(payload, (char *)"}"); |
317 } else { |
358 } else { |
318 payload = xstrcat(payload, (char *)",\"fan\":null"); |
359 payload = xstrcat(payload, (char *)",\"fan\":null"); |
319 } |
360 } |
320 |
361 |
|
362 /* |
|
363 * Interior lights control, 0..100% and usage counter. |
|
364 */ |
|
365 if (unit->light_address) { |
|
366 payload = xstrcat(payload, (char *)",\"light\":{\"address\":\""); |
|
367 payload = xstrcat(payload, unit->light_address); |
|
368 payload = xstrcat(payload, (char *)"\",\"state\":"); |
|
369 sprintf(buf, "%d", unit->light_state); |
|
370 payload = xstrcat(payload, buf); |
|
371 payload = xstrcat(payload, (char *)",\"usage\":"); |
|
372 sprintf(buf, "%d", unit->light_usage); |
|
373 payload = xstrcat(payload, buf); |
|
374 payload = xstrcat(payload, (char *)"}"); |
|
375 } else { |
|
376 payload = xstrcat(payload, (char *)",\"light\":null"); |
|
377 } |
|
378 |
|
379 /* |
|
380 * Door sensor. |
|
381 */ |
321 if (unit->door_address) { |
382 if (unit->door_address) { |
322 payload = xstrcat(payload, (char *)",\"door\":{\"address\":\""); |
383 payload = xstrcat(payload, (char *)",\"door\":{\"address\":\""); |
323 payload = xstrcat(payload, unit->door_address); |
384 payload = xstrcat(payload, unit->door_address); |
324 payload = xstrcat(payload, (char *)"\",\"state\":"); |
385 payload = xstrcat(payload, (char *)"\",\"state\":"); |
325 sprintf(buf, "%d", unit->door_state); |
386 sprintf(buf, "%d", unit->door_state); |
327 payload = xstrcat(payload, (char *)"}"); |
388 payload = xstrcat(payload, (char *)"}"); |
328 } else { |
389 } else { |
329 payload = xstrcat(payload, (char *)",\"door\":null"); |
390 payload = xstrcat(payload, (char *)",\"door\":null"); |
330 } |
391 } |
331 |
392 |
332 if (unit->light_address) { |
393 /* |
333 payload = xstrcat(payload, (char *)",\"light\":{\"address\":\""); |
394 * PSU status |
334 payload = xstrcat(payload, unit->light_address); |
395 */ |
335 payload = xstrcat(payload, (char *)"\",\"state\":"); |
|
336 sprintf(buf, "%d", unit->light_state); |
|
337 payload = xstrcat(payload, buf); |
|
338 payload = xstrcat(payload, (char *)"}"); |
|
339 } else { |
|
340 payload = xstrcat(payload, (char *)",\"light\":null"); |
|
341 } |
|
342 |
|
343 if (unit->psu_address) { |
396 if (unit->psu_address) { |
344 payload = xstrcat(payload, (char *)",\"psu\":{\"address\":\""); |
397 payload = xstrcat(payload, (char *)",\"psu\":{\"address\":\""); |
345 payload = xstrcat(payload, unit->psu_address); |
398 payload = xstrcat(payload, unit->psu_address); |
346 payload = xstrcat(payload, (char *)"\",\"state\":"); |
399 payload = xstrcat(payload, (char *)"\",\"state\":"); |
347 sprintf(buf, "%d", unit->psu_state); |
400 sprintf(buf, "%d", unit->psu_state); |
349 payload = xstrcat(payload, (char *)"}"); |
402 payload = xstrcat(payload, (char *)"}"); |
350 } else { |
403 } else { |
351 payload = xstrcat(payload, (char *)",\"psu\":null"); |
404 payload = xstrcat(payload, (char *)",\"psu\":null"); |
352 } |
405 } |
353 |
406 |
|
407 /* |
|
408 * Working mode and setpoints |
|
409 */ |
354 payload = xstrcat(payload, (char *)",\"mode\":\""); |
410 payload = xstrcat(payload, (char *)",\"mode\":\""); |
355 payload = xstrcat(payload, (char *)UNITMODE[unit->mode]); |
411 payload = xstrcat(payload, (char *)UNITMODE[unit->mode]); |
356 payload = xstrcat(payload, (char *)"\",\"setpoint\":{\"low\":"); |
412 payload = xstrcat(payload, (char *)"\",\"setpoint\":{\"low\":"); |
357 sprintf(buf, "%.1f", unit->PID_heat->SetP); |
413 sprintf(buf, "%.1f", unit->PID_heat->SetP); |
358 payload = xstrcat(payload, buf); |
414 payload = xstrcat(payload, buf); |
359 payload = xstrcat(payload, (char *)",\"high\":"); |
415 payload = xstrcat(payload, (char *)",\"high\":"); |
360 sprintf(buf, "%.1f", unit->PID_cool->SetP); |
416 sprintf(buf, "%.1f", unit->PID_cool->SetP); |
361 payload = xstrcat(payload, buf); |
417 payload = xstrcat(payload, buf); |
362 payload = xstrcat(payload, (char *)"}"); |
418 payload = xstrcat(payload, (char *)"},\"alarm\":"); |
363 |
419 sprintf(buf, "%d", unit->alarm_flag); |
|
420 payload = xstrcat(payload, buf); |
|
421 |
|
422 /* |
|
423 * Loaded profile and state |
|
424 */ |
364 if (unit->mode == UNITMODE_PROFILE && unit->profile) { |
425 if (unit->mode == UNITMODE_PROFILE && unit->profile) { |
365 for (profile = Config.profiles; profile; profile = profile->next) { |
426 for (profile = Config.profiles; profile; profile = profile->next) { |
366 if (strcmp(unit->profile, profile->uuid) == 0) { |
427 if (strcmp(unit->profile, profile->uuid) == 0) { |
367 payload = xstrcat(payload, (char *)",\"profile\":{\"uuid\":\""); |
428 payload = xstrcat(payload, (char *)",\"profile\":{\"uuid\":\""); |
368 payload = xstrcat(payload, unit->profile); |
429 payload = xstrcat(payload, unit->profile); |