logo elektroda
logo elektroda
X
logo elektroda

[BK7231N/CB3S] Tuya Smart Air Box Air Quality Monitor, 5 sensors

lars4 5844 50
Best answers

How can I make OpenBeken show the sensor values from my Tuya Smart Air Box after flashing it?

Add `tuyaMcu_sendQueryState` to the autoexec after your `TuyaMCU` setup; that forces the MCU to send the current DP values, and the readings will appear in OpenBeken [#21169855][#21169864][#21169869] The working config kept `startDriver TuyaMCU`, `tuyaMcu_defWiFiState 4`, and `tuyaMcu_setBaudRate 9600`, then mapped DPs 18, 19, 2, 21, and 22 to channels 1–5 [#21169869] `tmSensor` is not needed here; it is intended for battery-powered devices [#21171036] If you still see nothing, the thread suggests checking the Tuya MCU baud rate and query behavior, but in this case the query command was the actual fix [#21169772][#21169855]
Generated by the language model.
ADVERTISEMENT
  • #1 21169769
    lars4
    Level 5  
    Posts: 14
    I have problems getting the values ​​out after switching to OpenBeken

    Printed circuit board with electronic components viewed from above.

    White circular device labeled Tuya Smart Air Box with Tuya, Wi-Fi, and Smart Life logos on top.

    With original firmware this is read out:
    Table with sensor values read after switching to OpenBeken.

    2 = CH2O mg/m^3, div 100
    18 = Temperature, div 10
    19 = Humidity, div 10
    21 = VOC ppm, div 10
    22 = CO2 ppm


    Autoexec.bat

    startDriver TuyaMCU
    startDriver tmSensor
    setChannelType 1 Temperature_div10
    linkTuyaMCUOutputToChannel 18 val 1
    setChannelType 2 Humidity_div10
    linkTuyaMCUOutputToChannel 19 val 2
    setChannelType 3 Custom
    SetChannelLabel 3 CH2O mg/m^3
    linkTuyaMCUOutputToChannel 2 val 3
    setChannelType 4 Custom
    SetChannelLabel 4 VOC ppm
    linkTuyaMCUOutputToChannel 21 val 4
    setChannelType 5 Custom
    SetChannelLabel 5 CO2 ppm
    linkTuyaMCUOutputToChannel 22 val 5


    After I switch to OpenBeken, this is read out
    Screenshot of a WiFi data decoding tool showing raw packets.

    Screenshot of AirBox interface showing all sensor readings at 0.00.

    Anyone have any suggestions what I have missed?
  • ADVERTISEMENT
  • #2 21169772
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    >>21169769

    at what baud did you capture original comms?

    if 115200, add tuyaMcu_setBaudRate 115200 to your autoexec
  • #3 21169777
    lars4
    Level 5  
    Posts: 14
    >>21169772

    unfortunately it doesn't help. Used 9600 as default
  • #4 21169786
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    was the CB3S removed from the PCB for flashing?

    Is there definitely continuity between the module and the pad, between the very edge of the gold contact on the module and the silver pad on PCB, eg between these dots

    CB3S module on a PCB with marked solder points.

    and then continuity onwards to the legs of the MCU it's talking to?
  • #5 21169787
    lars4
    Level 5  
    Posts: 14
    >>21169786

    No, it was not removed. No resistors had to be unsoldered either, it was still possible to flash. I have tried to flash back the original firmware and then everything works as it did before
  • #6 21169789
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    oh. what if you get rid of startDriver tmSensor
  • ADVERTISEMENT
  • #7 21169796
    lars4
    Level 5  
    Posts: 14
    >>21169789

    I've tried it, it came up with different information in the serial log; unfortunately, I don't have a screenshot of it, but I can get that if needed.
  • ADVERTISEMENT
  • #8 21169812
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    could do? im not sure what to suggest next.
  • #9 21169825
    lars4
    Level 5  
    Posts: 14
    >>21169812
    without startDriver tmSensor

    Screenshot of a data packet analysis tool in hexadecimal format.
  • #10 21169837
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    oh hang on. add tuyaMcu_defWiFiState 4 under startDriver TuyaMCU
  • #11 21169842
    lars4
    Level 5  
    Posts: 14
    >>21169837

    Still no values :-(

    Screenshot of a packet decoder tool for WiFi communication.

    Autoexec.bat
    startDriver TuyaMCU
    //startDriver tmSensor
    
    tuyaMcu_defWiFiState 4
    tuyaMcu_setBaudRate 9600
    
    
    setChannelType 1 Temperature_div10
    linkTuyaMCUOutputToChannel 18 val 1
    
    setChannelType 2 Humidity_div10
    linkTuyaMCUOutputToChannel 19 val 2
    
    setChannelType 3 Custom
    SetChannelLabel 3 CH2O mg/m^3
    linkTuyaMCUOutputToChannel 2 val 3
    
    setChannelType 4 Custom
    SetChannelLabel 4 VOC ppm
    linkTuyaMCUOutputToChannel 21 val 4
    
    setChannelType 5 Custom
    SetChannelLabel 5 CO2 ppm
    linkTuyaMCUOutputToChannel 22 val 5
  • Helpful post
    #12 21169855
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    I'm probably forgettng something obvious

    and if you enter command tuyaMcu_sendQueryState do you get all the current dpID statuses returned to the log?
  • #13 21169864
    lars4
    Level 5  
    Posts: 14
    >>21169855

    Now I got the values after entering the command tuyaMcu_sendQueryState Thanks!!!

    After restarting, I need to send the command again for it to display the values
  • #14 21169866
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    ah ok ok. good
  • #15 21169869
    lars4
    Level 5  
    Posts: 14
    >>21169866

    Working autoexec.bat

    startDriver TuyaMCU
    tuyaMcu_defWiFiState 4
    tuyaMcu_setBaudRate 9600
    setChannelType 1 Temperature_div10
    linkTuyaMCUOutputToChannel 18 val 1
    setChannelType 2 Humidity_div10
    linkTuyaMCUOutputToChannel 19 val 2
    setChannelType 3 Custom
    SetChannelLabel 3 CH2O mg/m^3
    linkTuyaMCUOutputToChannel 2 val 3
    setChannelType 4 Custom
    SetChannelLabel 4 VOC ppm
    linkTuyaMCUOutputToChannel 21 val 4
    setChannelType 5 Custom
    SetChannelLabel 5 CO2 ppm
    linkTuyaMCUOutputToChannel 22 val 5
    tuyaMcu_sendQueryState
    

    Thanks so much for your help!
  • #16 21169896
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    no worries. is your firmware backup in credential-free state and would you mind sharing it?
  • #17 21169914
    lars4
    Level 5  
    Posts: 14
    >>21169896
    it's not in that mode, but do you still have use for it? It doesn't matter to me
  • Helpful post
    #18 21169916
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    template for device list

    Code: JSON
    Log in, to see the code


    https://github.com/OpenBekenIOT/webapp/pull/136

    Added after 1 [minutes]:

    lars4 wrote:
    it's not in that mode, but do you still have use for it? It doesn't matter to me


    only to post here and to see if there's anything else of interest from it. I would flash to my own device to see what boot log is. if you'd rather DM it me I can attempt factory reset and put fake credentials into it

    Added after 34 [minutes]:

    boot log. known patched v2.1.17 so cloudcutter no good

    Code: Text
    Log in, to see the code
  • #19 21171036
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14412
    Help: 650
    Rate: 12357
    Thank you @divadiow for you activity.

    Some hints from me:
    - tmSensor is only for battery powered devices
    - tuyaMcu_sendQueryState can be send in repeating event (like every 15 seconds etc)
    - TuyaMCU baud rate can be detected from 2MB flash so there is no need to guess
    - it may be useful to enable PowerSave on this device (as on many others)

    Extra question: Is this DHT sensor of some kind? On device photo?
    Helpful post? Buy me a coffee.
  • #20 21173494
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    I wonder if it's a DHT20.

    DHT20 humidity and temperature sensor with four metal pins.

    Added after 8 [minutes]:

    How could the poster confirm apart from desoldering and trying the sensor with one of the DHT sensor driver option or just an Arduino setup?

    https://github.com/search?q=repo%3Aopenshwprojects%2FOpenBK7231T_App+dht&type=code&p=2

    DHT20 isn't mentioned but does the driver support it anyway?

    I guess if a dump of the MCU flash could be had there might be mention in there of the exact sensor
  • #21 21173538
    lars4
    Level 5  
    Posts: 14
    >>21173494

    I'll see what I can figure out. I haven't been home for a couple of days

    Added after 1 [hours] 44 [minutes]:

    >>21173494

    Yes it is a DHT20
    Close-up of an ASAIR DHT20 sensor on an electronic board.

    I can't find any information about the second sensor

    Image of a circuit board with several electronic components, including a sensor labeled BP0315-01# HMNST.

    Guess it says BP0315-01# HMNST
  • #23 21174757
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    The Hefei Micro Nano Sensing Technology Co. Ltd (HMNST) contact Lei has stated the sensor on that module is an HGS1000 http://www.hmnst.com/a/products/gas/73.html

    Code: Text
    Log in, to see the code


    English translated info PDF attached
    Attachments:
    • HGS1000_EN.pdf (734.79 KB) You must be logged in to download this attachment.
  • ADVERTISEMENT
  • #24 21174799
    lars4
    Level 5  
    Posts: 14
    >>21174757

    Perfect, good work!
  • #25 21175431
    divadiow
    Level 38  
    Posts: 4852
    Help: 424
    Rate: 857
    Code: Text
    Log in, to see the code


    The sheet Lei sent has a lot of the same information as the one posted above, but with a bit more detail.
    Attachments:
    • HGS1000_CN.pdf (738.92 KB) You must be logged in to download this attachment.
    • HGS1000_EN.pdf (546.94 KB) You must be logged in to download this attachment.
  • #26 21177061
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14412
    Help: 650
    Rate: 12357
    So it's DHT20 indeed. It should work well with OBK directly, without MCU:



    HGS1000, on the other hand, is not currently supported. I've checked @divadiow 's documents but I can't see any details about the communication protocol used by HGS1000 family. Maybe we would need to hook up a 10$ logic analyzer for that, like I did in some other topics: https://www.elektroda.com/rtvforum/topic4035491.html

    Added after 1 [minutes]:

    EDIT: It's UART:
    Diagram showing DHT20 and a table with pin descriptions. Fragment of technical documentation for a UART communication protocol, including a data packet structure and example code in a programming language.
    Helpful post? Buy me a coffee.
  • #27 21180371
    lars4
    Level 5  
    Posts: 14
    >>21177061

    In this case, there is no need for directly connected sensors. The values are reported correctly after the "tuyaMcu_sendQueryState" command is sent.
  • #28 21593564
    io2345
    Level 9  
    Posts: 244
    Help: 1
    Rate: 6
    I'm thinking about an "adapted usage" of this AirBox. It should give an alarm sound when certain values are exceeded.
    To achieve that, I would connect an alarm buzzer (rated 35 mA) to one of the unused Pins of the CB3S. P8 (GPIOP_8) on Pin 13 seems to be available.

    What will I have to add in the autoexec.bat in Post#15, to set P8 to high (or low, whatever is easier), when at least one of these values are exceeded:
    - Channel 1 (temperature) is over 550 (that would be 55 degrees)
    - Channel 2 (humidity) is over 800 (80%)
    - Channel 3 (CH2O) is over 50 (0,5 mg/m3)
    - Channel 4 (VOC) is over 50 (5 ppm)
    - Channel 5 (CO2) is over 700 (700 ppm)


    For those who want to do the same: Don't connect the Buzzer directly to CB3S's IO-Pin. 35mA is too much for that. Use a simple "transitor as switch" circle instead, something like this:


    [BK7231N/CB3S] Tuya Smart Air Box Air Quality Monitor, 5 sensors

    You can take connections from here:


    [BK7231N/CB3S] Tuya Smart Air Box Air Quality Monitor, 5 sensors


    ===============================
    Done! Not pretty, but working:


    [BK7231N/CB3S] Tuya Smart Air Box Air Quality Monitor, 5 sensors

    [BK7231N/CB3S] Tuya Smart Air Box Air Quality Monitor, 5 sensors
    The + Pin of the Buzzer is soldered to the 3,3V pin, the rest is "flying wiring"
  • #29 21593616
    p.kaczmarek2
    Moderator Smart Home
    Posts: 14412
    Help: 650
    Rate: 12357
    Probably the simplest way would be to create a loop and check every second. The channel indexes, values and condition in sample below should be adjusted.
    
    alias ALARM_ON setChannel 10 1
    alias ALARM_OFF setChannel 10 0
    
    again:
    delay_s 1
    if $CH4==0||$CH3>50||$CH2<10 then ALARM_ON else ALARM_OFF
    goto again
    
    

    https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/autoexecExamples.md
    Helpful post? Buy me a coffee.
  • #30 21593801
    io2345
    Level 9  
    Posts: 244
    Help: 1
    Rate: 6
    >>21593616 It always takes a while for my brain to catch up with you. But after some thinking I guess that the block to add at the end of the autoexec.bat should be in my case:

    alias ALARM_ON setChannel 8 1
    alias ALARM_OFF setChannel 8 0
    again:
    delay_s 10
    if $CH1>550||$CH2>800||$CH3>50||$CH4>50||$CH5>700 
    then ALARM_ON 
    else ALARM_OFF
    goto again


    and I'll have to set P8 (PWM2) for example to type "Relay" and channel 8. Or isn't that necessary at all?

Topic summary

✨ The discussion addresses issues with reading sensor values from the Tuya Smart Air Box Air Quality Monitor (BK7231N/CB3S) after switching to OpenBeken firmware. The original firmware correctly outputs sensor data including CH2O, temperature, humidity, VOC, and CO2 via specific data points (DPIDs). Initial troubleshooting involved verifying baud rates (default 9600), module connection integrity, and driver configurations in autoexec.bat. The key solution was to send the command "tuyaMcu_sendQueryState" after startup to retrieve sensor values, as values do not appear automatically on reboot. The working autoexec.bat includes starting the TuyaMCU driver, setting WiFi state, baud rate, defining channel types and labels, linking DPIDs to channels, and issuing the query state command. Further discussion identified the temperature/humidity sensor as a DHT20 and the VOC sensor as an HGS1000 from Hefei Micro Nano Sensing Technology Co. Ltd (HMNST), which uses UART communication but lacks direct OpenBeken support. Suggestions included periodic sending of the query state command and enabling power-saving modes. An additional topic explored adding an alarm buzzer on GPIO P8 (Pin 13) triggered by threshold exceedances on sensor channels, implemented via autoexec.bat scripting with conditional loops and channel control commands. The conversation also referenced firmware backup sharing and device templates for integration.
Generated by the language model.

FAQ

TL;DR: If your BK7231N/CB3S Tuya Air Box shows 0 values in OpenBeken, map 5 dpIDs, set baud to 9600, set Wi‑Fi state to 4, and add tuyaMcu_sendQueryState. "Now I got the values" after that command. This FAQ is for OpenBeken users who need temperature, humidity, CH2O, VOC, and CO2 to appear correctly after flashing. [#21169869]

Why it matters: This device can look fully flashed yet still report no useful air-quality data until the right TuyaMCU startup sequence runs.

Option Result on this Air Box Best use
OpenBeken + TuyaMCU + tuyaMcu_sendQueryState All 5 values can display correctly Keep TuyaMCU path and add automation
OpenBeken + tmSensor Can interfere here Battery-powered TuyaMCU devices
ESPHome Used successfully for spare pins and other purposes If you want custom GPIO or IR work

Key insight: The missing piece was not the channel map. It was forcing a TuyaMCU state refresh at boot with tuyaMcu_sendQueryState, while avoiding tmSensor on this mains-powered Air Box. [#21169869]

Quick Facts

  • The working dpID map is: 2 = CH2O mg/m^3 ÷100, 18 = temperature ÷10, 19 = humidity ÷10, 21 = VOC ppm ÷10, 22 = CO2 ppm. Those five datapoints are enough to expose all main readings in OpenBeken. [#21169769]
  • The confirmed working TuyaMCU settings were tuyaMcu_defWiFiState 4 and tuyaMcu_setBaudRate 9600. Without the later query command, the device could still boot with empty readings. [#21169842]
  • A working alarm add-on used CB3S P8 with a transistor switch, not a direct buzzer connection. The buzzer was rated 35 mA, and direct drive from the module pin was explicitly discouraged. [#21593564]
  • A practical self-recovery method used NTP plus addClockEvent 13:30:00 0x7F 1 reboot to force one reboot every day. That workaround targeted stuck values after power outages. [#21816233]
  • The thread identified two onboard sensors: a DHT20 for temperature and humidity, and an HMNST HGS1000 gas sensor module. OpenBeken support was clear for DHT20, but not for HGS1000 direct integration. [#21177061]

How do I make a Tuya Smart Air Box with BK7231N/CB3S show temperature, humidity, CH2O, VOC, and CO2 correctly in OpenBeken?

Use TuyaMCU, map the five dpIDs, and send a state query at boot. 1. Start TuyaMCU, set Wi‑Fi state 4, and baud 9600. 2. Link dpIDs 18, 19, 2, 21, 22 to channels for temperature, humidity, CH2O, VOC, and CO2. 3. Add tuyaMcu_sendQueryState to autoexec.bat so values appear after power-up, not only after a manual command. [#21169869]

Why does this Tuya Air Box only start showing sensor values after I run tuyaMcu_sendQueryState in OpenBeken?

Because this device does not reliably push its current TuyaMCU states to OpenBeken on its own at boot. The manual command forces the MCU to return the active dpID values, and that immediately populated all five readings in the log and UI. After each restart, the same query was needed until it was added to autoexec.bat. [#21169864]

What should a working autoexec.bat look like for the Tuya Smart Air Box Air Quality Monitor with dpIDs 2, 18, 19, 21, and 22?

A working file starts TuyaMCU, sets Wi‑Fi state 4, sets baud 9600, maps dpIDs 18/19/2/21/22 to channels 1–5, and ends with tuyaMcu_sendQueryState. Channel 1 is Temperature_div10, channel 2 is Humidity_div10, and channels 3 to 5 are custom labels for CH2O, VOC, and CO2. That exact layout was confirmed to work on July 27, 2024. [#21169869]

Which TuyaMCU settings matter most on this device, such as tuyaMcu_defWiFiState 4 and tuyaMcu_setBaudRate 9600?

The two key settings are tuyaMcu_defWiFiState 4 and tuyaMcu_setBaudRate 9600. On this Air Box, 9600 matched the working serial link, while Wi‑Fi state 4 was recommended during troubleshooting under startDriver TuyaMCU. These settings alone were not enough, but they were part of the final working configuration. [#21169842]

Why can startDriver tmSensor break or interfere with readings on this Air Box, and when should tmSensor be used instead?

It can interfere because this Air Box works through TuyaMCU state reporting, not the battery-oriented polling path tied to tmSensor. Removing startDriver tmSensor changed the serial behavior, and the final fix omitted it completely. Use tmSensor for battery-powered TuyaMCU devices, not this mains-powered USB-C Air Box. [#21171036]

What is tmSensor in OpenBeken, and why is it recommended only for battery-powered devices?

"tmSensor" is an OpenBeken driver that handles TuyaMCU sensor behavior for battery-powered devices, including state reporting patterns that differ from always-powered hardware. In this thread, an OpenBeken maintainer stated, "tmSensor is only for battery powered devices." That is why enabling it on this Air Box caused confusion instead of fixing the missing values. [#21171036]

What is a TuyaMCU dpID, and how do dpIDs map to OpenBeken channels on the BK7231N Air Box?

"TuyaMCU dpID" is a Tuya datapoint identifier that carries one sensor or status value between the main MCU and the Wi‑Fi module, with each dpID representing a specific function and value format. On this Air Box, dpID 18 maps to temperature ÷10, 19 to humidity ÷10, 2 to CH2O ÷100, 21 to VOC ÷10, and 22 to CO2 ppm. [#21169769]

How can I add a buzzer alarm to an unused CB3S pin like P8 and trigger it when temperature, humidity, CH2O, VOC, or CO2 exceed thresholds?

Use a transistor-switched buzzer on P8 and control it from a linked OpenBeken channel. 1. Assign P8 to channel 8 and set its role to Relay, Rel_n, LED, or LED_n. 2. Add alias ALARM_ON setChannel 8 1 and alias ALARM_OFF setChannel 8 0. 3. Run a loop such as if $CH1>580||$CH6>890||$CH3>50||$CH4>200||$CH5>1200 then ALARM_ON else ALARM_OFF. Do not drive a 35 mA buzzer directly from the CB3S pin. [#21595628]

Why doesn’t a multiline if/else script work in OpenBeken autoexec.bat, and what is the correct single-line syntax for alarm logic?

It fails because OpenBeken does not support multiline if/else syntax in autoexec.bat. The maintainer stated that directly, and the fix was a single-line command such as if $CH1>580||$CH2>890||$CH3>50||$CH4>200||$CH5>1200 then ALARM_ON else ALARM_OFF. Once rewritten to one line, the alarm logic worked. [#21595612]

How do I configure a CB3S GPIO pin to follow an OpenBeken channel, such as setting P8 to Relay or LED on channel 8?

You must assign both a role and a channel to the pin. setChannel 8 1 changes channel 8 only; it does not drive P8 until P8 is configured as Relay, Rel_n, LED, or similar and linked to channel 8. The maintainer noted that the channel number can be any value, but the pin-role mapping is mandatory. [#21595031]

What causes this Air Box to boot with zero or stale values until a restart, and how can I keep readings valid across reboots with setStartValue or state queries?

The device can boot without refreshing TuyaMCU datapoints, so channels stay at 0 or retain stale values until a restart or query. Two mitigations appeared in the thread: add tuyaMcu_sendQueryState at startup, and use low channel numbers with setStartValue <channel> -1 so the last values persist across reboots. A later example used channels 1, 3, 4, 5, 6 with setStartValue on each. [#21816233]

How can I schedule an automatic daily reboot in OpenBeken using NTP and addClockEvent to recover from stuck sensor values after power outages?

Start the NTP driver, set a time source, and schedule a clock event. The working example was: startDriver ntp, ntp_setup 0.pool.ntp.org, ntp_start, ntp_timeZoneOfs 1, and addClockEvent 13:30:00 0x7F 1 reboot. The user first tried a long delay alias, but daily reboot worked after switching to NTP-based scheduling. [#21816233]

What sensors are inside the Tuya Smart Air Box, and how were the DHT20 and HMNST HGS1000 identified in the thread?

The thread identified a DHT20 for temperature and humidity and an HMNST HGS1000 gas sensor module. The DHT20 was confirmed by a board photo on July 30, 2024, and the HGS1000 name later came from HMNST contact confirmation shared on July 31, 2024. OpenBeken support was described as straightforward for DHT20, while HGS1000 protocol support was not available. [#21174757]

OpenBeken vs ESPHome on the Tuya BK7231N Air Box: which is better if I want to use spare pins for alarms or IR control?

OpenBeken is sufficient if you want alarms or spare GPIO control, while ESPHome was chosen by one user for broader repurposing. This same Air Box already drove a buzzer from a spare pin under OpenBeken, and an OpenBeken maintainer also noted that OBK has an IR driver. ESPHome still worked fine for one user who switched to use free pins for other functions. [#21694989]

How does this Air Box derive its reported CO2 reading, and is it a true CO2 measurement or an estimate based on the VOC/formaldehyde sensor?

The thread does not prove that the CO2 value is a true dedicated CO2 measurement. Users confirmed a DHT20 plus an HMNST HGS1000 gas sensor, and one later question explicitly asked whether CO2 was calculated from the VOC sensor, but no definitive protocol or sensing method was posted. Treat the displayed CO2 as unverified within this thread, even though breathing on the unit changed the reading. [#21744651]
Generated by the language model.
ADVERTISEMENT