You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的树莓派部署的Telegram天气查询机器人无法回复消息?

代码问题分析
  • 死循环阻塞主进程:雨水检测部分的while True是无限死循环,代码执行到这会一直停在这里循环检测雨水状态,后面的Telegram机器人初始化、消息监听逻辑永远不会被执行,这是机器人无法工作的核心原因。
  • 传感器数据仅读取一次:BME680的温湿度、气压等数据是在脚本启动阶段计算赋值的,后续用户请求/data时返回的永远是脚本启动时的旧数据,不是实时监测值。
  • 换行符语法错误:拼接messdaten变量时使用了硬换行,正确的字符串换行应该用转义字符\n,否则会触发语法错误。
  • 雨水状态未实时读取:原逻辑里雨水状态的判断要么卡死在死循环里,要么也是固定值,无法返回实时降雨状态。
修正后可运行代码
#!/usr/bin/python3
#coding: utf8

# 依赖导入
import time, datetime
import telepot
from telepot.loop import MessageLoop
import board
from busio import I2C
import adafruit_bme680
from gpiozero import InputDevice

# 初始化BME680传感器
i2c = I2C(board.SCL, board.SDA)
bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c, debug = False)
bme680.sea_level_pressure = 971.91
temperature_offset = 0

# 初始化雨水传感器
rain = InputDevice(18)

# 初始化Telegram机器人 替换为你自己的bot token
telegram_bot = telepot.Bot('XXX:XXXXXXX')
print (telegram_bot.getMe())

# 读取BME680实时数据的函数
def get_bme680_data():
    temperatur = "Temperatur: %0.1f C" % (bme680.temperature + temperature_offset)
    gas = "Gas: %d ohm" % bme680.gas
    luftfeuchtigkeit = "Luftfeuchtigkeit: %0.1f %%" % bme680.relative_humidity
    luftdruck = "Luftdruck: %0.3f hPa" % bme680.pressure
    messdaten = temperatur + "\n" + gas + "\n" + luftfeuchtigkeit + "\n" +  luftdruck
    return messdaten

# 读取雨水实时状态的函数
def get_rain_status():
    if rain.is_active:
        return "Es regnet. Fenster zu!"
    else:
        return "Es regnet nicht"

# 消息处理逻辑
def action(msg):
    chat_id=msg['chat']['id']
    command = msg['text']
    
    print ('Received: %s' % command)
    
    if command == '/hi':
        telegram_bot.sendMessage(chat_id, "Kuckuck")
    
    elif command == '/data':
        # 请求时才读取实时数据
        realtime_data = get_bme680_data()
        telegram_bot.sendMessage(chat_id, realtime_data)
        
    elif command == '/rain':
        # 请求时才读取实时降雨状态
        realtime_rain = get_rain_status()
        telegram_bot.sendMessage(chat_id, realtime_rain)

# 启动消息监听
MessageLoop(telegram_bot, action).run_as_thread()
print ('Up and Running...')

# 保持程序运行
while 1:
    time.sleep(10)
额外注意事项
  • 替换代码中XXX:XXXXXXX为你自己的Telegram机器人Token
  • 确认树莓派已经开启I2C功能,否则BME680会初始化失败
  • 确认雨水传感器的接线引脚和代码中设置的18号BCM引脚一致

内容的提问来源于stack exchange,提问作者Marie03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:10