from dashboard_data.card_utils import safe_number def build_soil_moisture_heatmap(sensor_id: str, context: dict | None = None, ai_bundle: dict | None = None) -> dict: context = context or {} sensor = context.get("sensor") depths = context.get("depths", []) if sensor is None: return {"zones": [], "hours": [], "series": []} hours = ["۶ ص", "۸ ص", "۱۰ ص", "۱۲ ظ", "۱۴ ع", "۱۶ ع", "۱۸ ع"] base_moisture = safe_number(sensor.soil_moisture, 0) series = [] zones = [] if not depths: depths = [None, None] for index, depth in enumerate(depths[:7], start=1): zones.append(f"زون {index}") depth_offset = 0 if depth is None else round(safe_number(getattr(depth, "wv0033", None), 0) / 10) data = [] for hour_index, hour in enumerate(hours): value = max(0, min(100, round(base_moisture + depth_offset - abs(3 - hour_index) * 2))) data.append({"x": hour, "y": value}) series.append({"name": f"زون {index}", "data": data}) return { "zones": zones, "hours": hours, "series": series, }