Yoyo-9877's picture
Update app.py
c350d26 verified
#!/usr/bin/env python3
# PLANETYOYO AI Ultimate v19.0 - Final Release with pre-loading and manual local training
# This version is the complete code with all requested features.
import subprocess, sys, os, time, json, requests, threading, hashlib, random, math
from datetime import datetime, timedelta
from collections import Counter, defaultdict, deque
from dataclasses import dataclass, field
from typing import Dict, List, Any, Optional, Tuple
import io
# Install packages quietly and handle dependencies
try:
for pkg in ["gradio", "torch", "transformers", "requests", "Pillow", "pandas", "prophet", "adafruit-io", "geopy", "numpy", "cloudinary", "Pillow", "matplotlib", "scikit-learn"]:
subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", pkg], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
except:
pass
import gradio as gr
from PIL import Image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Conditional imports
try:
import torch
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
AI_AVAILABLE = True
device = "cuda" if torch.cuda.is_available() else "cpu"
except ImportError:
AI_AVAILABLE = False
device = "cpu"
try:
from adafruit_io.rest_client import Client as AdafruitClient
from adafruit_io.rest_client import APIError
from geopy.geocoders import Nominatim
ADAFRUIT_AVAILABLE = True
GEOPY_AVAILABLE = True
except ImportError:
ADAFRUIT_AVAILABLE = False
GEOPY_AVAILABLE = False
try:
import cloudinary
import cloudinary.api
import cloudinary.uploader
CLOUDINARY_AVAILABLE = True
except ImportError:
CLOUDINARY_AVAILABLE = False
try:
from prophet import Prophet
PROPHET_AVAILABLE = True
except ImportError:
PROPHET_AVAILABLE = False
# ==================== CONFIGURATION & SECRETS ====================
# Hardcoded keys as requested
PLANTNET_API_KEY = "2b10HlR0yP4wZbvHjP8jCo3Aae"
CLOUDINARY_CLOUD_NAME = "dru8hdesf"
CLOUDINARY_API_KEY = "959867312261694"
CLOUDINARY_API_SECRET = "3S0glC5W38T2hh-SGVskOOODVFk"
ADAFRUIT_IO_USERNAME = "planetserver"
ADAFRUIT_IO_KEY = "aio_lhXC90tYptqosfgidyXWtdkb9e6b"
WEATHER_API_KEY = "e541061f22d8727d1cae4f22157fe7ec"
TELEGRAM_BOT_TOKEN = "8437890500:AAFIeITryixh9WbHif7D30mMB"
HUGGING_FACE_TOKEN = os.environ.get("HF_TOKEN", "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")
TELEGRAM_CHAT_ID = "667462198"
ADAFRUIT_IO_BASE_URL = "https://io.adafruit.com/api/v2"
REPO_ID = "Yoyo-9877/planet_monitor_YOYO"
# Adafruit IO Feed names and Cloudinary Folder as per user request
ADAFRUIT_FEEDS = {
"temperature": "temperature-sensor",
"humidity": "humidity-sensor",
"soil_moisture": "soil-moisture-sensor",
"light": "light-sensor",
"analysis_results": "plant-analysis-results"
}
CLOUDINARY_FOLDER = "ESP32CAMPLANET"
# Weather API Endpoint
WEATHER_API_URL = "http://api.openweathermap.org/data/2.5/weather"
# Plant Database
PLANT_DATABASE = {
"aloe_vera": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช ืขื“ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื” ืžืื•ื“"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/aloe_vera.jpg", "plant_id": "aloe_vera"},
"almond": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ื•ืจ ืฉื—ื•ืจ", "ืจื™ืงื‘ื•ืŸ ื—ื•ื", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dalmond", "plant_id": "almond"},
"apple": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—", "ื—ืœื•ื“ืช ืืจื–-ืชืคื•ื—", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/apple.jpg", "plant_id": "apple"},
"apple_fuji": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfuji_apple", "plant_id": "apple_fuji"},
"apple_gala": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgala_apple", "plant_id": "apple_gala"},
"apple_granny_smith": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgranny_smith", "plant_id": "apple_granny_smith"},
"apricot": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dapricot", "plant_id": "apricot"},
"artichoke": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dartichoke", "plant_id": "artichoke"},
"asparagus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ืช ื”ืืกืคืจื’ื•ืก", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dasparagus", "plant_id": "asparagus"},
"avocado": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ื’ื ื” ืžืจื•ื— ื—ื–ืงื”"], "common_diseases": ["ื’ืœื“ ื”ืื‘ื•ืงื“ื•", "ื›ืชื ืฉืžืฉ", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/avocado.jpg", "plant_id": "avocado"},
"azalea": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืงืจืงืข ื—ื•ืžืฆื™ืช", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ืงืฉืงืฉืช ื”ืื–ืœื™ื”", "ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/4/4b/Azalea_flower_in_Japan.jpg", "plant_id": "azalea"},
"bamboo": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืื• ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ื—ื ืงืŸ ื”ื‘ืžื‘ื•ืง", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช ื”ื‘ืžื‘ื•ืง", "ื›ืชื ืขืœื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/bamboo.jpg", "plant_id": "bamboo"},
"barley": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื ื ืกื•ืช ืฉืขื•ืจื” ืฆื”ื•ื‘ื”", "ื›ื ื™ืžื•ืช", "ื›ืชื ืจืฉืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbarley", "plant_id": "barley"},
"basil": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ืงืจืงืข ืขืฉื™ืจื”"], "common_diseases": ["ืงืฉืงืฉืช", "ืคื˜ืจื™ื” ืืคื•ืจื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/basil.jpg", "plant_id": "basil"},
"bean": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืื ืชืจืงื ื•ื–", "ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbean", "plant_id": "bean"},
"birch": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ืชืžื•ืชืช ืœื™ื‘ื ื”", "ื—ืœื•ื“ื”", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbirch", "plant_id": "birch"},
"blueberry": {"care_tips": ["ืงืจืงืข ื—ื•ืžืฆื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืขื ื‘ืช ืื•ื›ืžื ื™ื•ืช", "ื—ื ืงืŸ ื’ื–ืข", "ืื ืชืจืงื ื•ื–"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/blueberry.jpg", "plant_id": "blueberry"},
"broccoli": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ื”ืฉื•ืจืฉ", "ืจื’ืœ ืฉื—ื•ืจื”", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbroccoli", "plant_id": "broccoli"},
"cabbage": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ื”ืฉื•ืจืฉ", "ื›ืชื ืขืœื™ื ืืœื˜ืจื ืจื™ื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcabbage", "plant_id": "cabbage"},
"cacao": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ืชืจืžื™ืœ ืฉื—ื•ืจ", "ืžื˜ืื˜ื ื”ืžื›ืฉืคื•ืช", "ื•ื™ืจื•ืก ื™ืจื™ืขื” ื ืคื•ื—ื”"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/5/51/Theobroma_cacao_tree.jpg", "plant_id": "cacao"},
"cactus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื” ืžืื•ื“"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืงืงื˜ื•ืก", "ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ืจืš"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/cactus.jpg", "plant_id": "cactus"},
"camellia": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืงื‘ื•ืขื”", "ื”ื’ื ื” ืžืจื•ื— ื—ื–ืงื”"], "common_diseases": ["ื—ื ืงืŸ ืขืœื™ ื›ืœื™ืœ", "ืคืฆืข", "ืžืจื” ื‘ืขืœื”"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/e/e0/Camellia_japonica_flower.jpg", "plant_id": "camellia"},
"carrot": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืจื›ื” ื•ืขืžื•ืงื”"], "common_diseases": ["ื—ื ืงืŸ ื—ื™ื™ื“ืงื™", "ื—ื ืงืŸ ืขืœื™ื ืฆืจืงืกืคื•ืจื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/carrot.jpg", "plant_id": "carrot"},
"cauliflower": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื” ืœื‘ื ื”", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcauliflower", "plant_id": "cauliflower"},
"cherry": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืกืคื—ืช ื—ื™ื™ื“ืงื™ืช", "ืจื™ืงื‘ื•ืŸ ื—ื•ื", "ื›ืชื ืขืœื™ื ื“ื•ื‘ื“ื‘ืŸ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/cherry.jpg", "plant_id": "cherry"},
"cilantro": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื ืฆืจืงืกืคื•ืจื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcilantro", "plant_id": "cilantro"},
"coffee": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ื—ื•ืžืฆื™ืช ื•ืžื ื•ืงื–ืช"], "common_diseases": ["ื—ืœื•ื“ืช ื”ืงืคื”", "ืžื—ืœืช ืคืจื™ ื”ืงืคื”", "ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcoffee", "plant_id": "coffee"},
"cucumber": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืงื‘ื™ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช ื”ืžืœืคืคื•ืŸ", "ื—ื ืงืŸ ื’ื–ืข ื’ื•ืžื™"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/cucumber.jpg", "plant_id": "cucumber"},
"daffodil": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื–ื‘ื•ื‘ ื‘ืฆืœ ื ืจืงื™ืก", "ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddaffodil", "plant_id": "daffodil"},
"date_palm": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื‘ื™ื™ื•ื“", "ื›ืืžื“ื’'", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddate_palm", "plant_id": "date_palm"},
"dill": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื ืฆืจืงืกืคื•ืจื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddill", "plant_id": "dill"},
"dragon_fruit": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืกืคื—ืช ืคืจื™ ื”ื“ืจืงื•ืŸ", "ื›ืชื ืฉื—ื•ืจ", "ืจื™ืงื‘ื•ืŸ ื’ื–ืข"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/dragon_fruit.jpg", "plant_id": "dragon_fruit"},
"eggplant": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ื—ื ืงืŸ ืคื•ืžื•ืคืกื™ืก", "ืื ืชืจืงื ื•ื–"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/eggplant.jpg", "plant_id": "eggplant"},
"fern": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ื ืžื˜ื•ื“ื•ืช ืขืœื™ื", "ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/fern.jpg", "plant_id": "fern"},
"ficus": {"care_tips": ["ืื•ืจ ืœื ื™ืฉื™ืจ", "ื”ืฉืงื™ื” ืžืชื•ื ื”", "ื ื™ืงื•ื™ ืขืœื™ื ืžืื‘ืง"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืื ืชืจืงื ื•ื–", "ืขืคืฅ ื›ืชืจ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/ficus.jpg", "plant_id": "ficus"},
"fig": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ืช ื”ืชืื ื”", "ื—ื ืงืŸ ื•ืจื•ื“", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช ื”ืชืื ื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/fig.jpg", "plant_id": "fig"},
"garlic": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืœื‘ืŸ", "ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ืฆื•ื•ืืจ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/garlic.jpg", "plant_id": "garlic"},
"geranium": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”", "ื”ืกืจืช ืคืจื—ื™ื ื™ื‘ืฉื™ื"], "common_diseases": ["ื—ืœื•ื“ื”", "ื—ื ืงืŸ ื‘ื•ื˜ืจื™ื˜ื™ืก", "ื‘ืฆืงืช"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/geranium.jpg", "plant_id": "geranium"},
"ginseng": {"care_tips": ["ืฆืœ ืžืœื", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ื—ื ืงืŸ ืืœื˜ืจื ืจื™ื”", "ื—ืœื•ื“ืช ื’'ื™ื ืกื ื’"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dginseng", "plant_id": "ginseng"},
"grapevine": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืงื‘ื•ืข"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ", "ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/grapevine.jpg", "plant_id": "grapevine"},
"hawthorn": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ืขืžื™ื“ ืœืžื—ืœื•ืช"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhawthorn", "plant_id": "hawthorn"},
"hibiscus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงืžื™ืœืช ื”ื™ื‘ื™ืกืงื•ืก", "ื›ืชื ืขืœื™ื ื—ื™ื™ื“ืงื™", "ื›ืชื ืฉื—ื•ืจ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/hibiscus.jpg", "plant_id": "hibiscus"},
"jasmine": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืื• ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ื˜ื™ืคื•ืก ืžื˜ืคืก"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื›ืชื ืขืœื™ื", "ืขื•ื‘ืฉ ืžืคื•ื™ื—"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/jasmine.jpg", "plant_id": "jasmine"},
"juniper": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ื ืงืŸ ืคื•ืžื•ืคืกื™ืก", "ื—ื ืงืŸ ืงื‘ื˜ื™ื ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djuniper", "plant_id": "juniper"},
"kiwi": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื—ื ืงืŸ ื—ื™ื™ื“ืงื™", "ืจื™ืงื‘ื•ืŸ ื›ืชืจ", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/kiwi.jpg", "plant_id": "kiwi"},
"lantana": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืขื•ื‘ืฉ ืžืคื•ื™ื—", "ื–ื‘ื•ื‘ ืœื‘ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlantana", "plant_id": "lantana"},
"laurel": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืขืœื™ื ื ื’ื•ืขื™ื", "ืคืฆืข ืคื™ื˜ื•ืคื˜ื•ืจื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/laurel.jpg", "plant_id": "laurel"},
"lavender": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช", "ื’ื™ื–ื•ื ืœืื—ืจ ื”ืคืจื™ื—ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื ืกืคื˜ืžื‘ืจื™", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืคืฆืข ื’ื–ืข"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Lavandula_angustifolia_field.jpg", "plant_id": "lavender"},
"leek": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ืช ื›ืจื™ืฉื”", "ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™ ืคื•ืกืจื™ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dleek", "plant_id": "leek"},
"lemon": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื—ืœืช ืจื™ืงื‘ื•ืŸ", "ื›ื ื™ืžื•ืช"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/lemon_tree.jpg", "plant_id": "lemon"},
"lettuce": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื”ื˜ืœืช ื—ืกื”", "ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืกืงืœืจื•ื˜ื™ื ื™ื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/lettuce.jpg", "plant_id": "lettuce"},
"lilac": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืœืื—ืจ ืคืจื™ื—ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlilac", "plant_id": "lilac"},
"lily": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื•ื™ืจื•ืก ืžื•ื–ืื™ืงืช ื”ืฉื•ืฉืŸ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/lily.jpg", "plant_id": "lily"},
"magnolia": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ื”ื’ื ื” ืžืจื•ื— ื—ื–ืงื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืคืฆืข", "ืชืžื•ืชื”"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/a/a2/Magnolia_grandiflora_tree.jpg", "plant_id": "magnolia"},
"mango": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–", "ืงื™ืžื—ื•ืŸ", "ืชืžื•ืชื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/mango.jpg", "plant_id": "mango"},
"maple": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ื–ืคืช", "ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmaple", "plant_id": "maple"},
"melon": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ื—ื ืงืŸ ืขืœื™ื ืืœื˜ืจื ืจื™ื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/melon.jpg", "plant_id": "melon"},
"melon_cantaloupe": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcantaloupe", "plant_id": "melon_cantaloupe"},
"melon_honeydew": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhoneydew_melon", "plant_id": "melon_honeydew"},
"mint": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”", "ืจื’ื™ืฉ ืœืžื–ื™ืงื™ื"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงืžื—ื•ื ื™ืช"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/mint.jpg", "plant_id": "mint"},
"myrtle": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืชื•ื ื”", "ื’ื™ื–ื•ื ืœืื—ืจ ื”ืคืจื™ื—ื”"], "common_diseases": ["ื—ืœื•ื“ืช ื”ื”ื“ืก", "ื—ื ืงืŸ ื‘ื•ื˜ืจื™ื˜ื™ืก", "ื›ืชื ืขืœื™ื"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/a/a2/Myrtus_communis_plant.jpg", "plant_id": "myrtle"},
"nutmeg": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ื ืงืŸ ื—ื•ื˜", "ื—ื ืงืŸ ืื’ื•ื– ืžื•ืกืงื˜"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnutmeg", "plant_id": "nutmeg"},
"oak": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงืžื™ืœืช ื”ืืœื•ืŸ", "ืื ืชืจืงื ื•ื–", "ืฉืœืคื•ื—ื™ืช ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Doak", "plant_id": "oak"},
"oat": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœืงืจืงืขื•ืช ื“ืœื•ืช"], "common_diseases": ["ื—ืœื•ื“ืช ื”ื›ืชืจ", "ื›ื ื™ืžื•ืช", "ื”ื›ืœืœื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Doat", "plant_id": "oat"},
"okra": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ื” ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ืงื™ืžื—ื•ืŸ", "ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/okra.jpg", "plant_id": "okra"},
"olive": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช", "ืงืจืงืข ืžื ื•ืงื–ืช ื”ื™ื˜ื‘"], "common_diseases": ["ื–ื‘ื•ื‘ ื”ืคื™ืจื•ืช", "ืžื—ืœืช ืขื™ื ื™ื™ื ื˜ื•ื•ืก"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/olive_tree.jpg", "plant_id": "olive"},
"onion": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ ื‘ืฆืœ", "ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™ ืคื•ืกืจื™ื•ื", "ื—ื ืงืŸ ืขืœื™ื ื‘ื•ื˜ืจื™ื˜ื™ืก"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/onion.jpg", "plant_id": "onion"},
"orchid": {"care_tips": ["ืื•ืจ ืœื ื™ืฉื™ืจ", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื›ื ื™ืžื•ืช ืงืžื—"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/orchid.jpg", "plant_id": "orchid"},
"oregano": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื—ืœื•ื“ืช ื ืขื ืข", "ืจื™ืงื‘ื•ืŸ ื’ื–ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Doregano", "plant_id": "oregano"},
"palm": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ืจื™ืงื‘ื•ืŸ ื ื™ืฆืŸ", "ืจื™ืงื‘ื•ืŸ ื’ื–ืข ื’ืื ื•ื“ืจืžื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/palm.jpg", "plant_id": "palm"},
"parsley": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื ืกืคื˜ืžื‘ืจื™", "ื“ืขื™ื›ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dparsley", "plant_id": "parsley"},
"passion_fruit": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืชืžื™ื›ื” ืœื˜ื™ืคื•ืก"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ื›ืชื ืกืคื˜ืžื‘ืจื™", "ื›ืชื ื—ื•ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/passion_fruit.jpg", "plant_id": "passion_fruit"},
"pea": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ืงืจื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ื—ื ืงืŸ ืืกืงื•ื›ื™ืชื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpea", "plant_id": "pea"},
"peach": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืขืœื™ื ืžืกื•ืœืกืœื™ื ืฉืœ ืืคืจืกืง", "ืจื™ืงื‘ื•ืŸ ื—ื•ื", "ื›ืชื ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpeach", "plant_id": "peach"},
"pear": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื ืงืŸ ืืฉ", "ื’ืœื“ ืื’ืก", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/pear.jpg", "plant_id": "pear"},
"pecan": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื’ืœื“ ืคืงืืŸ", "ื›ื•ื•ื™ื•ืช ืขืœื™ื ืคื˜ืจื™ื™ืชื™ื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpecan", "plant_id": "pecan"},
"pepper": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ื—ื™ื™ื“ืงื™", "ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช ืคืœืคืœ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/pepper.jpg", "plant_id": "pepper"},
"persimmon": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–", "ืงืžื™ืœืช ืืคืจืกืžื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpersimmon", "plant_id": "persimmon"},
"petunia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ื™ืฉ ืœื”ืกื™ืจ ืคืจื—ื™ื ื ื‘ื•ืœื™ื"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื›ื ื™ืžื•ืช"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/petunia.jpg", "plant_id": "petunia"},
"pine": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงืžื—ื•ื ื™ืช", "ืกืคื—ืช", "ื›ืœื™ื” ืขืœื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/pine_tree.jpg", "plant_id": "pine"},
"plum": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื•ื™ืจื•ืก ืื‘ืขื‘ื•ืขื•ืช ืฉื–ื™ืฃ", "ืงืฉืจ ืฉื—ื•ืจ", "ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dplum", "plant_id": "plum"},
"poinsettia": {"care_tips": ["ืื•ืจ ื‘ื”ื™ืจ", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ื”ื’ื ื” ืžืงื•ืจ"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืงื™ืžื—ื•ืŸ", "ื’ืœื“ ื”ืคื•ื™ื ืกื˜ื™ืื”"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/4/4c/Euphorbia_pulcherrima_plant.jpg", "plant_id": "poinsettia"},
"pomegranate": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื›ืชื ืคืจื™", "ืื ืชืจืงื ื•ื–", "ืจื™ืงื‘ื•ืŸ ืคืจื™ ืืœื˜ืจื ืจื™ื”"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/pomegranate.jpg", "plant_id": "pomegranate"},
"potato": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžืื•ื—ืจืช", "ื›ืœื™ื” ืžื•ืงื“ืžืช", "ื’ืœื“", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/potato.jpg", "plant_id": "potato"},
"pumpkin": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ื ืงืŸ ื’ื–ืข ื’ื•ืžื™", "ื—ื’ื‘ ื“ืœืขืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpumpkin", "plant_id": "pumpkin"},
"pumpkin_spaghetti": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dspaghetti_squash", "plant_id": "pumpkin_spaghetti"},
"quinoa": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ ืงื™ื ื•ืื”", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dquinoa", "plant_id": "quinoa"},
"raspberry": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืฉื ืชื™"], "common_diseases": ["ืื ืชืจืงื ื•ื–", "ื—ื ืงืŸ ืงื ื”", "ื—ื ืงืŸ ื“ื•ืจื‘ืŸ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/raspberry.jpg", "plant_id": "raspberry"},
"rhododendron": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืงืจืงืข ื—ื•ืžืฆื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื’ื‘ ื”ืชื—ืจื” ืฉืœ ื”ืื–ืœื™ื”", "ื—ื ืงืŸ ืขืœื™ื", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื ืคื™ื˜ื•ืคื˜ื•ืจื”"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/e/ec/Rhododendron_yakushimanum_flower.jpg", "plant_id": "rhododendron"},
"rice": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืœื—ื” ื‘ืžื™ื•ื—ื“"], "common_diseases": ["ืคื™ืฆื•ืฅ ืื•ืจื–", "ื—ื ืงืŸ ื ื“ืŸ", "ื—ื ืงืŸ ืขืœื™ื ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Drice", "plant_id": "rice"},
"rose": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ", "ืงื™ืžื—ื•ืŸ", "ืžื—ืœืช ื•ืจื“"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/rose.jpg", "plant_id": "rose"},
"rosemary": {"care_tips": ["ื“ืจื•ืฉ ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”", "ืงืจืงืข ืžื ื•ืงื–ืช ื”ื™ื˜ื‘"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/rosemary.jpg", "plant_id": "rosemary"},
"sage": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsage", "plant_id": "sage"},
"scallion": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื˜ืจื™ืคืก ื‘ืฆืœ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dscallion", "plant_id": "scallion"},
"spinach": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ืงืจืงืข ืขืฉื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ ืชืจื“", "ื—ืœื•ื“ื” ืœื‘ื ื”", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/1/15/Spinach_plant.jpg", "plant_id": "spinach"},
"strawberry": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–", "ืขื•ื‘ืฉ ืืคื•ืจ", "ืฆืจื™ื‘ืช ืขืœื™ื", "ื›ืชื ืขืœื™ื ื–ื•ื•ื™ืชื™"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/strawberry.jpg", "plant_id": "strawberry"},
"succulent": {"care_tips": ["ืื•ืจ ื‘ื”ื™ืจ", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื›ื ื™ืžื•ืช ืงืžื—", "ื›ื•ื•ื™ื•ืช ืฉืžืฉ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/succulent.jpg", "plant_id": "succulent"},
"sunflower": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”", "ื—ื ืงืŸ ื’ื–ืข ืคื•ืžื”", "ืงืžื™ืœื” ื•ืจื˜ื™ืฆื™ืœื™ืช"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/sunflower.jpg", "plant_id": "sunflower"},
"sweet_potato": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ", "ืจื™ืงื‘ื•ืŸ ืจืš", "ืกืงืœืฃ"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/sweet_potato.jpg", "plant_id": "sweet_potato"},
"swiss_chard": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ื›ืชื ืขืœื™ื ืฆืจืงืกืคื•ืจื”", "ื ืžื˜ื•ื“ืช ืฆื™ืกื˜ื” ืฉืœ ืกืœืง"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dswiss_chard", "plant_id": "swiss_chard"},
"tea": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ื ืงืŸ ืฉืœืคื•ื—ื™ืช", "ื—ืœื•ื“ื” ืื“ื•ืžื”"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/5/54/Camellia_sinensis_plant.jpg", "plant_id": "tea"},
"thyme": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื’ื–ืข", "ื—ื ืงืŸ ื‘ื•ื˜ืจื™ื˜ื™ืก"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dthyme", "plant_id": "thyme"},
"tilia": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืื• ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ืงืžื™ืœื” ื•ืจื˜ื™ืฆื™ืœื™ืช", "ืื ืชืจืงื ื•ื–", "ืกืคื—ืช"], "img_url": "https://upload.wikimedia.org/wikipedia/commons/e/e2/Tilia_cordata_tree.jpg", "plant_id": "tilia"},
"tobacco": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืขื•ื‘ืฉ ื›ื—ื•ืœ", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช ื”ื˜ื‘ืง", "ืกืคื—ืช ืฉื—ื•ืจื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dtobacco", "plant_id": "tobacco"},
"tomato": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”", "ืชืžื™ื›ื” ื‘ืฆืžื™ื—ื”"], "common_diseases": ["ื›ืœื™ื” ืžื•ืงื“ืžืช", "ื›ืœื™ื” ืžืื•ื—ืจืช", "ื›ืชื ืขืœื™ื ืกืคื˜ืžื‘ืจื™", "ืงืžื™ืœื” ื—ื™ื™ื“ืงื™ืช"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/tomato.jpg", "plant_id": "tomato"},
"tomato_cherry": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžื•ืงื“ืžืช", "ื›ืœื™ื” ืžืื•ื—ืจืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcherry_tomato", "plant_id": "tomato_cherry"},
"tomato_heirloom": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžื•ืงื“ืžืช", "ื›ืœื™ื” ืžืื•ื—ืจืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dheirloom_tomato", "plant_id": "tomato_heirloom"},
"tulip": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื•ื™ืจื•ืก ืฉื‘ื™ืจืช ื”ืฆื‘ืข ืฉืœ ื”ืฆื‘ืขื•ื ื™", "ืจื™ืงื‘ื•ืŸ ื‘ืฆืœ ืคื•ืกืจื™ื•ื", "ื—ื ืงืŸ ื‘ื•ื˜ืจื™ื˜ื™ืก"], "img_url": "https://res.cloudinary.com/dru8hdesf/image/upload/v1716900000/ESP32CAMPLANET/tulip.jpg", "plant_id": "tulip"},
"walnut": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwalnut", "plant_id": "walnut"},
"apple_golden_delicious": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgolden_delicious_apple", "plant_id": "apple_golden_delicious"},
"apple_honeycrisp": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhoneycrisp_apple", "plant_id": "apple_honeycrisp"},
"apple_red_delicious": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_delicious_apple", "plant_id": "apple_red_delicious"},
"apricot_royal": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Droyal_apricot", "plant_id": "apricot_royal"},
"avocado_hass": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ื’ื ื” ืžืจื•ื— ื—ื–ืงื”"], "common_diseases": ["ื›ืชื ืฉืžืฉ", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhass_avocado", "plant_id": "avocado_hass"},
"basil_sweet": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื”", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsweet_basil", "plant_id": "basil_sweet"},
"basil_thai": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dthai_basil", "plant_id": "basil_thai"},
"bean_green": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgreen_bean", "plant_id": "bean_green"},
"bean_kidney": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dkidney_bean", "plant_id": "bean_kidney"},
"blueberry_highbush": {"care_tips": ["ืงืจืงืข ื—ื•ืžืฆื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืขื ื‘ืช ืื•ื›ืžื ื™ื•ืช", "ื—ื ืงืŸ ื’ื–ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhighbush_blueberry", "plant_id": "blueberry_highbush"},
"broccoli_calabrese": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcalabrese_broccoli", "plant_id": "broccoli_calabrese"},
"cabbage_red": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ื”ืฉื•ืจืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_cabbage", "plant_id": "cabbage_red"},
"carrot_nantes": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืจื›ื” ื•ืขืžื•ืงื”"], "common_diseases": ["ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnantes_carrot", "plant_id": "carrot_nantes"},
"cherry_black": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblack_cherry", "plant_id": "cherry_black"},
"cherry_sour": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsour_cherry", "plant_id": "cherry_sour"},
"corn_sweet": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื” ื ืคื•ืฆื”", "ืขื•ื‘ืฉ ืชื™ืจืก"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsweet_corn", "plant_id": "corn_sweet"},
"corn_popcorn": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื” ื ืคื•ืฆื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpopcorn", "plant_id": "corn_popcorn"},
"cucumber_pickling": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืงื‘ื™ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpickling_cucumber", "plant_id": "cucumber_pickling"},
"eggplant_japanese": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djapanese_eggplant", "plant_id": "eggplant_japanese"},
"fig_black": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ืช ื”ืชืื ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblack_fig", "plant_id": "fig_black"},
"fig_mission": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ืช ื”ืชืื ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmission_fig", "plant_id": "fig_mission"},
"garlic_softneck": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืœื‘ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsoftneck_garlic", "plant_id": "garlic_softneck"},
"garlic_hardneck": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืœื‘ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhardneck_garlic", "plant_id": "garlic_hardneck"},
"grape_concord": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืงื‘ื•ืข"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dconcord_grape", "plant_id": "grape_concord"},
"grape_thompson_seedless": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืงื‘ื•ืข"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dthompson_seedless_grape", "plant_id": "grape_thompson_seedless"},
"jasmine_star": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืื• ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dstar_jasmine", "plant_id": "jasmine_star"},
"kiwi_hardy": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhardy_kiwi", "plant_id": "kiwi_hardy"},
"lavender_english": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Denglish_lavender", "plant_id": "lavender_english"},
"lemon_meyer": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื—ืœืช ืจื™ืงื‘ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmeyer_lemon", "plant_id": "lemon_meyer"},
"lettuce_romaine": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืกืงืœืจื•ื˜ื™ื ื™ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dromaine_lettuce", "plant_id": "lettuce_romaine"},
"lettuce_iceberg": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Diceberg_lettuce", "plant_id": "lettuce_iceberg"},
"mint_peppermint": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpeppermint", "plant_id": "mint_peppermint"},
"mint_spearmint": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dspearmint", "plant_id": "mint_spearmint"},
"oak_white": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงืžื™ืœืช ื”ืืœื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwhite_oak", "plant_id": "oak_white"},
"oak_red": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงืžื™ืœืช ื”ืืœื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_oak", "plant_id": "oak_red"},
"olive_black": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื–ื‘ื•ื‘ ื”ืคื™ืจื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblack_olive", "plant_id": "olive_black"},
"onion_red": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™ ืคื•ืกืจื™ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_onion", "plant_id": "onion_red"},
"onion_sweet": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ ื‘ืฆืœ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsweet_onion", "plant_id": "onion_sweet"},
"parsley_flat_leaf": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื“ืขื™ื›ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dflat_leaf_parsley", "plant_id": "parsley_flat_leaf"},
"peach_nectarine": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnectarine", "plant_id": "peach_nectarine"},
"pear_anjo": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื ืงืŸ ืืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Danjo_pear", "plant_id": "pear_anjo"},
"pepper_bell": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbell_pepper", "plant_id": "pepper_bell"},
"pepper_jalapeno": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djalapeno_pepper", "plant_id": "pepper_jalapeno"},
"plum_damson": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ืงืฉืจ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddamson_plum", "plant_id": "plum_damson"},
"potato_russet": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื’ืœื“", "ื›ืœื™ื” ืžืื•ื—ืจืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Drusset_potato", "plant_id": "potato_russet"},
"potato_yukon_gold": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื’ืœื“"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dyukon_gold_potato", "plant_id": "potato_yukon_gold"},
"pumpkin_jack_o_lantern": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djack_o_lantern_pumpkin", "plant_id": "pumpkin_jack_o_lantern"},
"raspberry_black": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืฉื ืชื™"], "common_diseases": ["ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblack_raspberry", "plant_id": "raspberry_black"},
"rose_hybrid_tea": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhybrid_tea_rose", "plant_id": "rose_hybrid_tea"},
"sage_common": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcommon_sage", "plant_id": "sage_common"},
"spinach_savoy": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ ืชืจื“"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsavoy_spinach", "plant_id": "spinach_savoy"},
"strawberry_everbearing": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืขื•ื‘ืฉ ืืคื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Deverbearing_strawberry", "plant_id": "strawberry_everbearing"},
"sweet_potato_jewel": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djewel_sweet_potato", "plant_id": "sweet_potato_jewel"},
"tomato_roma": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžื•ืงื“ืžืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Droma_tomato", "plant_id": "tomato_roma"},
"tomato_beefsteak": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžืื•ื—ืจืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbeefsteak_tomato", "plant_id": "tomato_beefsteak"},
"tulip_darwin_hybrid": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืฆืœ ืคื•ืกืจื™ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddarwin_hybrid_tulip", "plant_id": "tulip_darwin_hybrid"},
"walnut_black": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblack_walnut", "plant_id": "walnut_black"},
"watermelon": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื›ืชื ืขืœื™ื", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwatermelon", "plant_id": "watermelon"},
"watermelon_sugar_baby": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsugar_baby_watermelon", "plant_id": "watermelon_sugar_baby"},
"zucchini": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช ื”ื“ืœืขืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dzucchini", "plant_id": "zucchini"},
"zucchini_black_beauty": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblack_beauty_zucchini", "plant_id": "zucchini_black_beauty"},
"arborvitae": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื“ืขื™ื›ื”", "ืงืžื™ืœื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Darborvitae", "plant_id": "arborvitae"},
"banana": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืืงืœื™ื ื˜ืจื•ืคื™", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ืงืžื™ืœืช ืคื ืžื”", "ื›ืชื ืกื™ื’ืื˜ื•ืงื” ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbanana", "plant_id": "banana"},
"beech": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ืงืจืงืข ืœื—ื” ื•ืžื ื•ืงื–ืช"], "common_diseases": ["ืžื—ืœืช ืœื™ื‘ื ื” ืืžืจื™ืงืื™ืช", "ืžื—ืœืช ืœื™ื‘ื ื” ืื™ืจื•ืคื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbeech", "plant_id": "beech"},
"beet": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbeet", "plant_id": "beet"},
"bok_choy": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbok_choy", "plant_id": "bok_choy"},
"cauliflower_romanesco": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื” ืœื‘ื ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dromanesco_cauliflower", "plant_id": "cauliflower_romanesco"},
"celery": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื ืžื•ืงื“ื", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcelery", "plant_id": "celery"},
"chamomile": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dchamomile", "plant_id": "chamomile"},
"chive": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dchive", "plant_id": "chive"},
"collard_greens": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcollard_greens", "plant_id": "collard_greens"},
"corn_indian": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื” ื ืคื•ืฆื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dindian_corn", "plant_id": "corn_indian"},
"cranberry": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ื—ื•ืžืฆื™ืช", "ื”ืฉืงื™ื” ืงื‘ื•ืขื”"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ืจื™ืงื‘ื•ืŸ ืคื™ืจื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcranberry", "plant_id": "cranberry"},
"currant": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcurrant", "plant_id": "currant"},
"elderberry": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืคื™ืจื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Delderberry", "plant_id": "elderberry"},
"endive": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dendive", "plant_id": "endive"},
"fennel": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfennel", "plant_id": "fennel"},
"foxglove": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfoxglove", "plant_id": "foxglove"},
"gardenia": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ื—ื•ืžืฆื™ืช", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ", "ืขื•ื‘ืฉ ืžืคื•ื™ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgardenia", "plant_id": "gardenia"},
"ginger": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dginger", "plant_id": "ginger"},
"gooseberry": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgooseberry", "plant_id": "gooseberry"},
"hazelnut": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืงืคื•ื", "ืจื™ืงื‘ื•ืŸ ืขืฅ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhazelnut", "plant_id": "hazelnut"},
"honeysuckle": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืคืฆืขื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhoneysuckle", "plant_id": "honeysuckle"},
"iris": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืจืš ื—ื™ื™ื“ืงื™", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Diris", "plant_id": "iris"},
"kohlrabi": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ", "ื—ืœื•ื“ื” ืœื‘ื ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dkohlrabi", "plant_id": "kohlrabi"},
"lemon_lime": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื—ืœืช ืจื™ืงื‘ื•ืŸ", "ื›ื ื™ืžื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlemon_lime", "plant_id": "lemon_lime"},
"lettuce_butterhead": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื”ื˜ืœื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbutterhead_lettuce", "plant_id": "lettuce_butterhead"},
"lettuce_leaf": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dleaf_lettuce", "plant_id": "lettuce_leaf"},
"lime": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ", "ื›ืชื ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlime", "plant_id": "lime"},
"mandarin": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื•ืจ ืฉื—ื•ืจ", "ืขื•ื‘ืฉ ืืคื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmandarin", "plant_id": "mandarin"},
"marigold": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmarigold", "plant_id": "marigold"},
"oat_rolled": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœืงืจืงืขื•ืช ื“ืœื•ืช"], "common_diseases": ["ื—ืœื•ื“ืช ื”ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Drolled_oat", "plant_id": "oat_rolled"},
"olive_green": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื–ื‘ื•ื‘ ื”ืคื™ืจื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgreen_olive", "plant_id": "olive_green"},
"onion_white": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™ ืคื•ืกืจื™ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwhite_onion", "plant_id": "onion_white"},
"orange": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ", "ืžื—ืœืช ืจื™ืงื‘ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dorange", "plant_id": "orange"},
"orange_navel": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnavel_orange", "plant_id": "orange_navel"},
"orange_valencia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dvalencia_orange", "plant_id": "orange_valencia"},
"papaya": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช ื”ื™ื˜ื‘"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื•ื™ืจื•ืก ื˜ื‘ืขืช ืคืกื™ืคืกืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpapaya", "plant_id": "papaya"},
"parsley_curly": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื“ืขื™ื›ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcurly_parsley", "plant_id": "parsley_curly"},
"peach_white": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwhite_peach", "plant_id": "peach_white"},
"pecan_paper_shell": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื’ืœื“ ืคืงืืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpaper_shell_pecan", "plant_id": "pecan_paper_shell"},
"pepper_cayenne": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcayenne_pepper", "plant_id": "pepper_cayenne"},
"pepper_habanero": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhabanero_pepper", "plant_id": "pepper_habanero"},
"pepper_poblano": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื•ื™ืจื•ืก ืคืกื™ืคืกืช ืคืœืคืœ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpoblano_pepper", "plant_id": "pepper_poblano"},
"pistachio": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื’ืœื“", "ืจื™ืงื‘ื•ืŸ ืคื™ืจื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpistachio", "plant_id": "pistachio"},
"potato_red": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื’ืœื“"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_potato", "plant_id": "potato_red"},
"pumpkin_pie": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpie_pumpkin", "plant_id": "pumpkin_pie"},
"quince": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื ืงืŸ ืืฉ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dquince", "plant_id": "quince"},
"rose_floribunda": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfloribunda_rose", "plant_id": "rose_floribunda"},
"safflower": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ืœื•ื“ื”", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsafflower", "plant_id": "safflower"},
"shallot": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ืฆื•ื•ืืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dshallot", "plant_id": "shallot"},
"sorghum": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืขื•ื‘ืฉ ืจืืฉ", "ื—ืœื•ื“ื”", "ืงืžื™ืœื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsorghum", "plant_id": "sorghum"},
"soybean": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ื’ื–ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsoybean", "plant_id": "soybean"},
"spinach_new_zealand": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื” ืœื‘ื ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnew_zealand_spinach", "plant_id": "spinach_new_zealand"},
"squash_butternut": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbutternut_squash", "plant_id": "squash_butternut"},
"strawberry_alpine": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืขื•ื‘ืฉ ืืคื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dalpine_strawberry", "plant_id": "strawberry_alpine"},
"sunflower_confection": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dconfection_sunflower", "plant_id": "sunflower_confection"},
"thyme_lemon": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlemon_thyme", "plant_id": "thyme_lemon"},
"tomato_grape": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžื•ืงื“ืžืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgrape_tomato", "plant_id": "tomato_grape"},
"turnip": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื” ืœื‘ื ื”", "ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dturnip", "plant_id": "turnip"},
"vanilla": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื’ื–ืข", "ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dvanilla", "plant_id": "vanilla"},
"watermelon_seeded": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dseeded_watermelon", "plant_id": "watermelon_seeded"},
"wheat": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwheat", "plant_id": "wheat"},
"zucchini_yellow_squash": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dyellow_squash", "plant_id": "zucchini_yellow_squash"},
"alyssum": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dalyssum", "plant_id": "alyssum"},
"anemone": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Danemone", "plant_id": "anemone"},
"apple_pink_lady": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpink_lady_apple", "plant_id": "apple_pink_lady"},
"artemisia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dartemisia", "plant_id": "artemisia"},
"azalea_mollis": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืงืจืงืข ื—ื•ืžืฆื™ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmollis_azalea", "plant_id": "azalea_mollis"},
"balsam": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืจื™ืงื‘ื•ืŸ ื’ื–ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbalsam", "plant_id": "balsam"},
"basil_lemon": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlemon_basil", "plant_id": "basil_lemon"},
"blackberry": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืฉื ืชื™"], "common_diseases": ["ืื ืชืจืงื ื•ื–", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblackberry", "plant_id": "blackberry"},
"boxwood": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dboxwood", "plant_id": "boxwood"},
"canna": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcanna", "plant_id": "canna"},
"carnation": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcarnation", "plant_id": "carnation"},
"cherry_bing": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbing_cherry", "plant_id": "cherry_bing"},
"chrysanthemum": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dchrysanthemum", "plant_id": "chrysanthemum"},
"clematis": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืื• ื—ืœืงื™ืช", "ืงืจืงืข ืงืจื™ืจื”"], "common_diseases": ["ืงืžื™ืœื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dclematis", "plant_id": "clematis"},
"crocus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืฆืœ", "ื•ื™ืจื•ืก"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcrocus", "plant_id": "crocus"},
"dahlia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื•ื™ืจื•ืก ืคืกื™ืคืกืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddahlia", "plant_id": "dahlia"},
"daisy": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddaisy", "plant_id": "daisy"},
"dogwood": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddogwood", "plant_id": "dogwood"},
"echinacea": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dechinacea", "plant_id": "echinacea"},
"eucalyptus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ืœื•ื“ื”", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Deucalyptus", "plant_id": "eucalyptus"},
"forsythia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dforsythia", "plant_id": "forsythia"},
"geranium_zonal": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dzonal_geranium", "plant_id": "geranium_zonal"},
"ginger_butterfly": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbutterfly_ginger", "plant_id": "ginger_butterfly"},
"gladiolus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื’ืœื“ื™ื•ืœื™", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgladiolus", "plant_id": "gladiolus"},
"grape_cabernet_sauvignon": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืงื‘ื•ืข"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcabernet_sauvignon", "plant_id": "grape_cabernet_sauvignon"},
"holly": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dholly", "plant_id": "holly"},
"hydrangea": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhydrangea", "plant_id": "hydrangea"},
"iris_bearded": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืจืš ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbearded_iris", "plant_id": "iris_bearded"},
"kiwi_golden": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgolden_kiwi", "plant_id": "kiwi_golden"},
"lemon_eureka": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื—ืœืช ืจื™ืงื‘ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Deureka_lemon", "plant_id": "lemon_eureka"},
"lettuce_leaf_red": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_leaf_lettuce", "plant_id": "lettuce_leaf_red"},
"lilac_common": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืœืื—ืจ ืคืจื™ื—ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcommon_lilac", "plant_id": "lilac_common"},
"lily_asiatic": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื•ื™ืจื•ืก ืžื•ื–ืื™ืงื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dasiatic_lily", "plant_id": "lily_asiatic"},
"lily_oriental": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื•ื™ืจื•ืก ืžื•ื–ืื™ืงื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Doriental_lily", "plant_id": "lily_oriental"},
"linden": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืื• ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงืžื™ืœื” ื•ืจื˜ื™ืฆื™ืœื™ืช", "ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlinden", "plant_id": "linden"},
"mango_ataulfo": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dataulfo_mango", "plant_id": "mango_ataulfo"},
"marjoram": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmarjoram", "plant_id": "marjoram"},
"melaleuca": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื ืงืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmelaleuca", "plant_id": "melaleuca"},
"mint_chocolate": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dchocolate_mint", "plant_id": "mint_chocolate"},
"morning_glory": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื›ืชื ืœื‘ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmorning_glory", "plant_id": "morning_glory"},
"nasturtium": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื•ื™ืจื•ืก ืคืกื™ืคืกืช", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnasturtium", "plant_id": "nasturtium"},
"oak_pin": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงืžื™ืœืช ื”ืืœื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpin_oak", "plant_id": "oak_pin"},
"oregano_greek": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื—ืœื•ื“ื” ื ืขื ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgreek_oregano", "plant_id": "oregano_greek"},
"pansy": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpansy", "plant_id": "pansy"},
"passion_fruit_purple": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืชืžื™ื›ื” ืœื˜ื™ืคื•ืก"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpurple_passion_fruit", "plant_id": "passion_fruit_purple"},
"pear_bartlett": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื ืงืŸ ืืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbartlett_pear", "plant_id": "pear_bartlett"},
"pecan_elliott": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื’ืœื“ ืคืงืืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Delliott_pecan", "plant_id": "pecan_elliott"},
"pepper_chili": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื•ื™ืจื•ืก ืคืกื™ืคืกืช ืคืœืคืœ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dchili_pepper", "plant_id": "pepper_chili"},
"pine_scots": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dscots_pine", "plant_id": "pine_scots"},
"pomegranate_wonderful": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื›ืชื ืคืจื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwonderful_pomegranate", "plant_id": "pomegranate_wonderful"},
"potato_sweet": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsweet_potato", "plant_id": "potato_sweet"},
"pumpkin_mini": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmini_pumpkin", "plant_id": "pumpkin_mini"},
"radish": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dradish", "plant_id": "radish"},
"rhubarb": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Drhubarb", "plant_id": "rhubarb"},
"rose_climbing": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dclimbing_rose", "plant_id": "rose_climbing"},
"sage_purple": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpurple_sage", "plant_id": "sage_purple"},
"squash_acorn": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dacorn_squash", "plant_id": "squash_acorn"},
"strawberry_june_bearing": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืขื•ื‘ืฉ ืืคื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djune_bearing_strawberry", "plant_id": "strawberry_june_bearing"},
"thyme_creeping": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcreeping_thyme", "plant_id": "thyme_creeping"},
"tomato_san_marzano": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžื•ืงื“ืžืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsan_marzano_tomato", "plant_id": "tomato_san_marzano"},
"tulip_parrot": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื•ื™ืจื•ืก ืฉื‘ื™ืจืช ื”ืฆื‘ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dparrot_tulip", "plant_id": "tulip_parrot"},
"valerian": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dvalerian", "plant_id": "valerian"},
"walnut_english": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Denglish_walnut", "plant_id": "walnut_english"},
"water_lily": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืžื™ื ืžืชื•ืงื™ื"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwater_lily", "plant_id": "water_lily"},
"yarrow": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dyarrow", "plant_id": "yarrow"},
"yucca": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dyucca", "plant_id": "yucca"},
"agapanthus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dagapanthus", "plant_id": "agapanthus"},
"anise": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Danise", "plant_id": "anise"},
"aralia": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Daralia", "plant_id": "aralia"},
"artichoke_globe": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dglobe_artichoke", "plant_id": "artichoke_globe"},
"aster": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Daster", "plant_id": "aster"},
"asparagus_fern": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dasparagus_fern", "plant_id": "asparagus_fern"},
"borage": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dborage", "plant_id": "borage"},
"broccoli_raab": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbroccoli_raab", "plant_id": "broccoli_raab"},
"cabbage_napa": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnapa_cabbage", "plant_id": "cabbage_napa"},
"caladium": {"care_tips": ["ืฆืœ ืžืœื", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcaladium", "plant_id": "caladium"},
"camphor": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcamphor", "plant_id": "camphor"},
"celosia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืจื™ืงื‘ื•ืŸ ื’ื–ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcelosia", "plant_id": "celosia"},
"chive_garlic": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgarlic_chive", "plant_id": "chive_garlic"},
"citronella": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcitronella", "plant_id": "citronella"},
"cranesbill": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcranesbill", "plant_id": "cranesbill"},
"creeping_myrtle": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcreeping_myrtle", "plant_id": "creeping_myrtle"},
"daffodil_jonquil": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืกื™ืกื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djonquil_daffodil", "plant_id": "daffodil_jonquil"},
"daisy_shasta": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dshasta_daisy", "plant_id": "daisy_shasta"},
"dandelion": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ืœื•ื“ื” ืœื‘ื ื”", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddandelion", "plant_id": "dandelion"},
"dianthus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddianthus", "plant_id": "dianthus"},
"dracaena": {"care_tips": ["ืื•ืจ ืœื ื™ืฉื™ืจ", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื", "ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddracaena", "plant_id": "dracaena"},
"echinacea_purpurea": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dechinacea_purpurea", "plant_id": "echinacea_purpurea"},
"feverfew": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfeverfew", "plant_id": "feverfew"},
"gardenia_cape_jasmine": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ื—ื•ืžืฆื™ืช"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcape_jasmine_gardenia", "plant_id": "gardenia_cape_jasmine"},
"goldenrod": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgoldenrod", "plant_id": "goldenrod"},
"gooseberry_jostaberry": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djostaberry", "plant_id": "gooseberry_jostaberry"},
"grape_chardonnay": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืงื‘ื•ืข"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dchardonnay_grape", "plant_id": "grape_chardonnay"},
"holly_american": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Damerican_holly", "plant_id": "holly_american"},
"honeysuckle_vine": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืื• ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhoneysuckle_vine", "plant_id": "honeysuckle_vine"},
"hyssop": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhyssop", "plant_id": "hyssop"},
"iris_dutch": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืฆืœ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddutch_iris", "plant_id": "iris_dutch"},
"kale": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dkale", "plant_id": "kale"},
"kiwi_fuzzy": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfuzzy_kiwi", "plant_id": "kiwi_fuzzy"},
"lavender_french": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfrench_lavender", "plant_id": "lavender_french"},
"lemon_pink_eureka": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื—ืœืช ืจื™ืงื‘ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpink_eureka_lemon", "plant_id": "lemon_pink_eureka"},
"lettuce_bibb": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbibb_lettuce", "plant_id": "lettuce_bibb"},
"magnolia_star": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dstar_magnolia", "plant_id": "magnolia_star"},
"mango_kent": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dkent_mango", "plant_id": "mango_kent"},
"maple_sugar": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ื–ืคืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsugar_maple", "plant_id": "maple_sugar"},
"melon_galia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgalia_melon", "plant_id": "melon_galia"},
"mint_apple": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dapple_mint", "plant_id": "mint_apple"},
"myrtle_crape": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcrape_myrtle", "plant_id": "myrtle_crape"},
"narcissus": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืฆืœ", "ื•ื™ืจื•ืก"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dnarcissus", "plant_id": "narcissus"},
"oak_live": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงืžื™ืœืช ื”ืืœื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlive_oak", "plant_id": "oak_live"},
"orange_blood": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblood_orange", "plant_id": "orange_blood"},
"paprika": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ื—ื™ื™ื“ืงื™", "ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpaprika", "plant_id": "paprika"},
"parsley_italian": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื“ืขื™ื›ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ditalian_parsley", "plant_id": "parsley_italian"},
"peach_flat": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dflat_peach", "plant_id": "peach_flat"},
"pecan_cheyenne": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื’ืœื“ ืคืงืืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcheyenne_pecan", "plant_id": "pecan_cheyenne"},
"pepper_ghost": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dghost_pepper", "plant_id": "pepper_ghost"},
"petunia_wave": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dwave_petunia", "plant_id": "petunia_wave"},
"pine_eastern_white": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ืœื•ื“ื”", "ืงืžื—ื•ื ื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Deastern_white_pine", "plant_id": "pine_eastern_white"},
"plum_japanese": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djapanese_plum", "plant_id": "plum_japanese"},
"pomegranate_pink": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื›ืชื ืคืจื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpink_pomegranate", "plant_id": "pomegranate_pink"},
"potato_fingerling": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื’ืœื“"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfingerling_potato", "plant_id": "potato_fingerling"},
"pumpkin_sugar": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsugar_pumpkin", "plant_id": "pumpkin_sugar"},
"quinoa_red": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_quinoa", "plant_id": "quinoa_red"},
"raspberry_red": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืฉื ืชื™"], "common_diseases": ["ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_raspberry", "plant_id": "raspberry_red"},
"rose_miniature": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dminiature_rose", "plant_id": "rose_miniature"},
"rosemary_prostrate": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dprostrate_rosemary", "plant_id": "rosemary_prostrate"},
"saffron_crocus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืฆืœ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsaffron_crocus", "plant_id": "saffron_crocus"},
"spinach_perpetual": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ ืชืจื“"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dperpetual_spinach", "plant_id": "spinach_perpetual"},
"squash_spaghetti": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dspaghetti_squash", "plant_id": "squash_spaghetti"},
"sunflower_tall": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dtall_sunflower", "plant_id": "sunflower_tall"},
"sweet_potato_purple": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpurple_sweet_potato", "plant_id": "sweet_potato_purple"},
"thyme_common": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื’ื–ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcommon_thyme", "plant_id": "thyme_common"},
"tomato_brandywine": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžืื•ื—ืจืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbrandywine_tomato", "plant_id": "tomato_brandywine"},
"verbena": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dverbena", "plant_id": "verbena"},
"wheat_durum": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddurum_wheat", "plant_id": "wheat_durum"},
"zinnia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dzinnia", "plant_id": "zinnia"},
"anemone_coronaria": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ืœื—ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Danemone_coronaria", "plant_id": "anemone_coronaria"},
"apple_honeycrisp": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhoneycrisp_apple", "plant_id": "apple_honeycrisp"},
"apple_macintosh": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ื’ืœื“ ื”ืชืคื•ื—"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmacintosh_apple", "plant_id": "apple_macintosh"},
"avocado_reed": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ื’ื ื” ืžืจื•ื— ื—ื–ืงื”"], "common_diseases": ["ื›ืชื ืฉืžืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dreed_avocado", "plant_id": "avocado_reed"},
"basil_genovese": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgenovese_basil", "plant_id": "basil_genovese"},
"bean_lima": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlima_bean", "plant_id": "bean_lima"},
"bean_snap": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsnap_bean", "plant_id": "bean_snap"},
"beet_sugar": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsugar_beet", "plant_id": "beet_sugar"},
"bellflower": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbellflower", "plant_id": "bellflower"},
"cabbage_savoy": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsavoy_cabbage", "plant_id": "cabbage_savoy"},
"calla_lily": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืจืš", "ื•ื™ืจื•ืก"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcalla_lily", "plant_id": "calla_lily"},
"camellia_sinensis": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืงื‘ื•ืขื”"], "common_diseases": ["ื—ื ืงืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcamellia_sinensis", "plant_id": "camellia_sinensis"},
"cannabis": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืขื•ื‘ืฉ ืืคื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcannabis", "plant_id": "cannabis"},
"castor_bean": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcastor_bean", "plant_id": "castor_bean"},
"cherry_rainier": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Drainier_cherry", "plant_id": "cherry_rainier"},
"chrysanthemum_garden": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgarden_chrysanthemum", "plant_id": "chrysanthemum_garden"},
"coleus": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcoleus", "plant_id": "coleus"},
"corn_dent": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื—ืœื•ื“ื” ื ืคื•ืฆื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddent_corn", "plant_id": "corn_dent"},
"cranberry_american": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ื—ื•ืžืฆื™ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืคื™ืจื•ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Damerican_cranberry", "plant_id": "cranberry_american"},
"cucumber_english": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืงื‘ื™ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Denglish_cucumber", "plant_id": "cucumber_english"},
"daisy_gerbera": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgerbera_daisy", "plant_id": "daisy_gerbera"},
"date_palm_deglet_noor": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื‘ื™ื™ื•ื“"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddeglet_noor_date_palm", "plant_id": "date_palm_deglet_noor"},
"delphinium": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddelphinium", "plant_id": "delphinium"},
"dogwood_flowering": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dflowering_dogwood", "plant_id": "dogwood_flowering"},
"fern_maidenhair": {"care_tips": ["ืฆืœ ืžืœื", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ื ืžื˜ื•ื“ื•ืช ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmaidenhair_fern", "plant_id": "fern_maidenhair"},
"ficus_lyrata": {"care_tips": ["ืื•ืจ ืœื ื™ืฉื™ืจ", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dficus_lyrata", "plant_id": "ficus_lyrata"},
"garlic_elephant": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืœื‘ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Delephant_garlic", "plant_id": "garlic_elephant"},
"grape_merlot": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืงื‘ื•ืข"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmerlot_grape", "plant_id": "grape_merlot"},
"hazelnut_filbert": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืงืคื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dfilbert_hazelnut", "plant_id": "hazelnut_filbert"},
"hibiscus_syriacus": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงืžื™ืœืช ื”ื™ื‘ื™ืกืงื•ืก"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhibiscus_syriacus", "plant_id": "hibiscus_syriacus"},
"hollyhock": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dhollyhock", "plant_id": "hollyhock"},
"hydrangea_oakleaf": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Doakleaf_hydrangea", "plant_id": "hydrangea_oakleaf"},
"iris_siberian": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืจืš ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsiberian_iris", "plant_id": "iris_siberian"},
"kale_lacinato": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื•ืขื“ื•ืŸ ืฉื•ืจืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dlacinato_kale", "plant_id": "kale_lacinato"},
"kiwi_arctic_beauty": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื—ื ืงืŸ ื—ื™ื™ื“ืงื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Darctic_beauty_kiwi", "plant_id": "kiwi_arctic_beauty"},
"lemon_ponzu": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืžื—ืœืช ืจื™ืงื‘ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dponzu_lemon", "plant_id": "lemon_ponzu"},
"lettuce_mesclun": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmesclun_lettuce", "plant_id": "lettuce_mesclun"},
"lilac_dwarf": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืœืื—ืจ ืคืจื™ื—ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddwarf_lilac", "plant_id": "lilac_dwarf"},
"magnolia_southern": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ืฆืœ ื—ืœืงื™", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsouthern_magnolia", "plant_id": "magnolia_southern"},
"maple_japanese": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงืžื™ืœื” ื•ืจื˜ื™ืฆื™ืœื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Djapanese_maple", "plant_id": "maple_japanese"},
"melissa": {"care_tips": ["ืฉืžืฉ ืžืœืื” ืขื“ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ", "ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmelissa", "plant_id": "melissa"},
"mint_catnip": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dcatnip_mint", "plant_id": "mint_catnip"},
"oak_bur": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ืงืžื™ืœืช ื”ืืœื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbur_oak", "plant_id": "oak_bur"},
"orange_mandarin": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื›ืชืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmandarin_orange", "plant_id": "orange_mandarin"},
"papaya_solo": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsolo_papaya", "plant_id": "papaya_solo"},
"pea_sugar_snap": {"care_tips": ["ืฉืžืฉ ื—ืœืงื™ืช", "ืงืจืงืข ืงืจื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsugar_snap_pea", "plant_id": "pea_sugar_snap"},
"peach_donut": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddonut_peach", "plant_id": "peach_donut"},
"pepper_banana": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื•ื™ืจื•ืก ืคืกื™ืคืกืช ืคืœืคืœ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbanana_pepper", "plant_id": "pepper_banana"},
"petunia_super_tunia": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsuper_tunia_petunia", "plant_id": "petunia_super_tunia"},
"pine_loblolly": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื—ืœื•ื“ื”"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dloblolly_pine", "plant_id": "pine_loblolly"},
"plum_greengage": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ื‘ื™ื ื•ื ื™ืช"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื—ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dgreengage_plum", "plant_id": "plum_greengage"},
"pomegranate_kazake": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืขืžื™ื“ ืœื‘ืฆื•ืจืช"], "common_diseases": ["ื›ืชื ืคืจื™"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dkazake_pomegranate", "plant_id": "pomegranate_kazake"},
"potato_sweet_red": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dred_sweet_potato", "plant_id": "potato_sweet_red"},
"pumpkin_blue_hubbard": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblue_hubbard_pumpkin", "plant_id": "pumpkin_blue_hubbard"},
"quince_orange": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื—ื ืงืŸ ืืฉ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dorange_quince", "plant_id": "quince_orange"},
"raspberry_black_cap": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื’ื™ื–ื•ื ืฉื ืชื™"], "common_diseases": ["ืื ืชืจืงื ื•ื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dblack_cap_raspberry", "plant_id": "raspberry_black_cap"},
"rhododendron_pjm": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืงืจืงืข ื—ื•ืžืฆื™ืช"], "common_diseases": ["ื›ืชื ืขืœื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpjm_rhododendron", "plant_id": "rhododendron_pjm"},
"rice_basmati": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืœื—ื” ื‘ืžื™ื•ื—ื“"], "common_diseases": ["ืคื™ืฆื•ืฅ ืื•ืจื–"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbasmati_rice", "plant_id": "rice_basmati"},
"rose_knockout": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืขืžื•ืงื”"], "common_diseases": ["ื›ืชื ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dknockout_rose", "plant_id": "rose_knockout"},
"rosemary_tuscan_blue": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dtuscan_blue_rosemary", "plant_id": "rosemary_tuscan_blue"},
"sage_tri_color": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ืงืจืงืข ืžื ื•ืงื–ืช"], "common_diseases": ["ืงืžื™ืœื” ืคื•ืกืจื™ืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dtri_color_sage", "plant_id": "sage_tri_color"},
"spinach_malabar": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dmalabar_spinach", "plant_id": "spinach_malabar"},
"squash_pattypan": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dpattypan_squash", "plant_id": "squash_pattypan"},
"strawberry_dayneutral": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืจื•ื‘ื”"], "common_diseases": ["ืขื•ื‘ืฉ ืืคื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Ddayneutral_strawberry", "plant_id": "strawberry_dayneutral"},
"sweet_potato_beauregard": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื—ื•ืจ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dbeauregard_sweet_potato", "plant_id": "sweet_potato_beauregard"},
"thyme_silver": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ืฉื•ืจืฉื™ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dsilver_thyme", "plant_id": "thyme_silver"},
"tomato_amish_paste": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืกื“ื™ืจื”"], "common_diseases": ["ื›ืœื™ื” ืžื•ืงื“ืžืช"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Damish_paste_tomato", "plant_id": "tomato_amish_paste"},
"tulip_triumph": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžื•ืขื˜ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื‘ืฆืœ ืคื•ืกืจื™ื•ื"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dtriumph_tulip", "plant_id": "tulip_triumph"},
"vanilla_planifolia": {"care_tips": ["ืฆืœ ื—ืœืงื™", "ืœื—ื•ืช ื’ื‘ื•ื”ื”"], "common_diseases": ["ืจื™ืงื‘ื•ืŸ ื’ื–ืข"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dvanilla_planifolia", "plant_id": "vanilla_planifolia"},
"verbena_perennial": {"care_tips": ["ืฉืžืฉ ืžืœืื”", "ื”ืฉืงื™ื” ืžืชื•ื ื”"], "common_diseases": ["ืงื™ืžื—ื•ืŸ"], "img_url": "https://www.google.com/search?q=https://placehold.co/600x400/000000/FFFFFF%3Ftext%3Dperennial_verbena", "plant_id": "verbena_perennial"},
}
# User-provided list of all models
PLANT_AI_MODELS = {
"PlantVillage-Disease": {
"model_id": "linkanjarad/mobilenet_v2_1.0_224-plant-disease-identification",
"specialty": "Plant Disease Detection", "reliability": 0.94, "priority": 1
},
"Pest-Identifier": {
"model_id": "linkanjarad/mobilenet_v2_1.0_224-plant-diseases",
"specialty": "Pest Identification", "reliability": 0.92, "priority": 2
},
"PlantNet-Species": {
"model_id": "google/vit-base-patch16-224-in21k",
"specialty": "Species Identification", "reliability": 0.91, "priority": 3
},
"Botanical-Vision": {
"model_id": "facebook/deit-base-patch16-224",
"specialty": "Botanical Features", "reliability": 0.87, "priority": 4
},
"Soil-Analysis-AI": {
"model_id": "facebook/deit-base-patch16-224-in21k",
"specialty": "Soil Composition Analysis", "reliability": 0.88, "priority": 5
},
"Plant-Health": {
"model_id": "google/efficientnet-b4",
"specialty": "Health Assessment", "reliability": 0.86, "priority": 6
},
"Weed-Identifier": {
"model_id": "microsoft/resnet-50",
"specialty": "Weed Identification", "reliability": 0.85, "priority": 7
},
"Flora-ID": {
"model_id": "google/vit-large-patch16-224",
"specialty": "Wild Flora", "reliability": 0.84, "priority": 8
},
"Crop-Vision": {
"model_id": "facebook/convnext-base-224-22k-1k",
"specialty": "Crop Recognition", "reliability": 0.83, "priority": 9
},
"Plant-Lifecycle": {
"model_id": "microsoft/beit-base-patch16-224-in21k",
"specialty": "Plant Lifecycle", "reliability": 0.82, "priority": 10
},
"Medicinal-Plants": {
"model_id": "google/efficientnet-b3",
"specialty": "Medicinal Plants", "reliability": 0.81, "priority": 11
},
"Tree-Detector": {
"model_id": "facebook/dino-vitb16",
"specialty": "Tree Species", "reliability": 0.80, "priority": 12
},
"Flower-ID": {
"model_id": "microsoft/resnet-50",
"specialty": "Flower Recognition", "reliability": 0.79, "priority": 13
},
"Nutrient-Deficiency-Detector": {
"model_id": "facebook/convnext-base-224-22k-1k",
"specialty": "Nutrient Deficiency", "reliability": 0.87, "priority": 14
},
"Fruit-Classifier": {
"model_id": "google/efficientnet-b2",
"specialty": "Fruit Recognition", "reliability": 0.85, "priority": 15
},
"Vegetable-Expert": {
"model_id": "microsoft/resnet-34",
"specialty": "Vegetable Classification", "reliability": 0.84, "priority": 16
},
"Herb-Specialist": {
"model_id": "google/efficientnet-b1",
"specialty": "Herb Identification", "reliability": 0.83, "priority": 17
},
"Flower-Morphology": {
"model_id": "facebook/convnext-small-224",
"specialty": "Flower Analysis", "reliability": 0.82, "priority": 18
},
"Aquatic-Flora-Expert": {
"model_id": "microsoft/beit-base-patch16-224-in21k",
"specialty": "Aquatic Plants", "reliability": 0.80, "priority": 19
},
"Leaf-Shape-AI": {
"model_id": "microsoft/resnet-18",
"specialty": "Leaf Shape Analysis", "reliability": 0.81, "priority": 20
},
"Model-21": {
"model_id": "google/vit-base-patch16-224-in21k",
"specialty": "Pest & Disease Vector Identification", "reliability": 0.90, "priority": 21
},
"Model-22": {
"model_id": "facebook/deit-base-patch16-224-in21k",
"specialty": "Nutrient Deficiency Detection", "reliability": 0.89, "priority": 22
},
"Model-23": {
"model_id": "microsoft/resnet-50",
"specialty": "Drought & Water Stress", "reliability": 0.88, "priority": 23
},
"Model-24": {
"model_id": "google/efficientnet-b5",
"specialty": "Weed vs. Crop Classification", "reliability": 0.87, "priority": 24
},
"Model-25": {
"model_id": "facebook/convnext-base-224-22k-1k",
"specialty": "Urban Plant Species", "reliability": 0.86, "priority": 25
},
"Model-26": {
"model_id": "microsoft/swin-tiny-patch4-window7-224",
"specialty": "Wildflower Identification", "reliability": 0.85, "priority": 26
},
"Model-27": {
"model_id": "google/vit-large-patch16-224-in21k",
"specialty": "Common Allergen Plants", "reliability": 0.84, "priority": 27
},
"Model-28": {
"model_id": "facebook/dino-vitb16",
"specialty": "Poisonous Plant Detection", "reliability": 0.83, "priority": 28
},
"Model-29": {
"model_id": "microsoft/beit-base-patch16-224-in21k",
"specialty": "Aquatic & Wetland Plants", "reliability": 0.82, "priority": 29
},
"Model-30": {
"model_id": "google/efficientnet-b4",
"specialty": "Fungi & Mushroom Identification", "reliability": 0.81, "priority": 30
},
"Model-31": {
"model_id": "facebook/convnext-small-224",
"specialty": "Plant Anatomy (Root/Stem/Leaf)", "reliability": 0.80, "priority": 31
},
"Model-32": {
"model_id": "microsoft/resnet-18",
"specialty": "Plant Lifecycle Stage", "reliability": 0.79, "priority": 32
},
"Model-33": {
"model_id": "google/mobilenet-v2-1.0-224",
"specialty": "Microscopic Plant Features", "reliability": 0.78, "priority": 33
},
"Model-34": {
"model_id": "microsoft/resnet-101",
"specialty": "Seed & Spore Identification", "reliability": 0.77, "priority": 34
},
"Model-35": {
"model_id": "facebook/deit-tiny-patch16-224",
"specialty": "Rare & Exotic Herbs", "reliability": 0.76, "priority": 35
},
"Model-36": {
"model_id": "google/efficientnet-b1",
"specialty": "Tropical Plant Identification", "reliability": 0.75, "priority": 36
},
"Model-37": {
"model_id": "microsoft/swinv2-base-patch4-window8-256",
"specialty": "Forest & Woodland Species", "reliability": 0.74, "priority": 37
},
"Model-38": {
"model_id": "facebook/convnext-tiny-224",
"specialty": "Desert Plant Identification", "reliability": 0.73, "priority": 38
},
"Model-39": {
"model_id": "google/vit-base-patch16-224-in21k",
"specialty": "Mountain Flora", "reliability": 0.72, "priority": 39
},
"Model-40": {
"model_id": "microsoft/beit-base-patch16-224-in21k",
"specialty": "Polar & Alpine Plants", "reliability": 0.71, "priority": 40
},
"Disease-Scanner": {
"model_id": "google/mobilenet_v2_1.0_224",
"specialty": "Disease Detection", "reliability": 0.80, "priority": 41
},
"Garden-Botanist": {
"model_id": "facebook/deit-small-patch16-224",
"specialty": "Garden Plant Expert", "reliability": 0.79, "priority": 42
},
"Plant-Anatomy": {
"model_id": "microsoft/beit-base-patch16-224",
"specialty": "Plant Structure Analysis", "reliability": 0.78, "priority": 43
},
"Agricultural-AI": {
"model_id": "google/vit-base-patch16-224",
"specialty": "Agricultural Crops", "reliability": 0.77, "priority": 44
},
"Botanical-Scanner": {
"model_id": "facebook/convnext-tiny-224",
"specialty": "General Botany", "reliability": 0.76, "priority": 45
},
"Plant-Taxonomy": {
"model_id": "microsoft/swinv2-base-patch4-window8-256",
"specialty": "Taxonomic Classification", "reliability": 0.75, "priority": 46
},
"Fungi-Classifier": {
"model_id": "google/efficientnet-b0",
"specialty": "Fungi & Mushroom", "reliability": 0.74, "priority": 47
},
"Urban-Flora-Expert": {
"model_id": "microsoft/resnet-101",
"specialty": "Urban Plants", "reliability": 0.78, "priority": 48
},
"Weed-Identifier_2": {
"model_id": "microsoft/resnet-50",
"specialty": "Weed Identification", "reliability": 0.85, "priority": 49
},
"Plant-Lifecycle_2": {
"model_id": "google/efficientnet-b5",
"specialty": "Plant Lifecycle", "reliability": 0.82, "priority": 50
}
}
# Pre-trained models
@dataclass
class PretrainedModel:
model: Any
name: str
# Cache for loaded models
PLANT_MODELS_CACHE = {}
# ==================== UTILITY FUNCTIONS & CLASSES ====================
def get_user_location():
"""Tries to get user's location based on IP."""
try:
response = requests.get('http://ipinfo.io/json')
data = response.json()
city = data.get('city', 'Tel Aviv')
country = data.get('country', 'IL')
return f"{city}, {country}"
except Exception as e:
print(f"Failed to get location from IP: {e}. Using default.")
return "Tel Aviv, IL"
# A simple way to load and save a dictionary of model weights
def load_weights():
"""Loads model weights from a JSON file, or creates defaults based on reliability if none exist."""
if os.path.exists("model_weights.json"):
try:
with open("model_weights.json", "r") as f:
return json.load(f)
except json.JSONDecodeError:
print("Error decoding model_weights.json. Using default weights from PLANT_AI_MODELS.")
pass
# Default weights based on the `reliability` field
weights = {name: data['reliability'] for name, data in PLANT_AI_MODELS.items()}
return weights
def save_weights(weights):
"""Saves model weights to a JSON file."""
try:
with open("model_weights.json", "w") as f:
json.dump(weights, f, indent=4)
except Exception as e:
print(f"Failed to save model weights: {e}")
# Load weights at startup
MODEL_WEIGHTS = load_weights()
def load_hugging_face_model(model_name: str, repo_id: str):
"""Loads and caches a Hugging Face model and tokenizer."""
if repo_id not in PLANT_MODELS_CACHE:
try:
print(f"Loading model '{model_name}' from Hugging Face...")
model_pipeline = pipeline("image-classification", model=repo_id, device=0 if torch.cuda.is_available() else -1, token=HUGGING_FACE_TOKEN)
PLANT_MODELS_CACHE[repo_id] = model_pipeline
print(f"Model '{model_name}' loaded successfully.")
except Exception as e:
print(f"Failed to load model {model_name} from {repo_id}: {e}")
PLANT_MODELS_CACHE[repo_id] = None
return PLANT_MODELS_CACHE[repo_id]
def load_all_models():
"""Loads all models into cache at startup."""
print("Pre-loading all models...")
for model_name, model_info in PLANT_AI_MODELS.items():
load_hugging_face_model(model_name, model_info['model_id'])
print("All models pre-loaded.")
# ==================== ADAFRUIT IO & CLOUDINARY HANDLERS ====================
class DataIntegrator:
def __init__(self):
self.aio = None
if ADAFRUIT_AVAILABLE:
try:
self.aio = AdafruitClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)
except Exception as e:
print(f"Failed to initialize AdafruitClient: {e}. Check your credentials.")
if GEOPY_AVAILABLE:
self.geolocator = Nominatim(user_agent="plantscope_app")
def get_adafruit_data(self, feed_name: str, limit: int = 1000) -> Optional[List[Dict]]:
"""Fetches data from an Adafruit IO feed - up to 1000 records without time limits."""
if not self.aio:
print("Adafruit IO not available or failed to initialize, skipping data fetch.")
return None
try:
feed = self.aio.feeds(feed_name)
data = self.aio.receive(feed.key, limit=limit)
print(f"ื ืžืฉื›ื• {len(data) if data else 0} ื ืชื•ื ื™ื ืžื”ืคื™ื“ {feed_name}")
return data
except APIError as e:
print(f"Adafruit API Error fetching data from {feed_name}: {e}. Check your feed key or network connection.")
return None
except Exception as e:
print(f"General Adafruit API Error: {e}")
return None
def post_adafruit_data(self, feed_name: str, value: Any) -> bool:
"""Posts a new data point to an Adafruit IO feed."""
if not self.aio:
print(f"Adafruit IO not available or failed to initialize, skipping data post for {feed_name}.")
return False
try:
feed = self.aio.feeds(feed_name)
self.aio.send_data(feed.key, value)
return True
except APIError as e:
print(f"Adafruit API Error posting data to {feed_name}: {e}. Check your feed key or network connection.")
return False
except Exception as e:
print(f"General Adafruit API Error: {e}")
return False
def get_cloudinary_images(self, count: int = 100) -> List[Dict]:
"""Fetches ALL images from Cloudinary from a specific folder WITHOUT TIME LIMITS."""
if not CLOUDINARY_AVAILABLE:
print("Cloudinary not available, returning empty list.")
return []
try:
cloudinary.config(cloud_name=CLOUDINARY_CLOUD_NAME, api_key=CLOUDINARY_API_KEY, api_secret=CLOUDINARY_API_SECRET)
all_images = []
next_cursor = None
# ืœื•ืœืื” ืฉืžื•ืฉื›ืช ืืช ื›ืœ ื”ืชืžื•ื ื•ืช ืœืœื ื”ื’ื‘ืœืช ื–ืžืŸ
while len(all_images) < count:
request_params = {
"type": "upload",
"prefix": CLOUDINARY_FOLDER,
"max_results": min(500, count - len(all_images)), # Cloudinary ืžื’ื‘ื™ืœ ืœ-500 ื‘ื‘ืงืฉื”
"direction": "desc"
}
# ื”ื•ืกืคืช cursor ืื ื™ืฉ ื”ืžืฉืš
if next_cursor:
request_params["next_cursor"] = next_cursor
results = cloudinary.api.resources(**request_params)
batch_images = results.get('resources', [])
all_images.extend(batch_images)
# ื‘ื“ื™ืงื” ืื ื™ืฉ ืขื•ื“ ืชืžื•ื ื•ืช
next_cursor = results.get('next_cursor')
if not next_cursor or len(batch_images) == 0:
break
print(f"ื ืžืฉื›ื• {len(all_images)} ืชืžื•ื ื•ืช ืž-Cloudinary (ืœืœื ื”ื’ื‘ืœืช ื–ืžืŸ)")
return all_images[:count] # ื”ื—ื–ืจืช ื”ืžืกืคืจ ื”ืžื‘ื•ืงืฉ
except Exception as e:
print(f"Cloudinary API Error: {e}. Check your Cloudinary credentials or folder name.")
return []
def get_weather_for_location(self, location: str) -> Optional[Dict]:
"""Fetches weather data using OpenWeatherMap API."""
if not WEATHER_API_KEY:
return None
try:
response = requests.get(WEATHER_API_URL, params={
"q": location,
"appid": WEATHER_API_KEY,
"units": "metric"
})
response.raise_for_status()
data = response.json()
return {
"location": data.get("name"),
"temperature": data.get("main", {}).get("temp"),
"humidity": data.get("main", {}).get("humidity"),
"description": data.get("weather", [{}])[0].get("description")
}
except requests.exceptions.HTTPError as e:
print(f"Weather API HTTP Error: {e}")
return None
except Exception as e:
print(f"Weather API Error: {e}")
return None
def find_closest_sensor_data(self, image_timestamp, sensor_data):
if not sensor_data:
return None
try:
image_dt = datetime.fromisoformat(image_timestamp.replace('Z', '+00:00') if 'Z' in image_timestamp else image_timestamp)
except ValueError:
print(f"Could not parse image timestamp: {image_timestamp}")
return None
closest_data = None
min_diff = float('inf')
for data_point in sensor_data:
try:
data_dt = datetime.fromisoformat(data_point['created_at'].replace('Z', '+00:00') if 'Z' in data_point['created_at'] else data_point['created_at'])
time_diff = abs((image_dt - data_dt).total_seconds())
if time_diff < min_diff:
min_diff = time_diff
closest_data = data_point
except ValueError:
continue
return closest_data
min_diff = float('inf')
for data_point in sensor_data:
try:
data_dt = datetime.fromisoformat(data_point['created_at'].replace('Z', '+00:00') if 'Z' in data_point['created_at'] else data_point['created_at'])
time_diff = abs((image_dt - data_dt).total_seconds())
if time_diff < min_diff:
min_diff = time_diff
closest_data = data_point
except ValueError:
continue
return closest_data
# Function to get a plant identification from PlantNet
def get_plant_id_from_plantnet(image_path: str) -> Optional[Dict]:
"""Sends an image to the PlantNet API and returns the top result."""
if not PLANTNET_API_KEY:
print("PlantNet API key is missing.")
return None
url = "https://my-api.plantnet.org/v2/identify/all"
try:
with open(image_path, "rb") as image_file:
files = {'images': image_file}
payload = {'api-key': PLANTNET_API_KEY}
print("Sending image to PlantNet API...")
response = requests.post(url, files=files, params=payload)
response.raise_for_status()
data = response.json()
if data['results']:
top_result = data['results'][0]
# Find the Hebrew common name if available, otherwise use the scientific name
plant_name = None
for name in top_result['species']['commonNames']:
if any('\u0590' <= c <= '\u05EA' for c in name): # Check for Hebrew characters
plant_name = name
break
if not plant_name:
plant_name = top_result['species']['scientificNameWithoutAuthor']
score = top_result['score']
return {"plant_name": plant_name, "score": score}
else:
return None
except requests.exceptions.HTTPError as e:
print(f"HTTP Error: {e} - Could not connect to PlantNet API.")
return None
except Exception as e:
print(f"Error communicating with PlantNet API: {e}")
return None
# ==================== AI ANALYSIS & CONSENSUS ENGINE ====================
# Define keywords to separate models into two consensus groups
SPECIES_KEYWORDS = ["Species", "Flora", "Botanical", "Tree", "Crop", "Flower", "Fruit", "Vegetable", "Herb", "Weed", "Anatomy", "Lifecycle", "Taxonomy", "Expert", "Wild", "Urban", "Desert", "Mountain", "Forest", "Polar", "Aquatic", "Agricultural"]
HEALTH_KEYWORDS = ["Disease", "Pest", "Health", "Deficiency", "Stress", "Fungi", "Poisonous"]
# Automatically divide models based on keywords
SPECIES_MODELS = {name: data for name, data in PLANT_AI_MODELS.items() if any(k in data["specialty"] for k in SPECIES_KEYWORDS)}
HEALTH_MODELS = {name: data for name, data in PLANT_AI_MODELS.items() if any(k in data["specialty"] for k in HEALTH_KEYWORDS)}
# Pre-trained models
@dataclass
class PretrainedModel:
model: Any
name: str
# Cache for loaded models
PLANT_MODELS_CACHE = {}
# List of non-plant keywords to filter from species identification
NON_PLANT_KEYWORDS = ['pot', 'label', 'unhealthy', 'disease', 'background', 'hand', 'stem', 'leaf', 'flower', 'fruit', 'root', 'tree', 'plant']
def run_dual_consensus(image_path: str, manual_plant_name: Optional[str] = None) -> Tuple[str, Dict]:
"""
Runs a weighted dual-core consensus analysis on the given image.
If a manual plant name is provided, skips species identification.
"""
if not AI_AVAILABLE:
return "ืฉื’ื™ืื”: ื™ื›ื•ืœื•ืช ื”-AI ืื™ื ืŸ ื–ืžื™ื ื•ืช.", {"confidence": 0, "details": "AI not available."}
global MODEL_WEIGHTS
plant_results = []
health_results = []
# Check if a manual plant name was provided
if manual_plant_name:
print(f"Manual plant name '{manual_plant_name}' provided. Skipping species identification consensus.")
top_plant_prediction = manual_plant_name
plant_confidence = 1.0 # Set confidence to 100% since it's a manual override
else:
# 1. Species Identification Consensus (Weighted) - only if no manual name provided
print("Running Species Identification Consensus...")
for model_name, model_info in SPECIES_MODELS.items():
try:
classifier = PLANT_MODELS_CACHE.get(model_info['model_id'])
if classifier:
predictions = classifier(image_path)
for pred in predictions:
if not any(keyword in pred['label'].lower() for keyword in NON_PLANT_KEYWORDS):
plant_results.append({
"model_name": model_name,
"label": pred['label'],
"score": pred['score'] * MODEL_WEIGHTS.get(model_name, model_info['reliability'])
})
except Exception as e:
print(f"Error with model {model_name}: {e}")
# Aggregate results based on weighted scores
plant_scores = defaultdict(float)
for result in plant_results:
plant_scores[result['label']] += result['score']
if not plant_scores:
return "ืœื ื–ื•ื”ื” ืืฃ ืฆืžื—, ื™ื™ืชื›ืŸ ืฉื”ืชืžื•ื ื” ืื™ื ื” ืžืชืื™ืžื”", {"confidence": 0, "details": "No plants detected."}
top_plant_prediction = max(plant_scores, key=plant_scores.get)
total_plant_score = sum(plant_scores.values())
plant_confidence = plant_scores[top_plant_prediction] / total_plant_score if total_plant_score > 0 else 0
# 2. Health Analysis Consensus (Weighted) - this always runs
print("Running Health Analysis Consensus...")
for model_name, model_info in HEALTH_MODELS.items():
try:
classifier = PLANT_MODELS_CACHE.get(model_info['model_id'])
if classifier:
predictions = classifier(image_path)
for pred in predictions:
health_results.append({
"model_name": model_name,
"label": pred['label'],
"score": pred['score'] * MODEL_WEIGHTS.get(model_name, model_info['reliability'])
})
except Exception as e:
print(f"Error with model {model_name}: {e}")
# Aggregate health results
health_scores = defaultdict(float)
for result in health_results:
health_scores[result['label']] += result['score']
top_health_prediction = max(health_scores, key=health_scores.get) if health_scores else "ืœื ื™ื“ื•ืข"
total_health_score = sum(health_scores.values())
health_confidence = health_scores[top_health_prediction] / total_health_score if total_health_score > 0 else 0
return (
f"**ื–ื™ื”ื•ื™ ืกื•ืคื™:** {top_plant_prediction}",
{
"plant_prediction": top_plant_prediction,
"plant_confidence": plant_confidence,
"health_prediction": top_health_prediction,
"health_confidence": health_confidence,
"plant_scores_log": dict(plant_scores) if not manual_plant_name else {},
"health_scores_log": dict(health_scores),
"image_path": image_path,
}
)
def update_model_weights(original_analysis: Dict, user_correction: str):
"""
Updates the model weights based on user feedback (manual training from Cloudinary).
"""
global MODEL_WEIGHTS
if not original_analysis:
return "No original analysis found to update weights."
print(f"Updating model weights based on user correction. Old weights: {MODEL_WEIGHTS}")
plant_scores_log = original_analysis.get('plant_scores_log', {})
for model_name, model_info in PLANT_AI_MODELS.items():
if model_name in SPECIES_MODELS:
if user_correction in plant_scores_log:
MODEL_WEIGHTS[model_name] = min(1.0, MODEL_WEIGHTS.get(model_name, model_info['reliability']) + 0.05)
else:
MODEL_WEIGHTS[model_name] = max(0.01, MODEL_WEIGHTS.get(model_name, model_info['reliability']) - 0.02)
print(f"New weights: {MODEL_WEIGHTS}")
save_weights(MODEL_WEIGHTS)
return "Weights updated based on your correction."
def update_model_weights_from_plantnet(plantnet_result: Dict, original_analysis: Dict):
"""
Updates the model weights based on the PlantNet result (automatic training).
"""
global MODEL_WEIGHTS
if not plantnet_result or not original_analysis:
return "No PlantNet result or original analysis found to update weights."
print(f"Updating model weights using PlantNet data. Old weights: {MODEL_WEIGHTS}")
plantnet_prediction = plantnet_result.get("plant_name")
for model_name, model_info in SPECIES_MODELS.items():
try:
classifier = PLANT_MODELS_CACHE.get(model_info['model_id'])
if classifier:
predictions = classifier(original_analysis.get("image_path"))
if predictions:
model_top_prediction = predictions[0]['label']
if model_top_prediction == plantnet_prediction:
MODEL_WEIGHTS[model_name] = min(1.0, MODEL_WEIGHTS.get(model_name, model_info['reliability']) + 0.05)
else:
MODEL_WEIGHTS[model_name] = max(0.01, MODEL_WEIGHTS.get(model_name, model_info['reliability']) - 0.02)
except Exception as e:
print(f"Failed to get individual prediction from {model_name}: {e}")
print(f"New weights: {MODEL_WEIGHTS}")
save_weights(MODEL_WEIGHTS)
return f"Weights updated based on PlantNet's identification: '{plantnet_prediction}'."
def analyze_plant_image(image_path: str, manual_plant_name: Optional[str] = None):
"""
Main analysis function using the weighted consensus.
"""
if not image_path:
return "ืื ื ื”ืขืœื” ืชืžื•ื ื”.", []
final_prediction, analysis_details = run_dual_consensus(image_path, manual_plant_name)
plant_name = analysis_details.get("plant_prediction")
plant_info = PLANT_DATABASE.get(plant_name, {})
care_tips = plant_info.get("care_tips", ["ืื™ืŸ ื ืชื•ื ื™ื ื–ืžื™ื ื™ื."])
health_prediction = analysis_details['health_prediction']
if health_prediction in ["ืœื ื™ื“ื•ืข", "healthy"]: # Add "healthy" check for future model improvements
common_diseases = ["ื”ืฆืžื— ื‘ืžืฆื‘ ืžืฆื•ื™ืŸ! ืชื–ื›ื•ืจ ืœื”ืžืฉื™ืš ืœื˜ืคืœ ื‘ื•"]
else:
common_diseases = plant_info.get("common_diseases", ["ืื™ืŸ ื ืชื•ื ื™ื ื–ืžื™ื ื™ื."])
if len(common_diseases) > 0:
common_diseases.append(f"ื™ื™ืชื›ืŸ ื•ื”ืžืขืจื›ืช ื–ื™ื”ืชื”: {health_prediction}")
else:
common_diseases = [f"ื™ื™ืชื›ืŸ ื•ื”ืžืขืจื›ืช ื–ื™ื”ืชื”: {health_prediction}"]
img_url = plant_info.get("img_url", None)
output_text = f"""
**ืชื•ืฆืื•ืช ื”ื ื™ืชื•ื—:**
* **ื–ื™ื”ื•ื™ ืฆืžื—:** {plant_name} (ื‘ื™ื˜ื—ื•ืŸ: {analysis_details['plant_confidence']:.2%})
* **ืžืฆื‘ ื‘ืจื™ืื•ืช:** {analysis_details['health_prediction']} (ื‘ื™ื˜ื—ื•ืŸ: {analysis_details['health_confidence']:.2%})
* **ื˜ื™ืคื™ื ืœื˜ื™ืคื•ืœ:** {', '.join(care_tips)}
* **ืžื—ืœื•ืช ื ืคื•ืฆื•ืช:** {', '.join(common_diseases)}
"""
gallery_data = [(img_url, plant_name)] if img_url else []
analysis_details["image_path"] = image_path
analysis_details["timestamp"] = datetime.now().isoformat()
data_integrator.post_adafruit_data(ADAFRUIT_FEEDS["analysis_results"], json.dumps(analysis_details))
return output_text, gallery_data
# ==================== GRADIO INTERFACE FUNCTIONS ====================
data_integrator = DataIntegrator()
last_analysis_details = None
def refresh_cloudinary_images_interface():
"""Fetches images from Cloudinary and returns them for the gallery."""
images = data_integrator.get_cloudinary_images()
if not images:
return "ืœื ื ืžืฆืื• ืชืžื•ื ื•ืช ื‘-Cloudinary. ืื ื ื‘ื“ื•ืง ืืช ื”ื’ื“ืจื•ืช ื”ืชื™ืงื™ื™ื”.", []
image_list = [(img['secure_url'], f"Image taken at: {img['created_at']}") for img in images]
return f"ื ืžืฆืื• {len(images)} ืชืžื•ื ื•ืช.", image_list
def get_image_details(evt: gr.SelectData, image_data):
"""Retrieves and displays details for a selected image."""
selected_image_url = evt.value
selected_image_info = [img for img in image_data if img[0] == selected_image_url][0]
# Get sensor data
timestamp_str = selected_image_info[1].replace("Image taken at: ", "")
temp_data = data_integrator.get_adafruit_data(ADAFRUIT_FEEDS["temperature"])
humid_data = data_integrator.get_adafruit_data(ADAFRUIT_FEEDS["humidity"])
closest_temp_data = data_integrator.find_closest_sensor_data(timestamp_str, temp_data)
closest_humid_data = data_integrator.find_closest_sensor_data(timestamp_str, humid_data)
sensor_info = f"ื˜ืžืคืจื˜ื•ืจื”: {closest_temp_data['value']}ยฐC\n" if closest_temp_data else "ืื™ืŸ ื ืชื•ื ื™ ื˜ืžืคืจื˜ื•ืจื”.\n"
sensor_info += f"ืœื—ื•ืช: {closest_humid_data['value']}%" if closest_humid_data else "ืื™ืŸ ื ืชื•ื ื™ ืœื—ื•ืช."
return f"URL: {selected_image_url}", sensor_info, selected_image_url, "ืคืจื˜ื™ ืชืžื•ื ื” ื ื˜ืขื ื•.", gr.update(visible=True), gr.update(visible=True)
def save_plant_definition(image_path, plant_name):
"""
Saves the user's manual plant classification and uses it to update model weights.
Now also uses the PlantNet API as a reference.
"""
if not image_path or not plant_name:
return "ืฉื’ื™ืื”: ืื ื ื‘ื—ืจ ืชืžื•ื ื” ื•ืฆืžื—."
analysis_record = {
"image_path": image_path,
"user_defined_plant": plant_name,
"timestamp": datetime.now().isoformat()
}
try:
# Step 1: Get original analysis
raw_data = data_integrator.get_adafruit_data(ADAFRUIT_FEEDS["analysis_results"], limit=10)
original_analysis = json.loads(raw_data[0]['value'])
# Step 2: Use user correction to update weights (as before)
update_model_weights(original_analysis, plant_name)
# Step 3: Use PlantNet to update weights (as requested)
plantnet_result = get_plant_id_from_plantnet(image_path)
if plantnet_result:
update_model_weights_from_plantnet(plantnet_result, original_analysis)
except Exception as e:
print(f"Failed to retrieve original analysis for weight update: {e}")
return "ื”ื’ื“ืจืช ื”ืฆืžื— ื ืฉืžืจื”. ืืš ืขื“ื›ื•ืŸ ื”ืžืฉืงืœื•ืช ื ื›ืฉืœ."
return f"ื”ืฆืžื— '{plant_name}' ื ืฉืžืจ ื‘ื”ืฆืœื—ื”. ืžืขืจื›ืช ื”ืœืžื™ื“ื” ืขื•ื“ื›ื ื”."
def train_from_upload(image_path: str, plant_name: str):
"""
A new function for manual training from a user-uploaded image.
This function directly updates weights without relying on Adafruit IO.
"""
if not image_path or not plant_name:
return "ืฉื’ื™ืื”: ืื ื ื”ืขืœื” ืชืžื•ื ื” ื•ื‘ื—ืจ ืฆืžื—."
global MODEL_WEIGHTS
print(f"Starting manual training for plant '{plant_name}' from uploaded image.")
for model_name, model_info in SPECIES_MODELS.items():
try:
classifier = PLANT_MODELS_CACHE.get(model_info['model_id'])
if classifier:
predictions = classifier(image_path)
# Check for an exact or partial match with the user-provided name
matches = [p for p in predictions if p['label'].lower().strip() == plant_name.lower().strip() or plant_name.lower().strip() in p['label'].lower().strip()]
if matches:
# Reward the model if it made a correct prediction (even if it wasn't the top one)
MODEL_WEIGHTS[model_name] = min(1.0, MODEL_WEIGHTS.get(model_name, model_info['reliability']) + 0.05)
else:
# Penalize if the model's predictions didn't include the correct plant at all
MODEL_WEIGHTS[model_name] = max(0.01, MODEL_WEIGHTS.get(model_name, model_info['reliability']) - 0.02)
except Exception as e:
print(f"Failed to get individual prediction from {model_name}: {e}")
save_weights(MODEL_WEIGHTS)
return f"ื”ืžืขืจื›ืช ืœืžื“ื” ื‘ื”ืฆืœื—ื”! ืžืฉืงืœื•ืช ื”ืžื•ื“ืœื™ื ืขื•ื“ื›ื ื• ืขื‘ื•ืจ ื”ืฆืžื— '{plant_name}'."
def get_sensor_weather_data(city: str):
"""Retrieves and displays sensor and weather data."""
weather = data_integrator.get_weather_for_location(city)
temp_data = data_integrator.get_adafruit_data(ADAFRUIT_FEEDS["temperature"])
output_text = ""
if weather:
output_text += f"ืžื–ื’ ืื•ื•ื™ืจ ื‘{weather['location']}:\nื˜ืžืคืจื˜ื•ืจื”: {weather['temperature']}ยฐC\nืœื—ื•ืช: {weather['humidity']}%\nืชื™ืื•ืจ: {weather['description']}\n\n"
if temp_data:
output_text += f"ื ืชื•ื ื™ ื—ื™ื™ืฉื ื™ื ืื—ืจื•ื ื™ื:\n"
for i, point in enumerate(temp_data[:5]):
output_text += f"ื˜ืžืค' {i+1}: {point['value']}ยฐC ({point['created_at']})\n"
return output_text, None
def run_prophet_forecast():
"""Generates a forecast using Prophet."""
data_integrator = DataIntegrator()
temp_data = data_integrator.get_adafruit_data(ADAFRUIT_FEEDS["temperature"])
if not temp_data or len(temp_data) < 20:
print("Not enough real data, generating dummy data for forecast.")
end_date = datetime.now()
start_date = end_date - timedelta(days=30)
dates = [start_date + timedelta(days=i) for i in range(31)]
y_values = [random.uniform(20.0, 30.0) + math.sin(math.radians(i * 15)) * 2 for i in range(31)]
df = pd.DataFrame({'ds': dates, 'y': y_values})
output_message = "ืื™ืŸ ืžืกืคื™ืง ื ืชื•ื ื™ื ืืžื™ืชื™ื™ื. ืžื•ืฆื’ืช ืชื—ื–ื™ืช ืขืœ ื‘ืกื™ืก ื ืชื•ื ื™ื ืคื™ืงื˜ื™ื‘ื™ื™ื."
else:
df = pd.DataFrame([{'ds': datetime.fromisoformat(d['created_at'].replace('Z', '+00:00')), 'y': float(d['value'])} for d in temp_data])
df.sort_values('ds', inplace=True)
output_message = "ืชื—ื–ื™ืช ื˜ืžืคืจื˜ื•ืจื” ืœ-30 ื”ื™ืžื™ื ื”ืงืจื•ื‘ื™ื ื ื•ืฆืจื” ื‘ื”ืฆืœื—ื”."
m = Prophet(daily_seasonality=True, weekly_seasonality=True)
m.fit(df)
future = m.make_future_dataframe(periods=30, freq='D')
forecast = m.predict(future)
fig = m.plot(forecast)
plt.title("Temperature Forecast")
return output_message, fig
def send_robot_command(command: str):
"""Sends a command to the robot and gets a response."""
if not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID:
return "ืฉื’ื™ืื”: ืคืจื˜ื™ Telegram ื—ืกืจื™ื."
try:
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
payload = {"chat_id": TELEGRAM_CHAT_ID, "text": f"ืคืงื•ื“ื” ืžื”ืžืฉืชืžืฉ: {command}"}
response = requests.post(url, data=payload)
response.raise_for_status()
return "ื”ืคืงื•ื“ื” ื ืฉืœื—ื” ื‘ื”ืฆืœื—ื” ืœืจื•ื‘ื•ื˜."
except requests.exceptions.HTTPError as e:
return f"ืฉื’ื™ืื” ื‘ืฉืœื™ื—ืช ืคืงื•ื“ื” ืœื˜ืœื’ืจื: {e}"
except Exception as e:
return f"ืฉื’ื™ืื” ื›ืœืœื™ืช: {e}"
def get_care_tips_interface(plant_name: str):
"""Retrieves care tips for a selected plant."""
plant_info = PLANT_DATABASE.get(plant_name, {})
if not plant_info:
return "ืื™ืŸ ืžื™ื“ืข ื–ืžื™ืŸ ืขืœ ืฆืžื— ื–ื”.", None
care_tips = plant_info.get("care_tips", ["ืื™ืŸ ื ืชื•ื ื™ื."])
common_diseases = plant_info.get("common_diseases", ["ืื™ืŸ ื ืชื•ื ื™ื."])
tips_str = '\n- '.join(care_tips)
diseases_str = '\n- '.join(common_diseases)
text_output = f"**{plant_name}**\n\n**ื˜ื™ืคื™ื ืœื˜ื™ืคื•ืœ:**\n- {tips_str}\n\n**ืžื—ืœื•ืช ื ืคื•ืฆื•ืช:**\n- {diseases_str}"
image_output = plant_info.get("img_url", None)
return text_output, image_output
# ==================== MAIN GRADIO INTERFACE ====================
def create_gradio_app():
css = """
.gradio-container {
background-color: #40E0D0; /* Turquoise color */
}
"""
with gr.Blocks(title="YOYOPLANET AI", theme=gr.themes.Soft(), css=css) as app:
gr.Markdown(
"""
<div style="text-align: center;">
<h1>YOYOPLANET AI</h1>
<h3>ืžืขืจื›ืช ื—ื›ืžื” ืœื ื™ื˜ื•ืจ, ื ื™ืชื•ื— ื•ื˜ื™ืคื•ืœ ื‘ืฆืžื—ื™ื</h3>
<p>ื‘ืจื•ื›ื™ื ื”ื‘ืื™ื ืœืžืขืจื›ืช ื ื™ื˜ื•ืจ ื”ืฆืžื—ื™ื ื”ื›ื™ ื—ื›ืžื” ื‘ืขื•ืœื!</p>
</div>
"""
)
with gr.Tabs():
# --- Tab 1: Image Analysis ---
with gr.TabItem("ื ื™ืชื•ื— ืชืžื•ื ื•ืช"):
gr.Markdown("ื”ืฉืชืžืฉ ื‘ื˜ืื‘ ื–ื” ื›ื“ื™ ืœื ืชื— ืชืžื•ื ื” ื—ื“ืฉื” ื‘ืืžืฆืขื•ืช ืžืขืจื›ืช ื”ืงื•ื ืกื ื–ื•ืก ื”ืžืฉื•ืงืœืœืช.")
with gr.Row():
image_input = gr.Image(type="filepath", label="ื”ืขืœื” ืชืžื•ื ื” ืฉืœ ื”ืฆืžื— ืฉืœืš")
manual_plant_dropdown = gr.Dropdown(
choices=[""] + sorted(list(PLANT_DATABASE.keys())),
label="ืื•ืคืฆื™ื•ื ืœื™: ื‘ื—ืจ ืฆืžื— ื™ื“ื ื™ืช (ืœื ื™ืชื•ื— ื‘ืจื™ืื•ืชื™ ื‘ืœื‘ื“)",
info="ื‘ื—ื™ืจื” ื–ื• ืชื‘ื˜ืœ ืืช ืงื•ื ืกื ื–ื•ืก ื–ื™ื”ื•ื™ ื”ืฆืžื—ื™ื ื•ืชืชืžืงื“ ื‘ืžื—ืœื•ืช."
)
analysis_button = gr.Button("ื‘ืฆืข ื ื™ืชื•ื—")
analysis_output = gr.Textbox(label="ืชื•ืฆืื•ืช ื ื™ืชื•ื—", interactive=False)
analysis_gallery = gr.Gallery(label="ื”ืฉื•ื•ืื” ืœื“ื•ื’ืžืื•ืช ืžื”ืžืื’ืจ", columns=5, allow_preview=True)
# --- Tab 2: Manual Training (Local Upload) ---
with gr.TabItem("ืื™ืžื•ืŸ ื™ื“ื ื™ (ื”ืขืœืื” ืžืงื•ืžื™ืช)"):
gr.Markdown(
"""
ื”ืฉืชืžืฉ ื‘ื˜ืื‘ ื–ื” ื›ื“ื™ ืœืืžืŸ ืืช ื”ืžืขืจื›ืช ืขืœ ืชืžื•ื ื” ื—ื“ืฉื” ืฉืืชื” ืžืขืœื”.
<br>
**ื›ื™ืฆื“ ื–ื” ืขื•ื‘ื“**: ื”ืžืขืจื›ืช ืœื•ืžื“ืช ืžื”ื”ื’ื“ืจื•ืช ืฉืœืš ื•ืžืชืื™ืžื” ืืช ืขืฆืžื”. ื›ืืฉืจ ืืชื” ื‘ื•ื—ืจ ืฆืžื— ื•ืžืคืขื™ืœ ืืช ื”ืื™ืžื•ืŸ, ื”ืžืขืจื›ืช ืžื—ื–ืงืช ืืช ื”ืžื•ื“ืœื™ื ืฉื–ื™ื”ื• ื ื›ื•ืŸ ื•ืžื—ืœื™ืฉื” ืืช ืืœื” ืฉื˜ืขื•, ื•ื›ืš ืžืฉืคืจืช ืืช ื”ื“ื™ื•ืง ื”ื›ืœืœื™.
"""
)
with gr.Row():
manual_training_image_input = gr.Image(type="filepath", label="ื”ืขืœื” ืชืžื•ื ื” ืœืื™ืžื•ืŸ")
with gr.Row():
manual_training_plant_dropdown = gr.Dropdown(
choices=sorted(list(PLANT_DATABASE.keys())),
label="ื‘ื—ืจ ืืช ืฉื ื”ืฆืžื— ืžื”ืชืžื•ื ื”"
)
manual_training_btn = gr.Button("ืืžืŸ ืืช ื”ืžืขืจื›ืช")
manual_training_output = gr.Textbox(label="ืชื•ืฆืื•ืช ืื™ืžื•ืŸ", interactive=False)
# --- Tab 3: Ultimate Analysis ---
with gr.TabItem("ื ื™ืชื•ื— ืื•ืœื˜ื™ืžื˜ื™ื‘ื™"):
gr.Markdown(
"""
<div style="text-align: center;">
<h4>ื—ื™ื–ื•ื™ื™ื (ืคืจื•ืค'ื˜)</h4>
<p>ื”ืคืขืœ ืชื—ื–ื™ืช ืžื‘ื•ืกืกืช AI ืขืœ ื ืชื•ื ื™ ื”ื˜ืžืคืจื˜ื•ืจื” ื”ื”ื™ืกื˜ื•ืจื™ื™ื.</p>
</div>
"""
)
prophet_btn = gr.Button("ื”ืคืขืœ ืชื—ื–ื™ืช")
prophet_output = gr.Textbox(label="ืชื•ืฆืื•ืช ืชื—ื–ื™ืช", interactive=False)
prophet_graph = gr.Plot(label="ื’ืจืฃ ืชื—ื–ื™ืช")
gr.Markdown("---")
gr.Markdown(
"""
<div style="text-align: center;">
<h4>ืฉืœื™ื˜ื” ืžืจื—ื•ืง ืขืœ ื”ืจื•ื‘ื•ื˜</h4>
<p>ืฉืœื— ืคืงื•ื“ื•ืช ืœืจื•ื‘ื•ื˜ ืฉืœืš ื‘ืืžืฆืขื•ืช ื”ื•ื“ืขื•ืช ื˜ืœื’ืจื.</p>
</div>
"""
)
with gr.Row():
robot_command_input = gr.Textbox(label="ื”ืงืœื“ ืคืงื•ื“ื” ืœืจื•ื‘ื•ื˜ (ืœื“ื•ื’ืžื”: 'ื”ืฉืงื” ืคื˜ื•ื ื™ื”', 'ื”ืคืขืœ ืžืฉืื‘ื”')")
send_robot_command_btn = gr.Button("ืฉืœื— ืคืงื•ื“ื”")
robot_output = gr.Textbox(label="ืชื’ื•ื‘ืช ื”ืจื•ื‘ื•ื˜", interactive=False)
# --- Tab 4: Sensor Data & Forecasting ---
with gr.TabItem("ื ื™ื˜ื•ืจ ื—ื™ื™ืฉื ื™ื ื•ืชื—ื–ื™ื•ืช"):
gr.Markdown(
"""
<div style="text-align: center;">
<h4>ื ืชื•ื ื™ ื—ื™ื™ืฉื ื™ื ื•ืžื–ื’ ืื•ื•ื™ืจ</h4>
<p>ืขืงื•ื‘ ืื—ืจ ื”ื ืชื•ื ื™ื ืžื”ื—ื™ื™ืฉื ื™ื ืฉืœืš ื•ืงื‘ืœ ื ืชื•ื ื™ ืžื–ื’ ืื•ื•ื™ืจ ืขื“ื›ื ื™ื™ื.</p>
</div>
"""
)
city_input = gr.Textbox(value=get_user_location(), label="ื”ื›ื ืก ืžื™ืงื•ื (ืขื™ืจ)")
sensor_btn = gr.Button("ืจืขื ืŸ ื ืชื•ื ื™ ื—ื™ื™ืฉื ื™ื")
sensor_weather_output = gr.Textbox(label="ื ืชื•ื ื™ื ืื—ืจื•ื ื™ื ื•ืžื–ื’ ืื•ื•ื™ืจ", interactive=False)
# --- Tab 5: Tips ---
with gr.TabItem("ื˜ื™ืคื™ื"):
gr.Markdown(
"""
<div style="text-align: center;">
<h4>ืžื“ืจื™ืš ื˜ื™ืคื•ืœ ื‘ืฆืžื—ื™ื</h4>
</div>
"""
)
with gr.Row():
plant_dropdown_care = gr.Dropdown(choices=sorted(list(PLANT_DATABASE.keys())), label="ื‘ื—ืจ ืฆืžื— ืœืงื‘ืœืช ื˜ื™ืคื™ื ืœื˜ื™ืคื•ืœ")
care_btn = gr.Button("ืงื‘ืœ ื˜ื™ืคื™ื")
plant_display = gr.Textbox(label="ืžื™ื“ืข ืขืœ ื”ืฆืžื—", interactive=False)
plant_img_display = gr.Image(label="ืชืžื•ื ื” ืœื”ืžื—ืฉื”")
# --- Tab 6: Facts about the system ---
with gr.TabItem("ืขื•ื‘ื“ื•ืช ืขืœ ื”ืžืขืจื›ืช"):
gr.Markdown(
f"""
<div style="text-align: center;">
<h4>ืขื•ื‘ื“ื•ืช ืขืœ ื”ืžืขืจื›ืช</h4>
</div>
<p>
**ืžืฆื‘ ืžื•ื“ืœื™ื:** {len(SPECIES_MODELS)} ืžื•ื“ืœื™ ื–ื™ื”ื•ื™ ืฆืžื—ื™ื ืคืขื™ืœื™ื.<br>
**ืžืฆื‘ ืžื•ื“ืœื™ื:** {len(HEALTH_MODELS)} ืžื•ื“ืœื™ ื–ื™ื”ื•ื™ ืžื—ืœื•ืช ืคืขื™ืœื™ื.<br>
**ืžืฆื‘ ื”ืžืื’ืจ:** {len(PLANT_DATABASE)} ืžื™ื ื™ ืฆืžื—ื™ื ื™ื“ื•ืขื™ื ื‘ืžืื’ืจ.<br>
**ื™ื›ื•ืœื•ืช ืขื™ืงืจื™ื•ืช:** ื ื™ืชื•ื— ื‘ื–ืžืŸ ืืžืช, ืžืขืจื›ืช ืœืžื™ื“ื” ืขืฆืžืื™ืช, ื ื™ื˜ื•ืจ ื—ื™ื™ืฉื ื™ื, ืฉืœื™ื˜ื” ืžืจื—ื•ืง.<br>
**ืคืจื•ื˜ื•ืงื•ืœ ืชืงืฉื•ืจืช:** ื”ืžืขืจื›ืช ืžืฉืชืžืฉืช ื‘ืคืจื•ื˜ื•ืงื•ืœ MQTT ื“ืจืš Adafruit IO ื•ื‘-Telegram API.<br>
</p>
"""
)
# --- Tab 7: Plant Image Comparison & Manual Training (Cloudinary) ---
with gr.TabItem("ื”ืฉื•ื•ืืช ืชืžื•ื ื•ืช ืฆืžื—ื™ื ื•ืื™ืžื•ืŸ ื™ื“ื ื™ (Cloudinary)"):
gr.Markdown(
"""
<div style="text-align: center;">
<h4>ื’ืœืจื™ื™ืช ืชืžื•ื ื•ืช ืžื”ืžืฆืœืžื” ื”ื—ื›ืžื” ืฉืœืš</h4>
<p>ื›ืืŸ ืชื•ื›ืœ ืœืฆืคื•ืช ื‘ืชืžื•ื ื•ืช ืฉื”ื•ืขืœื• ื•ืœืกืคืง ืžื™ื“ืข ืžืชืงืŸ. **ืžื™ื“ืข ื–ื” ื™ืฉืžืฉ ืœืื™ืžื•ืŸ ื”ืžื•ื“ืœ ื”ืขืฆืžืื™ ืฉืœืš!**</p>
</div>
"""
)
refresh_cloudinary_btn = gr.Button("ืจืขื ืŸ ื’ืœืจื™ื”")
cloudinary_message = gr.Textbox(label="ืžืฆื‘ ื—ื™ื‘ื•ืจ ืœ-Cloudinary", interactive=False)
cloudinary_gallery = gr.Gallery(label="ืชืžื•ื ื•ืช ืื—ืจื•ื ื•ืช", columns=4, height=400, preview=True, object_fit="contain")
with gr.Column(visible=False) as details_column:
selected_image_display = gr.Image(label="ืชืžื•ื ื” ื ื‘ื—ืจืช", type="filepath")
with gr.Row():
image_info_display = gr.Textbox(label="ืคืจื˜ื™ ืชืžื•ื ื”", interactive=False)
sensor_info_display = gr.Textbox(label="ื ืชื•ื ื™ ื—ื™ื™ืฉื ื™ื ืงืจื•ื‘ื™ื", interactive=False)
with gr.Row() as plant_setter_row:
plant_dropdown = gr.Dropdown(choices=sorted(list(PLANT_DATABASE.keys())), label="ื‘ื—ืจ ืฆืžื— ื™ื“ื ื™ืช")
save_plant_btn = gr.Button("ืฉืžื•ืจ ื”ื’ื“ืจืช ืฆืžื—")
# --- Event Handlers ---
analysis_button.click(
fn=analyze_plant_image,
inputs=[image_input, manual_plant_dropdown],
outputs=[analysis_output, analysis_gallery]
)
manual_training_btn.click(
fn=train_from_upload,
inputs=[manual_training_image_input, manual_training_plant_dropdown],
outputs=manual_training_output
)
prophet_btn.click(
fn=run_prophet_forecast,
outputs=[prophet_output, prophet_graph]
)
send_robot_command_btn.click(
fn=send_robot_command,
inputs=[robot_command_input],
outputs=robot_output
)
sensor_btn.click(
fn=get_sensor_weather_data,
inputs=[city_input],
outputs=[sensor_weather_output]
)
care_btn.click(
fn=get_care_tips_interface,
inputs=[plant_dropdown_care],
outputs=[plant_display, plant_img_display]
)
refresh_cloudinary_btn.click(
fn=refresh_cloudinary_images_interface,
outputs=[cloudinary_message, cloudinary_gallery]
)
cloudinary_gallery.select(
fn=lambda evt: get_image_details(evt, cloudinary_gallery.value),
inputs=[gr.State(None)],
outputs=[image_info_display, sensor_info_display, selected_image_display, cloudinary_message, details_column, plant_setter_row],
show_progress=True
)
save_plant_btn.click(
fn=save_plant_definition,
inputs=[selected_image_display, plant_dropdown],
outputs=cloudinary_message
)
return app
# ==================== MAIN ====================
if __name__ == "__main__":
print("===== Application Startup at {} =====".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
print("YOYOPLANET AI v19.0 Starting...")
print("=" * 60)
print(f"AI Available: {AI_AVAILABLE}")
print(f"Adafruit IO Available: {ADAFRUIT_AVAILABLE}")
print(f"Cloudinary Available: {CLOUDINARY_AVAILABLE}")
print(f"Prophet Available: {PROPHET_AVAILABLE}")
print(f"Plant Database: {len(PLANT_DATABASE)} species")
print(f"Species Models: {len(SPECIES_MODELS)}")
print(f"Health Models: {len(HEALTH_MODELS)}")
print("=" * 60)
# Pre-load all models at startup for faster inference
if AI_AVAILABLE:
load_all_models()
app = create_gradio_app()
app.launch()