185 bool comma = false; |
185 bool comma = false; |
186 profiles_list *profile; |
186 profiles_list *profile; |
187 prof_step *pstep; |
187 prof_step *pstep; |
188 |
188 |
189 payload = xstrcat(payload, (char *)"{"); |
189 payload = xstrcat(payload, (char *)"{"); |
190 if (birth || unit->mqtt_flag & MQTT_FLAG_MODE) { |
190 if (birth) { |
191 // Also send these on mode change |
|
192 payload = xstrcat(payload, (char *)"\"uuid\":\""); |
191 payload = xstrcat(payload, (char *)"\"uuid\":\""); |
193 payload = xstrcat(payload, unit->uuid); |
192 payload = xstrcat(payload, unit->uuid); |
194 payload = xstrcat(payload, (char *)"\",\"alias\":\""); |
193 payload = xstrcat(payload, (char *)"\",\"alias\":\""); |
195 payload = xstrcat(payload, unit->alias); |
194 payload = xstrcat(payload, unit->alias); |
196 payload = xstrcat(payload, (char *)"\",\"name\":\""); |
195 payload = xstrcat(payload, (char *)"\","); |
197 payload = xstrcat(payload, unit->name); |
196 } |
198 payload = xstrcat(payload, (char *)"\""); |
197 |
199 comma = true; |
198 payload = xstrcat(payload, (char *)"\"name\":\""); |
200 } |
199 payload = xstrcat(payload, unit->name); |
201 if (birth || unit->mqtt_flag & MQTT_FLAG_AIR) { |
200 if (unit->air_address) { |
202 if (comma) |
201 payload = xstrcat(payload, (char *)"\",\"air\":{\"address\":\""); |
203 payload = xstrcat(payload, (char *)","); |
202 payload = xstrcat(payload, unit->air_address); |
204 if (unit->air_address) { |
203 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
205 payload = xstrcat(payload, (char *)"\"air\":{\"address\":\""); |
204 payload = xstrcat(payload, (char *)TEMPSTATE[unit->air_state]); |
206 payload = xstrcat(payload, unit->air_address); |
205 payload = xstrcat(payload, (char *)"\",\"temperature\":"); |
207 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
206 sprintf(buf, "%.3f", unit->air_temperature / 1000.0); |
208 payload = xstrcat(payload, (char *)TEMPSTATE[unit->air_state]); |
207 payload = xstrcat(payload, buf); |
209 payload = xstrcat(payload, (char *)"\",\"temperature\":"); |
208 payload = xstrcat(payload, (char *)"}"); |
210 sprintf(buf, "%.3f", unit->air_temperature / 1000.0); |
209 } else { |
211 payload = xstrcat(payload, buf); |
210 payload = xstrcat(payload, (char *)"\",\"air\":null"); |
212 payload = xstrcat(payload, (char *)"}"); |
211 } |
213 } else { |
212 |
214 payload = xstrcat(payload, (char *)"\"air\":null"); |
213 if (unit->beer_address) { |
215 } |
214 payload = xstrcat(payload, (char *)",\"beer\":{\"address\":\""); |
216 comma = true; |
215 payload = xstrcat(payload, unit->beer_address); |
217 } |
216 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
218 if (birth || unit->mqtt_flag & MQTT_FLAG_BEER) { |
217 payload = xstrcat(payload, (char *)TEMPSTATE[unit->beer_state]); |
219 if (comma) |
218 payload = xstrcat(payload, (char *)"\",\"temperature\":"); |
220 payload = xstrcat(payload, (char *)","); |
219 sprintf(buf, "%.3f", unit->beer_temperature / 1000.0); |
221 if (unit->beer_address) { |
220 payload = xstrcat(payload, buf); |
222 payload = xstrcat(payload, (char *)"\"beer\":{\"address\":\""); |
221 payload = xstrcat(payload, (char *)"}"); |
223 payload = xstrcat(payload, unit->beer_address); |
222 } else { |
224 payload = xstrcat(payload, (char *)"\",\"state\":\""); |
223 payload = xstrcat(payload, (char *)",\"beer\":null"); |
225 payload = xstrcat(payload, (char *)TEMPSTATE[unit->beer_state]); |
224 } |
226 payload = xstrcat(payload, (char *)"\",\"temperature\":"); |
225 |
227 sprintf(buf, "%.3f", unit->beer_temperature / 1000.0); |
226 if (unit->heater_address) { |
228 payload = xstrcat(payload, buf); |
227 payload = xstrcat(payload, (char *)",\"heater\":{\"address\":\""); |
229 payload = xstrcat(payload, (char *)"}"); |
228 payload = xstrcat(payload, unit->heater_address); |
230 } else { |
229 payload = xstrcat(payload, (char *)"\",\"state\":"); |
231 payload = xstrcat(payload, (char *)"\"beer\":null"); |
230 sprintf(buf, "%d", unit->heater_state); |
232 } |
231 payload = xstrcat(payload, buf); |
233 comma = true; |
232 payload = xstrcat(payload, (char *)"}"); |
234 } |
233 } else { |
235 if (birth || unit->mqtt_flag & MQTT_FLAG_HEATER) { |
234 payload = xstrcat(payload, (char *)",\"heater\":null"); |
236 if (comma) |
235 } |
237 payload = xstrcat(payload, (char *)","); |
236 |
238 if (unit->heater_address) { |
237 if (unit->cooler_address) { |
239 payload = xstrcat(payload, (char *)"\"heater\":{\"address\":\""); |
238 payload = xstrcat(payload, (char *)",\"cooler\":{\"address\":\""); |
240 payload = xstrcat(payload, unit->heater_address); |
239 payload = xstrcat(payload, unit->cooler_address); |
241 payload = xstrcat(payload, (char *)"\",\"state\":"); |
240 payload = xstrcat(payload, (char *)"\",\"state\":"); |
242 sprintf(buf, "%d", unit->heater_state); |
241 sprintf(buf, "%d", unit->cooler_state); |
243 payload = xstrcat(payload, buf); |
242 payload = xstrcat(payload, buf); |
244 payload = xstrcat(payload, (char *)"}"); |
243 payload = xstrcat(payload, (char *)"}"); |
245 } else { |
244 } else { |
246 payload = xstrcat(payload, (char *)"\"heater\":null"); |
245 payload = xstrcat(payload, (char *)",\"cooler\":null"); |
247 } |
246 } |
248 comma = true; |
247 |
249 } |
248 if (unit->fan_address) { |
250 if (birth || unit->mqtt_flag & MQTT_FLAG_COOLER) { |
249 payload = xstrcat(payload, (char *)",\"fan\":{\"address\":\""); |
251 if (comma) |
250 payload = xstrcat(payload, unit->fan_address); |
252 payload = xstrcat(payload, (char *)","); |
251 payload = xstrcat(payload, (char *)"\",\"state\":"); |
253 if (unit->cooler_address) { |
252 sprintf(buf, "%d", unit->fan_state); |
254 payload = xstrcat(payload, (char *)"\"cooler\":{\"address\":\""); |
253 payload = xstrcat(payload, buf); |
255 payload = xstrcat(payload, unit->cooler_address); |
254 payload = xstrcat(payload, (char *)"}"); |
256 payload = xstrcat(payload, (char *)"\",\"state\":"); |
255 } else { |
257 sprintf(buf, "%d", unit->cooler_state); |
256 payload = xstrcat(payload, (char *)",\"fan\":null"); |
258 payload = xstrcat(payload, buf); |
257 } |
259 payload = xstrcat(payload, (char *)"}"); |
258 |
260 } else { |
259 if (unit->door_address) { |
261 payload = xstrcat(payload, (char *)"\"cooler\":null"); |
260 payload = xstrcat(payload, (char *)",\"door\":{\"address\":\""); |
262 } |
261 payload = xstrcat(payload, unit->door_address); |
263 comma = true; |
262 payload = xstrcat(payload, (char *)"\",\"state\":"); |
264 } |
263 sprintf(buf, "%d", unit->door_state); |
265 if (birth || unit->mqtt_flag & MQTT_FLAG_FAN) { |
264 payload = xstrcat(payload, buf); |
266 if (comma) |
265 payload = xstrcat(payload, (char *)"}"); |
267 payload = xstrcat(payload, (char *)","); |
266 } else { |
268 if (unit->fan_address) { |
267 payload = xstrcat(payload, (char *)",\"door\":null"); |
269 payload = xstrcat(payload, (char *)"\"fan\":{\"address\":\""); |
268 } |
270 payload = xstrcat(payload, unit->fan_address); |
269 |
271 payload = xstrcat(payload, (char *)"\",\"state\":"); |
270 if (unit->light_address) { |
272 sprintf(buf, "%d", unit->fan_state); |
271 payload = xstrcat(payload, (char *)",\"light\":{\"address\":\""); |
273 payload = xstrcat(payload, buf); |
272 payload = xstrcat(payload, unit->light_address); |
274 payload = xstrcat(payload, (char *)"}"); |
273 payload = xstrcat(payload, (char *)"\",\"state\":"); |
275 } else { |
274 sprintf(buf, "%d", unit->light_state); |
276 payload = xstrcat(payload, (char *)"\"fan\":null"); |
275 payload = xstrcat(payload, buf); |
277 } |
276 payload = xstrcat(payload, (char *)"}"); |
278 comma = true; |
277 } else { |
279 } |
278 payload = xstrcat(payload, (char *)",\"light\":null"); |
280 if (birth || unit->mqtt_flag & MQTT_FLAG_DOOR) { |
279 } |
281 if (comma) |
280 |
282 payload = xstrcat(payload, (char *)","); |
281 if (unit->psu_address) { |
283 if (unit->door_address) { |
282 payload = xstrcat(payload, (char *)",\"psu\":{\"address\":\""); |
284 payload = xstrcat(payload, (char *)"\"door\":{\"address\":\""); |
283 payload = xstrcat(payload, unit->psu_address); |
285 payload = xstrcat(payload, unit->door_address); |
284 payload = xstrcat(payload, (char *)"\",\"state\":"); |
286 payload = xstrcat(payload, (char *)"\",\"state\":"); |
285 sprintf(buf, "%d", unit->psu_state); |
287 sprintf(buf, "%d", unit->door_state); |
286 payload = xstrcat(payload, buf); |
288 payload = xstrcat(payload, buf); |
287 payload = xstrcat(payload, (char *)"}"); |
289 payload = xstrcat(payload, (char *)"}"); |
288 } else { |
290 } else { |
289 payload = xstrcat(payload, (char *)",\"psu\":null"); |
291 payload = xstrcat(payload, (char *)"\"door\":null"); |
290 } |
292 } |
291 |
293 comma = true; |
292 payload = xstrcat(payload, (char *)",\"mode\":\""); |
294 } |
293 payload = xstrcat(payload, (char *)UNITMODE[unit->mode]); |
295 if (birth || unit->mqtt_flag & MQTT_FLAG_LIGHT) { |
294 payload = xstrcat(payload, (char *)"\",\"setpoint\":{\"low\":"); |
296 if (comma) |
295 sprintf(buf, "%.1f", unit->PID_heat->SetP); |
297 payload = xstrcat(payload, (char *)","); |
296 payload = xstrcat(payload, buf); |
298 if (unit->light_address) { |
297 payload = xstrcat(payload, (char *)",\"high\":"); |
299 payload = xstrcat(payload, (char *)"\"light\":{\"address\":\""); |
298 sprintf(buf, "%.1f", unit->PID_cool->SetP); |
300 payload = xstrcat(payload, unit->light_address); |
299 payload = xstrcat(payload, buf); |
301 payload = xstrcat(payload, (char *)"\",\"state\":"); |
300 payload = xstrcat(payload, (char *)"}"); |
302 sprintf(buf, "%d", unit->light_state); |
301 |
303 payload = xstrcat(payload, buf); |
302 if (unit->mode == UNITMODE_PROFILE && unit->profile) { |
304 payload = xstrcat(payload, (char *)"}"); |
303 for (profile = Config.profiles; profile; profile = profile->next) { |
305 } else { |
304 if (strcmp(unit->profile, profile->uuid) == 0) { |
306 payload = xstrcat(payload, (char *)"\"light\":null"); |
305 payload = xstrcat(payload, (char *)",\"profile\":{\"uuid\":\""); |
307 } |
306 payload = xstrcat(payload, unit->profile); |
308 comma = true; |
307 payload = xstrcat(payload, (char *)",\"name\":\""); |
309 } |
308 payload = xstrcat(payload, profile->name); |
310 if (birth || unit->mqtt_flag & MQTT_FLAG_PSU) { |
309 payload = xstrcat(payload, (char *)"\",\"inittemp\":{\"low\":"); |
311 if (comma) |
310 sprintf(buf, "%.1f", profile->inittemp_lo); |
312 payload = xstrcat(payload, (char *)","); |
311 payload = xstrcat(payload, buf); |
313 if (unit->psu_address) { |
312 payload = xstrcat(payload, (char *)",\"high\":"); |
314 payload = xstrcat(payload, (char *)"\"psu\":{\"address\":\""); |
313 sprintf(buf, "%.1f", profile->inittemp_hi); |
315 payload = xstrcat(payload, unit->psu_address); |
314 payload = xstrcat(payload, buf); |
316 payload = xstrcat(payload, (char *)"\",\"state\":"); |
315 payload = xstrcat(payload, (char *)"},\"fridgemode\":"); |
317 sprintf(buf, "%d", unit->psu_state); |
316 sprintf(buf, "%d", profile->fridge_mode); |
318 payload = xstrcat(payload, buf); |
317 payload = xstrcat(payload, buf); |
319 payload = xstrcat(payload, (char *)"}"); |
318 comma = false; |
320 } else { |
319 if (profile->steps) { |
321 payload = xstrcat(payload, (char *)"\"psu\":null"); |
320 payload = xstrcat(payload, (char *)",\"steps\":["); |
322 } |
321 for (pstep = profile->steps; pstep; pstep = pstep->next) { |
323 comma = true; |
322 if (comma) |
324 } |
323 payload = xstrcat(payload, (char *)","); |
325 if (birth || unit->mqtt_flag & MQTT_FLAG_MODE) { |
324 payload = xstrcat(payload, (char *)"{\"resttime\":"); |
326 if (comma) |
325 sprintf(buf, "%d", pstep->resttime); |
327 payload = xstrcat(payload, (char *)","); |
326 payload = xstrcat(payload, buf); |
328 payload = xstrcat(payload, (char *)"\"mode\":\""); |
327 payload = xstrcat(payload, (char *)",\"steptime\":"); |
329 payload = xstrcat(payload, (char *)UNITMODE[unit->mode]); |
328 sprintf(buf, "%d", pstep->steptime); |
330 payload = xstrcat(payload, (char *)"\""); |
329 payload = xstrcat(payload, buf); |
331 comma = true; |
330 payload = xstrcat(payload, (char *)",\"target\":{\"low\":"); |
332 } |
331 sprintf(buf, "%.1f", pstep->target_lo); |
333 if (birth || unit->mqtt_flag & MQTT_FLAG_SP) { |
332 payload = xstrcat(payload, buf); |
334 if (unit->mode != UNITMODE_OFF) { |
333 payload = xstrcat(payload, (char *)",\"high\":"); |
335 if (comma) |
334 sprintf(buf, "%.1f", pstep->target_hi); |
336 payload = xstrcat(payload, (char *)","); |
335 payload = xstrcat(payload, buf); |
337 payload = xstrcat(payload, (char *)"\"setpoint\":{\"low\":"); |
336 payload = xstrcat(payload, (char *)"},\"fridgemode\":"); |
338 sprintf(buf, "%.1f", unit->PID_heat->SetP); |
337 sprintf(buf, "%d", pstep->fridge_mode); |
339 payload = xstrcat(payload, buf); |
338 payload = xstrcat(payload, buf); |
340 payload = xstrcat(payload, (char *)",\"high\":"); |
339 payload = xstrcat(payload, (char *)"}"); |
341 sprintf(buf, "%.1f", unit->PID_cool->SetP); |
340 comma = true; |
342 payload = xstrcat(payload, buf); |
|
343 payload = xstrcat(payload, (char *)"}"); |
|
344 comma = true; |
|
345 } |
|
346 } |
|
347 if (birth || unit->mqtt_flag & MQTT_FLAG_PROFILE || unit->mqtt_flag & MQTT_FLAG_PERCENT) { |
|
348 if (unit->mode == UNITMODE_PROFILE && unit->profile) { |
|
349 for (profile = Config.profiles; profile; profile = profile->next) { |
|
350 if (strcmp(unit->profile, profile->uuid) == 0) { |
|
351 if (comma) |
|
352 payload = xstrcat(payload, (char *)","); |
|
353 payload = xstrcat(payload, (char *)"\"profile\":{\"uuid\":\""); |
|
354 payload = xstrcat(payload, unit->profile); |
|
355 payload = xstrcat(payload, (char *)",\"name\":\""); |
|
356 payload = xstrcat(payload, profile->name); |
|
357 payload = xstrcat(payload, (char *)"\",\"inittemp\":{\"low\":"); |
|
358 sprintf(buf, "%.1f", profile->inittemp_lo); |
|
359 payload = xstrcat(payload, buf); |
|
360 payload = xstrcat(payload, (char *)",\"high\":"); |
|
361 sprintf(buf, "%.1f", profile->inittemp_hi); |
|
362 payload = xstrcat(payload, buf); |
|
363 payload = xstrcat(payload, (char *)"},\"fridgemode\":"); |
|
364 sprintf(buf, "%d", profile->fridge_mode); |
|
365 payload = xstrcat(payload, buf); |
|
366 comma = false; |
|
367 if (profile->steps) { |
|
368 payload = xstrcat(payload, (char *)",\"steps\":["); |
|
369 for (pstep = profile->steps; pstep; pstep = pstep->next) { |
|
370 if (comma) |
|
371 payload = xstrcat(payload, (char *)","); |
|
372 payload = xstrcat(payload, (char *)"{\"resttime\":"); |
|
373 sprintf(buf, "%d", pstep->resttime); |
|
374 payload = xstrcat(payload, buf); |
|
375 payload = xstrcat(payload, (char *)",\"steptime\":"); |
|
376 sprintf(buf, "%d", pstep->steptime); |
|
377 payload = xstrcat(payload, buf); |
|
378 payload = xstrcat(payload, (char *)",\"target\":{\"low\":"); |
|
379 sprintf(buf, "%.1f", pstep->target_lo); |
|
380 payload = xstrcat(payload, buf); |
|
381 payload = xstrcat(payload, (char *)",\"high\":"); |
|
382 sprintf(buf, "%.1f", pstep->target_hi); |
|
383 payload = xstrcat(payload, buf); |
|
384 payload = xstrcat(payload, (char *)"},\"fridgemode\":"); |
|
385 sprintf(buf, "%d", pstep->fridge_mode); |
|
386 payload = xstrcat(payload, buf); |
|
387 payload = xstrcat(payload, (char *)"}"); |
|
388 comma = true; |
|
389 } |
|
390 payload = xstrcat(payload, (char *)"]"); |
|
391 } else { |
|
392 payload = xstrcat(payload, (char *)",\"steps\":null"); |
|
393 } |
341 } |
394 payload = xstrcat(payload, (char *)"}"); |
342 payload = xstrcat(payload, (char *)"]"); |
395 break; |
343 } else { |
396 } |
344 payload = xstrcat(payload, (char *)",\"steps\":null"); |
|
345 } |
|
346 payload = xstrcat(payload, (char *)"}"); |
|
347 break; |
397 } |
348 } |
398 } else { |
349 } |
399 if (comma) |
350 } else { |
400 payload = xstrcat(payload, (char *)","); |
351 payload = xstrcat(payload, (char *)",\"profile\":null"); |
401 payload = xstrcat(payload, (char *)"\"profile\":null"); |
|
402 } |
|
403 } |
352 } |
404 payload = xstrcat(payload, (char *)"}"); |
353 payload = xstrcat(payload, (char *)"}"); |
405 |
354 |
406 return payload; |
355 return payload; |
407 } |
356 } |