How to send SMS using ESP32
Learn how to send real-time SMS alerts from your ESP32 without using a GSM module. Use Wi-Fi and Circuit Digest’s free SMS API to get instant notifications for IoT projects like motion detection, temperature monitoring, and more.
- Suitable forB.Tech Embedded students
- Build time3-4 weeks
- LevelBeginner
- Available atAjvika Labs, Kakinada
About this project
Want instant SMS alerts from your ESP32 without relying on a bulky GSM module? Whether it's motion detection, a sudden temperature spike, or an unauthorized locker door opening, your ESP32 can now send real-time SMS notifications straight to your phone, using just Wi-Fi and a free API from Circuit Digest Cloud.
Most IoT projects require you to constantly check an app or web dashboard to stay updated. But with this smart SMS-based alert system, your ESP32 becomes a proactive watchdog, pushing important updates directly to your smartphone inbox, even when you're offline from apps or dashboards. And the best part? No monthly fees, no SIM cards, just code and Wi-Fi.
In this article, we are going to show you how you can read the temperature data from a DHT11 and send the values to a smartphone as an SMS using the ESP32 board. So let's get started.
Sending SMS without using GSM Module
Arduino Code Overview
Working Demonstration
GitHub Repository with Code and Circuit
Projects using Circuit Digest SMS API
How does it send SMS without using GSM?
Instead of making ESP32 directly rely on cellular networks, we connect ESP32 to the Wi-Fi network and make use of the Circuit Digest SMS API to send text messages. These SMS APIs act as a middleman between ESP32 and the cellular networks. Here's how it works:
ESP32 connects to the Active Wi-Fi Network - ESP32 connects to the Wi-Fi Access point to access the internet, so that it is able to communicate with SMS API’s.
ESP32 sends HTTP request to the API - Whenever ESP32 gets triggered by the Sensors, it sends an HTTP request to the SMS API with the recipient’s phone number, message and valid API Key.
SMS API delivers the Message - SMS API checks if the API Key is valid or not. If it is valid, then it sends a message to the recipient’s phone number through the mobile network, just like a regular text message.
In this way, we can send SMS using ESP32 without the need for GSM Modules. If you're curious about how to send SMS using GSM, then check out this guide to send SMS from ESP32 using GSM.
Ok, that’s all about it working. Let’s move to components that are required to send SMS Alerts from ESP32 via the Internet.
The hardware requirements for making the ESP32 send SMS are minimal. Here are the things that you need to make one.
ESP32 Development Board
5V Power Supply Adaptor with programming cable.
For a practical example, I make use of a DHT11 sensor to measure temperature and make the ESP32 send SMS alerts if a certain condition occurs.
Based on your application, you can use any sensor as you want in place of the DHT11 sensor. For example, if you want to trigger an SMS alert when motion is detected, then you might opt for a PIR Sensor by utilizing this ESP32 PIR Sensor Interfacing tutorial as a reference.
Setting up the hardware for sending SMS with the ESP32 is Simple. Since we are using the Online SMS API’s, we don’t need to worry about the complex GSM circuit connection. Here is a circuit diagram for our ESP32 SMS Sender.
Here is the actual hardware of the ESP32 SMS sending Circuit. Looks simple, right? Yeah, because it doesn’t need any additional hardware like GSM. To send an SMS, it just needs the power of the Internet.
You can use a 5V power supply to power this whole circuit through the ESP32’s USB Port. Next, we will see how to generate an API key for SMS transmission.
Before moving on to the coding part, we first want to generate a valid SMS API from the Circuit Digest Cloud SMS service provider, so that we can make our ESP32 send SMS by utilizing the power of the internet.
STEP 1: Visit our Circuit Digest Cloud website “ https://www.circuitdigest.cloud/ ”. Then click on the login button. It will redirect you to the login page, where you just enter your login credentials. If you don’t have an account, create a new one using the Register Page.
STEP 2: After logging in, you will find the “ Account ” button in the top-right corner. Click on it to view a dropdown menu with options such as Profile, API Key, and Logout. Select API Key, and you will be redirected to the API key generation page.
STEP 3: On the API Key generating page, a new API key will be generated with a limit of 100 SMS per month. Even after Expiry, you can renew it for free of cost.
STEP 4: After that, scroll down the webpage until you find the SMS Notification API section. Click on \" View Details\" to proceed.
Step 5: In the SMS Notification API tab, you will find the \" Link Phone Number\" option. Click on it to link a phone number for sending SMS notifications.
STEP 6: Enter the phone number you want to link and click the \"Get OTP\" button. You will receive an OTP on the entered number enter the OTP to verify the phone number. Once verified, you can also view the list of linked phone numbers here.
Prebuilt SMS Template of Circuit Digest Cloud
Previously, I taught you how to generate the SMS API Key from Circuit Digest Cloud for sending SMS from ESP32. Now, here we are going to know about predefined SMS templates and how to choose one that suits our specific application.
Your {#var#} is currently at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The temperature in {#var#} has reached {#var#}°C. Please take necessary action. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Motion detected by {#var#} in the {#var#}. Investigate immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The battery level of {#var#} is critically low at {#var#}%. Recharge immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Your {#var#} is currently at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
It’s time to service your {#var#}. Last service was on {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Error {#var#} has been detected in {#var#}. Please troubleshoot immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The {#var#} is currently {#var#}. Please ensure safety. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The system {#var#} has been rebooted at {#var#}. Verify functionality. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The device {#var#} is currently located at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The task {#var#} has been successfully completed at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Connection Lost Alert
The connection with {#var#} was lost at {#var#}. Please check the network or device. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The {#var#} requires maintenance. Detected issue: {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The {#var#} is experiencing an overload. Current load: {#var#}. Please reduce usage. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Unauthorized access detected in {#var#} at {#var#}. Verify immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Here you find the list of SMS templates, where each of them is designed for a specific alert use case. Since I am using a DHT11 sensor to trigger an SMS Alert based on temperature threshold value, I am going to pick out “ Temperature Alert Template with ID of 102 ”.
The temperature in {#var#} has reached {#var#}°C. Please take necessary action. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
So, let's take a note on Template ID number 102, which is needed in the upcoming ESP32 programming part. In the above temperature template, you may notice two “#var#”, which are user-customizable.
For example, if I initialise the global var1 & var2 variables present in the upcoming ESP32 code as “ WAREHOUSE ” and “ 30 ” respectively. The SMS alert should look like this while receiving.
Arduino Code Overview
Before diving into an in-depth explanation of the code, let’s get to know the core logic behind this C++ code. This code makes the ESP32 look for an authorized Wi-Fi access point and make a connection using the credentials. Later, it initializes the DHT11 temperature sensor to retrieve Temperature data continuously.
If the temperature value reaches 30 degrees Celsius or above, it triggers ESP32 to send an SMS alert using the SMS API. Ok, I hope, now you get a clear idea. Let’s move into the coding part.
WiFi.h - It is the ESP32 board’s specific WiFi Library used for handling WiFi-specific tasks such as connecting to the authorized network and making HTTP requests to the client via WiFi.
WiFi.h - It is the ESP32 board’s specific WiFi Library used for handling WiFi-specific tasks such as connecting to the authorized network and making HTTP requests to the client via WiFi.
DHT.h && DHT_U.h - It helps in simplifying the process of making ESP32 communicate with the DHT11 through the sensor’s proprietary one-wire protocol.
DHT.h && DHT_U.h - It helps in simplifying the process of making ESP32 communicate with the DHT11 through the sensor’s proprietary one-wire protocol.
Note, we don’t want to install the “ WiFi.h ” separately as we do for “ DHT.h ”, since it already comes when we install the ESP32 board from the Arduino Board library manager.
Whereas you can easily get the “ DHT11 Sensor ” library by clicking its header file name, as I mentioned above. After downloading the ZIP file from the GitHub repo, you can install it either through the Arduino IDE, by going to Sketch -> Include Library -> Add ZIP Library and selecting the downloaded ZIP file, or by simply extracting the ZIP file into the Arduino library folder.
Macro for Pin Definition:
Here, I am using a Macro to define in ESP32s, which pin the DHT11 sensor’s data pin is going to get connected. We can also use a variable to hold this data, but it is good to use macros over a variable to save some memory space, especially in embedded systems.
Creating an Instance of DHT_Unified Class:
This creates an object named “dht” for the “DHT_Unified” class to initialise the DHT11 sensor for getting temperature, where it passes the “Temp_SensorPin” macro value as a parameter, so that the ESP32 can retrieve data from that specific pin.
Declaring Global Variables for holding valuable Data
These “ ssid ” and “ password ” variables are used for storing the WiFi access point credentials, where the ESP32 is going to get connect to it.
// API credentials and SMS details const char* apiKey = \"xxxxxxxxxxxxx\"; // Replace with your API key const char* templateID = \"102\"; // Replace with your template ID const char* mobileNumber = \"91xxxxxxxxxx\"; // Replace with the recipient's mobile number with country code (eg : 91XXXXXXXXXX) const char* var1 = \"WAREHOUSE\"; // Replace with your custom variable const char* var2 = \"30\"; // Replace with your custom variable
The above variables are used for holding the SMS API credentials, the recipient's mobile number, as well as the SMS template ID and customizable variables. Make sure you replace “ apikey ” with your newly generated one.
Here I am initializing “ var1 ” and “ var2 ” values as “WAREHOUSE” and “30”, which will get reflected on the final sms output as I mentioned previously.
This variable is used for storing the temperature data that comes from the DHT11 sensor. Here, I initially set it down to zero to avoid holding garbage data.
read_temperature() Function to retrieve Temperature data:
This function is used for reading the current temperature data from the DHT11 sensor using its predefined functions and stores that value in the “temperature” variable. Then make it print on the Serial monitor as well for debugging purposes.
sensSMS() function to trigger SMS Alert via SMS API:
This SMS function is specifically designed to send an SMS Alert when it is called by other functions. First, it checks whether the Wi-Fi is connected or not, then creates a Wi-Fi client to establish a connection with the server.
Later, it constructs an HTTP POST request with the necessary headers and JSON payload containing the SMS details. After sending the request, it waits for the server’s response code to determine the SMS sent status.
First of all, it makes the ESP32 connect to the existing WiFi network using its WiFi credentials, then it checks whether it connects to the network or not. If yes, it prints out the IP address of the ESP32.
At last, it makes a call on dht.begin() to make the DHT11 sensor get ready for fetching the temperature data from the environment and send it out to the ESP32 input pin.
This loop() function is used to continuously retrieve temperature data from the DHT11 sensor and check whether it is greater than or equal to 30 degrees Celsius. If yes, it triggers a One SMS alert and stops further SMS alerts until the temperature gets back to 28 degrees Celsius.
Ok, now the coding part is over, let’s delve into the code uploading part. For that, you make sure the ESP32 board is selected properly. Since there are many variants of ESP32-based development boards available, select the proper one based on your specific ESP32 development board.
Most IoT projects require you to constantly check an app or web dashboard to stay updated. But with this smart SMS-based alert system, your ESP32 becomes a proactive watchdog, pushing important updates directly to your smartphone inbox, even when you're offline from apps or dashboards. And the best part? No monthly fees, no SIM cards, just code and Wi-Fi.
In this article, we are going to show you how you can read the temperature data from a DHT11 and send the values to a smartphone as an SMS using the ESP32 board. So let's get started.
Sending SMS without using GSM Module
Arduino Code Overview
Working Demonstration
GitHub Repository with Code and Circuit
Projects using Circuit Digest SMS API
How does it send SMS without using GSM?
Instead of making ESP32 directly rely on cellular networks, we connect ESP32 to the Wi-Fi network and make use of the Circuit Digest SMS API to send text messages. These SMS APIs act as a middleman between ESP32 and the cellular networks. Here's how it works:
ESP32 connects to the Active Wi-Fi Network - ESP32 connects to the Wi-Fi Access point to access the internet, so that it is able to communicate with SMS API’s.
ESP32 sends HTTP request to the API - Whenever ESP32 gets triggered by the Sensors, it sends an HTTP request to the SMS API with the recipient’s phone number, message and valid API Key.
SMS API delivers the Message - SMS API checks if the API Key is valid or not. If it is valid, then it sends a message to the recipient’s phone number through the mobile network, just like a regular text message.
In this way, we can send SMS using ESP32 without the need for GSM Modules. If you're curious about how to send SMS using GSM, then check out this guide to send SMS from ESP32 using GSM.
Ok, that’s all about it working. Let’s move to components that are required to send SMS Alerts from ESP32 via the Internet.
The hardware requirements for making the ESP32 send SMS are minimal. Here are the things that you need to make one.
ESP32 Development Board
5V Power Supply Adaptor with programming cable.
For a practical example, I make use of a DHT11 sensor to measure temperature and make the ESP32 send SMS alerts if a certain condition occurs.
Based on your application, you can use any sensor as you want in place of the DHT11 sensor. For example, if you want to trigger an SMS alert when motion is detected, then you might opt for a PIR Sensor by utilizing this ESP32 PIR Sensor Interfacing tutorial as a reference.
Setting up the hardware for sending SMS with the ESP32 is Simple. Since we are using the Online SMS API’s, we don’t need to worry about the complex GSM circuit connection. Here is a circuit diagram for our ESP32 SMS Sender.
Here is the actual hardware of the ESP32 SMS sending Circuit. Looks simple, right? Yeah, because it doesn’t need any additional hardware like GSM. To send an SMS, it just needs the power of the Internet.
You can use a 5V power supply to power this whole circuit through the ESP32’s USB Port. Next, we will see how to generate an API key for SMS transmission.
Before moving on to the coding part, we first want to generate a valid SMS API from the Circuit Digest Cloud SMS service provider, so that we can make our ESP32 send SMS by utilizing the power of the internet.
STEP 1: Visit our Circuit Digest Cloud website “ https://www.circuitdigest.cloud/ ”. Then click on the login button. It will redirect you to the login page, where you just enter your login credentials. If you don’t have an account, create a new one using the Register Page.
STEP 2: After logging in, you will find the “ Account ” button in the top-right corner. Click on it to view a dropdown menu with options such as Profile, API Key, and Logout. Select API Key, and you will be redirected to the API key generation page.
STEP 3: On the API Key generating page, a new API key will be generated with a limit of 100 SMS per month. Even after Expiry, you can renew it for free of cost.
STEP 4: After that, scroll down the webpage until you find the SMS Notification API section. Click on \" View Details\" to proceed.
Step 5: In the SMS Notification API tab, you will find the \" Link Phone Number\" option. Click on it to link a phone number for sending SMS notifications.
STEP 6: Enter the phone number you want to link and click the \"Get OTP\" button. You will receive an OTP on the entered number enter the OTP to verify the phone number. Once verified, you can also view the list of linked phone numbers here.
Prebuilt SMS Template of Circuit Digest Cloud
Previously, I taught you how to generate the SMS API Key from Circuit Digest Cloud for sending SMS from ESP32. Now, here we are going to know about predefined SMS templates and how to choose one that suits our specific application.
Your {#var#} is currently at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The temperature in {#var#} has reached {#var#}°C. Please take necessary action. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Motion detected by {#var#} in the {#var#}. Investigate immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The battery level of {#var#} is critically low at {#var#}%. Recharge immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Your {#var#} is currently at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
It’s time to service your {#var#}. Last service was on {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Error {#var#} has been detected in {#var#}. Please troubleshoot immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The {#var#} is currently {#var#}. Please ensure safety. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The system {#var#} has been rebooted at {#var#}. Verify functionality. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The device {#var#} is currently located at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The task {#var#} has been successfully completed at {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Connection Lost Alert
The connection with {#var#} was lost at {#var#}. Please check the network or device. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The {#var#} requires maintenance. Detected issue: {#var#}. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
The {#var#} is experiencing an overload. Current load: {#var#}. Please reduce usage. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Unauthorized access detected in {#var#} at {#var#}. Verify immediately. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
Here you find the list of SMS templates, where each of them is designed for a specific alert use case. Since I am using a DHT11 sensor to trigger an SMS Alert based on temperature threshold value, I am going to pick out “ Temperature Alert Template with ID of 102 ”.
The temperature in {#var#} has reached {#var#}°C. Please take necessary action. -- Powered by CircuitDigest for the Engineers and Makers of India. Visit www.circuitdigest.com.
So, let's take a note on Template ID number 102, which is needed in the upcoming ESP32 programming part. In the above temperature template, you may notice two “#var#”, which are user-customizable.
For example, if I initialise the global var1 & var2 variables present in the upcoming ESP32 code as “ WAREHOUSE ” and “ 30 ” respectively. The SMS alert should look like this while receiving.
Arduino Code Overview
Before diving into an in-depth explanation of the code, let’s get to know the core logic behind this C++ code. This code makes the ESP32 look for an authorized Wi-Fi access point and make a connection using the credentials. Later, it initializes the DHT11 temperature sensor to retrieve Temperature data continuously.
If the temperature value reaches 30 degrees Celsius or above, it triggers ESP32 to send an SMS alert using the SMS API. Ok, I hope, now you get a clear idea. Let’s move into the coding part.
WiFi.h - It is the ESP32 board’s specific WiFi Library used for handling WiFi-specific tasks such as connecting to the authorized network and making HTTP requests to the client via WiFi.
WiFi.h - It is the ESP32 board’s specific WiFi Library used for handling WiFi-specific tasks such as connecting to the authorized network and making HTTP requests to the client via WiFi.
DHT.h && DHT_U.h - It helps in simplifying the process of making ESP32 communicate with the DHT11 through the sensor’s proprietary one-wire protocol.
DHT.h && DHT_U.h - It helps in simplifying the process of making ESP32 communicate with the DHT11 through the sensor’s proprietary one-wire protocol.
Note, we don’t want to install the “ WiFi.h ” separately as we do for “ DHT.h ”, since it already comes when we install the ESP32 board from the Arduino Board library manager.
Whereas you can easily get the “ DHT11 Sensor ” library by clicking its header file name, as I mentioned above. After downloading the ZIP file from the GitHub repo, you can install it either through the Arduino IDE, by going to Sketch -> Include Library -> Add ZIP Library and selecting the downloaded ZIP file, or by simply extracting the ZIP file into the Arduino library folder.
Macro for Pin Definition:
Here, I am using a Macro to define in ESP32s, which pin the DHT11 sensor’s data pin is going to get connected. We can also use a variable to hold this data, but it is good to use macros over a variable to save some memory space, especially in embedded systems.
Creating an Instance of DHT_Unified Class:
This creates an object named “dht” for the “DHT_Unified” class to initialise the DHT11 sensor for getting temperature, where it passes the “Temp_SensorPin” macro value as a parameter, so that the ESP32 can retrieve data from that specific pin.
Declaring Global Variables for holding valuable Data
These “ ssid ” and “ password ” variables are used for storing the WiFi access point credentials, where the ESP32 is going to get connect to it.
// API credentials and SMS details const char* apiKey = \"xxxxxxxxxxxxx\"; // Replace with your API key const char* templateID = \"102\"; // Replace with your template ID const char* mobileNumber = \"91xxxxxxxxxx\"; // Replace with the recipient's mobile number with country code (eg : 91XXXXXXXXXX) const char* var1 = \"WAREHOUSE\"; // Replace with your custom variable const char* var2 = \"30\"; // Replace with your custom variable
The above variables are used for holding the SMS API credentials, the recipient's mobile number, as well as the SMS template ID and customizable variables. Make sure you replace “ apikey ” with your newly generated one.
Here I am initializing “ var1 ” and “ var2 ” values as “WAREHOUSE” and “30”, which will get reflected on the final sms output as I mentioned previously.
This variable is used for storing the temperature data that comes from the DHT11 sensor. Here, I initially set it down to zero to avoid holding garbage data.
read_temperature() Function to retrieve Temperature data:
This function is used for reading the current temperature data from the DHT11 sensor using its predefined functions and stores that value in the “temperature” variable. Then make it print on the Serial monitor as well for debugging purposes.
sensSMS() function to trigger SMS Alert via SMS API:
This SMS function is specifically designed to send an SMS Alert when it is called by other functions. First, it checks whether the Wi-Fi is connected or not, then creates a Wi-Fi client to establish a connection with the server.
Later, it constructs an HTTP POST request with the necessary headers and JSON payload containing the SMS details. After sending the request, it waits for the server’s response code to determine the SMS sent status.
First of all, it makes the ESP32 connect to the existing WiFi network using its WiFi credentials, then it checks whether it connects to the network or not. If yes, it prints out the IP address of the ESP32.
At last, it makes a call on dht.begin() to make the DHT11 sensor get ready for fetching the temperature data from the environment and send it out to the ESP32 input pin.
This loop() function is used to continuously retrieve temperature data from the DHT11 sensor and check whether it is greater than or equal to 30 degrees Celsius. If yes, it triggers a One SMS alert and stops further SMS alerts until the temperature gets back to 28 degrees Celsius.
Ok, now the coding part is over, let’s delve into the code uploading part. For that, you make sure the ESP32 board is selected properly. Since there are many variants of ESP32-based development boards available, select the proper one based on your specific ESP32 development board.
Technologies used
Hardware components
- ESP32 Development Board
- DHT11 Sensor
- Breadboard
- 5V Power Supply Adaptor with programming cable.
- Connecting Wires
Software & tools
- Arduino IDE
Project demo video
What you get
- Working project / hardware kit, tested before delivery
- Complete source code with explanation
- Project demo and guidance for your viva
- Project report, PPT and IEEE paper support (on request)
Delivery & Payment
Delivery takes a minimum of two weeks from the date your inquiry is confirmed.
Payment is in two parts:
• 50% advance to start the project
• Remaining 50% before delivery
Note:
• Documentation and PPT are not included by default
• If you need documentation/PPT, it can be arranged for extra time and cost
We'll confirm the exact timeline and cost with you after reviewing your requirements.