Beispiel #1
0
// 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;
  }
}
Beispiel #2
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");
}