加上时间同步相关

This commit is contained in:
2026-01-24 23:19:23 +08:00
parent 2bc882bc96
commit 41459c16f5
3 changed files with 27 additions and 11 deletions

View File

@@ -55,10 +55,13 @@ def get_weather_data(city=None, force=False):
if city is None: if city is None:
city = config.get("city", "北京") city = config.get("city", "北京")
# 获取本地时间戳
ts0 = int(time.mktime(time.localtime()))
# 从配置获取API基础URL默认使用官方API # 从配置获取API基础URL默认使用官方API
api_base = config.get("weather_api_url", "https://iot.foresh.com/api/weather") api_base = config.get("weather_api_url", "https://iot.foresh.com/api/weather")
url = f"{api_base}?city={city}" url = f"{api_base}?city={city}&ts={ts0}"
print(f"正在获取{city}天气数据...") print(f"正在获取{city}天气数据,时间戳:{ts0}...")
# 发送GET请求 # 发送GET请求
response = urequests.get(url) response = urequests.get(url)
@@ -69,6 +72,17 @@ def get_weather_data(city=None, force=False):
wdata = response.json() wdata = response.json()
response.close() # 关闭连接释放内存 response.close() # 关闭连接释放内存
# 如果服务器返回了时间戳,则同步本地时间
if "ts" in wdata and isinstance(wdata["ts"], (int, float)):
server_ts = int(wdata["ts"])
ts1 = int(time.mktime(time.localtime()))
# 检查时间戳差异,如果差异过大才同步
if abs(server_ts - ts1) > 30: # >30s
machine.RTC.datetime(time.localtime(server_ts + (ts1 - ts0) // 2))
print(
f"时间已同步: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}"
)
# 提取关键信息,减少内存占用 # 提取关键信息,减少内存占用
weather_report = { weather_report = {
"t": wdata.get("temperature", "N/A"), "t": wdata.get("temperature", "N/A"),
@@ -82,6 +96,7 @@ def get_weather_data(city=None, force=False):
"date": wdata.get("date", "N/A"), "date": wdata.get("date", "N/A"),
"advice": wdata.get("advice", "N/A"), "advice": wdata.get("advice", "N/A"),
"image": wdata.get("image", "N/A"), "image": wdata.get("image", "N/A"),
"ts": ts, # 添加时间戳用于同步本地时间
} }
print("天气数据获取成功") print("天气数据获取成功")
@@ -104,7 +119,7 @@ async def weather_update_task():
"""定时更新天气数据的后台任务""" """定时更新天气数据的后台任务"""
# 获取更新间隔默认10分钟 # 获取更新间隔默认10分钟
interval_minutes = config.get("weather_interval", 10) interval_minutes = int(config.get("weather_interval", 10))
interval_ms = interval_minutes * 60 * 1000 # 转换为毫秒 interval_ms = interval_minutes * 60 * 1000 # 转换为毫秒
print(f"开始定时更新天气数据,间隔{interval_minutes}分钟") print(f"开始定时更新天气数据,间隔{interval_minutes}分钟")
@@ -175,6 +190,7 @@ async def animation_task():
def start(): def start():
# 初始化液晶屏 # 初始化液晶屏
display.init_display() display.init_display()
display.brightness(int(config.get("brightness", 10)))
display.show_jpg("/rom/www/images/T1.jpg", 80, 80) display.show_jpg("/rom/www/images/T1.jpg", 80, 80)
gc.collect() gc.collect()
@@ -255,6 +271,8 @@ def start():
async def lcd_set(request): async def lcd_set(request):
ack = {"status": "success"} ack = {"status": "success"}
try: try:
if request.method != "POST":
raise Exception("invalid request")
content_length = int(request.headers["Content-Length"]) content_length = int(request.headers["Content-Length"])
post_data = (await request.read(content_length)).decode() post_data = (await request.read(content_length)).decode()
@@ -284,6 +302,8 @@ def start():
async def config_update(request): async def config_update(request):
ack = {"status": "success"} ack = {"status": "success"}
try: try:
if request.method != "POST":
raise Exception("invalid request")
content_length = int(request.headers["Content-Length"]) content_length = int(request.headers["Content-Length"])
post_data = (await request.read(content_length)).decode() post_data = (await request.read(content_length)).decode()

View File

@@ -15,16 +15,13 @@ class Config:
cls._instance = super(Config, cls).__new__(cls) cls._instance = super(Config, cls).__new__(cls)
return cls._instance return cls._instance
def __init__( def __init__(self, ssid=None, password=None, city=None, **kwargs):
self, ssid=None, password=None, city=None, weather_interval=10, **kwargs
):
"""初始化配置,只在第一次调用时执行""" """初始化配置,只在第一次调用时执行"""
if not self._initialized: if not self._initialized:
self.config_data = { self.config_data = {
"ssid": ssid, "ssid": ssid,
"password": password, "password": password,
"city": city, "city": city,
"weather_interval": weather_interval,
} }
# 添加其他可能的自定义配置项 # 添加其他可能的自定义配置项
self.config_data.update(kwargs) self.config_data.update(kwargs)
@@ -82,8 +79,7 @@ class Config:
self.config_data = { self.config_data = {
"ssid": None, "ssid": None,
"password": None, "password": None,
"city": None, "city": "北京",
"weather_interval": 10,
} }
def is_valid(self): def is_valid(self):

View File

@@ -27,7 +27,7 @@ class Display:
if not self._initialized: if not self._initialized:
self.tft = None self.tft = None
self._backlight = None self._backlight = None
self._brightness = 50 # 默认亮度50% self._brightness = 80 # 默认亮度80%
self._initialized = True self._initialized = True
def init_display(self): def init_display(self):
@@ -82,7 +82,7 @@ class Display:
"""设置背光亮度 (0-100)""" """设置背光亮度 (0-100)"""
if _brightness >= 0 and _brightness <= 100: if _brightness >= 0 and _brightness <= 100:
# 将0-100范围映射到0-1023 (PWM占空比) # 将0-100范围映射到0-1023 (PWM占空比)
duty = int(1023 * _brightness / 100) duty = int(1023 * (100 - _brightness) / 100)
self._backlight.duty(duty) self._backlight.duty(duty)
self._brightness = _brightness self._brightness = _brightness
return self._brightness return self._brightness