0、项目背景

其实之前写过IoT的代码,7、8年前,利用了温湿度传感器+红外线来控制空调,
当然我也知道这其实就是一个典型的PID算法即使就是用豆包这样的AI,
结合传感器和空调控制器的代码,也就是一个下午肯定能编写出来满意的程序,
但我就是有点想实验一下,在不编程的情况下,仅凭CALL AI本身,能否完成我想要的东西,
当然,这个程序本身,除了LLM以外其实和python的程序都是类似的,只是你懂得,
这样的程序的难度相当低,因为引擎的核心是一段中文的需求描述,而非晦涩的PID算法
正常的人也能看懂其余的部分,

无非就是

1、定时调用获取环境参数以及记录当中的历史温度、空调当前状态信息;
2、将决策用参数交给LLM
3、将LLM的决策最终交给程序执行,我的空调是美的,有两种方法可以去执行
   a、网上找到的美的的局域网控制;
   b、之前购买过的几乎是万能的可录制红外线信号的外设

1和3部分,本文不再累述,将放在别的文章里记录。
本文只记录使用R1思维连以及V3推理的过程,且结构化输出的技巧等,也不在本文讨论范围
还有诸如定时、重试、空调的状态获取等工程问题,均省略,后续实际实现时考量

1、启动项目

uv init air_conditon_deepseek

2、增加依赖

uv add openai

3、vscode初始化

切记需要让右下角的虚拟环境被激活了

4、跑第一个示例代码

4.1 配置API的KEY

# -----------------------------------------------------------------------------
# 使用 PowerShell
# 打开 PowerShell(在 “开始” 菜单中搜索 “PowerShell” 并打开)。
# 要为当前用户设置环境变量,可以使用
# $env:SILICONFLOW_API_KEY = "your_api_key"
# 命令。
# 同样,将"your_api_key"替换为实际的 API 密钥。不过,这种方式设置的环境变量只在当前 PowerShell 会话中有效。

# 要永久设置环境变量(对于当前用户),可以使用
# [Environment]::SetEnvironmentVariable("SILICONFLOW_API_KEY","your_api_key","User")。
# 如果要设置系统级别的环境变量(需要管理员权限),可以将最后一个参数改为"Machine",
# 例如
# [Environment]::SetEnvironmentVariable("SILICONFLOW_API_KEY","your_api_key","Machine")。
# Set up SILICONFLOW API key
# 记得使用以上方法后,需要关闭vscode后重启vscode,之后点击F5运行python脚本的时候才能生效
SILICONFLOW_API_KEY = os.getenv('SILICONFLOW_API_KEY')

配置完成之后,记得重启vscode,否则不会生效

4.2 编码

from openai import OpenAI
import os

# -----------------------------------------------------------------------------
# 使用 PowerShell
# 打开 PowerShell(在 “开始” 菜单中搜索 “PowerShell” 并打开)。
# 要为当前用户设置环境变量,可以使用
# $env:SILICONFLOW_API_KEY = "your_api_key"
# 命令。
# 同样,将"your_api_key"替换为实际的 API 密钥。不过,这种方式设置的环境变量只在当前 PowerShell 会话中有效。

# 要永久设置环境变量(对于当前用户),可以使用
# [Environment]::SetEnvironmentVariable("SILICONFLOW_API_KEY","your_api_key","User")。
# 如果要设置系统级别的环境变量(需要管理员权限),可以将最后一个参数改为"Machine",
# 例如
# [Environment]::SetEnvironmentVariable("SILICONFLOW_API_KEY","your_api_key","Machine")。
# Set up SILICONFLOW API key
# 记得使用以上方法后,需要关闭vscode后重启vscode,之后点击F5运行python脚本的时候才能生效
SILICONFLOW_API_KEY = os.getenv('SILICONFLOW_API_KEY')

if not SILICONFLOW_API_KEY:
    raise ValueError("SILICONFLOW API key is not set. Please set the SILICONFLOW_API_KEY environment variable.")


client = OpenAI(api_key=SILICONFLOW_API_KEY,base_url="https://api.siliconflow.cn/v1")

stream = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": "你好啊",
        }
    ],
    model="deepseek-ai/DeepSeek-V3",
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")


5、接着是提示词本身

该提示词其实就是用R1的聊天界面聊出来的,然后使用V3来推理,这样即快,又省钱,不需要LLM每次都进行思维链式的推理了;

系统提示词:

