thermferm/mqtt.c

changeset 510
2da3d3340403
parent 509
b5ae9017194f
child 513
a2732027afb3
equal deleted inserted replaced
509:b5ae9017194f 510:2da3d3340403
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 }
491 payload = xstrcat(payload, (char *)VERSION); 440 payload = xstrcat(payload, (char *)VERSION);
492 payload = xstrcat(payload, (char *)"\"}"); 441 payload = xstrcat(payload, (char *)"\"}");
493 comma = true; 442 comma = true;
494 } 443 }
495 444
496 if (birth || flag & MQTT_NODE_HT) { 445 if (Config.temp_address || Config.hum_address) {
497 if (Config.temp_address || Config.hum_address) { 446 if (comma)
498 if (comma) 447 payload = xstrcat(payload, (char *)",");
499 payload = xstrcat(payload, (char *)","); 448 payload = xstrcat(payload, (char *)"\"HT\":{");
500 payload = xstrcat(payload, (char *)"\"HT\":{"); 449 if (Config.temp_address) {
501 if (Config.temp_address) { 450 payload = xstrcat(payload, (char *)"\"temperature\":");
502 payload = xstrcat(payload, (char *)"\"temperature\":"); 451 sprintf(buf, "%.1f", Config.temp_value / 1000.0);
503 sprintf(buf, "%.1f", Config.temp_value / 1000.0); 452 payload = xstrcat(payload, buf);
504 payload = xstrcat(payload, buf); 453 }
505 } 454 if (Config.temp_address && Config.hum_address)
506 if (Config.temp_address && Config.hum_address) 455 payload = xstrcat(payload, (char *)",");
507 payload = xstrcat(payload, (char *)","); 456 if (Config.hum_address) {
508 if (Config.hum_address) { 457 payload = xstrcat(payload, (char *)"\"humidity\":");
509 payload = xstrcat(payload, (char *)"\"humidity\":"); 458 sprintf(buf, "%.1f", Config.hum_value / 1000.0);
510 sprintf(buf, "%.1f", Config.hum_value / 1000.0); 459 payload = xstrcat(payload, buf);
511 payload = xstrcat(payload, buf); 460 }
512 } 461 payload = xstrcat(payload, (char *)"}");
513 payload = xstrcat(payload, (char *)"}");
514 }
515 } 462 }
516 payload = xstrcat(payload, (char *)"}}"); 463 payload = xstrcat(payload, (char *)"}}");
517 464
518 if (birth) 465 if (birth)
519 publisher(mosq, topic_base((char *)"NBIRTH"), payload, true); 466 publisher(mosq, topic_base((char *)"NBIRTH"), payload, true);

mercurial