diff --git a/CHANGELOG.md b/CHANGELOG.md index 7616e25..e474776 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [0.3.9] - 2026-02-16 +### Added +- Neuer Befehl `/me` zeigt eigene Node-Infos (Name, HW, Hops, SNR, RSSI, Batterie, Position) +- Wetter zeigt Luftdruck NN (hPa) und Taupunkt (°C) + ## [0.3.8] - 2026-02-16 ### Changed - Ping-Antwort zeigt Hop-Anzahl des anfragenden Nodes (z.B. "Pong ueber 2 Hops!") diff --git a/config.yaml b/config.yaml index ba34a39..4402103 100644 --- a/config.yaml +++ b/config.yaml @@ -1,4 +1,4 @@ -version: "0.3.8" +version: "0.3.9" bot: name: "MeshDD-Bot" diff --git a/meshbot/bot.py b/meshbot/bot.py index 86a30b3..24832ad 100644 --- a/meshbot/bot.py +++ b/meshbot/bot.py @@ -286,10 +286,14 @@ class MeshBot: f"{prefix}stats - Statistiken\n" f"{prefix}uptime - Laufzeit\n" f"{prefix}weather [plz:XXXXX] - Wetter\n" + f"{prefix}me - Meine Node-Infos\n" f"{prefix}mesh - Mesh-Netzwerk\n" f"{prefix}help - Diese Hilfe" ) + elif cmd == f"{prefix}me": + response = await self._get_my_info(from_id) + elif cmd == f"{prefix}weather": args = text.split()[1:] plz = None @@ -385,6 +389,51 @@ class MeshBot: parts.append(f"{seconds}s") return " ".join(parts) + async def _get_my_info(self, from_id: str) -> str: + if not from_id: + return "❌ Node-ID unbekannt." + node = await self.db.get_node(from_id) + if not node: + return f"❌ Keine Daten fuer {from_id}." + + name = node.get("long_name") or node.get("short_name") or from_id + hw = node.get("hw_model") or "-" + hops = node.get("hop_count") if node.get("hop_count") is not None else "-" + snr = f"{node['snr']:.1f} dB" if node.get("snr") is not None else "-" + rssi = f"{node['rssi']} dBm" if node.get("rssi") is not None else "-" + bat = f"{node['battery']}%" if node.get("battery") is not None else "-" + voltage = f"{node['voltage']:.2f}V" if node.get("voltage") is not None else "-" + alt = f"{int(node['alt'])} m" if node.get("alt") is not None else "-" + pos = "" + if node.get("lat") and node.get("lon"): + pos = f"{node['lat']:.4f}, {node['lon']:.4f}" + last_seen = "" + if node.get("last_seen"): + elapsed = int(time.time() - node["last_seen"]) + if elapsed < 60: + last_seen = f"{elapsed}s" + elif elapsed < 3600: + last_seen = f"{elapsed // 60}m" + elif elapsed < 86400: + last_seen = f"{elapsed // 3600}h" + else: + last_seen = f"{elapsed // 86400}d" + + lines = [ + f"📋 {name}", + f"ID: {from_id}", + f"HW: {hw}", + f"Hops: {hops}", + f"SNR: {snr} | RSSI: {rssi}", + f"Bat: {bat} ({voltage})", + ] + if pos: + lines.append(f"Pos: {pos} | {alt}") + if last_seen: + lines.append(f"Zuletzt: vor {last_seen}") + + return "\n".join(lines) + async def _get_mesh_info(self) -> str: nodes = await self.db.get_all_nodes() total = len(nodes) @@ -446,7 +495,7 @@ class MeshBot: url = ( f"https://api.open-meteo.com/v1/forecast?" f"latitude={lat}&longitude={lon}" - f"¤t=temperature_2m,relative_humidity_2m,wind_speed_10m,weather_code" + f"¤t=temperature_2m,relative_humidity_2m,wind_speed_10m,weather_code,pressure_msl,dew_point_2m" ) try: @@ -457,6 +506,8 @@ class MeshBot: humidity = current.get("relative_humidity_2m", "?") wind = current.get("wind_speed_10m", "?") code = current.get("weather_code", 0) + pressure = current.get("pressure_msl", "?") + dewpoint = current.get("dew_point_2m", "?") weather_icon = self._weather_code_to_icon(code) location = await self._reverse_geocode(lat, lon) @@ -465,6 +516,8 @@ class MeshBot: f"{weather_icon} Wetter{loc_str}:\n" f"Temp: {temp}°C\n" f"Feuchte: {humidity}%\n" + f"Taupunkt: {dewpoint}°C\n" + f"Luftdruck: {pressure} hPa\n" f"Wind: {wind} km/h" ) except Exception: