{"id":31588472,"url":"https://github.com/cyberpods/esp32-notifier","last_synced_at":"2026-05-07T13:04:56.455Z","repository":{"id":317878168,"uuid":"1069161732","full_name":"cyberpods/esp32-notifier","owner":"cyberpods","description":"Multi-channel IoT notification system for ESP32-S3 with WiFi setup mode, system logging, and support for Pushbullet, Email, and Telegram notifications","archived":false,"fork":false,"pushed_at":"2025-10-03T15:06:03.000Z","size":32,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-03T17:29:21.606Z","etag":null,"topics":["arduino","email","esp32","esp32s3","iot","notifications","pushbullet","smtp","telegram"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cyberpods.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-03T13:54:34.000Z","updated_at":"2025-10-03T15:07:23.000Z","dependencies_parsed_at":"2025-10-03T17:29:38.238Z","dependency_job_id":"56fc9089-8aec-4ad6-b74e-31d1fc5a0884","html_url":"https://github.com/cyberpods/esp32-notifier","commit_stats":null,"previous_names":["cyberpods/esp32-notifier"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cyberpods/esp32-notifier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyberpods%2Fesp32-notifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyberpods%2Fesp32-notifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyberpods%2Fesp32-notifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyberpods%2Fesp32-notifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cyberpods","download_url":"https://codeload.github.com/cyberpods/esp32-notifier/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyberpods%2Fesp32-notifier/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278547821,"owners_count":26004775,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arduino","email","esp32","esp32s3","iot","notifications","pushbullet","smtp","telegram"],"created_at":"2025-10-06T02:09:33.182Z","updated_at":"2026-05-07T13:04:56.447Z","avatar_url":"https://github.com/cyberpods.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ESP32-Notifier v3.2\n\nAn advanced IoT notification and monitoring system that supports **multi-board configurations**, **cellular/4G connectivity**, **camera with photo capture**, **GPS tracking**, and **environmental sensing**. Monitor up to 4 inputs simultaneously and receive notifications via Pushbullet, Email, Telegram, or SMS.\n\n## 🎉 What's New in v3.2 (Current Release)\n\n- 🌡️ **BMP180 Environmental Sensor** - Temperature and pressure monitoring\n- 📊 **Live Sensor Readings** - Real-time temperature, pressure, and altitude in web interface\n- 📈 **Sensor Data in Notifications** - Automatic environmental data appended to alerts\n- 🔧 **Configurable I2C Pins** - Flexible GPIO pin assignment for sensor connection\n- ⚖️ **Dual Units** - Metric and imperial units (°C/°F, hPa/inHg, m/ft)\n\n## 🚀 What's New in v3.1\n\n- 📶 **Cellular/4G Support** - SIM7670G modem integration for mobile connectivity\n- 📱 **SMS Notifications** - Send alerts via text message\n- 🔀 **Intelligent Connection Modes** - WiFi Only, Cellular Only, or WiFi with Cellular Backup\n- 📡 **HTTP over Cellular** - Pushbullet and Telegram over mobile network\n- 📊 **Cellular Status Monitoring** - Operator name and signal strength display\n- ⚙️ **Per-Service Connection Mode** - Configure connection preference for each notification service\n- 📞 **Configurable APN** - Support for various mobile carriers\n\n## 🎥 What's New in v3.0\n\n- 🎛️ **Multi-Board Support** - Three board configurations (Generic ESP32-S3, Waveshare SIM7670G, Freenove CAM)\n- 📷 **OV2640 Camera Integration** - Capture photos when inputs trigger\n- 📸 **Photo Attachments** - Include images in Email and Telegram notifications\n- 💾 **SD Card Storage** - Save photos to SD card (1-bit and 4-bit modes)\n- 🛰️ **GPS/GNSS Positioning** - Include location coordinates in notifications\n- 🗺️ **Per-Input GPS/Camera** - Enable photo capture and GPS per input independently\n- 🎚️ **Board-Specific Optimization** - Safe GPIO pin defaults based on board type\n\n## ✨ Core Features from v2.0\n\n- ✅ **WiFi Network Scanner** - Scan and select networks during setup\n- ✅ **WiFi Setup Mode** - Access Point for first-time configuration (no code editing!)\n- ✅ **System Logs** - Web-based log viewer with 100-entry circular buffer\n- ✅ **Multi-input Support** - Monitor up to 4 switches independently\n- ✅ **WiFi Auto-Reconnection** - Automatic recovery from network drops\n- ✅ **Watchdog Timer** - Prevents system hangs and auto-recovers from crashes\n- ✅ **Web Authentication** - Password-protected configuration interface\n- ✅ **Non-blocking Operations** - No blocking delays for smooth operation\n- ✅ **Notification Retry** - Failed notifications auto-retry up to 3 times\n- ✅ **Rate Limiting** - Prevents notification spam (5s minimum interval per input)\n- ✅ **Test Buttons** - Test each notification service from web interface\n- ✅ **Timezone Support** - Easy timezone selection (UTC-12 to UTC+14)\n- ✅ **ArduinoJson** - Secure JSON handling prevents injection attacks\n- ✅ **HTML Encoding** - XSS protection for user-supplied content\n\n## Hardware Requirements\n\n### Basic Setup (All Configurations)\n- **ESP32-S3 development board** (any variant)\n- **Physical switch or relay** (for input monitoring)\n- **USB cable** for programming\n\n### Board-Specific Options\n\n**Option 1: Generic ESP32-S3** (WiFi only)\n- Standard ESP32-S3 DevKit or similar\n- WiFi-only notifications\n- Cost-effective for basic monitoring\n\n**Option 2: ESP32-S3-SIM7670G-4G** ([Waveshare](https://www.waveshare.com/))\n- Integrated SIM7670G cellular modem\n- OV2640 camera module\n- SD card slot (for photo storage)\n- GPS/GNSS capability\n- Requires: Nano SIM card with data plan\n\n**Option 3: Freenove ESP32-S3 CAM**\n- OV2640 camera module\n- SD card slot\n- WiFi-only (no cellular)\n\n### Board Pinout References\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"33%\"\u003e\u003cimg src=\"docs/images/ESP32-S3 Wroom.png\" alt=\"Generic ESP32-S3 Pinout\" width=\"100%\"/\u003e\u003cbr/\u003e\u003ci\u003eGeneric ESP32-S3 Wroom Pinout\u003c/i\u003e\u003c/td\u003e\n    \u003ctd width=\"33%\"\u003e\u003cimg src=\"docs/images/ESP32-S3 SIM7670G 4G Development Board.jpg\" alt=\"Waveshare SIM7670G Pinout\" width=\"100%\"/\u003e\u003cbr/\u003e\u003ci\u003eWaveshare ESP32-S3-SIM7670G-4G Pinout\u003c/i\u003e\u003c/td\u003e\n    \u003ctd width=\"33%\"\u003e\u003cimg src=\"docs/images/SeeedStudio ESP32S3.jpg\" alt=\"Freenove ESP32-S3 Pinout\" width=\"100%\"/\u003e\u003cbr/\u003e\u003ci\u003eSeeed Studio/Freenove ESP32-S3 Pinout\u003c/i\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e 💡 **Note**: Use these pinout diagrams when configuring custom GPIO pins for inputs, I2C devices, or troubleshooting pin conflicts with board-specific features (camera, modem, etc.)\n\n### Optional Components\n- **BMP180/BMP085 Sensor** - For temperature and pressure monitoring\n  - Requires: I2C connection (2 GPIO pins)\n- **SD Card** - For camera photo storage (FAT32 formatted)\n  - Recommended: Class 10, 8GB-32GB\n- **Nano SIM Card** - For cellular connectivity (SIM7670G board only)\n  - Requires: Data plan with mobile carrier\n\n## Features\n\n### Core Capabilities\n- ⚡ **Real-time Multi-Input Monitoring** - Monitor up to 4 independent switches/sensors\n- 🌐 **Dual Connectivity** - WiFi and/or Cellular (4G LTE)\n- 🔔 **Four Notification Channels**:\n  - 📱 **Pushbullet** - Push notifications to all your devices\n  - 📧 **Email** - SMTP email notifications (Gmail, Outlook, etc.)\n  - ⚡ **Telegram** - Instant messaging via Telegram bot\n  - 📱 **SMS** - Text messages via cellular modem (SIM7670G boards)\n\n### Advanced Features\n- 📷 **Photo Capture** - Take photos with OV2640 camera when inputs trigger\n- 📸 **Photo Attachments** - Include images in Email and Telegram notifications\n- 🛰️ **GPS Tracking** - Include location coordinates in alerts\n- 🌡️ **Environmental Sensing** - Monitor temperature, pressure, and altitude (BMP180)\n- 💾 **SD Card Storage** - Save photos and logs to SD card\n- 🔀 **Intelligent Connection Modes** - Choose WiFi, Cellular, or automatic failover per service\n\n### Configuration \u0026 Management\n- 🌐 **Web-based Configuration** - No code changes needed\n- 🔐 **Password-Protected Interface** - HTTP Basic Authentication\n- 📊 **Live Status Dashboard** - Real-time WiFi, cellular, sensor, and input monitoring\n- 📝 **System Logs** - Web-based log viewer (last 100 events)\n- 🧪 **Test Buttons** - Test each notification service independently\n- ⏰ **NTP Time Sync** - Accurate timestamps with timezone support\n- 💾 **Persistent Storage** - All settings saved to flash memory\n\n### Reliability \u0026 Safety\n- 🔄 **Auto-Reconnection** - WiFi and cellular auto-recovery\n- 🐕 **Watchdog Timer** - Prevents system hangs (30s timeout)\n- 🔁 **Notification Retry** - Up to 3 attempts for failed notifications\n- ⏱️ **Rate Limiting** - Prevents notification spam (5s interval per input)\n- 🚫 **Non-blocking Operations** - Smooth operation without delays\n- 🔒 **Security Features** - XSS protection and JSON injection prevention\n\n## Screenshots \u0026 Diagrams\n\n### Web Interface\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/images/wifi-setup.svg\" alt=\"WiFi Setup Mode\" width=\"400\"/\u003e\u003cbr/\u003e\u003ci\u003eWiFi Setup Mode with Network Scanner\u003c/i\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/images/main-config.svg\" alt=\"Main Configuration\" width=\"400\"/\u003e\u003cbr/\u003e\u003ci\u003eMain Configuration Interface\u003c/i\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003e\u003cimg src=\"docs/images/logs-viewer.svg\" alt=\"Logs Viewer\" width=\"800\"/\u003e\u003cbr/\u003e\u003ci\u003eSystem Logs Viewer\u003c/i\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e 💡 **Note**: Interactive HTML versions available in [`docs/`](docs/) folder\n\n### Wiring Diagrams\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/wiring-toggle.svg\" alt=\"Toggle Switch Wiring\" width=\"400\"/\u003e\u003cbr/\u003e\u003ci\u003eToggle Switch (Door Sensor)\u003c/i\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/wiring-momentary.svg\" alt=\"Momentary Switch Wiring\" width=\"400\"/\u003e\u003cbr/\u003e\u003ci\u003eMomentary Switch (Doorbell)\u003c/i\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003e\u003cimg src=\"docs/wiring-multi-input.svg\" alt=\"Multi-Input Wiring\" width=\"600\"/\u003e\u003cbr/\u003e\u003ci\u003eMulti-Input Configuration (4 switches)\u003c/i\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Example Output\n\n- 📋 [Terminal Output Sample](docs/terminal-output.txt) - Serial monitor output with notifications\n- 📊 [Sample Log File (JSON)](docs/sample-log.json) - System logs in JSON format\n\n## Setup\n\n### 1. Hardware Wiring\n\n**Basic Single Input:**\n- Connect your switch between GPIO4 and 3.3V\n- Internal pull-down resistor is enabled\n- Switch closed = HIGH (3.3V), Switch open = LOW (0V)\n\n**Multi-Input Setup:**\n- See [wiring diagram](docs/wiring-multi-input.svg) for connecting up to 4 inputs\n- All inputs share common 3.3V power\n- Each input uses a separate GPIO pin (default: 4, 5, 6, 7)\n- Configure pins via web interface\n\n### 2. Software Installation\n\n1. Install Arduino IDE\n2. Install ESP32 board support:\n   - Go to File → Preferences\n   - Add to Additional Board Manager URLs: `https://espressif.github.io/arduino-esp32/package_esp32_index.json`\n   - Go to Tools → Board → Boards Manager\n   - Search for \"ESP32\" and install \"esp32 by Espressif Systems\"\n\n3. **Install required libraries**:\n   - Go to Tools → Manage Libraries\n   - Search for and install:\n\n   **Required (All Configurations):**\n     - **\"ESP Mail Client\"** by Mobizt (for Email notifications)\n     - **\"ArduinoJson\"** by Benoit Blanchon (v6.x or later - for JSON parsing)\n\n   **Optional (Advanced Features):**\n     - **\"Adafruit BMP085 Library\"** (for BMP180 sensor - works with both BMP085 and BMP180)\n       - Also install dependencies: \"Adafruit Unified Sensor\" and \"Adafruit BusIO\"\n     - **\"TinyGPSPlus\"** by Mikal Hart (for GPS/GNSS support - SIM7670G boards only)\n\n   \u003e 💡 **Note**: Optional libraries can be disabled by commenting out the corresponding `#define` in code:\n   \u003e - `HAS_BMP180_LIB` for BMP180 sensor\n   \u003e - `HAS_CAMERA_LIB` for camera support\n   \u003e - `HAS_GPS_LIB` for GPS/GNSS\n\n4. Select your board:\n   - Tools → Board → ESP32 Arduino → ESP32S3 Dev Module\n\n5. **⚠️ CRITICAL - Set Partition Scheme ⚠️**:\n   - **YOU MUST CHANGE THIS OR COMPILATION WILL FAIL**\n   - Go to: Tools → Partition Scheme → **\"Huge APP (3MB No OTA/1MB SPIFFS)\"**\n   - ⚠️ **This is REQUIRED** - the sketch will NOT compile with the default partition scheme\n   - Without this setting, you'll get error: **\"Sketch too big\"** or **\"text section exceeds available space\"**\n   - **If you see compilation errors about size, check this setting first!**\n\n6. **Camera Boards: Enable PSRAM** (SIM7670G and Freenove only):\n   - Go to: Tools → PSRAM → **\"OPI PSRAM\"** (for Waveshare/Freenove boards)\n   - This is REQUIRED for camera operation\n   - Without PSRAM, camera initialization will fail\n\n### 3. Upload\n\n1. Connect ESP32-S3 via USB\n2. Select the correct COM port (Tools → Port)\n3. Click Upload\n4. Open Serial Monitor (115200 baud) to view debug output\n\n### 4. First-Time WiFi Setup\n\n**On first boot (or when WiFi credentials are empty), the device automatically enters Setup Mode:**\n\n1. The device creates a WiFi Access Point named `ESP32-Notifier-Setup`\n2. Connect to this network using password: `setup123`\n3. Open your browser and navigate to `http://192.168.4.1`\n4. **NEW: Click \"Scan for Networks\"** to see all available WiFi networks with signal strength\n5. Click on any network to auto-fill the SSID, or manually enter your WiFi network name\n6. Enter your WiFi password\n7. Click \"Connect to WiFi\"\n8. The device will restart and connect to your WiFi network\n9. Check the Serial Monitor for the new IP address (e.g., `192.168.1.100`)\n10. Navigate to that IP address to access the full configuration interface\n\n**Default Settings:**\n- **Web Username:** `admin`\n- **Web Password:** `admin123` ⚠️ **CHANGE THIS IMMEDIATELY**\n- **Pushbullet:** Disabled by default\n- Input 1: GPIO4 (enabled by default)\n- Inputs 2-4: GPIO 5, 6, 7 (disabled by default)\n\n## Usage\n\n### Basic Operation\n\nOnce running, the device will:\n1. Enable 30-second watchdog timer\n2. Connect to WiFi (non-blocking)\n3. Sync time via NTP\n4. Start password-protected web server\n5. Monitor all enabled inputs independently\n6. Send notifications when any input state changes\n7. Auto-reconnect WiFi if connection drops\n8. Retry failed notifications up to 3 times\n\n### Web Configuration Interface\n\nAfter uploading, check the Serial Monitor (115200 baud) to find the device's IP address. Then:\n\n1. **Access the web interface**:\n   - Open your browser and navigate to the IP address shown in Serial Monitor (e.g., `http://192.168.1.100`)\n   - **Login with:** Username: `admin`, Password: `admin123`\n   - ⚠️ **Change the password immediately** for security\n\n2. **Available Settings**:\n\n   **Basic Configuration:**\n   - **WiFi Settings**: Change network credentials, Reset WiFi button\n   - **Web Authentication**: Change username and password\n   - **Board Configuration**: Board type selection, Camera/GPS/Cellular toggles\n\n   **Notification Services:**\n   - **Pushbullet Settings**: Enable/disable, API token, connection mode, **Test button**\n   - **Email Settings**: Enable/disable, SMTP server/port, credentials, recipient, connection mode, **Test button**\n   - **Telegram Settings**: Enable/disable, bot token, chat ID, connection mode, **Test button**\n   - **SMS Settings** (SIM7670G only): Enable/disable, phone number, connection mode\n\n   **Cellular Configuration** (SIM7670G only):\n   - Enable/disable cellular modem\n   - APN configuration\n   - Connection mode per service\n   - Status: Operator name, signal strength\n\n   **Environmental Sensor:**\n   - **BMP180 Sensor**: Enable/disable, I2C pin configuration (SDA/SCL)\n   - Include sensor data in notifications toggle\n   - Live readings: Temperature, Pressure, Altitude\n\n   **Inputs Configuration** (up to 4 inputs):\n   - Enable/disable each input\n   - Custom name for each input\n   - GPIO pin assignment (board-specific safe defaults)\n   - Mode (Toggle or Momentary)\n   - Custom ON and OFF messages with `{timestamp}` placeholder\n   - **Camera trigger**: Capture photo when input triggers (camera boards only)\n   - **GPS inclusion**: Include GPS coordinates in notification (SIM7670G only)\n\n   **General Settings:**\n   - Notification title\n   - Timezone offset (dropdown with major timezones)\n\n3. **Web Interface Features**:\n   - Live status display (WiFi, IP, all input states, uptime)\n   - **System Logs** - View last 100 events (triggers, notifications, errors)\n   - **Test buttons** for each notification service\n   - Save configuration (persists across reboots)\n   - Restart device remotely\n   - All settings stored in non-volatile memory\n   - Password-protected (HTTP Basic Authentication)\n\n4. **Switch Modes**:\n   - **Toggle Mode** (default): Sends notifications on both state changes\n     - Use for: Door sensors, power monitors, window sensors\n     - Notifies when: Device turns ON and when it turns OFF\n\n   - **Momentary Mode**: Only sends notification when switch goes HIGH\n     - Use for: Doorbells, motion detectors, push buttons\n     - Notifies when: Trigger detected (ignores release)\n\n5. **Example Custom Messages**:\n\n   **Toggle Mode (door sensor):**\n   ```\n   ON:  \"🟢 Garage door opened at {timestamp}\"\n   OFF: \"🔴 Garage door closed at {timestamp}\"\n   ```\n\n   **Momentary Mode (doorbell):**\n   ```\n   ON:  \"🔔 Doorbell pressed at {timestamp}\"\n   OFF: (not used in momentary mode)\n   ```\n\n   **Momentary Mode (motion detector):**\n   ```\n   ON:  \"⚠️ Motion detected at {timestamp}\"\n   ```\n\n### Setting Up Notification Services\n\n#### Pushbullet Setup\n1. Go to https://www.pushbullet.com/#settings/account\n2. Create an Access Token\n3. Copy the token and paste it in the web interface\n4. Enable Pushbullet notifications\n\n#### Email Setup (Gmail Example)\n1. **Enable 2-Factor Authentication** on your Google account\n2. Go to https://myaccount.google.com/apppasswords\n3. Create an App Password (select \"Mail\" and your device)\n4. In the web interface:\n   - SMTP Server: `smtp.gmail.com`\n   - SMTP Port: `465` (SSL) or `587` (TLS)\n   - Your Email: your Gmail address\n   - Password: the 16-character app password (no spaces)\n   - Recipient Email: where you want to receive notifications\n5. Enable Email notifications\n\n**Other Email Providers:**\n- **Outlook/Hotmail**: `smtp-mail.outlook.com`, Port `587`\n- **Yahoo**: `smtp.mail.yahoo.com`, Port `465` or `587`\n- **Custom SMTP**: Enter your provider's SMTP settings\n\n#### Telegram Setup\n1. **Create a Bot**:\n   - Open Telegram and search for `@BotFather`\n   - Send `/newbot` and follow instructions\n   - Copy the Bot Token (format: `123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11`)\n\n2. **Get Your Chat ID**:\n   - Search for `@userinfobot` on Telegram\n   - Start a chat and it will send you your Chat ID (e.g., `123456789`)\n   - Or send a message to your bot, then visit: `https://api.telegram.org/bot\u003cYourBotToken\u003e/getUpdates`\n\n3. In the web interface:\n   - Paste your Bot Token\n   - Paste your Chat ID\n   - Enable Telegram notifications\n\n4. **Start your bot**: Send `/start` to your bot on Telegram\n\n#### SMS Setup (SIM7670G Boards Only)\n1. Insert a Nano SIM card with an active data plan\n2. In the web interface:\n   - Navigate to **\"Cellular / 4G Configuration\"**\n   - Enable cellular modem\n   - Enter your carrier's APN (e.g., \"internet\", \"wholesale\", \"fast.t-mobile.com\")\n   - Navigate to **\"SMS Settings\"**\n   - Enable SMS notifications\n   - Enter recipient phone number with country code (e.g., \"+1234567890\")\n3. Device will connect to cellular network on boot\n4. SMS will be sent via cellular modem when inputs trigger\n\n### Board Selection \u0026 Configuration\n\nNavigate to the **\"Board Configuration\"** section in the web interface to select your board type:\n\n#### Quick Comparison\n\n| Feature | Generic ESP32-S3 | Waveshare SIM7670G | Freenove CAM |\n|---------|------------------|-------------------|--------------|\n| **WiFi** | ✅ | ✅ | ✅ |\n| **Cellular/4G** | ❌ | ✅ | ❌ |\n| **Camera** | ❌ | ✅ OV2640 | ✅ OV2640 |\n| **GPS** | ❌ | ✅ | ❌ |\n| **SD Card** | ❌ | ✅ | ✅ |\n| **SMS** | ❌ | ✅ | ❌ |\n| **Pushbullet** | ✅ | ✅ | ✅ |\n| **Email** | ✅ | ✅ | ✅ |\n| **Telegram** | ✅ | ✅ | ✅ |\n| **Default Pins** | 1, 2, 3, 47 | 21, 38, 39, 40 | Board-specific |\n| **Pinout Diagram** | [View](docs/images/ESP32-S3%20Wroom.png) | [View](docs/images/ESP32-S3%20SIM7670G%204G%20Development%20Board.jpg) | [View](docs/images/SeeedStudio%20ESP32S3.jpg) |\n| **Best For** | Basic monitoring | Full-featured remote | WiFi camera alerts |\n\n#### Option 1: Generic ESP32-S3\n- **Features**: WiFi notifications only\n- **Supported Services**: Pushbullet, Email, Telegram\n- **Default GPIO Pins**: 1, 2, 3, 47\n- **Use Case**: Cost-effective monitoring without camera/GPS\n- **Configuration**: Select \"Generic ESP32-S3\" from dropdown\n- **Pinout**: See [Generic ESP32-S3 Wroom pinout diagram](docs/images/ESP32-S3%20Wroom.png)\n\n#### Option 2: ESP32-S3-SIM7670G-4G (Waveshare)\n- **Features**: WiFi + Cellular + Camera + GPS + SD Card\n- **Supported Services**: All (Pushbullet, Email, Telegram, SMS)\n- **Default GPIO Pins**: 21, 38, 39, 40 (safe pins that avoid modem/camera conflicts)\n- **Additional Hardware Required**:\n  - Nano SIM card with data plan\n  - SD card (FAT32, Class 10 recommended)\n- **Configuration**:\n  - Select \"ESP32-S3-SIM7670G-4G (Waveshare)\" from dropdown\n  - Enable Camera checkbox for photo capture\n  - Enable GPS checkbox for location tracking\n  - Enable Cellular checkbox for mobile connectivity\n- **Pinout**: See [Waveshare SIM7670G pinout diagram](docs/images/ESP32-S3%20SIM7670G%204G%20Development%20Board.jpg)\n\n#### Option 3: Freenove ESP32-S3 CAM\n- **Features**: WiFi + Camera + SD Card\n- **Supported Services**: Pushbullet, Email, Telegram\n- **Default GPIO Pins**: Board-specific safe pins\n- **Additional Hardware Required**: SD card (FAT32 formatted)\n- **Configuration**:\n  - Select \"Freenove ESP32-S3 CAM\" from dropdown\n  - Enable Camera checkbox for photo capture\n- **Pinout**: See [Seeed Studio/Freenove pinout diagram](docs/images/SeeedStudio%20ESP32S3.jpg)\n\n### Advanced Features Setup\n\n#### 📷 Camera \u0026 Photo Capture\n\n**Hardware Setup:**\n- Ensure OV2640 camera is properly connected\n- Insert FAT32-formatted SD card (8-32GB recommended)\n- Enable PSRAM in Arduino IDE (Tools → PSRAM → OPI PSRAM)\n\n**Software Configuration:**\n1. In web interface, navigate to **\"Board Configuration\"**\n2. Select appropriate board (SIM7670G or Freenove)\n3. Check **\"Enable Camera (OV2640)\"**\n4. Click \"Save Configuration\"\n5. Device will initialize camera on restart\n\n**Per-Input Photo Triggers:**\n1. Navigate to **\"Inputs Configuration\"**\n2. For each input, check **\"Capture Photo\"** to enable photo on trigger\n3. Photos are automatically attached to Email and Telegram notifications\n4. Photos saved to SD card with timestamp (e.g., `/20251015_143045.jpg`)\n\n**Status Indicators:**\n- Web interface shows: \"📷 Camera: Ready\" when initialized\n- \"💾 SD Card: XXX MB\" when card detected\n- Error messages if camera or SD card fails\n\n#### 🛰️ GPS/GNSS Location Tracking\n\n**Requirements:**\n- ESP32-S3-SIM7670G-4G board only\n- Cellular modem must be enabled\n- Clear view of sky for GPS fix (may take 1-2 minutes outdoors)\n\n**Configuration:**\n1. Enable **Cellular Modem** in web interface\n2. Check **\"Enable GPS/GNSS\"** in Board Configuration\n3. GPS powers on automatically with modem\n\n**Per-Input GPS:**\n1. Navigate to **\"Inputs Configuration\"**\n2. For each input, check **\"Include GPS Location\"**\n3. Location coordinates will be included in notifications when input triggers\n4. Format: \"GPS: Lat: 40.7128, Lon: -74.0060, Alt: 10.0m (4 sats)\"\n\n**Status:**\n- Web interface shows satellite count and fix status\n- \"GPS: Fix (8 sats)\" when locked\n- \"GPS: Searching\" when acquiring signal\n\n#### 📶 Cellular/4G Connectivity\n\n**Hardware Requirements:**\n- ESP32-S3-SIM7670G-4G board\n- Nano SIM card with active data plan\n- Compatible carrier (most GSM/LTE carriers supported)\n\n**Initial Setup:**\n1. Power off device and insert Nano SIM card\n2. Power on and navigate to web interface\n3. In **\"Cellular / 4G Configuration\"**:\n   - Check **\"Enable Cellular Modem\"**\n   - Enter APN for your carrier:\n     - T-Mobile: `fast.t-mobile.com` or `wholesale`\n     - AT\u0026T: `broadband` or `phone`\n     - Verizon: `vzwinternet`\n     - Other carriers: Check carrier documentation\n4. Save configuration and restart\n\n**Connection Modes:**\n\nFor each notification service, choose:\n- **WiFi Only**: Use WiFi connection (default, most reliable for Pushbullet/Email/Telegram)\n- **Cellular Only**: Use mobile data (best for areas without WiFi)\n- **WiFi with Cellular Backup**: Try WiFi first, fall back to cellular if WiFi unavailable\n\n**Status Monitoring:**\n- Cellular status shown in web interface:\n  - \"📶 Cellular: Connected to T-Mobile (Signal: 25)\"\n  - Operator name and signal strength\n  - Connection state (Connected/Disconnected)\n\n**Use Cases:**\n- Remote locations without WiFi\n- Backup connectivity when WiFi fails\n- Mobile installations (vehicles, portable devices)\n\n#### 🌡️ Environmental Monitoring (BMP180)\n\n**Hardware Setup:**\n```\nBMP180 Sensor     ESP32-S3\n─────────────     ────────\nVCC (3.3V)   -\u003e   3.3V\nGND          -\u003e   GND\nSDA          -\u003e   GPIO21 (default, configurable)\nSCL          -\u003e   GPIO22 (default, configurable)\n```\n\n**Software Configuration:**\n1. Install **\"Adafruit BMP085 Library\"** in Arduino IDE\n2. In web interface, navigate to **\"BMP180 Sensor\"** section\n3. Check **\"Enable BMP180 Sensor\"**\n4. Configure I2C pins (default: SDA=21, SCL=22)\n5. Check **\"Include sensor data in notifications\"**\n6. Save configuration\n\n**Live Readings:**\n- Web interface displays real-time data:\n  - 🌡️ Temperature: 22.5°C / 72.5°F\n  - 🔽 Pressure: 1013.2 hPa / 29.92 inHg\n  - ⛰️ Altitude: 123.4 m / 404.9 ft\n\n**In Notifications:**\nWhen enabled, sensor data is automatically appended:\n```\nInput 1 ON at 2025-10-15 14:30:45\n\n🌡️  Temperature: 22.5°C / 72.5°F\n🔽 Pressure: 1013.2 hPa / 29.92 inHg\n⛰️  Altitude: 123.4 m / 404.9 ft\n```\n\n**Troubleshooting:**\n- If \"⚠️ Sensor not detected\" appears:\n  - Verify wiring connections\n  - Check I2C pin configuration\n  - Try different GPIO pins if conflict exists\n  - See [BMP180_SETUP.md](BMP180_SETUP.md) for detailed guide\n\n### Changing WiFi Networks\n\nIf you need to connect to a different WiFi network:\n\n1. **Method 1: Reset via Web Interface** (Recommended)\n   - Log in to the web interface\n   - Go to the WiFi section\n   - Click the red \"Reset WiFi\" button\n   - Confirm the action\n   - Device will restart in Access Point mode\n   - Connect to `ESP32-Notifier-Setup` network (password: `setup123`)\n   - Navigate to `http://192.168.4.1`\n   - Configure new WiFi credentials\n\n2. **Method 2: Edit via Web Interface**\n   - If you can still access the device on your network\n   - Simply update the SSID and Password fields\n   - Click \"Save Configuration\"\n   - Device will connect to the new network\n\n3. **Method 3: Re-flash Firmware**\n   - If you can't access the device at all\n   - Re-upload the sketch via Arduino IDE\n   - Device will start fresh in AP mode\n\n## Troubleshooting\n\n### General Issues\n- **⚠️ Compilation error \"Sketch too big\" or \"text section exceeds available space\" ⚠️**:\n  - **THIS IS THE #1 ISSUE - CHECK PARTITION SCHEME FIRST!**\n  - Go to Tools → Partition Scheme → **\"Huge APP (3MB No OTA/1MB SPIFFS)\"**\n  - This setting is **MANDATORY** for the sketch to fit in flash memory\n  - The default partition scheme is too small and will always fail\n- **WiFi won't connect**: Check SSID and password in web interface or code\n- **Can't access web interface**: Check Serial Monitor for IP address; ensure you're on the same network\n- **Time shows incorrect**: Adjust GMT offset in web interface (e.g., -14400 for EDT, -18000 for EST, 3600 for CET)\n- **False triggers**: Increase debounce delay (currently 50ms in code)\n- **Settings not persisting**: Configuration is saved to ESP32 flash memory automatically when you click \"Save Configuration\"\n- **Serial Monitor blank**: Enable \"USB CDC On Boot\" in Arduino IDE Tools menu\n\n### Notification Service Issues\n- **Pushbullet not working**:\n  - Verify token at https://www.pushbullet.com/#settings/account\n  - Ensure Pushbullet is enabled in web interface\n\n- **Email not sending**:\n  - Check SMTP server and port settings\n  - For Gmail: Must use App Password (not regular password) with 2FA enabled\n  - Verify your email provider allows SMTP access\n  - Check Serial Monitor for specific error messages\n\n- **Telegram not working**:\n  - Ensure you've sent `/start` to your bot first\n  - Verify Chat ID is correct (use @userinfobot)\n  - Check that bot token is valid\n  - Make sure Telegram is enabled in web interface\n\n- **SMS not sending**:\n  - Ensure cellular modem is enabled and connected\n  - Verify phone number includes country code (e.g., +1 for US)\n  - Check APN configuration for your carrier\n  - Confirm SIM card has active service and credit\n  - View Serial Monitor for AT command errors\n\n### Advanced Features Issues\n\n- **Camera not initializing**:\n  - Check PSRAM is enabled: Tools → PSRAM → \"OPI PSRAM\"\n  - Verify partition scheme: \"Huge APP (3MB No OTA/1MB SPIFFS)\"\n  - Ensure camera connections are secure\n  - Try disabling camera in code if not needed: comment out `#define HAS_CAMERA_LIB`\n  - Check Serial Monitor for specific error codes\n\n- **SD card not detected**:\n  - Verify SD card is FAT32 formatted (not exFAT or NTFS)\n  - Use Class 10 card, 8-32GB capacity\n  - Check card is fully inserted\n  - Try different SD card if available\n  - Some boards use 1-bit mode, others 4-bit (handled automatically)\n  - Serial Monitor shows: \"SD card not available\" if failed\n\n- **GPS not getting fix**:\n  - Requires clear view of sky (won't work indoors)\n  - Wait 1-2 minutes for initial fix (cold start)\n  - Ensure cellular modem is enabled (GPS uses modem)\n  - Check antenna connection on SIM7670G board\n  - Serial Monitor shows satellite count when searching\n  - Some locations have poor GPS coverage\n\n- **Cellular modem not connecting**:\n  - Verify SIM card is inserted correctly (contacts facing down)\n  - Check SIM has active data plan\n  - Confirm APN matches your carrier (case-sensitive)\n  - Ensure SIM is not PIN-locked\n  - Wait 30-60 seconds for network registration\n  - Try different carrier if available (roaming)\n  - Serial Monitor shows modem AT command responses\n\n- **BMP180 sensor not found**:\n  - Verify wiring: VCC-\u003e3.3V, GND-\u003eGND, SDA-\u003eGPIO21, SCL-\u003eGPIO22\n  - Check I2C pin configuration matches wiring\n  - Try different GPIO pins if conflict with other features\n  - Use an I2C scanner sketch to verify sensor address (0x77)\n  - Ensure sensor module is powered (some have voltage regulators)\n  - See [BMP180_SETUP.md](BMP180_SETUP.md) for detailed troubleshooting\n\n- **Photos not attaching to notifications**:\n  - SD card must be initialized successfully\n  - Email: Check SMTP server supports attachments (some don't)\n  - Telegram: Requires active internet connection (WiFi or cellular)\n  - Photos are saved to SD card even if attachment fails\n  - Check Serial Monitor for file write errors\n\n- **Board-specific GPIO conflicts**:\n  - Each board has different safe GPIO pins\n  - SIM7670G: Avoid pins 17, 18, 41, 42 (modem), 4-16, 34-37 (camera)\n  - Freenove: Avoid pins 4, 5 (camera I2C)\n  - Use web interface defaults which are pre-configured per board\n  - Strapping pins (0, 1, 2, 3, 45, 46) may cause boot issues\n\n## Version History\n\n### v3.2 (October 2025) - Current\n- Added BMP180 temperature/pressure sensor support\n- Real-time environmental monitoring in web interface\n- Automatic sensor data inclusion in notifications\n- Configurable I2C pins for flexible sensor connection\n\n### v3.1 (September 2025)\n- Cellular/4G support with SIM7670G modem integration\n- SMS notifications via cellular modem\n- Intelligent connection modes (WiFi/Cellular/Hybrid)\n- HTTP over cellular for Pushbullet and Telegram\n- Per-service connection mode configuration\n- Cellular status monitoring (operator, signal strength)\n\n### v3.0 (August 2025)\n- Multi-board support (Generic, SIM7670G, Freenove)\n- OV2640 camera integration with photo capture\n- Photo attachments in Email and Telegram\n- GPS/GNSS positioning support\n- SD card storage for photos\n- Per-input camera and GPS triggers\n- Board-specific GPIO pin optimization\n\n### v2.0 (July 2025)\n- WiFi network scanner in AP mode\n- Web-based configuration interface\n- Multi-input support (up to 4 switches)\n- System logging with web viewer\n- WiFi auto-reconnection\n- Watchdog timer\n- Web authentication\n- Non-blocking operations\n- Notification retry queue\n- ArduinoJson security improvements\n\nSee [RELEASE_NOTES.md](RELEASE_NOTES.md) for complete changelog.\n\n## Serial Monitor Output\n\n### Basic Configuration (Generic ESP32-S3)\n```\n=== ESP32-Notifier v3.2-BMP180 ===\n[BOOT] Serial initialized\n[BOOT] Free Heap: 320544 bytes\n[BOOT] Chip: ESP32-S3 Rev 0\n[BOOT] Initializing watchdog...\n[BOOT] Watchdog timer enabled (30s)\n[BOOT] Loading preferences...\n[BOOT] Preferences loaded OK\n[BOOT] Checking board configuration...\n[BOOT] Board type: 0 (0=Generic, 1=SIM7670G, 2=Freenove)\n[BOOT] Board: Generic ESP32-S3\n[BOOT] BMP180 sensor disabled, skipping\n[BOOT] Configuring input pins...\n[BOOT] Input 1 (Front Door) on pin 21: LOW\nConnecting to WiFi: YourNetwork\n...\nWiFi connected!\nIP address: 192.168.1.100\nWaiting for time sync...\nTime synchronized!\nWeb server started\nConfiguration page: http://192.168.1.100\n\n[INPUT] Pin 21 changed to 1\n[INPUT] State change confirmed! Input: Front Door\nDevice turned ON at 2025-10-15 14:30:45\n--- Sending Notifications ---\nSending Pushbullet...\n✓ Pushbullet sent! Code: 200\nSending Email...\n✓ Email sent!\nSending Telegram...\n✓ Telegram sent! Code: 200\n--- Notifications Complete ---\n```\n\n### Advanced Configuration (SIM7670G with Camera, GPS, BMP180)\n```\n=== ESP32-Notifier v3.2-BMP180 ===\n[BOOT] Board: ESP32-S3-SIM7670G-4G (Waveshare)\n[BOOT] Cellular enabled: 1, Camera: 1, GPS: 1\n[BOOT] Initializing cellular modem...\n[MODEM] Power enable HIGH\n[MODEM] Checking modem...\n[MODEM] Modem responding: OK\n[MODEM] IMEI: 867584034512345\n[MODEM] Network registration...\n[MODEM] ✓ Connected to T-Mobile (Signal: 25)\n[BOOT] Modem initialized successfully\n[BOOT] Cellular network connected\n[BOOT] Initializing SD card...\n[SD] Card type: SDHC\n[SD] Card size: 15360 MB\n[SD] ✓ SD card mounted\n[BOOT] SD card ready\n[BOOT] Initializing camera...\nPSRAM found - using conservative settings\n✓ BMP180 sensor initialized successfully\n[BOOT] Camera ready\n[BOOT] Initializing GPS...\nGPS initialized via modem\n[BOOT] GPS ready\n[BOOT] Initializing BMP180 sensor...\nI2C pins - SDA: GPIO21, SCL: GPIO22\n✓ BMP180 sensor initialized successfully\n[SUCCESS] BMP180 sensor initialized\n[BOOT] BMP180 sensor ready\n[BOOT] WiFi connected!\n[BOOT] IP address: 192.168.1.100\n[BOOT] === Setup complete ===\n\n[INPUT] Input: Garage Door triggered\nCapturing photo to SD card...\nFrame buffer size: 24576 bytes\n✓ Photo saved: /20251015_143045.jpg (24576 bytes)\nGPS: Lat: 40.7128, Lon: -74.0060, Alt: 10.0m (6 sats)\n--- Sending Notifications ---\n✓ Pushbullet sent (cellular)! Code: 200\n✓ Email sent with photo attachment!\n✓ Telegram sent with photo! Code: 200\n✓ SMS sent to +1234567890\nAdded BMP180 sensor data to notification\n--- Notifications Complete ---\n```\n\n### Example Notification with All Features\n```\nNotification received:\n─────────────────────\nTitle: Garage Door Alert\nBody:\nGarage door opened at 2025-10-15 14:30:45\n\n📷 Photo: /20251015_143045.jpg\n🛰️ GPS: Lat: 40.7128, Lon: -74.0060, Alt: 10.0m (6 sats)\n\n🌡️  Temperature: 22.5°C / 72.5°F\n🔽 Pressure: 1013.2 hPa / 29.92 inHg\n⛰️  Altitude: 123.4 m / 404.9 ft\n─────────────────────\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcyberpods%2Fesp32-notifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcyberpods%2Fesp32-notifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcyberpods%2Fesp32-notifier/lists"}