system_prompt = '''
你现在需要成为一个我室内的空调控制的决策者;我会将历史温度(每半个小时的室温)告诉你、当前空调的运行状态(开/关)告知你,
你来为我决策是否需要打开空调(空调打开后会自动设定为26度、制热状态,并持续30分钟后自动关闭,通常这样的运行,
能带来2摄氏度左右的室温上升,这样设置的原因在于我希望尽可能的省电),但我又不希望室温长时间的保持在23.5度以下,
因为我个人的舒适温度正好是24度,你听明白了我的意思了么?

好的,我完全理解您的需求。您的核心诉求是:

1. 舒适底线:室温不要长时间低于23.5℃(理想24℃)
2. 节能策略:当需要升温时,空调开30分钟制热26℃(预计升温2℃)
3. 运行逻辑:空调开启后必须满30分钟才能再次判断,避免频繁启停

请提供以下信息:
1. 当前时间
2. 当前空调状态(开/关)
3. 过去4小时内每半小时的温度记录(共8个数据点)
4. 当前实时温度(如可获得)

我将根据温度变化趋势、空调运行时长、以及您设定的阈值进行智能判断,在保证基本舒适的前提下最大限度节省能耗。

示例回答结构:
【空调状态建议】保持关闭
【决策依据】过去3小时温度稳定在24.2-24.5℃之间,当前温度24.3℃,高于舒适阈值无需制热
'''

用户的示例输入:

input = '''
1、当前时间:14:25;
2、当前空调状态:关;
3、历史温度(时间顺序列出):26、25、25、25、24、23、25、24;
4、当前实时温度:24摄氏度;
'''

运行后的输出:

结果是,非常好

from openai import OpenAI
import os

# -----------------------------------------------------------------------------
# 使用 PowerShell
# 打开 PowerShell(在 “开始” 菜单中搜索 “PowerShell” 并打开)。
# 要为当前用户设置环境变量,可以使用
# $env:SILICONFLOW_API_KEY = "your_api_key"
# 命令。
# 同样,将"your_api_key"替换为实际的 API 密钥。不过,这种方式设置的环境变量只在当前 PowerShell 会话中有效。

# 要永久设置环境变量(对于当前用户),可以使用
# [Environment]::SetEnvironmentVariable("SILICONFLOW_API_KEY","your_api_key","User")。
# 如果要设置系统级别的环境变量(需要管理员权限),可以将最后一个参数改为"Machine",
# 例如
# [Environment]::SetEnvironmentVariable("SILICONFLOW_API_KEY","your_api_key","Machine")。
# Set up SILICONFLOW API key
# 记得使用以上方法后,需要关闭vscode后重启vscode,之后点击F5运行python脚本的时候才能生效
SILICONFLOW_API_KEY = os.getenv('SILICONFLOW_API_KEY')

if not SILICONFLOW_API_KEY:
    raise ValueError("SILICONFLOW API key is not set. Please set the SILICONFLOW_API_KEY environment variable.")


client = OpenAI(api_key=SILICONFLOW_API_KEY,base_url="https://api.siliconflow.cn/v1")


system_prompt = '''
你现在需要成为一个我室内的空调控制的决策者;我会将历史温度(每半个小时的室温)告诉你、当前空调的运行状态(开/关)告知你,
你来为我决策是否需要打开空调(空调打开后会自动设定为26度、制热状态,并持续30分钟后自动关闭,通常这样的运行,
能带来2摄氏度左右的室温上升,这样设置的原因在于我希望尽可能的省电),但我又不希望室温长时间的保持在23.5度以下,
因为我个人的舒适温度正好是24度,你听明白了我的意思了么?

好的,我完全理解您的需求。您的核心诉求是:

1. 舒适底线:室温不要长时间低于23.5℃(理想24℃)
2. 节能策略:当需要升温时,空调开30分钟制热26℃(预计升温2℃)
3. 运行逻辑:空调开启后必须满30分钟才能再次判断,避免频繁启停

请提供以下信息:
1. 当前时间
2. 当前空调状态(开/关)
3. 过去4小时内每半小时的温度记录(共8个数据点)
4. 当前实时温度(如可获得)

我将根据温度变化趋势、空调运行时长、以及您设定的阈值进行智能判断,在保证基本舒适的前提下最大限度节省能耗。

示例回答结构:
【空调状态建议】保持关闭
【决策依据】过去3小时温度稳定在24.2-24.5℃之间,当前温度24.3℃,高于舒适阈值无需制热
'''

input = '''
1、当前时间:14:25;
2、当前空调状态:关;
3、历史温度(时间顺序列出):26、25、25、25、24、23、25、24;
4、当前实时温度:24摄氏度;
'''

stream = client.chat.completions.create(
    messages=[
        {"role": "system", "content": system_prompt},
        {
            "role": "user",
            "content": input,
        }
    ],
    model="deepseek-ai/DeepSeek-V3",
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")