diff --git a/bot_listener.py b/bot_listener.py index 88e7acc1..fc94574a 100644 --- a/bot_listener.py +++ b/bot_listener.py @@ -584,13 +584,24 @@ def start_bot(): m_c = mgm.get("current", {}) # 翻译风向 wind_dir = m_c.get("wind_dir") + wind_speed_ms = m_c.get("wind_speed_ms") dir_str = "" if wind_dir is not None: dirs = ["北", "东北", "东", "东南", "南", "西南", "西", "西北"] dir_str = dirs[int((float(wind_dir) + 22.5) % 360 / 45)] + "风 " - msg_lines.append(f" [MGM] 🌡️ 体感: {m_c.get('feels_like')}°C | 💧 {m_c.get('humidity')}%") - msg_lines.append(f" [MGM] 🌬️ {dir_str}{wind_dir}° ({m_c.get('wind_speed_ms')} m/s) | 💧 降水: {m_c.get('rain_24h') or 0}mm") + # 体感和湿度(跳过缺失数据) + feels_like = m_c.get("feels_like") + humidity = m_c.get("humidity") + if feels_like is not None or humidity is not None: + parts = [] + if feels_like is not None: parts.append(f"🌡️ 体感: {feels_like}°C") + if humidity is not None: parts.append(f"💧 {humidity}%") + msg_lines.append(f" [MGM] {' | '.join(parts)}") + + # 风况(跳过缺失数据) + if wind_dir is not None and wind_speed_ms is not None: + msg_lines.append(f" [MGM] 🌬️ {dir_str}{wind_dir}° ({wind_speed_ms} m/s) | 💧 降水: {m_c.get('rain_24h') or 0}mm") # 新增:气压和云量 extra_parts = [] diff --git a/src/data_collection/weather_sources.py b/src/data_collection/weather_sources.py index a15b6194..2527bb7b 100644 --- a/src/data_collection/weather_sources.py +++ b/src/data_collection/weather_sources.py @@ -373,18 +373,23 @@ class WeatherDataCollector: # MGM 数据字段映射 # ruzgarHiz 实测为 km/h,转为 m/s 需要除以 3.6 ruz_hiz_kmh = latest.get("ruzgarHiz", 0) + + # MGM 返回 -9999 表示数据缺失,需要过滤 + def _valid(v): + return v is not None and v > -9000 + results["current"] = { - "temp": latest.get("sicaklik"), - "feels_like": latest.get("hissedilenSicaklik") or latest.get("sicaklik"), - "humidity": latest.get("nem"), - "wind_speed_ms": round(ruz_hiz_kmh / 3.6, 1) if ruz_hiz_kmh is not None else None, - "wind_speed_kt": round(ruz_hiz_kmh / 1.852, 1) if ruz_hiz_kmh is not None else None, - "wind_dir": latest.get("ruzgarYon"), - "rain_24h": latest.get("toplamYagis"), - "pressure": latest.get("aktuelBasinc"), + "temp": latest.get("sicaklik") if _valid(latest.get("sicaklik")) else None, + "feels_like": latest.get("hissedilenSicaklik") if _valid(latest.get("hissedilenSicaklik")) else None, + "humidity": latest.get("nem") if _valid(latest.get("nem")) else None, + "wind_speed_ms": round(ruz_hiz_kmh / 3.6, 1) if _valid(ruz_hiz_kmh) else None, + "wind_speed_kt": round(ruz_hiz_kmh / 1.852, 1) if _valid(ruz_hiz_kmh) else None, + "wind_dir": latest.get("ruzgarYon") if _valid(latest.get("ruzgarYon")) else None, + "rain_24h": latest.get("toplamYagis") if _valid(latest.get("toplamYagis")) else None, + "pressure": latest.get("aktuelBasinc") if _valid(latest.get("aktuelBasinc")) else None, "cloud_cover": latest.get("kapalilik"), # 0-8 八分位云量 - "mgm_max_temp": latest.get("maxSicaklik"), # MGM 官方实测最高温 - "time": latest.get("veriZamani"), # 观测时间 + "mgm_max_temp": latest.get("maxSicaklik") if _valid(latest.get("maxSicaklik")) else None, + "time": latest.get("veriZamani"), "station_name": latest.get("istasyonAd") or latest.get("adi") or latest.get("merkezAd") or "Ankara Esenboğa" }