thermferm/mqtt.c

changeset 546
d2e8626e7118
parent 545
c382a6c58c20
child 547
0e4d4b45249f
equal deleted inserted replaced
545:c382a6c58c20 546:d2e8626e7118
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]);
270 payload = xstrcat(payload, (char *)"}"); 290 payload = xstrcat(payload, (char *)"}");
271 } else { 291 } else {
272 payload = xstrcat(payload, (char *)",\"beer\":null"); 292 payload = xstrcat(payload, (char *)",\"beer\":null");
273 } 293 }
274 294
295 /*
296 * External chiller temperature sensor
297 */
275 if (unit->chiller_address) { 298 if (unit->chiller_address) {
276 payload = xstrcat(payload, (char *)",\"chiller\":{\"address\":\""); 299 payload = xstrcat(payload, (char *)",\"chiller\":{\"address\":\"");
277 payload = xstrcat(payload, unit->chiller_address); 300 payload = xstrcat(payload, unit->chiller_address);
278 payload = xstrcat(payload, (char *)"\",\"state\":\""); 301 payload = xstrcat(payload, (char *)"\",\"state\":\"");
279 payload = xstrcat(payload, (char *)TEMPSTATE[unit->chiller_state]); 302 payload = xstrcat(payload, (char *)TEMPSTATE[unit->chiller_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);

mercurial