// Query for values at periodic intervals void bsbport_polling_periodic(void) { switch (step) { // Temperaturen case 0: // Kollektortemperatur bsbport_query(0x49, 0x3d, 0x05, 0x2a, 0x00); step++; break; case 1: // SolarRücklauftemperatur bsbport_query(0x49, 0x3d, 0x05, 0x0f, 0x00); step++; break; case 2: // SolarVorlauftemperatur bsbport_query(0x49, 0x3d, 0x05, 0x0e, 0x00); step++; break; case 3: // Trinkwassertemperatur 31 3d 05 2f bsbport_query(0x31, 0x3d, 0x05, 0x2f, 0x00); step++; break; case 4: // Puffertemperatur 1 05 3d 05 34 bsbport_query(0x05, 0x3d, 0x05, 0x34, 0x00); step++; break; case 5: // Puffertemperatur 2 05 3d 05 35 bsbport_query(0x05, 0x3d, 0x05, 0x35, 0x00); step++; break; case 6: // HeizungsVorlauftemperatur bsbport_query(0x21, 0x3d, 0x05, 0x18, 0x00); step++; break; case 7: // Puffertemperatur 3 05 3d 05 36 bsbport_query(0x05, 0x3d, 0x05, 0x36, 0x00); step++; break; // Ertrag case 8: // Tagesertrag Solarenergie bsbport_query(0x49, 0x3d, 0x05, 0x99, 0x00); step++; break; // Sollwerte case 9: // Kompfortsollwert 0x2d 0x3d 0x05 0x8e bsbport_query(0x2d, 0x3d, 0x05, 0x8e, 0x00); step++; break; case 10: // Reduziertsollwert bsbport_query(0x2d, 0x3d, 0x05, 0x90, 0x00); step++; break; case 11: // Trinkwassersollwert bsbport_query(0x31, 0x3d, 0x06, 0xb9, 0x00); step++; break; case 12: // Trinkwasserreduziertsollwert bsbport_query(0x31, 0x3d, 0x06, 0xba, 0x00); step++; break; case 13: // Heizungsvorlaufsollwert bsbport_query(0x21, 0x3d, 0x06, 0x67, 0x00); step++; break; case 14: // Puffersollwert bsbport_query(0x05, 0x3d, 0x08, 0x83, 0x00); step++; break; case 15: // Kesselsollwert bsbport_query(0x05, 0x3d, 0x07, 0x83, 0x00); step++; break; // Status case 16: // Heizkreispumpe Q2 05 3d 09 A5 bsbport_query(0x05, 0x3d, 0x09, 0xA5, 0x00); step++; break; case 17: // Trinkwasserpumpe Q3 05 3d 09 A3 bsbport_query(0x05, 0x3d, 0x09, 0xA3, 0x00); step++; break; case 18: // Relaisausgang QX1 05 3d 09 BA -> Kollektorpumpe bsbport_query(0x05, 0x3d, 0x09, 0xBA, 0x00); step++; break; case 19: // Relaisausgang QX2 05 3d 09 BB -> bsbport_query(0x05, 0x3d, 0x09, 0xBB, 0x00); step++; break; case 20: // Relaisausgang QX3 05 3d 09 BC -> bsbport_query(0x05, 0x3d, 0x09, 0xBC, 0x00); step++; break; case 21: // Relaisausgang QX4 05 3d 09 BD -> Umschaltung Solar Puffer bsbport_query(0x05, 0x3d, 0x09, 0xBD, 0x00); step++; break; case 22: // Fehlerstatus 05 3d 00 9A bsbport_query(0x05, 0x3d, 0x00, 0x9A, 0x00); step++; break; default: step = 0; } }
void bsbport_publish_cb(char const *topic, uint16_t topic_length, const void *payload, uint16_t payload_length) { BSBDEBUG("MQTT Publish: %s", topic); if (topic_length < 20) return; uint8_t p1; uint8_t p2; uint8_t p3; uint8_t p4; uint8_t dest = 0; uint8_t ret; char type[4]; int16_t fp_val = 0; uint16_t raw_val = 0; if (topic[sizeof(BSBPORT_MQTT_TOPIC)] == 's') { char *strvalue = malloc(payload_length + 1); ret = sscanf_P(topic, PSTR(BSBPORT_SUBSCRIBE_SET_FORMAT), &dest, &p1, &p2, &p3, &p4, type); memcpy(strvalue, payload, payload_length); strvalue[payload_length] = 0; sscanf_P(strvalue, PSTR("%i"), &raw_val); next_int16_fp(strvalue, &fp_val, 1); BSBDEBUG("MQTT set ARGS:%d %02x %02x %02x %02x %02x %3s %s %d %u", ret, p1, p2, p3, p4, dest, type, strvalue, fp_val, raw_val); if (ret == 6) { uint8_t data[3]; uint8_t datalen = 3; data[0] = 0x01; if (type[0] == 'R') //set RAW value { data[1] = HI8(raw_val); data[2] = LO8(raw_val); } else if (type[0] == 'S') //set SELECT/SEL value { data[1] = LO8(raw_val); datalen = 2; } else if (type[0] == 'T') //set TEMP/TMP value { int16_t tmp; tmp = ((int32_t) fp_val * 64) / 10; data[1] = HI8(tmp); data[2] = LO8(tmp); } else if (type[0] == 'F') //set FP1/FP5 value { if (type[2] == '1') //set FP1 value { data[1] = HI8(fp_val); data[2] = LO8(fp_val); } else if (type[2] == '5') //set FP1 value { int16_t tmp; tmp = fp_val * 2 / 10; data[1] = HI8(tmp); data[2] = LO8(tmp); } } else { BSBDEBUG("MQTT set type unkown"); return; } BSBDEBUG("MQTT set send: %02x %02x %02x %02x %02x %02x %02x %02x %d", p1, p2, p3, p4, dest, data[0], data[1], data[2], datalen); bsbport_set(p1, p2, p3, p4, dest, data, datalen); } else BSBDEBUG("MQTT set parse error"); } if (topic[sizeof(BSBPORT_MQTT_TOPIC)] == 'q') { ret = sscanf_P(topic, PSTR(BSBPORT_SUBSCRIBE_QUERY_FORMAT), &dest, &p1, &p2, &p3, &p4); if (ret == 5) { BSBDEBUG("MQTT Query send: %02x %02x %02x %02x %02x", p1, p2, p3, p4, dest); bsbport_query(p1, p2, p3, p4, dest); } else BSBDEBUG("MQTT query parse error"); } else BSBDEBUG("MQTT parse error"); }