diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp
index 6c0e7e46aa8..8c25fe6aad5 100644
--- a/libraries/PPP/src/PPP.cpp
+++ b/libraries/PPP/src/PPP.cpp
@@ -8,6 +8,15 @@
 #include "driver/uart.h"
 #include "hal/uart_ll.h"
 
+#define PPP_CMD_MODE_CHECK(x)                                    \
+  if (_dce == NULL) {                                            \
+    return x;                                                    \
+  }                                                              \
+  if (_mode == ESP_MODEM_MODE_DATA) {                            \
+    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); \
+    return x;                                                    \
+  }
+
 typedef struct {
   void *arg;
 } PdpContext;
@@ -416,26 +425,13 @@ void PPPClass::end(void) {
 }
 
 bool PPPClass::sync() const {
-  if (_dce == NULL) {
-    return false;
-  }
+  PPP_CMD_MODE_CHECK(false);
 
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return false;
-  }
   return esp_modem_sync(_dce) == ESP_OK;
 }
 
 bool PPPClass::attached() const {
-  if (_dce == NULL) {
-    return false;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return false;
-  }
+  PPP_CMD_MODE_CHECK(false);
 
   int m = 0;
   esp_err_t err = esp_modem_get_network_attachment_state(_dce, m);
@@ -500,52 +496,31 @@ bool PPPClass::setPin(const char *pin) {
 }
 
 int PPPClass::RSSI() const {
-  if (_dce == NULL) {
-    return -1;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return -1;
-  }
+  PPP_CMD_MODE_CHECK(-1);
 
   int rssi, ber;
   esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber);
   if (err != ESP_OK) {
-    // log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err));
+    log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err));
     return -1;
   }
   return rssi;
 }
 
 int PPPClass::BER() const {
-  if (_dce == NULL) {
-    return -1;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return -1;
-  }
+  PPP_CMD_MODE_CHECK(-1);
 
   int rssi, ber;
   esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber);
   if (err != ESP_OK) {
-    // log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err));
+    log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err));
     return -1;
   }
   return ber;
 }
 
 String PPPClass::IMSI() const {
-  if (_dce == NULL) {
-    return String();
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return String();
-  }
+  PPP_CMD_MODE_CHECK(String());
 
   char imsi[32];
   esp_err_t err = esp_modem_get_imsi(_dce, (std::string &)imsi);
@@ -558,14 +533,7 @@ String PPPClass::IMSI() const {
 }
 
 String PPPClass::IMEI() const {
-  if (_dce == NULL) {
-    return String();
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return String();
-  }
+  PPP_CMD_MODE_CHECK(String());
 
   char imei[32];
   esp_err_t err = esp_modem_get_imei(_dce, (std::string &)imei);
@@ -578,14 +546,7 @@ String PPPClass::IMEI() const {
 }
 
 String PPPClass::moduleName() const {
-  if (_dce == NULL) {
-    return String();
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return String();
-  }
+  PPP_CMD_MODE_CHECK(String());
 
   char name[32];
   esp_err_t err = esp_modem_get_module_name(_dce, (std::string &)name);
@@ -598,14 +559,7 @@ String PPPClass::moduleName() const {
 }
 
 String PPPClass::operatorName() const {
-  if (_dce == NULL) {
-    return String();
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return String();
-  }
+  PPP_CMD_MODE_CHECK(String());
 
   char oper[32];
   int act = 0;
@@ -619,14 +573,7 @@ String PPPClass::operatorName() const {
 }
 
 int PPPClass::networkMode() const {
-  if (_dce == NULL) {
-    return -1;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return -1;
-  }
+  PPP_CMD_MODE_CHECK(-1);
 
   int m = 0;
   esp_err_t err = esp_modem_get_network_system_mode(_dce, m);
@@ -638,14 +585,7 @@ int PPPClass::networkMode() const {
 }
 
 int PPPClass::radioState() const {
-  if (_dce == NULL) {
-    return -1;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return -1;
-  }
+  PPP_CMD_MODE_CHECK(-1);
 
   int m = 0;
   esp_err_t err = esp_modem_get_radio_state(_dce, m);
@@ -657,14 +597,7 @@ int PPPClass::radioState() const {
 }
 
 bool PPPClass::powerDown() {
-  if (_dce == NULL) {
-    return false;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return false;
-  }
+  PPP_CMD_MODE_CHECK(false);
 
   esp_err_t err = esp_modem_power_down(_dce);
   if (err != ESP_OK) {
@@ -675,14 +608,7 @@ bool PPPClass::powerDown() {
 }
 
 bool PPPClass::reset() {
-  if (_dce == NULL) {
-    return false;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return false;
-  }
+  PPP_CMD_MODE_CHECK(false);
 
   esp_err_t err = esp_modem_reset(_dce);
   if (err != ESP_OK) {
@@ -693,14 +619,7 @@ bool PPPClass::reset() {
 }
 
 bool PPPClass::storeProfile() {
-  if (_dce == NULL) {
-    return false;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return false;
-  }
+  PPP_CMD_MODE_CHECK(false);
 
   esp_err_t err = esp_modem_store_profile(_dce);
   if (err != ESP_OK) {
@@ -711,14 +630,7 @@ bool PPPClass::storeProfile() {
 }
 
 bool PPPClass::setBaudrate(int baudrate) {
-  if (_dce == NULL) {
-    return false;
-  }
-
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return false;
-  }
+  PPP_CMD_MODE_CHECK(false);
 
   esp_err_t err = esp_modem_set_baud(_dce, baudrate);
   if (err != ESP_OK) {
@@ -737,15 +649,44 @@ bool PPPClass::setBaudrate(int baudrate) {
   return true;
 }
 
-bool PPPClass::sms(const char *num, const char *message) {
-  if (_dce == NULL) {
-    return false;
+int PPPClass::batteryVoltage() const {
+  PPP_CMD_MODE_CHECK(-1);
+
+  int volt, bcs, bcl;
+  esp_err_t err = esp_modem_get_battery_status(_dce, volt, bcs, bcl);
+  if (err != ESP_OK) {
+    log_e("esp_modem_get_battery_status failed with %d %s", err, esp_err_to_name(err));
+    return -1;
   }
+  return volt;
+}
 
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return false;
+int PPPClass::batteryLevel() const {
+  PPP_CMD_MODE_CHECK(-1);
+
+  int volt, bcs, bcl;
+  esp_err_t err = esp_modem_get_battery_status(_dce, volt, bcs, bcl);
+  if (err != ESP_OK) {
+    log_e("esp_modem_get_battery_status failed with %d %s", err, esp_err_to_name(err));
+    return -1;
   }
+  return bcl;
+}
+
+int PPPClass::batteryStatus() const {
+  PPP_CMD_MODE_CHECK(-1);
+
+  int volt, bcs, bcl;
+  esp_err_t err = esp_modem_get_battery_status(_dce, volt, bcs, bcl);
+  if (err != ESP_OK) {
+    log_e("esp_modem_get_battery_status failed with %d %s", err, esp_err_to_name(err));
+    return -1;
+  }
+  return bcs;
+}
+
+bool PPPClass::sms(const char *num, const char *message) {
+  PPP_CMD_MODE_CHECK(false);
 
   for (int i = 0; i < strlen(num); i++) {
     if (num[i] != '+' && num[i] != '#' && num[i] != '*' && (num[i] < 0x30 || num[i] > 0x39)) {
@@ -775,14 +716,8 @@ bool PPPClass::sms(const char *num, const char *message) {
 }
 
 String PPPClass::cmd(const char *at_command, int timeout) {
-  if (_dce == NULL) {
-    return String();
-  }
+  PPP_CMD_MODE_CHECK(String());
 
-  if (_mode == ESP_MODEM_MODE_DATA) {
-    log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND");
-    return String();
-  }
   char out[128] = {0};
   esp_err_t err = _esp_modem_at(_dce, at_command, out, timeout);
   if (err != ESP_OK) {
diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h
index f34dd957fe7..52eed57edbc 100644
--- a/libraries/PPP/src/PPP.h
+++ b/libraries/PPP/src/PPP.h
@@ -49,6 +49,9 @@ class PPPClass : public NetworkInterface {
   int radioState() const;       // 0:minimal, 1:full
   bool attached() const;        // true is attached to network
   bool sync() const;            // true if responds to 'AT'
+  int batteryVoltage() const;
+  int batteryLevel() const;
+  int batteryStatus() const;
 
   // Switch the communication mode
   bool mode(esp_modem_dce_mode_t m);