Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Device Settings

The CGD1 stores all configuration in a single 18-byte settings payload, read and written via the Data characteristics.

Settings Payload

13 01 [Vol] [Hdr1] [Hdr2] [Flags] [TZ] [Duration] [Brightness] [NightStartH] [NightStartM] [NightEndH] [NightEndM] [TzSign] [NightEn] [Reserved] [Sig 4B]
OffsetFieldBytesDescription
0Header10x13 (length byte)
1Command10x01 (set) or 0x02 (read response)
2Volume1Sound volume (1–5)
3Hdr11Fixed 0x58
4Hdr21Fixed 0x02
5Flags1Mode bitfield (see below)
6Timezone1Offset in 6-minute units (minutes / 6)
7Duration1Screen light duration in seconds
8Brightness1Packed brightness (see below)
9NightStartH1Night mode start hour (0–23)
10NightStartM1Night mode start minute (0–59)
11NightEndH1Night mode end hour (0–23)
12NightEndM1Night mode end minute (0–59)
13TzSign10x01 = positive, 0x00 = negative
14NightEn10x01 = enabled, 0x00 = disabled
15Reserved1Set to 0xFF
16–19Signature4Ringtone signature (0xFFFFFFFF when unused)

Flags Bitfield (Byte 5)

BitMaskField01
00x01LanguageChineseEnglish
10x02Time Format24-hour12-hour
20x04Temperature UnitCelsiusFahrenheit
40x10AlarmsEnabledDisabled

Brightness Encoding (Byte 8)

Two nibbles packed into one byte:

High nibble = daytime_brightness / 10
Low nibble  = nighttime_brightness / 10

Each value must be 0–150 and a multiple of 10. Typical range is 0–100.

Example: Daytime 80%, Nighttime 30% → (8 << 4) | 3 = 0x83

Night Mode Workaround

Disabling night mode is done by setting a 1-minute night mode window (00:00–00:01). Even the official app does this.

Protocol

Read Settings

Send 01 02 to Data Write. Response on Data Notify: 13 02 [Settings Payload 18B]

Write Settings

Send 13 01 [Settings Payload 18B] to Data Write. ACK: 04 ff 01 00 00

Set Immediate Brightness (Preview)

Send 02 03 [Value] to Data Write, where Value is brightness / 10 (0–15).

ACK: 04 ff 03 00 00

Preview Ringtone

Plays a generic beep sound for testing volume.

  • Current volume: 01 04
  • Specific volume: 02 04 [Vol] (volume 1–5)

ACK: 04 ff 04 00 00

CLI Usage

Read settings

cgd1 settings-read AA:BB:CC:DD:EE:FF

Write settings

Only specified fields are updated; unspecified fields are read from the device first and preserved:

cgd1 settings-write AA:BB:CC:DD:EE:FF \
    --volume 3 \
    --brightness 80 \
    --night-brightness 30 \
    --timezone 60 \
    --time-format 24 \
    --temp-unit C \
    --language en
FlagValuesDescription
--volume1–5Sound volume
--brightness0–150 (multiple of 10)Daytime brightness
--night-brightness0–150 (multiple of 10)Nighttime brightness
--timezone-720 to +840 (minutes)Timezone offset
--time-format12 or 24Time display format
--temp-unitC or FTemperature unit
--languageen, zh, de, jaDisplay language

Set brightness (preview)

cgd1 brightness AA:BB:CC:DD:EE:FF 80

Preview ringtone

cgd1 ringtone-preview AA:BB:CC:DD:EE:FF --volume 3

Library API

#![allow(unused)]
fn main() {
use cgd1_rs::{Brightness, Language, TemperatureUnit, TimeFormat, Timezone, Volume};

// Read current settings
let settings = device.read_settings().await?;
println!("Volume: {}", settings.volume);
println!("Brightness: {}", settings.brightness);

// Modify and write
let mut settings = device.read_settings().await?;
settings.volume = Volume::new(3)?;
settings.brightness = Brightness::new(80)?;
settings.time_format = TimeFormat::TwentyFourHour;
settings.temperature_unit = TemperatureUnit::Celsius;
settings.language = Language::English;
device.write_settings(&settings).await?;

// Set immediate brightness (preview)
device.set_brightness(Brightness::new(80)?).await?;

// Preview ringtone
device.preview_ringtone(Some(Volume::new(3)?)).await?;
}