void setupOTA()
{
  ArduinoOTA.setPort(8266);

  ArduinoOTA.setHostname(HOSTNAME);
  ArduinoOTA.setPassword(OTA_PASSWORD);

  ArduinoOTA.onError([](ota_error_t error)
  {
    blinkLed(3, 2000); // Blink 3 times slowly to indicate OTA error
  });

  ArduinoOTA.begin();
}

void setupDataReadout()
{
    // 1-0:1.8.1(000992.992*kWh)
    // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v5.0)
    telegramObjects[0].name = "consumption_low_tarif";
    strcpy(telegramObjects[0].code, "1-0:1.8.1");
    telegramObjects[0].endChar = '*';

    // 1-0:1.8.2(000560.157*kWh)
    // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v5.0)
    telegramObjects[1].name = "consumption_high_tarif";
    strcpy(telegramObjects[1].code, "1-0:1.8.2");
    telegramObjects[1].endChar = '*';

    // 1-0:1.8.1(000992.992*kWh)
    // 1-0:1.8.1 =  (DSMR v5.0)
    telegramObjects[2].name = "delivered_low_tarif";
    strcpy(telegramObjects[2].code, "1-0:2.8.1");
    telegramObjects[2].endChar = '*';

    // 1-0:1.8.2(000560.157*kWh)
    // 1-0:1.8.2 =  (DSMR v5.0)
    telegramObjects[3].name = "delivered_high_tarif";
    strcpy(telegramObjects[3].code, "1-0:2.8.2");
    telegramObjects[3].endChar = '*';

    // 0-1:24.2.1(150531200000S)(00811.923*m3)
    // 0-1:24.2.1 = Gas (DSMR v5.0)
    telegramObjects[4].name = "gas_meter_m3";
    strcpy(telegramObjects[4].code, "0-1:24.2.3");
    telegramObjects[4].endChar = '*';

    // 1-0:1.7.0(00.424*kW) Actueel verbruik
    // 1-0:1.7.x = Electricity consumption actual usage (DSMR v5.0)
    telegramObjects[5].name = "actual_consumption";
    strcpy(telegramObjects[5].code, "1-0:1.7.0");
    telegramObjects[5].endChar = '*';
    
    // 1-0:2.7.0(00.000*kW) 
    // Actuele teruglevering (-P) in 1 Watt resolution
    telegramObjects[6].name = "actual_received";
    strcpy(telegramObjects[6].code, "1-0:2.7");
    telegramObjects[6].endChar = '*';

    // 1-0:21.7.0(00.378*kW)
    // 1-0:21.7.0 = Instantaan vermogen Elektriciteit levering L1
    telegramObjects[7].name = "instant_power_usage_l1";
    strcpy(telegramObjects[7].code, "1-0:21.7.0");
    telegramObjects[7].endChar = '*';

    // 1-0:41.7.0(00.378*kW)
    // 1-0:41.7.0 = Instantaan vermogen Elektriciteit levering L2
    telegramObjects[8].name = "instant_power_usage_l2";
    strcpy(telegramObjects[8].code, "1-0:41.7.0");
    telegramObjects[8].endChar = '*';

    // 1-0:61.7.0(00.378*kW)
    // 1-0:61.7.0 = Instantaan vermogen Elektriciteit levering L3
    telegramObjects[9].name = "instant_power_usage_l3";
    strcpy(telegramObjects[9].code, "1-0:61.7.0");
    telegramObjects[9].endChar = '*';

    // 1-0:31.7.0(002*A)
    // 1-0:31.7.0 = Instantane stroom Elektriciteit L1
    telegramObjects[10].name = "instant_power_current_l1";
    strcpy(telegramObjects[10].code, "1-0:31.7.0");
    telegramObjects[10].endChar = '*';

    // 1-0:51.7.0(002*A)
    // 1-0:51.7.0 = Instantane stroom Elektriciteit L2
    telegramObjects[11].name = "instant_power_current_l2";
    strcpy(telegramObjects[11].code, "1-0:51.7.0");
    telegramObjects[11].endChar = '*';

    // 1-0:71.7.0(002*A)
    // 1-0:71.7.0 = Instantane stroom Elektriciteit L3
    telegramObjects[12].name = "instant_power_current_l3";
    strcpy(telegramObjects[12].code, "1-0:71.7.0");
    telegramObjects[12].endChar = '*';

    // 1-0:32.7.0(232.0*V)
    // 1-0:32.7.0 = Voltage L1
    telegramObjects[13].name = "instant_voltage_l1";
    strcpy(telegramObjects[13].code, "1-0:32.7.0");
    telegramObjects[13].endChar = '*';

    // 1-0:52.7.0(232.0*V)
    // 1-0:52.7.0 = Voltage L2
    telegramObjects[14].name = "instant_voltage_l2";
    strcpy(telegramObjects[14].code, "1-0:52.7.0");
    telegramObjects[14].endChar = '*';

    // 1-0:72.7.0(232.0*V)
    // 1-0:72.7.0 = Voltage L3
    telegramObjects[15].name = "instant_voltage_l3";
    strcpy(telegramObjects[15].code, "1-0:72.7.0");
    telegramObjects[15].endChar = '*';

    // 0-0:96.14.0(0001)
    // 0-0:96.14.0 = Actual Tarif
    telegramObjects[16].name = "actual_tarif_group";
    strcpy(telegramObjects[16].code, "0-0:96.14.0");

    // 0-0:96.7.21(00003)
    // 0-0:96.7.21 = Aantal onderbrekingen Elektriciteit
    telegramObjects[17].name = "short_power_outages";
    strcpy(telegramObjects[17].code, "0-0:96.7.21");

    // 0-0:96.7.9(00001)
    // 0-0:96.7.9 = Aantal lange onderbrekingen Elektriciteit
    telegramObjects[18].name = "long_power_outages";
    strcpy(telegramObjects[18].code, "0-0:96.7.9");

    // 1-0:32.32.0(00000)
    // 1-0:32.32.0 = Aantal korte spanningsdalingen Elektriciteit in fase 1
    telegramObjects[19].name = "short_power_drops";
    strcpy(telegramObjects[19].code, "1-0:32.32.0");

    // 1-0:32.36.0(00000)
    // 1-0:32.36.0 = Aantal korte spanningsstijgingen Elektriciteit in fase 1
    telegramObjects[20].name = "short_power_peaks";
    strcpy(telegramObjects[20].code, "1-0:32.36.0");
}