From 7e9ddf7ac724409630a0b4b5640a62c84e799e18 Mon Sep 17 00:00:00 2001 From: lygris Date: Thu, 13 Nov 2025 11:39:21 -0600 Subject: [PATCH 01/31] Add CC1101 docs --- content/components/_index.md | 1 + content/components/cc1101.md | 130 ++++++++++++++++++++++++++ content/components/images/cc1101.webp | Bin 0 -> 22576 bytes 3 files changed, 131 insertions(+) create mode 100644 content/components/cc1101.md create mode 100644 content/components/images/cc1101.webp diff --git a/content/components/_index.md b/content/components/_index.md index b00c2c89ff..ad39461cc4 100644 --- a/content/components/_index.md +++ b/content/components/_index.md @@ -1036,6 +1036,7 @@ Used for creating infrared (IR) or radio frequency (RF) remote control transmitt ESPHome to cellular networks. **Does not encompass Wi-Fi.** {{< imgtable >}} +"CC1101","components/cc1101","cc1101.webp","" "IR Remote Climate","components/climate/climate_ir","air-conditioner-ir.svg","dark-invert" "Remote Receiver","components/remote_receiver","remote.svg","dark-invert" "Remote Transmitter","components/remote_transmitter","remote.svg","dark-invert" diff --git a/content/components/cc1101.md b/content/components/cc1101.md new file mode 100644 index 0000000000..9b4e056142 --- /dev/null +++ b/content/components/cc1101.md @@ -0,0 +1,130 @@ +--- +title: CC1101 Low-Power Sub-1 GHz RF Transceiver +description: Instructions for setting up CC1101 RF Transceiver in ESPHome. +image: cc1101.webp +keywords: [cc1101] +--- + + +The **CC1101** component provides a driver for the **Texas Instruments CC1101** Sub-1 GHz RF Transceiver. +It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using the standard +[Remote Transmitter](remote_transmitter.md) and [Remote Receiver](remote_receiver.md) components. + +This component requires the [SPI Component](spi.md) to be enabled. + +{{< img src="cc1101.webp" alt="Image" width="50.0%" class="align-center" >}} + +## Component Configuration + +```yaml +# Minimal Example +cc1101: + cs_pin: GPIOXX + gdo0_pin: GPIOXX +```` + +## Configuration Variables + + - **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. + - **gdo0\_pin** (**Required**, [Pin](pin.md)): The GDO0 pin on the CC1101. This pin is used for sending and + receiving interrupt signals and raw data. + - **id** (*Optional*, [ID](id.md)): Manually specify the ID used for code generation. + - **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-70` to `11`. Default: `11`. + - **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. + Default: `0dB`. + - **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. + - **tuner** (*Optional*): Fine-tuning for the radio frequency settings. See [Tuner Configuration](https://www.google.com/search?q=%23tuner-configuration). + - **agc** (*Optional*): Advanced Automatic Gain Control settings. See [AGC Configuration](https://www.google.com/search?q=%23agc-configuration). + +## Tuner Configuration + +```yaml +# Example Tuner Configuration +cc1101: + cs_pin: GPIOXX + gdo0_pin: GPIOXX + tuner: + frequency: 433.92MHz + modulation: ASK/OOK + bandwidth: 203kHz + symbol_rate: 5000 +``` + + - **frequency** (*Optional*, frequency): The operating frequency (e.g., `433.92MHz`). Range: `300MHz` to + `928MHz`. Default: `433.92MHz`. + - **bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: + `203kHz`. + - **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. + - **modulation** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, + `GFSK`, `MSK`. + - **deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. + - **channel** (*Optional*, int): Channel number (added to base frequency). + - **channel\_spacing** (*Optional*, frequency): Spacing between channels. + - **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. + +## AGC Configuration +```yaml +# Example AGC Configuration +cc1101: + cs_pin: GPIOXX + gdo0_pin: GPIOXX + tuner: + frequency: 433.92MHz + modulation: ASK/OOK + bandwidth: 203kHz + symbol_rate: 5000 + agc: + magn_target: 24dB + max_lna_gain: 2.6dB + max_dvga_gan: -3 +``` + +Advanced users can fine-tune the Automatic Gain Control (AGC) settings. + + - **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). + - **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. + - **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. + +## Integration with Remote Receiver/Transmitter + +To use the CC1101 for receiving or transmitting signals, you must configure the standard +[Remote Receiver](https://www.google.com/search?q=remote_receiver.md) or [Remote Transmitter](https://www.google.com/search?q=remote_transmitter.md) components to use the **GDO0 pin** +defined in your CC1101 configuration. + +```yaml +# Example: Receiving raw data via GDO0 +remote_receiver: + pin: GPIOXX # Must match the 'gdo0_pin' in cc1101 config or GDO2 pin if connected + dump: all + +# Example: Transmitting raw data via GDO0 +remote_transmitter: + pin: GPIOXX # Must match the 'gdo0_pin' in cc1101 config or GDO2 pin if connected + carrier_duty_percent: 100% +``` + +## Troubleshooting + +### "FF0F was found" Error + +If you see a log entry stating `FF0F was found` or similar invalid versions (e.g., `0000`, `FFFF`) during +setup, this indicates an SPI communication failure. + + * Check your wiring, especially the **MISO** and **CSN** lines. + * Ensure the module is powered with a stable 3.3V source. + * This component implements a "burst read" fix specifically to address this issue on some CC1101 silicon revisions, + so persistent errors are likely physical connection issues. + +### Reset Issues + +This component uses a robust, non-blocking state machine that polls the `CHIP_RDYn` signal on the MISO line during +startup. This prevents race conditions where the ESP32 might attempt to configure the chip before the crystal has +stabilized. If you experience timeouts during the `RES` command, check your power supply stability. + +## See Also + + - [I²C Bus](/components/i2c) + - [Remote Receiver](/components/remote_receiver) + - [Remote Transmitter](/components/remote_transmitter) + - [SPI Component](/components/spi) + - [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) \ No newline at end of file diff --git a/content/components/images/cc1101.webp b/content/components/images/cc1101.webp new file mode 100644 index 0000000000000000000000000000000000000000..602fce4c5d62a017fb72c3c965f854d499114245 GIT binary patch literal 22576 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 Date: Thu, 13 Nov 2025 11:53:37 -0600 Subject: [PATCH 02/31] lint fixes --- content/components/cc1101.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 9b4e056142..7795ed2db7 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -5,7 +5,6 @@ image: cc1101.webp keywords: [cc1101] --- - The **CC1101** component provides a driver for the **Texas Instruments CC1101** Sub-1 GHz RF Transceiver. It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using the standard [Remote Transmitter](remote_transmitter.md) and [Remote Receiver](remote_receiver.md) components. @@ -21,6 +20,7 @@ This component requires the [SPI Component](spi.md) to be enabled. cc1101: cs_pin: GPIOXX gdo0_pin: GPIOXX + ```` ## Configuration Variables @@ -28,10 +28,12 @@ cc1101: - **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. - **gdo0\_pin** (**Required**, [Pin](pin.md)): The GDO0 pin on the CC1101. This pin is used for sending and receiving interrupt signals and raw data. + - **id** (*Optional*, [ID](id.md)): Manually specify the ID used for code generation. - **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-70` to `11`. Default: `11`. - **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. + - **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. - **tuner** (*Optional*): Fine-tuning for the radio frequency settings. See [Tuner Configuration](https://www.google.com/search?q=%23tuner-configuration). - **agc** (*Optional*): Advanced Automatic Gain Control settings. See [AGC Configuration](https://www.google.com/search?q=%23agc-configuration). @@ -52,17 +54,21 @@ cc1101: - **frequency** (*Optional*, frequency): The operating frequency (e.g., `433.92MHz`). Range: `300MHz` to `928MHz`. Default: `433.92MHz`. + - **bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. + - **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. - **modulation** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. + - **deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. - **channel** (*Optional*, int): Channel number (added to base frequency). - **channel\_spacing** (*Optional*, frequency): Spacing between channels. - **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. ## AGC Configuration + ```yaml # Example AGC Configuration cc1101: @@ -127,4 +133,4 @@ stabilized. If you experience timeouts during the `RES` command, check your powe - [Remote Receiver](/components/remote_receiver) - [Remote Transmitter](/components/remote_transmitter) - [SPI Component](/components/spi) - - [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) \ No newline at end of file + - [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) From 193427e96726e72e8d94ac37a23bc26e266bce3f Mon Sep 17 00:00:00 2001 From: lygris Date: Thu, 13 Nov 2025 12:05:45 -0600 Subject: [PATCH 03/31] More lint fixes --- content/components/cc1101.md | 52 ++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 7795ed2db7..4be55b8fed 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -25,18 +25,18 @@ cc1101: ## Configuration Variables - - **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. - - **gdo0\_pin** (**Required**, [Pin](pin.md)): The GDO0 pin on the CC1101. This pin is used for sending and - receiving interrupt signals and raw data. +- **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. +- **gdo0\_pin** (**Required**, [Pin](pin.md)): The GDO0 pin on the CC1101. This pin is used for sending and + receiving interrupt signals and raw data. - - **id** (*Optional*, [ID](id.md)): Manually specify the ID used for code generation. - - **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-70` to `11`. Default: `11`. - - **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. - Default: `0dB`. +- **id** (*Optional*, [ID](id.md)): Manually specify the ID used for code generation. +- **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-70` to `11`. Default: `11`. +- **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. + Default: `0dB`. - - **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. - - **tuner** (*Optional*): Fine-tuning for the radio frequency settings. See [Tuner Configuration](https://www.google.com/search?q=%23tuner-configuration). - - **agc** (*Optional*): Advanced Automatic Gain Control settings. See [AGC Configuration](https://www.google.com/search?q=%23agc-configuration). +- **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. +- **tuner** (*Optional*): Fine-tuning for the radio frequency settings. See [Tuner Configuration](https://www.google.com/search?q=%23tuner-configuration). +- **agc** (*Optional*): Advanced Automatic Gain Control settings. See [AGC Configuration](https://www.google.com/search?q=%23agc-configuration). ## Tuner Configuration @@ -52,20 +52,20 @@ cc1101: symbol_rate: 5000 ``` - - **frequency** (*Optional*, frequency): The operating frequency (e.g., `433.92MHz`). Range: `300MHz` to +- **frequency** (*Optional*, frequency): The operating frequency (e.g., `433.92MHz`). Range: `300MHz` to `928MHz`. Default: `433.92MHz`. - - **bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: +- **bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. - - **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. - - **modulation** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, +- **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. +- **modulation** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. - - **deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. - - **channel** (*Optional*, int): Channel number (added to base frequency). - - **channel\_spacing** (*Optional*, frequency): Spacing between channels. - - **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. +- **deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. +- **channel** (*Optional*, int): Channel number (added to base frequency). +- **channel\_spacing** (*Optional*, frequency): Spacing between channels. +- **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. ## AGC Configuration @@ -87,9 +87,9 @@ cc1101: Advanced users can fine-tune the Automatic Gain Control (AGC) settings. - - **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). - - **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. - - **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. +- **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). +- **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. +- **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. ## Integration with Remote Receiver/Transmitter @@ -129,8 +129,8 @@ stabilized. If you experience timeouts during the `RES` command, check your powe ## See Also - - [I²C Bus](/components/i2c) - - [Remote Receiver](/components/remote_receiver) - - [Remote Transmitter](/components/remote_transmitter) - - [SPI Component](/components/spi) - - [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) +- [I²C Bus](/components/i2c) +- [Remote Receiver](/components/remote_receiver) +- [Remote Transmitter](/components/remote_transmitter) +- [SPI Component](/components/spi) +- [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) From db07657502df02a5c6e56d7e33d5740697163892 Mon Sep 17 00:00:00 2001 From: lygris Date: Thu, 13 Nov 2025 12:08:32 -0600 Subject: [PATCH 04/31] final lint fixes --- content/components/cc1101.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 4be55b8fed..c37e0e7b10 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -116,9 +116,9 @@ remote_transmitter: If you see a log entry stating `FF0F was found` or similar invalid versions (e.g., `0000`, `FFFF`) during setup, this indicates an SPI communication failure. - * Check your wiring, especially the **MISO** and **CSN** lines. - * Ensure the module is powered with a stable 3.3V source. - * This component implements a "burst read" fix specifically to address this issue on some CC1101 silicon revisions, +- Check your wiring, especially the **MISO** and **CSN** lines. +- Ensure the module is powered with a stable 3.3V source. +- This component implements a "burst read" fix specifically to address this issue on some CC1101 silicon revisions, so persistent errors are likely physical connection issues. ### Reset Issues From ae1a4e5dff3e7b35d1a4f7d8594bd8cd3a83d19a Mon Sep 17 00:00:00 2001 From: lygris Date: Thu, 13 Nov 2025 12:17:50 -0600 Subject: [PATCH 05/31] fix img to be standard html --- content/components/cc1101.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index c37e0e7b10..32009a584c 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -11,7 +11,7 @@ It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using This component requires the [SPI Component](spi.md) to be enabled. -{{< img src="cc1101.webp" alt="Image" width="50.0%" class="align-center" >}} +Image ## Component Configuration From 88c38719b46f54cac64450e956d05d014b477e3c Mon Sep 17 00:00:00 2001 From: lygris Date: Sat, 15 Nov 2025 10:29:35 -0600 Subject: [PATCH 06/31] update with settings name changes --- content/components/cc1101.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 32009a584c..bcb6088164 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -47,19 +47,19 @@ cc1101: gdo0_pin: GPIOXX tuner: frequency: 433.92MHz - modulation: ASK/OOK - bandwidth: 203kHz + modulation_type: ASK/OOK + filter_bandwidth: 203kHz symbol_rate: 5000 ``` - **frequency** (*Optional*, frequency): The operating frequency (e.g., `433.92MHz`). Range: `300MHz` to `928MHz`. Default: `433.92MHz`. -- **bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: +- **filter_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. - **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. -- **modulation** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, +- **modulation_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. - **deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. @@ -76,8 +76,8 @@ cc1101: gdo0_pin: GPIOXX tuner: frequency: 433.92MHz - modulation: ASK/OOK - bandwidth: 203kHz + modulation_type: ASK/OOK + filter_bandwidth: 203kHz symbol_rate: 5000 agc: magn_target: 24dB From bcdd7d6748abf49d31ada9a0955959bb4ea56087 Mon Sep 17 00:00:00 2001 From: lygris Date: Sat, 15 Nov 2025 16:03:10 -0600 Subject: [PATCH 07/31] Update Docs to match latest commit. --- content/components/cc1101.md | 157 ++++++++++++++++++----------------- 1 file changed, 82 insertions(+), 75 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index bcb6088164..9876798d7a 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -20,112 +20,119 @@ This component requires the [SPI Component](spi.md) to be enabled. cc1101: cs_pin: GPIOXX gdo0_pin: GPIOXX - -```` + frequency: 433.92MHz +``` ## Configuration Variables -- **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. -- **gdo0\_pin** (**Required**, [Pin](pin.md)): The GDO0 pin on the CC1101. This pin is used for sending and - receiving interrupt signals and raw data. +### Hardware Settings -- **id** (*Optional*, [ID](id.md)): Manually specify the ID used for code generation. -- **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-70` to `11`. Default: `11`. -- **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. - Default: `0dB`. + - **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. + - **gdo0\_pin** (**Required**, [Pin](pin.md)): The pin connected to **GDO0** on the CC1101. + - **Note:** On ESP32, `remote_transmitter` **must** use the pin connected to **GDO0** to transmit successfully. -- **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. -- **tuner** (*Optional*): Fine-tuning for the radio frequency settings. See [Tuner Configuration](https://www.google.com/search?q=%23tuner-configuration). -- **agc** (*Optional*): Advanced Automatic Gain Control settings. See [AGC Configuration](https://www.google.com/search?q=%23agc-configuration). +### General Settings -## Tuner Configuration + - **frequency** (*Optional*, frequency): The operating frequency. Range: `300MHz` to `928MHz`. Default: `433.92MHz`. + - **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-30` to `11`. Default: `10`. + - **modulation\_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. + - **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. + - **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. + - **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. -```yaml -# Example Tuner Configuration -cc1101: - cs_pin: GPIOXX - gdo0_pin: GPIOXX - tuner: - frequency: 433.92MHz - modulation_type: ASK/OOK - filter_bandwidth: 203kHz - symbol_rate: 5000 -``` +### Tuner Settings + + - **filter\_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. + - **fsk\_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. + + - **channel** (*Optional*, int): Channel number (added to base frequency). + - **channel\_spacing** (*Optional*, frequency): Spacing between channels. + - **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. + + + + + + +### AGC (Automatic Gain Control) Settings -- **frequency** (*Optional*, frequency): The operating frequency (e.g., `433.92MHz`). Range: `300MHz` to - `928MHz`. Default: `433.92MHz`. +Advanced users can fine-tune the AGC dynamics. -- **filter_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: - `203kHz`. + - **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). + - **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. + - **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. + - **lna\_priority** (*Optional*, boolean): If true, decrease LNA gain before DVGA gain. + - **carrier\_sense\_abs\_thr** (*Optional*, int): Absolute RSSI threshold for Carrier Sense. + - **carrier\_sense\_rel\_thr** (*Optional*, enum): Relative RSSI threshold for Carrier Sense. + - **filter\_length\_fsk\_msk** (*Optional*, enum): Averaging length for FSK/MSK. + - **filter\_length\_ask\_ook** (*Optional*, enum): Averaging length for ASK/OOK. + - **freeze** (*Optional*, enum): AGC gain freeze behavior. + - **wait\_time** (*Optional*, enum): AGC wait time. + - **hyst\_level** (*Optional*, enum): AGC hysteresis level. -- **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. -- **modulation_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, - `GFSK`, `MSK`. +## Actions -- **deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. -- **channel** (*Optional*, int): Channel number (added to base frequency). -- **channel\_spacing** (*Optional*, frequency): Spacing between channels. -- **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. +This component provides actions to control the radio state, primarily used for coordinating transmission. -## AGC Configuration + - **cc1101.begin\_tx**: Wakes the radio and forces it into TX mode. This **must** be called before `remote_transmitter` starts sending data. + - **cc1101.end\_tx**: Puts the radio back into RX mode and resets the pin configuration to safe defaults. + - **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. + +### Example Transmit Button ```yaml -# Example AGC Configuration -cc1101: - cs_pin: GPIOXX - gdo0_pin: GPIOXX - tuner: - frequency: 433.92MHz - modulation_type: ASK/OOK - filter_bandwidth: 203kHz - symbol_rate: 5000 - agc: - magn_target: 24dB - max_lna_gain: 2.6dB - max_dvga_gan: -3 +button: + - platform: template + name: "Send Signal" + on_press: + # 1. Wake up radio and enter TX mode (Blocking wait) + - cc1101.begin_tx: + + # 2. Send data using standard Remote Transmitter + - remote_transmitter.transmit_raw: + code: [1000, -1000, 1000, -1000] + repeat: 5 + + # 3. Return to RX mode + - cc1101.end_tx: ``` -Advanced users can fine-tune the Automatic Gain Control (AGC) settings. +## Integration with Remote Receiver/Transmitter -- **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). -- **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. -- **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. +### Wiring for ESP32 (Split Pins) -## Integration with Remote Receiver/Transmitter +The ESP32 RMT peripheral requires exclusive access to the TX pin. You cannot share a single pin for both RX and TX easily. -To use the CC1101 for receiving or transmitting signals, you must configure the standard -[Remote Receiver](https://www.google.com/search?q=remote_receiver.md) or [Remote Transmitter](https://www.google.com/search?q=remote_transmitter.md) components to use the **GDO0 pin** -defined in your CC1101 configuration. + * **GDO0 (Pin 3)**: Connect to the pin used by `remote_transmitter`. + * **GDO2 (Pin 8)**: Connect to the pin used by `remote_receiver`. ```yaml -# Example: Receiving raw data via GDO0 -remote_receiver: - pin: GPIOXX # Must match the 'gdo0_pin' in cc1101 config or GDO2 pin if connected - dump: all +cc1101: + gdo0_pin: GPIOXX # CC1101 GDO0 -# Example: Transmitting raw data via GDO0 remote_transmitter: - pin: GPIOXX # Must match the 'gdo0_pin' in cc1101 config or GDO2 pin if connected + pin: GPIOXX # Must match GDO0 carrier_duty_percent: 100% + +remote_receiver: + pin: GPIOXX2 # CC1101 GDO2 + dump: all ``` +### Wiring for ESP8266 (Single Pin) + +On ESP8266, you can wire **GDO0** to a single GPIO and use it for both TX and RX. + ## Troubleshooting ### "FF0F was found" Error -If you see a log entry stating `FF0F was found` or similar invalid versions (e.g., `0000`, `FFFF`) during -setup, this indicates an SPI communication failure. - -- Check your wiring, especially the **MISO** and **CSN** lines. -- Ensure the module is powered with a stable 3.3V source. -- This component implements a "burst read" fix specifically to address this issue on some CC1101 silicon revisions, - so persistent errors are likely physical connection issues. +If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indicates an SPI communication failure. Check your wiring (MISO/MOSI/CS). -### Reset Issues +### No Signal during Transmit -This component uses a robust, non-blocking state machine that polls the `CHIP_RDYn` signal on the MISO line during -startup. This prevents race conditions where the ESP32 might attempt to configure the chip before the crystal has -stabilized. If you experience timeouts during the `RES` command, check your power supply stability. +1. **Check Pinout:** Ensure `remote_transmitter` is assigned to the pin physically connected to **GDO0**. The CC1101 **only** supports transmission via GDO0. ## See Also @@ -133,4 +140,4 @@ stabilized. If you experience timeouts during the `RES` command, check your powe - [Remote Receiver](/components/remote_receiver) - [Remote Transmitter](/components/remote_transmitter) - [SPI Component](/components/spi) -- [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) +- [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) \ No newline at end of file From 623264ff5213c45e51fa3b32c1ab68e4d73fe8a8 Mon Sep 17 00:00:00 2001 From: lygris Date: Tue, 18 Nov 2025 21:32:55 -0600 Subject: [PATCH 08/31] Requested Fixes --- content/components/cc1101.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 9876798d7a..aa3c92f493 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -100,9 +100,23 @@ button: ## Integration with Remote Receiver/Transmitter -### Wiring for ESP32 (Split Pins) +### Wiring for Single Pin Usage -The ESP32 RMT peripheral requires exclusive access to the TX pin. You cannot share a single pin for both RX and TX easily. +Wire **GDO0** to a single GPIO and use it for both TX and RX. +```yaml +cc1101: + gdo0_pin: GPIOXX # CC1101 GDO0 + +remote_transmitter: + pin: GPIOXX # Must match GDO0 + carrier_duty_percent: 100% + +remote_receiver: + pin: GPIOXX # CC1101 GDO0 + dump: all +``` + +### Wiring for Split Pin Usage * **GDO0 (Pin 3)**: Connect to the pin used by `remote_transmitter`. * **GDO2 (Pin 8)**: Connect to the pin used by `remote_receiver`. @@ -116,14 +130,10 @@ remote_transmitter: carrier_duty_percent: 100% remote_receiver: - pin: GPIOXX2 # CC1101 GDO2 + pin: GPIOXX # CC1101 GDO2 dump: all ``` -### Wiring for ESP8266 (Single Pin) - -On ESP8266, you can wire **GDO0** to a single GPIO and use it for both TX and RX. - ## Troubleshooting ### "FF0F was found" Error From 39f3e19c42d4100a031fa98db9520c038eae414b Mon Sep 17 00:00:00 2001 From: lygris Date: Tue, 18 Nov 2025 21:44:37 -0600 Subject: [PATCH 09/31] missed these ones --- content/components/cc1101.md | 47 ++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index aa3c92f493..df6e766c98 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -105,14 +105,36 @@ button: Wire **GDO0** to a single GPIO and use it for both TX and RX. ```yaml cc1101: - gdo0_pin: GPIOXX # CC1101 GDO0 + gdo0_pin: + pin: + number: GPIOXX # CC1101 GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true + allow_other_uses: true remote_transmitter: - pin: GPIOXX # Must match GDO0 + pin: + number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true + allow_other_uses: true carrier_duty_percent: 100% remote_receiver: - pin: GPIOXX # CC1101 GDO0 + pin: + number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true + allow_other_uses: true dump: all ``` @@ -123,10 +145,25 @@ remote_receiver: ```yaml cc1101: - gdo0_pin: GPIOXX # CC1101 GDO0 + gdo0_pin: + pin: + number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true + allow_other_uses: true remote_transmitter: - pin: GPIOXX # Must match GDO0 + pin: + number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true + allow_other_uses: true carrier_duty_percent: 100% remote_receiver: From 8d076327fe9d312ff788f574587cce0ef94ad59b Mon Sep 17 00:00:00 2001 From: lygris Date: Tue, 18 Nov 2025 21:49:33 -0600 Subject: [PATCH 10/31] lint fixes --- content/components/cc1101.md | 73 ++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index df6e766c98..e09ed1226b 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -27,75 +27,75 @@ cc1101: ### Hardware Settings - - **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. - - **gdo0\_pin** (**Required**, [Pin](pin.md)): The pin connected to **GDO0** on the CC1101. - - **Note:** On ESP32, `remote_transmitter` **must** use the pin connected to **GDO0** to transmit successfully. +- **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. +- **gdo0\_pin** (**Required**, [Pin](pin.md)): The pin connected to **GDO0** on the CC1101. +- **Note:** `remote_transmitter` **must** use the pin connected to **GDO0** to transmit successfully. ### General Settings - - **frequency** (*Optional*, frequency): The operating frequency. Range: `300MHz` to `928MHz`. Default: `433.92MHz`. - - **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-30` to `11`. Default: `10`. - - **modulation\_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. - - **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. - - **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. - - **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. +- **frequency** (*Optional*, frequency): The operating frequency. Range: `300MHz` to `928MHz`. Default: `433.92MHz`. +- **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-30` to `11`. Default: `10`. +- **modulation\_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. +- **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. +- **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. +- **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. ### Tuner Settings - - **filter\_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. - - **fsk\_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. +- **filter\_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. +- **fsk\_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. - - **channel** (*Optional*, int): Channel number (added to base frequency). - - **channel\_spacing** (*Optional*, frequency): Spacing between channels. - - **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. +- **channel** (*Optional*, int): Channel number (added to base frequency). +- **channel\_spacing** (*Optional*, frequency): Spacing between channels. +- **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. +- **pktlen** (*Optional*, int): Packet length config. --> ### AGC (Automatic Gain Control) Settings Advanced users can fine-tune the AGC dynamics. - - **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). - - **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. - - **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. - - **lna\_priority** (*Optional*, boolean): If true, decrease LNA gain before DVGA gain. - - **carrier\_sense\_abs\_thr** (*Optional*, int): Absolute RSSI threshold for Carrier Sense. - - **carrier\_sense\_rel\_thr** (*Optional*, enum): Relative RSSI threshold for Carrier Sense. - - **filter\_length\_fsk\_msk** (*Optional*, enum): Averaging length for FSK/MSK. - - **filter\_length\_ask\_ook** (*Optional*, enum): Averaging length for ASK/OOK. - - **freeze** (*Optional*, enum): AGC gain freeze behavior. - - **wait\_time** (*Optional*, enum): AGC wait time. - - **hyst\_level** (*Optional*, enum): AGC hysteresis level. +- **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). +- **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. +- **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. +- **lna\_priority** (*Optional*, boolean): If true, decrease LNA gain before DVGA gain. +- **carrier\_sense\_abs\_thr** (*Optional*, int): Absolute RSSI threshold for Carrier Sense. +- **carrier\_sense\_rel\_thr** (*Optional*, enum): Relative RSSI threshold for Carrier Sense. +- **filter\_length\_fsk\_msk** (*Optional*, enum): Averaging length for FSK/MSK. +- **filter\_length\_ask\_ook** (*Optional*, enum): Averaging length for ASK/OOK. +- **freeze** (*Optional*, enum): AGC gain freeze behavior. +- **wait\_time** (*Optional*, enum): AGC wait time. +- **hyst\_level** (*Optional*, enum): AGC hysteresis level. ## Actions This component provides actions to control the radio state, primarily used for coordinating transmission. - - **cc1101.begin\_tx**: Wakes the radio and forces it into TX mode. This **must** be called before `remote_transmitter` starts sending data. - - **cc1101.end\_tx**: Puts the radio back into RX mode and resets the pin configuration to safe defaults. - - **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. +- **cc1101.begin\_tx**: Wakes the radio and forces it into TX mode. This **must** be called before `remote_transmitter` starts sending data. +- **cc1101.end\_tx**: Puts the radio back into RX mode and resets the pin configuration to safe defaults. +- **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. ### Example Transmit Button ```yaml button: - - platform: template +- platform: template name: "Send Signal" on_press: # 1. Wake up radio and enter TX mode (Blocking wait) - - cc1101.begin_tx: + - cc1101.begin_tx: # 2. Send data using standard Remote Transmitter - - remote_transmitter.transmit_raw: + - remote_transmitter.transmit_raw: code: [1000, -1000, 1000, -1000] repeat: 5 # 3. Return to RX mode - - cc1101.end_tx: + - cc1101.end_tx: ``` ## Integration with Remote Receiver/Transmitter @@ -103,6 +103,7 @@ button: ### Wiring for Single Pin Usage Wire **GDO0** to a single GPIO and use it for both TX and RX. + ```yaml cc1101: gdo0_pin: @@ -140,8 +141,8 @@ remote_receiver: ### Wiring for Split Pin Usage - * **GDO0 (Pin 3)**: Connect to the pin used by `remote_transmitter`. - * **GDO2 (Pin 8)**: Connect to the pin used by `remote_receiver`. +- **GDO0 (Pin 3)**: Connect to the pin used by `remote_transmitter`. +- **GDO2 (Pin 8)**: Connect to the pin used by `remote_receiver`. ```yaml cc1101: @@ -187,4 +188,4 @@ If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indi - [Remote Receiver](/components/remote_receiver) - [Remote Transmitter](/components/remote_transmitter) - [SPI Component](/components/spi) -- [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) \ No newline at end of file +- [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) From 8059126a62d8ca42adb792c93623b2fc8fc630d5 Mon Sep 17 00:00:00 2001 From: lygris Date: Tue, 18 Nov 2025 21:51:49 -0600 Subject: [PATCH 11/31] moar lint fixes --- content/components/cc1101.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index e09ed1226b..fdfa973d59 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -180,7 +180,7 @@ If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indi ### No Signal during Transmit -1. **Check Pinout:** Ensure `remote_transmitter` is assigned to the pin physically connected to **GDO0**. The CC1101 **only** supports transmission via GDO0. +1. **Check Pinout:** Ensure `remote_transmitter` is assigned to the pin physically connected to **GDO0**. The CC1101 **only** supports transmission via GDO0. ## See Also From f6a156c8730d0be3c73ff6f8b141de3ca812140c Mon Sep 17 00:00:00 2001 From: lygris Date: Tue, 18 Nov 2025 21:56:34 -0600 Subject: [PATCH 12/31] add begin/end tx actions to examples --- content/components/cc1101.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index fdfa973d59..fa42bb6589 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -126,6 +126,12 @@ remote_transmitter: open_drain: true allow_other_uses: true carrier_duty_percent: 100% + on_transmit: + then: + - cc1101.begin_tx: + on_complete: + then: + - cc1101.end_tx: remote_receiver: pin: @@ -166,6 +172,12 @@ remote_transmitter: open_drain: true allow_other_uses: true carrier_duty_percent: 100% + on_transmit: + then: + - cc1101.begin_tx: + on_complete: + then: + - cc1101.end_tx: remote_receiver: pin: GPIOXX # CC1101 GDO2 From 9488c628af06c70430ab80efd8f1f5797548b6c3 Mon Sep 17 00:00:00 2001 From: lygris Date: Tue, 18 Nov 2025 22:01:25 -0600 Subject: [PATCH 13/31] Remove some commented lines and fix lint error --- content/components/cc1101.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index fa42bb6589..494db25924 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -44,15 +44,9 @@ cc1101: - **filter\_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. - **fsk\_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. - - **channel** (*Optional*, int): Channel number (added to base frequency). - **channel\_spacing** (*Optional*, frequency): Spacing between channels. - **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. - - - - - ### AGC (Automatic Gain Control) Settings @@ -192,7 +186,7 @@ If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indi ### No Signal during Transmit -1. **Check Pinout:** Ensure `remote_transmitter` is assigned to the pin physically connected to **GDO0**. The CC1101 **only** supports transmission via GDO0. +- **Check Pinout:** Ensure `remote_transmitter` is assigned to the pin physically connected to **GDO0**. The CC1101 **only** supports transmission via GDO0. ## See Also From b9d07e60db8c8a83b807a2bb8caedfad052ca3a1 Mon Sep 17 00:00:00 2001 From: lygris Date: Wed, 19 Nov 2025 08:24:17 -0600 Subject: [PATCH 14/31] Fix transmitter config example --- content/components/cc1101.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 494db25924..7ea6f4c1be 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -80,16 +80,9 @@ button: - platform: template name: "Send Signal" on_press: - # 1. Wake up radio and enter TX mode (Blocking wait) - - cc1101.begin_tx: - - # 2. Send data using standard Remote Transmitter - remote_transmitter.transmit_raw: code: [1000, -1000, 1000, -1000] repeat: 5 - - # 3. Return to RX mode - - cc1101.end_tx: ``` ## Integration with Remote Receiver/Transmitter @@ -122,9 +115,13 @@ remote_transmitter: carrier_duty_percent: 100% on_transmit: then: + - cc1101.set_idle: + - remote_transmitter.digital_write: false - cc1101.begin_tx: on_complete: then: + - cc1101.set_idle: + - remote_transmitter.digital_write: true - cc1101.end_tx: remote_receiver: @@ -147,7 +144,6 @@ remote_receiver: ```yaml cc1101: gdo0_pin: - pin: number: GPIOXX # Must match GDO0 mode: input: true @@ -168,9 +164,13 @@ remote_transmitter: carrier_duty_percent: 100% on_transmit: then: + - cc1101.set_idle: + - remote_transmitter.digital_write: false - cc1101.begin_tx: on_complete: then: + - cc1101.set_idle: + - remote_transmitter.digital_write: true - cc1101.end_tx: remote_receiver: From 7d0f999a2d0b78969b79906562375695d3661a02 Mon Sep 17 00:00:00 2001 From: lygris Date: Wed, 19 Nov 2025 08:30:27 -0600 Subject: [PATCH 15/31] Fix image link --- content/components/cc1101.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 7ea6f4c1be..f354b2a653 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -1,7 +1,7 @@ --- title: CC1101 Low-Power Sub-1 GHz RF Transceiver description: Instructions for setting up CC1101 RF Transceiver in ESPHome. -image: cc1101.webp +image: images/cc1101.webp keywords: [cc1101] --- @@ -11,7 +11,7 @@ It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using This component requires the [SPI Component](spi.md) to be enabled. -Image +Image ## Component Configuration From 95de05ca76ee87eb0b41692ed3839064e5eb0972 Mon Sep 17 00:00:00 2001 From: lygris Date: Wed, 19 Nov 2025 08:34:37 -0600 Subject: [PATCH 16/31] actually fix image link --- content/components/cc1101.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index f354b2a653..ba945d5a93 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -1,7 +1,7 @@ --- title: CC1101 Low-Power Sub-1 GHz RF Transceiver description: Instructions for setting up CC1101 RF Transceiver in ESPHome. -image: images/cc1101.webp +image: /components/images/cc1101.webp keywords: [cc1101] --- @@ -11,7 +11,7 @@ It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using This component requires the [SPI Component](spi.md) to be enabled. -Image +Image ## Component Configuration From 2723afa3f4820b6e80434e788ef5f181e5a68cb2 Mon Sep 17 00:00:00 2001 From: lygris Date: Wed, 19 Nov 2025 08:45:17 -0600 Subject: [PATCH 17/31] Add missing Idle action description. --- content/components/cc1101.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index ba945d5a93..08448efa91 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -72,6 +72,7 @@ This component provides actions to control the radio state, primarily used for c - **cc1101.begin\_tx**: Wakes the radio and forces it into TX mode. This **must** be called before `remote_transmitter` starts sending data. - **cc1101.end\_tx**: Puts the radio back into RX mode and resets the pin configuration to safe defaults. - **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. +- **cc1101.set_idle**: Puts the radio into idle state. ### Example Transmit Button From 5506883c8d114d0dede8a82fe2e31d00c5c5076f Mon Sep 17 00:00:00 2001 From: lygris Date: Wed, 19 Nov 2025 12:07:26 -0600 Subject: [PATCH 18/31] Update for new code commit --- content/components/cc1101.md | 158 ++++++++++++++++++----------------- 1 file changed, 82 insertions(+), 76 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 08448efa91..f24b3103ea 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -16,106 +16,114 @@ This component requires the [SPI Component](spi.md) to be enabled. ## Component Configuration ```yaml -# Minimal Example +# Minimal Example (DUAL_PIN is the default operation_mode) cc1101: cs_pin: GPIOXX - gdo0_pin: GPIOXX frequency: 433.92MHz ``` ## Configuration Variables ### Hardware Settings +- **cs_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. -- **cs\_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. -- **gdo0\_pin** (**Required**, [Pin](pin.md)): The pin connected to **GDO0** on the CC1101. -- **Note:** `remote_transmitter` **must** use the pin connected to **GDO0** to transmit successfully. +- **operation_mode** (Optional, enum): Defines the role of the CC1101 GDO pins based on your wiring setup. This is crucial for correct TX/RX operation. + - `DUAL_PIN` (Default): Configures the module for separate TX and RX data pins. Internally sets GDO0 (Module Pin 3) for TX Data Input and GDO2 (Module Pin 8) for RX Data Output. This is the recommended mode. + - `SINGLE_PIN`: Configures GDO0 (Module Pin 3) for bi-directional Serial I/O and sets GDO2 to high impedance. This mode requires only one MCU GPIO pin for both TX and RX. ### General Settings - **frequency** (*Optional*, frequency): The operating frequency. Range: `300MHz` to `928MHz`. Default: `433.92MHz`. -- **output\_power** (*Optional*, float): The transmission power in dBm. Range: `-30` to `11`. Default: `10`. -- **modulation\_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. -- **symbol\_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. -- **rx\_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. -- **dc\_blocking\_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. +- **output_power** (*Optional*, float): The transmission power in dBm. Range: `-30` to `11`. Default: `10`. +- **modulation_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. +- **symbol_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. +- **rx_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. +- **dc_blocking_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. ### Tuner Settings -- **filter\_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. -- **fsk\_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. +- **filter_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. +- **fsk_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. - **channel** (*Optional*, int): Channel number (added to base frequency). -- **channel\_spacing** (*Optional*, frequency): Spacing between channels. -- **if\_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. -- **pktlen** (*Optional*, int): Packet length config. --> +- **channel_spacing** (*Optional*, frequency): Spacing between channels. +- **if_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. +- **pktlen** (*Optional*, int): Packet length config. ### AGC (Automatic Gain Control) Settings Advanced users can fine-tune the AGC dynamics. -- **magn\_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). -- **max\_lna\_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. -- **max\_dvga\_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. -- **lna\_priority** (*Optional*, boolean): If true, decrease LNA gain before DVGA gain. -- **carrier\_sense\_abs\_thr** (*Optional*, int): Absolute RSSI threshold for Carrier Sense. -- **carrier\_sense\_rel\_thr** (*Optional*, enum): Relative RSSI threshold for Carrier Sense. -- **filter\_length\_fsk\_msk** (*Optional*, enum): Averaging length for FSK/MSK. -- **filter\_length\_ask\_ook** (*Optional*, enum): Averaging length for ASK/OOK. +- **magn_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). +- **max_lna_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. +- **max_dvga_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. +- **lna_priority** (*Optional*, boolean): If true, decrease LNA gain before DVGA gain. +- **carrier_sense_abs_thr** (*Optional*, int): Absolute RSSI threshold for Carrier Sense. +- **carrier_sense_rel_thr** (*Optional*, enum): Relative RSSI threshold for Carrier Sense. +- **filter_length_fsk_msk** (*Optional*, enum): Averaging length for FSK/MSK. +- **filter_length_ask_ook** (*Optional*, enum): Averaging length for ASK/OOK. - **freeze** (*Optional*, enum): AGC gain freeze behavior. -- **wait\_time** (*Optional*, enum): AGC wait time. -- **hyst\_level** (*Optional*, enum): AGC hysteresis level. +- **wait_time** (*Optional*, enum): AGC wait time. +- **hyst_level** (*Optional*, enum): AGC hysteresis level. ## Actions This component provides actions to control the radio state, primarily used for coordinating transmission. -- **cc1101.begin\_tx**: Wakes the radio and forces it into TX mode. This **must** be called before `remote_transmitter` starts sending data. -- **cc1101.end\_tx**: Puts the radio back into RX mode and resets the pin configuration to safe defaults. +- **cc1101.begin_tx**: Wakes the radio and forces it into TX mode. This **must** be called before `remote_transmitter` starts sending data. +- **cc1101.end_tx**: Puts the radio back into RX mode and resets the pin configuration to safe defaults. - **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. - **cc1101.set_idle**: Puts the radio into idle state. -### Example Transmit Button +## Integration with Remote Receiver/Transmitter + +### 1. Dual Pin Wiring (operation_mode: DUAL_PIN) +This mode is recommended for simplicity and clarity. The CC1101 chip handles the input/output logic internally, requiring minimal external pin configuration. + +- **GDO0 (Module Pin 3)**: Connect to the MCU pin used by `remote_transmitter`. +- **GDO2 (Module Pin 8)**: Connect to the MCU pin used by `remote_receiver`. ```yaml -button: -- platform: template - name: "Send Signal" - on_press: - - remote_transmitter.transmit_raw: - code: [1000, -1000, 1000, -1000] - repeat: 5 -``` +cc1101: + cs_pin: GPIOXX -## Integration with Remote Receiver/Transmitter +remote_transmitter: + pin: GPIOXX # Must match GDO0 + carrier_duty_percent: 100% + on_transmit: + then: + - cc1101.set_idle: + - remote_transmitter.digital_write: false + - cc1101.begin_tx: + on_complete: + then: + - cc1101.set_idle: + - remote_transmitter.digital_write: true + - cc1101.end_tx: -### Wiring for Single Pin Usage +remote_receiver: + pin: GPIOXX # CC1101 GDO2 + dump: all +``` -Wire **GDO0** to a single GPIO and use it for both TX and RX. +### 2. Single Pin Wiring - Push-Pull (with State Switching) +This mode requires only one MCU GPIO pin connected to GDO0 (Module Pin 3). Since the MCU pin operates in Push-Pull mode, manual switching between Input and Output logic is required inside the automation to avoid conflicts. + +- **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin. +- **GDO2 (Module Pin 8)**: Leave disconnected. ```yaml cc1101: - gdo0_pin: - pin: - number: GPIOXX # CC1101 GDO0 - mode: - input: true - output: true - pullup: true - open_drain: true - allow_other_uses: true + cs_pin: GPIOXX + operation_mode: SINGLE_PIN remote_transmitter: - pin: + pin: number: GPIOXX # Must match GDO0 - mode: - input: true - output: true - pullup: true - open_drain: true allow_other_uses: true carrier_duty_percent: 100% on_transmit: then: + - remote_receiver.disable: - cc1101.set_idle: - remote_transmitter.digital_write: false - cc1101.begin_tx: @@ -124,37 +132,28 @@ remote_transmitter: - cc1101.set_idle: - remote_transmitter.digital_write: true - cc1101.end_tx: + - remote_receiver.enable: remote_receiver: - pin: + pin: number: GPIOXX # Must match GDO0 - mode: - input: true - output: true - pullup: true - open_drain: true allow_other_uses: true dump: all ``` -### Wiring for Split Pin Usage +### 3. Single Pin Wiring - Open Drain +This mode also requires only one MCU GPIO pin connected to GDO0 (Module Pin 3), but is simpler as the Open Drain configuration automatically handles the logic state switching without needing complex on_transmit/on_complete automation logic. -- **GDO0 (Pin 3)**: Connect to the pin used by `remote_transmitter`. -- **GDO2 (Pin 8)**: Connect to the pin used by `remote_receiver`. +- **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin configured as Open Drain. +- **GDO2 (Module Pin 8)**: Leave disconnected. ```yaml cc1101: - gdo0_pin: - number: GPIOXX # Must match GDO0 - mode: - input: true - output: true - pullup: true - open_drain: true - allow_other_uses: true + cs_pin: GPIOXX + operation_mode: SINGLE_PIN remote_transmitter: - pin: + pin: number: GPIOXX # Must match GDO0 mode: input: true @@ -162,6 +161,7 @@ remote_transmitter: pullup: true open_drain: true allow_other_uses: true + eot_level: false carrier_duty_percent: 100% on_transmit: then: @@ -175,19 +175,25 @@ remote_transmitter: - cc1101.end_tx: remote_receiver: - pin: GPIOXX # CC1101 GDO2 + pin: + number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true + allow_other_uses: true dump: all ``` ## Troubleshooting ### "FF0F was found" Error - If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indicates an SPI communication failure. Check your wiring (MISO/MOSI/CS). ### No Signal during Transmit - -- **Check Pinout:** Ensure `remote_transmitter` is assigned to the pin physically connected to **GDO0**. The CC1101 **only** supports transmission via GDO0. +- **Check Pinout**: For all modes, the data line must be connected to GDO0 (Module Pin 3), as the CC1101 chip only supports transmission input via the GDO0 pin. +- **Check Pin Mode**: If using the Single Pin Push-Pull mode, ensure your on_transmit/on_complete logic correctly flips the pin's status. ## See Also From 282a759292c132a6f530143e346c7977acf91ae4 Mon Sep 17 00:00:00 2001 From: lygris Date: Thu, 20 Nov 2025 12:56:55 -0600 Subject: [PATCH 19/31] lint fixes --- content/components/cc1101.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index f24b3103ea..1bc4b2484a 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -25,8 +25,8 @@ cc1101: ## Configuration Variables ### Hardware Settings -- **cs_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. +- **cs_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. - **operation_mode** (Optional, enum): Defines the role of the CC1101 GDO pins based on your wiring setup. This is crucial for correct TX/RX operation. - `DUAL_PIN` (Default): Configures the module for separate TX and RX data pins. Internally sets GDO0 (Module Pin 3) for TX Data Input and GDO2 (Module Pin 8) for RX Data Output. This is the recommended mode. - `SINGLE_PIN`: Configures GDO0 (Module Pin 3) for bi-directional Serial I/O and sets GDO2 to high impedance. This mode requires only one MCU GPIO pin for both TX and RX. @@ -77,6 +77,7 @@ This component provides actions to control the radio state, primarily used for c ## Integration with Remote Receiver/Transmitter ### 1. Dual Pin Wiring (operation_mode: DUAL_PIN) + This mode is recommended for simplicity and clarity. The CC1101 chip handles the input/output logic internally, requiring minimal external pin configuration. - **GDO0 (Module Pin 3)**: Connect to the MCU pin used by `remote_transmitter`. @@ -106,6 +107,7 @@ remote_receiver: ``` ### 2. Single Pin Wiring - Push-Pull (with State Switching) + This mode requires only one MCU GPIO pin connected to GDO0 (Module Pin 3). Since the MCU pin operates in Push-Pull mode, manual switching between Input and Output logic is required inside the automation to avoid conflicts. - **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin. @@ -142,6 +144,7 @@ remote_receiver: ``` ### 3. Single Pin Wiring - Open Drain + This mode also requires only one MCU GPIO pin connected to GDO0 (Module Pin 3), but is simpler as the Open Drain configuration automatically handles the logic state switching without needing complex on_transmit/on_complete automation logic. - **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin configured as Open Drain. @@ -189,9 +192,11 @@ remote_receiver: ## Troubleshooting ### "FF0F was found" Error + If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indicates an SPI communication failure. Check your wiring (MISO/MOSI/CS). ### No Signal during Transmit + - **Check Pinout**: For all modes, the data line must be connected to GDO0 (Module Pin 3), as the CC1101 chip only supports transmission input via the GDO0 pin. - **Check Pin Mode**: If using the Single Pin Push-Pull mode, ensure your on_transmit/on_complete logic correctly flips the pin's status. From b92f78a6781539f69936591ad30007c60fc15f85 Mon Sep 17 00:00:00 2001 From: lygris Date: Fri, 21 Nov 2025 16:13:59 -0600 Subject: [PATCH 20/31] Update to match latest component config --- content/components/cc1101.md | 53 +++++++++++++++++------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 1bc4b2484a..4cd7da33ec 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -16,7 +16,7 @@ This component requires the [SPI Component](spi.md) to be enabled. ## Component Configuration ```yaml -# Minimal Example (DUAL_PIN is the default operation_mode) +# Minimal Example cc1101: cs_pin: GPIOXX frequency: 433.92MHz @@ -27,9 +27,6 @@ cc1101: ### Hardware Settings - **cs_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. -- **operation_mode** (Optional, enum): Defines the role of the CC1101 GDO pins based on your wiring setup. This is crucial for correct TX/RX operation. - - `DUAL_PIN` (Default): Configures the module for separate TX and RX data pins. Internally sets GDO0 (Module Pin 3) for TX Data Input and GDO2 (Module Pin 8) for RX Data Output. This is the recommended mode. - - `SINGLE_PIN`: Configures GDO0 (Module Pin 3) for bi-directional Serial I/O and sets GDO2 to high impedance. This mode requires only one MCU GPIO pin for both TX and RX. ### General Settings @@ -76,9 +73,11 @@ This component provides actions to control the radio state, primarily used for c ## Integration with Remote Receiver/Transmitter -### 1. Dual Pin Wiring (operation_mode: DUAL_PIN) +The component automatically configures the GDO pins to support both dual and single pin wiring schemes without any extra configuration. -This mode is recommended for simplicity and clarity. The CC1101 chip handles the input/output logic internally, requiring minimal external pin configuration. +### 1. Dual Pin Wiring (Recommended) + +This is the simplest and recommended wiring scheme. It uses separate pins for transmitting and receiving data. - **GDO0 (Module Pin 3)**: Connect to the MCU pin used by `remote_transmitter`. - **GDO2 (Module Pin 8)**: Connect to the MCU pin used by `remote_receiver`. @@ -106,13 +105,16 @@ remote_receiver: dump: all ``` -### 2. Single Pin Wiring - Push-Pull (with State Switching) +### 2. Single Pin Wiring -This mode requires only one MCU GPIO pin connected to GDO0 (Module Pin 3). Since the MCU pin operates in Push-Pull mode, manual switching between Input and Output logic is required inside the automation to avoid conflicts. +This wiring scheme uses a single MCU pin for both transmitting and receiving data, connected to GDO0. This requires careful configuration of the `remote_transmitter` and `remote_receiver` to avoid conflicts. Using an open-drain pin mode is recommended to simplify the setup. - **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin. - **GDO2 (Module Pin 8)**: Leave disconnected. +#### Single Pin with Open-Drain (Recommended for Single Pin) +This is the recommended method for single-pin wiring as it avoids complex automations to switch pin modes. + ```yaml cc1101: cs_pin: GPIOXX @@ -121,11 +123,16 @@ cc1101: remote_transmitter: pin: number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true allow_other_uses: true + eot_level: false carrier_duty_percent: 100% on_transmit: then: - - remote_receiver.disable: - cc1101.set_idle: - remote_transmitter.digital_write: false - cc1101.begin_tx: @@ -134,40 +141,34 @@ remote_transmitter: - cc1101.set_idle: - remote_transmitter.digital_write: true - cc1101.end_tx: - - remote_receiver.enable: remote_receiver: pin: number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true allow_other_uses: true dump: all ``` -### 3. Single Pin Wiring - Open Drain - -This mode also requires only one MCU GPIO pin connected to GDO0 (Module Pin 3), but is simpler as the Open Drain configuration automatically handles the logic state switching without needing complex on_transmit/on_complete automation logic. - -- **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin configured as Open Drain. -- **GDO2 (Module Pin 8)**: Leave disconnected. +#### Single Pin with Push-Pull +This method requires automations to manually enable and disable the receiver around transmissions to prevent the transmitter from receiving its own signals. ```yaml cc1101: cs_pin: GPIOXX - operation_mode: SINGLE_PIN remote_transmitter: pin: number: GPIOXX # Must match GDO0 - mode: - input: true - output: true - pullup: true - open_drain: true allow_other_uses: true - eot_level: false carrier_duty_percent: 100% on_transmit: then: + - remote_receiver.disable: - cc1101.set_idle: - remote_transmitter.digital_write: false - cc1101.begin_tx: @@ -176,15 +177,11 @@ remote_transmitter: - cc1101.set_idle: - remote_transmitter.digital_write: true - cc1101.end_tx: + - remote_receiver.enable: remote_receiver: pin: number: GPIOXX # Must match GDO0 - mode: - input: true - output: true - pullup: true - open_drain: true allow_other_uses: true dump: all ``` From be2fe85ed9248915a15cff5677624c2e4e4d974b Mon Sep 17 00:00:00 2001 From: lygris Date: Fri, 21 Nov 2025 16:18:02 -0600 Subject: [PATCH 21/31] lint fixes --- content/components/cc1101.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 4cd7da33ec..3bce0425c5 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -113,6 +113,7 @@ This wiring scheme uses a single MCU pin for both transmitting and receiving dat - **GDO2 (Module Pin 8)**: Leave disconnected. #### Single Pin with Open-Drain (Recommended for Single Pin) + This is the recommended method for single-pin wiring as it avoids complex automations to switch pin modes. ```yaml @@ -155,6 +156,7 @@ remote_receiver: ``` #### Single Pin with Push-Pull + This method requires automations to manually enable and disable the receiver around transmissions to prevent the transmitter from receiving its own signals. ```yaml From 343b0f6a128f70c662f9f0a44b16ade9a5d8f168 Mon Sep 17 00:00:00 2001 From: lygris Date: Tue, 25 Nov 2025 16:21:04 -0600 Subject: [PATCH 22/31] fix links --- content/components/cc1101.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 3bce0425c5..f7cc18dd12 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -7,9 +7,9 @@ keywords: [cc1101] The **CC1101** component provides a driver for the **Texas Instruments CC1101** Sub-1 GHz RF Transceiver. It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using the standard -[Remote Transmitter](remote_transmitter.md) and [Remote Receiver](remote_receiver.md) components. +[Remote Transmitter](/components/remote_transmitter) and [Remote Receiver](/components/remote_receiver) components. -This component requires the [SPI Component](spi.md) to be enabled. +This component requires the [SPI Component](/components/spi) to be enabled. Image @@ -26,7 +26,7 @@ cc1101: ### Hardware Settings -- **cs_pin** (**Required**, [Pin](pin.md)): The SPI Chip Select (CSN) pin connected to the module. +- **cs_pin** (**Required**, [Pin](/guides/configuration-types/#pin)): The SPI Chip Select (CSN) pin connected to the module. ### General Settings From bdc980513b913c7ac73d3c2ca0285c1d5b51a65d Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 2 Dec 2025 22:25:57 -0500 Subject: [PATCH 23/31] Clean up --- content/components/cc1101.md | 107 ++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index f7cc18dd12..493e0dd5be 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -26,20 +26,23 @@ cc1101: ### Hardware Settings -- **cs_pin** (**Required**, [Pin](/guides/configuration-types/#pin)): The SPI Chip Select (CSN) pin connected to the module. +- **cs_pin** (**Required**, [Pin](/guides/configuration-types/#pin)): + The SPI Chip Select (CSN) pin connected to the module. ### General Settings - **frequency** (*Optional*, frequency): The operating frequency. Range: `300MHz` to `928MHz`. Default: `433.92MHz`. - **output_power** (*Optional*, float): The transmission power in dBm. Range: `-30` to `11`. Default: `10`. -- **modulation_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. +- **modulation_type** (*Optional*, enum): The modulation format. + Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. - **symbol_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. - **rx_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. - **dc_blocking_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. ### Tuner Settings -- **filter_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Default: `203kHz`. +- **filter_bandwidth** (*Optional*, frequency): The receive filter bandwidth. + Range: `58kHz` to `812kHz`. Default: `203kHz`. - **fsk_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. - **channel** (*Optional*, int): Channel number (added to base frequency). - **channel_spacing** (*Optional*, frequency): Spacing between channels. @@ -51,7 +54,8 @@ cc1101: Advanced users can fine-tune the AGC dynamics. - **magn_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). -- **max_lna_gain** (*Optional*, dB): Maximum LNA gain reduction. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. +- **max_lna_gain** (*Optional*, dB): Maximum LNA gain reduction. + Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. - **max_dvga_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. - **lna_priority** (*Optional*, boolean): If true, decrease LNA gain before DVGA gain. - **carrier_sense_abs_thr** (*Optional*, int): Absolute RSSI threshold for Carrier Sense. @@ -66,14 +70,16 @@ Advanced users can fine-tune the AGC dynamics. This component provides actions to control the radio state, primarily used for coordinating transmission. -- **cc1101.begin_tx**: Wakes the radio and forces it into TX mode. This **must** be called before `remote_transmitter` starts sending data. -- **cc1101.end_tx**: Puts the radio back into RX mode and resets the pin configuration to safe defaults. +- **cc1101.begin_tx**: Wakes the radio and forces it into TX mode. + This **must** be called before `remote_transmitter` starts sending data. +- **cc1101.begin_rx**: Puts the radio into RX mode. - **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. - **cc1101.set_idle**: Puts the radio into idle state. ## Integration with Remote Receiver/Transmitter -The component automatically configures the GDO pins to support both dual and single pin wiring schemes without any extra configuration. +The component automatically configures the GDO pins to support both dual and single pin wiring schemes +without any extra configuration. ### 1. Dual Pin Wiring (Recommended) @@ -91,14 +97,10 @@ remote_transmitter: carrier_duty_percent: 100% on_transmit: then: - - cc1101.set_idle: - - remote_transmitter.digital_write: false - cc1101.begin_tx: on_complete: then: - - cc1101.set_idle: - - remote_transmitter.digital_write: true - - cc1101.end_tx: + - cc1101.begin_rx: remote_receiver: pin: GPIOXX # CC1101 GDO2 @@ -107,19 +109,34 @@ remote_receiver: ### 2. Single Pin Wiring -This wiring scheme uses a single MCU pin for both transmitting and receiving data, connected to GDO0. This requires careful configuration of the `remote_transmitter` and `remote_receiver` to avoid conflicts. Using an open-drain pin mode is recommended to simplify the setup. +This wiring scheme uses a single MCU pin for both transmitting and receiving data, connected to GDO0. +This requires careful configuration of the `remote_transmitter` and `remote_receiver` to avoid conflicts. +Using an open-drain pin mode is recommended to simplify the setup. - **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin. - **GDO2 (Module Pin 8)**: Leave disconnected. -#### Single Pin with Open-Drain (Recommended for Single Pin) +#### Single Pin with Open-Drain (Recommended) -This is the recommended method for single-pin wiring as it avoids complex automations to switch pin modes. +ESP32 must use this method when using single pin wiring. The shared pin should be set to open-drain with a +pullup. The `eot_level` should be set to `false`. In addition to setting the CC1101 mode in +`on_transmit` / `on_complete`, the pin should be driven low before `begin_tx` and pulled high / released +before `begin_rx`. ```yaml cc1101: cs_pin: GPIOXX - operation_mode: SINGLE_PIN + +remote_receiver: + pin: + number: GPIOXX # Must match GDO0 + mode: + input: true + output: true + pullup: true + open_drain: true + allow_other_uses: true + dump: all remote_transmitter: pin: @@ -130,7 +147,7 @@ remote_transmitter: pullup: true open_drain: true allow_other_uses: true - eot_level: false + eot_level: false carrier_duty_percent: 100% on_transmit: then: @@ -141,67 +158,65 @@ remote_transmitter: then: - cc1101.set_idle: - remote_transmitter.digital_write: true - - cc1101.end_tx: - -remote_receiver: - pin: - number: GPIOXX # Must match GDO0 - mode: - input: true - output: true - pullup: true - open_drain: true - allow_other_uses: true - dump: all + - cc1101.begin_rx: ``` -#### Single Pin with Push-Pull +#### Single Pin with Mode Switching -This method requires automations to manually enable and disable the receiver around transmissions to prevent the transmitter from receiving its own signals. +This method requires lambdas to manually switch the pin mode between input and output around transmissions. +On boot, the pin must be set to input mode so the receiver can operate. ```yaml +esphome: + on_boot: + - priority: 0 + then: + - lambda: id(rx_pin)->pin_mode(gpio::FLAG_INPUT); + cc1101: cs_pin: GPIOXX +remote_receiver: + pin: + id: rx_pin + number: GPIOXX # Must match GDO0 + allow_other_uses: true + dump: all + remote_transmitter: pin: + id: tx_pin number: GPIOXX # Must match GDO0 allow_other_uses: true carrier_duty_percent: 100% on_transmit: then: - - remote_receiver.disable: - cc1101.set_idle: - - remote_transmitter.digital_write: false + - lambda: id(tx_pin)->pin_mode(gpio::FLAG_OUTPUT); - cc1101.begin_tx: on_complete: then: - cc1101.set_idle: - - remote_transmitter.digital_write: true - - cc1101.end_tx: - - remote_receiver.enable: - -remote_receiver: - pin: - number: GPIOXX # Must match GDO0 - allow_other_uses: true - dump: all + - lambda: id(rx_pin)->pin_mode(gpio::FLAG_INPUT); + - cc1101.begin_rx: ``` ## Troubleshooting ### "FF0F was found" Error -If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indicates an SPI communication failure. Check your wiring (MISO/MOSI/CS). +If you see a log entry stating `FF0F`, `0000`, or `FFFF` during setup, this indicates an SPI +communication failure. Check your wiring (MISO/MOSI/CS). ### No Signal during Transmit -- **Check Pinout**: For all modes, the data line must be connected to GDO0 (Module Pin 3), as the CC1101 chip only supports transmission input via the GDO0 pin. -- **Check Pin Mode**: If using the Single Pin Push-Pull mode, ensure your on_transmit/on_complete logic correctly flips the pin's status. +- **Check Pinout**: For all modes, the data line must be connected to GDO0 (Module Pin 3), + as the CC1101 chip only supports transmission input via the GDO0 pin. +- **Check Pin Mode**: If using the Single Pin with Mode Switching method, + ensure your on_transmit / on_complete logic correctly flips the pin mode. ## See Also -- [I²C Bus](/components/i2c) - [Remote Receiver](/components/remote_receiver) - [Remote Transmitter](/components/remote_transmitter) - [SPI Component](/components/spi) From 1a6b140d380cecfabf4c28df2abd86c528ce87be Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 2 Dec 2025 22:42:03 -0500 Subject: [PATCH 24/31] Fix --- content/components/cc1101.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 493e0dd5be..b0ef2c180b 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -31,22 +31,26 @@ cc1101: ### General Settings -- **frequency** (*Optional*, frequency): The operating frequency. Range: `300MHz` to `928MHz`. Default: `433.92MHz`. -- **output_power** (*Optional*, float): The transmission power in dBm. Range: `-30` to `11`. Default: `10`. +- **frequency** (*Optional*, frequency): The operating frequency. + Range: `300MHz` to `928MHz`. Defaults to `433.92MHz`. +- **output_power** (*Optional*, float): The transmission power in dBm. + Range: `-30` to `11`. Defaults to `10`. - **modulation_type** (*Optional*, enum): The modulation format. Options: `ASK/OOK` (default), `2-FSK`, `4-FSK`, `GFSK`, `MSK`. -- **symbol_rate** (*Optional*, int): The symbol rate in Baud. Range: `600` to `500000`. Default: `5000`. -- **rx_attenuation** (*Optional*, enum): Internal RX attenuation. Options: `0dB`, `6dB`, `12dB`, `18dB`. Default: `0dB`. -- **dc_blocking_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Default: `True`. +- **symbol_rate** (*Optional*, int): The symbol rate in Baud. + Range: `600` to `500000`. Defaults to `5000`. +- **rx_attenuation** (*Optional*, enum): Internal RX attenuation. + Options: `0dB`, `6dB`, `12dB`, `18dB`. Defaults to `0dB`. +- **dc_blocking_filter** (*Optional*, boolean): Enable the digital DC blocking filter. Defaults to `true`. ### Tuner Settings - **filter_bandwidth** (*Optional*, frequency): The receive filter bandwidth. - Range: `58kHz` to `812kHz`. Default: `203kHz`. + Range: `58kHz` to `812kHz`. Defaults to `203kHz`. - **fsk_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. - **channel** (*Optional*, int): Channel number (added to base frequency). - **channel_spacing** (*Optional*, frequency): Spacing between channels. -- **if_frequency** (*Optional*, frequency): Intermediate Frequency. Default is optimized for 433MHz usage. +- **if_frequency** (*Optional*, frequency): Intermediate Frequency. Defaults to a value optimized for 433MHz. - **pktlen** (*Optional*, int): Packet length config. ### AGC (Automatic Gain Control) Settings @@ -119,7 +123,7 @@ Using an open-drain pin mode is recommended to simplify the setup. #### Single Pin with Open-Drain (Recommended) ESP32 must use this method when using single pin wiring. The shared pin should be set to open-drain with a -pullup. The `eot_level` should be set to `false`. In addition to setting the CC1101 mode in +pullup. The `eot_level` should be set to `false`. In addition to setting the CC1101 mode in `on_transmit` / `on_complete`, the pin should be driven low before `begin_tx` and pulled high / released before `begin_rx`. From ae9be5d49e97e49e0d0e1acc87e3d6b56381bd38 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:35:32 -0500 Subject: [PATCH 25/31] Clean up --- content/components/cc1101.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index b0ef2c180b..b775c20925 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -74,11 +74,10 @@ Advanced users can fine-tune the AGC dynamics. This component provides actions to control the radio state, primarily used for coordinating transmission. -- **cc1101.begin_tx**: Wakes the radio and forces it into TX mode. - This **must** be called before `remote_transmitter` starts sending data. +- **cc1101.begin_tx**: Puts the radio into TX mode. - **cc1101.begin_rx**: Puts the radio into RX mode. -- **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. - **cc1101.set_idle**: Puts the radio into idle state. +- **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. ## Integration with Remote Receiver/Transmitter From 8198129c5f1d08b899dce3739686202efe4671bc Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:44:20 -0500 Subject: [PATCH 26/31] Clean up --- content/components/cc1101.md | 4 ++-- content/components/images/cc1101-full.webp | Bin 0 -> 39320 bytes content/components/images/cc1101.webp | Bin 22576 -> 0 bytes static/images/cc1101.webp | Bin 0 -> 39320 bytes 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 content/components/images/cc1101-full.webp delete mode 100644 content/components/images/cc1101.webp create mode 100644 static/images/cc1101.webp diff --git a/content/components/cc1101.md b/content/components/cc1101.md index b775c20925..5ae751f1b0 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -1,7 +1,7 @@ --- title: CC1101 Low-Power Sub-1 GHz RF Transceiver description: Instructions for setting up CC1101 RF Transceiver in ESPHome. -image: /components/images/cc1101.webp +image: /components/images/cc1101-full.webp keywords: [cc1101] --- @@ -11,7 +11,7 @@ It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using This component requires the [SPI Component](/components/spi) to be enabled. -Image +CC1101 Module ## Component Configuration diff --git a/content/components/images/cc1101-full.webp b/content/components/images/cc1101-full.webp new file mode 100644 index 0000000000000000000000000000000000000000..f99bf15e975e3a2fdc377b0c9e73f9a901536562 GIT binary patch literal 39320 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 BSZ)9S literal 0 HcmV?d00001 diff --git a/content/components/images/cc1101.webp b/content/components/images/cc1101.webp deleted file mode 100644 index 602fce4c5d62a017fb72c3c965f854d499114245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22576 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 BSZ)9S literal 0 HcmV?d00001 From 060c8a491a162aec1336fd5a5a6457945ce48628 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 2 Dec 2025 23:52:53 -0500 Subject: [PATCH 27/31] Clean up --- content/components/cc1101.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 5ae751f1b0..75da2b02af 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -11,7 +11,7 @@ It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using This component requires the [SPI Component](/components/spi) to be enabled. -CC1101 Module +{{< img src="cc1101-full.webp" alt="CC1101 Module" width="50.0%" class="align-center" >}} ## Component Configuration From ee7d637ab66c9372c5946f9a39535ce0ba8022f2 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 3 Dec 2025 07:57:01 -0500 Subject: [PATCH 28/31] Add detail --- content/components/cc1101.md | 76 +++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index 75da2b02af..badf589939 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -9,7 +9,7 @@ The **CC1101** component provides a driver for the **Texas Instruments CC1101** It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using the standard [Remote Transmitter](/components/remote_transmitter) and [Remote Receiver](/components/remote_receiver) components. -This component requires the [SPI Component](/components/spi) to be enabled. +This component requires the [SPI Component](/components/spi) to be configured. {{< img src="cc1101-full.webp" alt="CC1101 Module" width="50.0%" class="align-center" >}} @@ -51,32 +51,45 @@ cc1101: - **channel** (*Optional*, int): Channel number (added to base frequency). - **channel_spacing** (*Optional*, frequency): Spacing between channels. - **if_frequency** (*Optional*, frequency): Intermediate Frequency. Defaults to a value optimized for 433MHz. -- **pktlen** (*Optional*, int): Packet length config. +- **pktlen** (*Optional*, int): Packet length configuration. Sets the expected packet size for + fixed-length packet mode. Range: `1` to `255`. Not typically needed for OOK/ASK modulation. ### AGC (Automatic Gain Control) Settings -Advanced users can fine-tune the AGC dynamics. +Advanced users can fine-tune the AGC dynamics. The AGC automatically adjusts receiver gain to handle +signals of varying strength. These settings control how aggressively and quickly the gain adapts. +See the [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) for detailed information. -- **magn_target** (*Optional*, dB): Target signal amplitude. Range: `24dB` to `42dB` in increments of 3(eg. `33dB`). -- **max_lna_gain** (*Optional*, dB): Maximum LNA gain reduction. +- **magn_target** (*Optional*, dB): Target signal amplitude for the AGC loop. Higher values increase + sensitivity but may cause clipping on strong signals. + Range: `24dB` to `42dB` in increments of 3 (e.g., `33dB`). +- **max_lna_gain** (*Optional*, dB): Limits the maximum LNA (Low Noise Amplifier) gain. Use to prevent + saturation in high-signal environments. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. -- **max_dvga_gain** (*Optional*, enum): Maximum Digital Variable Gain reduction. Options: `Default`, `-1`, `-2`, `-3`. -- **lna_priority** (*Optional*, boolean): If true, decrease LNA gain before DVGA gain. -- **carrier_sense_abs_thr** (*Optional*, int): Absolute RSSI threshold for Carrier Sense. -- **carrier_sense_rel_thr** (*Optional*, enum): Relative RSSI threshold for Carrier Sense. -- **filter_length_fsk_msk** (*Optional*, enum): Averaging length for FSK/MSK. -- **filter_length_ask_ook** (*Optional*, enum): Averaging length for ASK/OOK. -- **freeze** (*Optional*, enum): AGC gain freeze behavior. -- **wait_time** (*Optional*, enum): AGC wait time. -- **hyst_level** (*Optional*, enum): AGC hysteresis level. +- **max_dvga_gain** (*Optional*, enum): Limits the maximum DVGA (Digital Variable Gain Amplifier) gain. + Options: `Default`, `-1`, `-2`, `-3`. +- **lna_priority** (*Optional*, boolean): If true, reduce LNA gain before DVGA gain when decreasing + overall gain. Useful for optimizing noise figure. +- **carrier_sense_abs_thr** (*Optional*, int): Absolute RSSI threshold for carrier sense. The radio + considers a carrier present when RSSI exceeds this level. +- **carrier_sense_rel_thr** (*Optional*, enum): Relative RSSI threshold for carrier sense, compared + to the current noise floor. +- **filter_length_fsk_msk** (*Optional*, enum): Averaging length for AGC in FSK/MSK modes. + Longer values provide more stable gain but slower response. +- **filter_length_ask_ook** (*Optional*, enum): Averaging length for AGC in ASK/OOK modes. + Longer values provide more stable gain but slower response. +- **freeze** (*Optional*, enum): Controls when AGC gain is frozen (held constant). +- **wait_time** (*Optional*, enum): Time to wait after a gain change before allowing another adjustment. +- **hyst_level** (*Optional*, enum): Hysteresis level to prevent gain oscillation on borderline signals. ## Actions This component provides actions to control the radio state, primarily used for coordinating transmission. -- **cc1101.begin_tx**: Puts the radio into TX mode. -- **cc1101.begin_rx**: Puts the radio into RX mode. -- **cc1101.set_idle**: Puts the radio into idle state. +- **cc1101.begin_tx**: Puts the radio into TX mode. Must be called before transmitting. +- **cc1101.begin_rx**: Puts the radio into RX mode. Call after transmitting to resume receiving. +- **cc1101.set_idle**: Puts the radio into an idle state. In single-pin configurations, this should be + called before switching between TX and RX modes to ensure clean state transitions. - **cc1101.reset**: Resets the CC1101 chip and re-applies configuration. ## Integration with Remote Receiver/Transmitter @@ -100,10 +113,10 @@ remote_transmitter: carrier_duty_percent: 100% on_transmit: then: - - cc1101.begin_tx: + - cc1101.begin_tx on_complete: then: - - cc1101.begin_rx: + - cc1101.begin_rx remote_receiver: pin: GPIOXX # CC1101 GDO2 @@ -121,9 +134,10 @@ Using an open-drain pin mode is recommended to simplify the setup. #### Single Pin with Open-Drain (Recommended) -ESP32 must use this method when using single pin wiring. The shared pin should be set to open-drain with a -pullup. The `eot_level` should be set to `false`. In addition to setting the CC1101 mode in -`on_transmit` / `on_complete`, the pin should be driven low before `begin_tx` and pulled high / released +ESP32 must use this method when using single-pin wiring. The shared pin should be set to open-drain with a +pullup. The `eot_level` option (from `remote_transmitter`) controls the pin state after transmission +completes - setting it to `false` keeps the pin low until explicitly released. In addition to setting the +CC1101 mode in `on_transmit`/`on_complete`, the pin should be driven low before `begin_tx` and released before `begin_rx`. ```yaml @@ -154,14 +168,14 @@ remote_transmitter: carrier_duty_percent: 100% on_transmit: then: - - cc1101.set_idle: + - cc1101.set_idle - remote_transmitter.digital_write: false - - cc1101.begin_tx: + - cc1101.begin_tx on_complete: then: - - cc1101.set_idle: + - cc1101.set_idle - remote_transmitter.digital_write: true - - cc1101.begin_rx: + - cc1101.begin_rx ``` #### Single Pin with Mode Switching @@ -194,14 +208,14 @@ remote_transmitter: carrier_duty_percent: 100% on_transmit: then: - - cc1101.set_idle: + - cc1101.set_idle - lambda: id(tx_pin)->pin_mode(gpio::FLAG_OUTPUT); - - cc1101.begin_tx: + - cc1101.begin_tx on_complete: then: - - cc1101.set_idle: + - cc1101.set_idle - lambda: id(rx_pin)->pin_mode(gpio::FLAG_INPUT); - - cc1101.begin_rx: + - cc1101.begin_rx ``` ## Troubleshooting @@ -216,7 +230,7 @@ communication failure. Check your wiring (MISO/MOSI/CS). - **Check Pinout**: For all modes, the data line must be connected to GDO0 (Module Pin 3), as the CC1101 chip only supports transmission input via the GDO0 pin. - **Check Pin Mode**: If using the Single Pin with Mode Switching method, - ensure your on_transmit / on_complete logic correctly flips the pin mode. + ensure your `on_transmit`/`on_complete` logic correctly flips the pin mode. ## See Also From c8485ced12ffd38215d154dad5157814b0b0f4ca Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:41:20 -0500 Subject: [PATCH 29/31] Add detail --- content/components/cc1101.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index badf589939..f4541ea23b 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -48,9 +48,9 @@ cc1101: - **filter_bandwidth** (*Optional*, frequency): The receive filter bandwidth. Range: `58kHz` to `812kHz`. Defaults to `203kHz`. - **fsk_deviation** (*Optional*, frequency): Frequency deviation for FSK/GFSK modulation. -- **channel** (*Optional*, int): Channel number (added to base frequency). -- **channel_spacing** (*Optional*, frequency): Spacing between channels. -- **if_frequency** (*Optional*, frequency): Intermediate Frequency. Defaults to a value optimized for 433MHz. +- **channel** (*Optional*, int): Channel number (added to base frequency). Defaults to `0`. +- **channel_spacing** (*Optional*, frequency): Spacing between channels. Defaults to `200kHz`. +- **if_frequency** (*Optional*, frequency): Intermediate Frequency. Defaults to `153kHz`. - **pktlen** (*Optional*, int): Packet length configuration. Sets the expected packet size for fixed-length packet mode. Range: `1` to `255`. Not typically needed for OOK/ASK modulation. @@ -62,25 +62,28 @@ See the [CC1101 Datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf) for det - **magn_target** (*Optional*, dB): Target signal amplitude for the AGC loop. Higher values increase sensitivity but may cause clipping on strong signals. - Range: `24dB` to `42dB` in increments of 3 (e.g., `33dB`). + Range: `24dB` to `42dB` in increments of 3 (e.g., `33dB`). Defaults to `42dB`. - **max_lna_gain** (*Optional*, dB): Limits the maximum LNA (Low Noise Amplifier) gain. Use to prevent - saturation in high-signal environments. + saturation in high-signal environments. Defaults to `Default`. Options: `Default`, `2.6dB`, `6.1dB`, `7.4dB`, `9.2dB`, `11.5dB`, `14.6dB`, `17.1dB`. - **max_dvga_gain** (*Optional*, enum): Limits the maximum DVGA (Digital Variable Gain Amplifier) gain. - Options: `Default`, `-1`, `-2`, `-3`. + Options: `Default`, `-1`, `-2`, `-3`. Defaults to `-3`. - **lna_priority** (*Optional*, boolean): If true, reduce LNA gain before DVGA gain when decreasing - overall gain. Useful for optimizing noise figure. + overall gain. Useful for optimizing noise figure. Defaults to `false`. - **carrier_sense_abs_thr** (*Optional*, int): Absolute RSSI threshold for carrier sense. The radio considers a carrier present when RSSI exceeds this level. - **carrier_sense_rel_thr** (*Optional*, enum): Relative RSSI threshold for carrier sense, compared - to the current noise floor. + to the current noise floor. Options: `Default`, `+6dB`, `+10dB`, `+14dB`. - **filter_length_fsk_msk** (*Optional*, enum): Averaging length for AGC in FSK/MSK modes. - Longer values provide more stable gain but slower response. + Longer values provide more stable gain but slower response. Options: `8`, `16`, `32`, `64`. - **filter_length_ask_ook** (*Optional*, enum): Averaging length for AGC in ASK/OOK modes. - Longer values provide more stable gain but slower response. + Longer values provide more stable gain but slower response. Options: `4dB`, `8dB`, `12dB`, `16dB`. - **freeze** (*Optional*, enum): Controls when AGC gain is frozen (held constant). + Options: `Default`, `On Sync`, `Analog Only`, `Analog And Digital`. - **wait_time** (*Optional*, enum): Time to wait after a gain change before allowing another adjustment. + Options: `8`, `16`, `24`, `32`. Defaults to `32`. - **hyst_level** (*Optional*, enum): Hysteresis level to prevent gain oscillation on borderline signals. + Options: `None`, `Low`, `Medium`, `High`. ## Actions From f4fabc63b1f2ab76d8ea42d457af34e47b5fd5b7 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:43:51 -0500 Subject: [PATCH 30/31] Add detail --- content/components/cc1101.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index f4541ea23b..eb88b3ce3c 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -5,11 +5,16 @@ image: /components/images/cc1101-full.webp keywords: [cc1101] --- -The **CC1101** component provides a driver for the **Texas Instruments CC1101** Sub-1 GHz RF Transceiver. -It allows you to transmit and receive raw RF signals (ASK/OOK, FSK, etc.) using the standard -[Remote Transmitter](/components/remote_transmitter) and [Remote Receiver](/components/remote_receiver) components. - -This component requires the [SPI Component](/components/spi) to be configured. +The **CC1101** component provides a driver for the **Texas Instruments CC1101** Sub-1 GHz RF Transceiver +([datasheet](https://www.ti.com/lit/ds/symlink/cc1101.pdf)). The CC1101 is a low-cost, low-power radio +chip commonly used for wireless communication in the 300-928 MHz frequency bands, including the popular +315 MHz, 433 MHz, 868 MHz, and 915 MHz ISM bands. + +The **CC1101** supports multiple modulation schemes (ASK/OOK, 2-FSK, 4-FSK, GFSK, MSK), configurable data +rates from 600 to 500,000 baud, and adjustable output power from -30 dBm to +11 dBm. It connects to +ESPHome via the [SPI Bus](/components/spi) and integrates with the +[Remote Transmitter](/components/remote_transmitter) and +[Remote Receiver](/components/remote_receiver) components for encoding and decoding RF protocols. {{< img src="cc1101-full.webp" alt="CC1101 Module" width="50.0%" class="align-center" >}} From cf8812d9c4b05e720d0379a21bf121e8155a63e3 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:47:49 -0500 Subject: [PATCH 31/31] Clean up --- content/components/cc1101.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/components/cc1101.md b/content/components/cc1101.md index eb88b3ce3c..2785db6db6 100644 --- a/content/components/cc1101.md +++ b/content/components/cc1101.md @@ -140,7 +140,7 @@ Using an open-drain pin mode is recommended to simplify the setup. - **GDO0 (Module Pin 3)**: Connect to a single MCU GPIO pin. - **GDO2 (Module Pin 8)**: Leave disconnected. -#### Single Pin with Open-Drain (Recommended) +#### Single Pin with Open-Drain ESP32 must use this method when using single-pin wiring. The shared pin should be set to open-drain with a pullup. The `eot_level` option (from `remote_transmitter`) controls the pin state after transmission