Spaces:
Runtime error
Runtime error
#!/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 | |
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 | |
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() |