A professional iPad application for mapping and analyzing EnOcean wireless devices using a USB TCM310 dongle. Features a modern spreadsheet-style UI for real-time device discovery, packet analysis, and CSV export capabilities.
- Real-time Device Discovery: Automatically detect and list all EnOcean devices within range
- Packet Analysis: Capture and display all EnOcean packets with RSSI, payload, and status information
- Spreadsheet UI: Clean, tabular interface inspired by modern spreadsheet applications
- CSV Export: Generate and share CSV files via email, SMS, or save to files
- DriverKit Integration: Native USB serial communication using iPadOS DriverKit
- ESP3 Protocol: Full support for EnOcean Serial Protocol 3 (ESP3)
- iPad with M1 chip or later (DriverKit requirement)
- iPad Pro (M1/M2)
- iPad Air (M1)
- EnOcean USB dongle (TCM310 or compatible FTDI-based device)
- USB-C cable or adapter to connect dongle to iPad
- iPadOS 16.0 or later
- Xcode 14.0 or later (for development)
- Apple Developer account (for DriverKit entitlements)
EnoceanMapper/
├── App/ # iPad application
│ ├── EnoceanMapperApp.swift # App entry point
│ ├── ContentView.swift # Main UI with spreadsheet layout
│ ├── MapperViewModel.swift # View model for state management
│ ├── SerialPortManager.swift # Serial communication layer
│ ├── Models.swift # Data models and CSV export
│ ├── Info.plist # App configuration
│ └── App.entitlements # App entitlements
├── Driver/ # DriverKit extension
│ ├── EnoceanDriver.swift # USB serial driver implementation
│ ├── Info.plist # Driver configuration
│ └── Driver.entitlements # Driver entitlements
└── Shared/ # Shared code
└── ESP3Protocol.swift # EnOcean ESP3 protocol implementation
Since this is command-line generated code, you'll need to create the Xcode project manually:
- Open Xcode and create a new App project
- Set the following:
- Product Name: EnoceanMapper
- Bundle Identifier: com.yourcompany.enoceanmapper (use your own)
- Interface: SwiftUI
- Language: Swift
- Platform: iPad
- In Xcode: File → New → Target
- Choose DriverKit → System Extension
- Set:
- Product Name: EnoceanDriver
- Bundle Identifier: com.yourcompany.enoceanmapper.driver
- Delete the default Swift files created by Xcode
- Drag and drop files from this repository:
App/*→ App targetDriver/*→ Driver targetShared/*→ Both targets (check both in File Inspector)
Update the bundle identifiers in both targets to match your Apple Developer account:
App Target:
- Bundle ID:
com.yourcompany.enoceanmapper
Driver Target:
- Bundle ID:
com.yourcompany.enoceanmapper.driver(must be prefixed with app bundle ID)
Replace the driver bundle ID if you changed it:
<key>com.apple.developer.driverkit.communicates-with-drivers</key>
<array>
<string>com.yourcompany.enoceanmapper.driver</string>
</array>The FTDI vendor ID (0x0403) is already configured. For production release, you'll need to request this entitlement from Apple.
For development, Xcode will auto-sign with development entitlements. For production:
- Visit: https://developer.apple.com/contact/request/system-extension/
- Fill out the form requesting DriverKit entitlements for:
- Vendor ID: 0x0403 (FTDI)
- Use Case: EnOcean wireless device mapping with TCM310 USB dongle
- Wait for Apple approval (typically 1-2 weeks)
- Connect your M1 iPad to your Mac
- Select your iPad as the deployment target
- Build and run (⌘R)
First-time setup on iPad:
- Install the app on your iPad
- Go to Settings → General → DriverKit
- Find EnoceanDriver and toggle it ON
- Connect the EnOcean USB dongle
- Connect USB Dongle: Plug the EnOcean TCM310 dongle into your iPad via USB-C
- Start Listening: Tap the green "Start Listening" button
- Trigger Devices: Press buttons, trigger sensors, etc. to make devices transmit
- View Results: Switch between "Devices" and "Packets" tabs to see data
Shows discovered devices with:
- Device ID: Unique 8-digit hex identifier (e.g.,
01A2B3C4) - Type: Device type based on R-ORG (Switch, Sensor, Contact, etc.)
- Packets: Total number of packets received from this device
- RSSI: Signal strength (best and average in dBm)
- First/Last Seen: Timestamps of first and most recent packet
Shows all captured packets with:
- Time: When the packet was received
- Device ID: Sender device identifier
- Type: Packet type (color-coded)
- RSSI: Signal strength (-60 dBm = excellent, -75 dBm = good, <-75 dBm = weak)
- Payload: Raw data bytes in hexadecimal
- Status: Status byte in binary format
- Tap the Export button in the control panel
- Choose:
- Export Devices: CSV file with device summary
- Export Packets: CSV file with all packets
- Export All Data: Combined CSV with both
- Share via:
- Save to Files: Save to iCloud Drive or local storage
- Email: Send as attachment
- Messages: Share via SMS/iMessage
- AirDrop: Send to nearby devices
Device ID,Device Type,RORG,First Seen,Last Seen,Packet Count,Best RSSI,Worst RSSI,Average RSSI
01A2B3C4,"Switch (RPS)",0xF6,2025-01-15T10:30:00Z,2025-01-15T10:35:00Z,12,-65,-72,-68Timestamp,Device ID,Device Type,RORG,RSSI,Payload (Hex),Status (Binary),SubTel#
2025-01-15T10:30:00Z,01A2B3C4,"Switch (RPS)",0xF6,-65,"F6 10",00001000,0- Check USB Connection: Ensure dongle is properly connected
- Enable Driver: Go to Settings → General → DriverKit and enable EnoceanDriver
- Check Permissions: App should request serial device access
- Trigger Devices: EnOcean devices only transmit when activated (button press, motion, etc.)
- Check iPad Model: Only M1/M2 iPads support DriverKit
- Rebuild Project: Clean build folder and rebuild
- Check Bundle IDs: Ensure driver bundle ID is prefixed with app bundle ID
- Check Entitlements: Verify entitlements are properly configured
- Check Baud Rate: TCM310 default is 57600 baud (configured automatically)
- Cable Quality: Use high-quality USB cables
- EMI Interference: Move away from sources of electromagnetic interference
- Move Closer: EnOcean typical range is 30-300m depending on obstacles
- Remove Obstacles: Metal and concrete significantly reduce signal
- Check Antenna: Some dongles have external antennas
| R-ORG | Value | Description | Common Devices |
|---|---|---|---|
| RPS | 0xF6 | Repeated Switch | Push buttons, wall switches |
| 1BS | 0xD5 | 1 Byte Sensor | Door/window contacts |
| 4BS | 0xA5 | 4 Byte Sensor | Temperature, humidity, motion sensors |
| VLD | 0xD2 | Variable Length | Complex devices |
| UTE | 0xD4 | Universal Teach-In | Learning mode devices |
+------+--------+------+------+------+-----------+
| Sync | Header | CRC | Data | Opt | Data CRC |
| 0x55 | 4 bytes| 1 | N | M | 1 |
+------+--------+------+------+------+-----------+
- Sync Byte: Always 0x55
- Header: Data length (2) + Optional length (1) + Packet type (1)
- CRC8: Separate checksums for header and data
- Baud Rate: 57600 (TCM310 default)
- Data Bits: 8
- Parity: None
- Stop Bits: 1
- Flow Control: Software (XON/XOFF)
- Packet Buffer: Automatic overflow protection
- Max Packets: Limited only by device memory
- Recommended: Clear data after exporting for long sessions
- Serial reading on background thread
- UI updates on main thread via Combine
- Thread-safe data access with @Published properties
# Clone repository
git clone https://github.com/yourusername/EnoceanMapper.git
# Open in Xcode
open EnoceanMapper.xcodeprojFor UI development without physical hardware:
- Comment out serial port connection in
SerialPortManager.swift - Use mock data generator (see development branch)
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Submit a pull request
- EnOcean Serial Protocol 3 (ESP3) Specification
- TCM310 Data Sheet
- Apple DriverKit Documentation
- WWDC22: Bring your driver to iPad
MIT License - See LICENSE file for details
For issues and questions:
- Open an issue on GitHub
- Email: support@yourcompany.com
- EnOcean GmbH for the ESP3 protocol specification
- Apple for DriverKit framework
- FTDI for USB-serial chipsets
Made with ❤️ for the EnOcean community