{
  "title": {
    "en": "Projects",
    "fa": "پروژه‌ها"
  },
  "projectsList": [
    {
      "id": "eye-tracking",
      "bg_color": "#0b1120",
      "title": {
        "en": "Eye-Tracking Smart Home",
        "fa": "خانه هوشمند با کنترل چشمی"
      },
      "short_desc": {
        "en": "People with spinal cord injuries control the lights, their bed and emergency calls just by looking at a panel. 97% of commands were recognized correctly in tests.",
        "fa": "افراد دارای آسیب نخاعی فقط با نگاه کردن به یک پنل، چراغ‌ها، تخت و تماس اضطراری را کنترل می‌کنند. در آزمایش‌ها ۹۷٪ فرمان‌ها درست تشخیص داده شدند."
      },
      "img": {
        "en": "/src/Projects/Eye_Tracking_EN.webp",
        "fa": "/src/Projects/Eye_Tracking_Fa.webp"
      },
      "img_srcset": {
        "en": "/src/Projects/Eye_Tracking_EN-400.webp 400w, /src/Projects/Eye_Tracking_EN-600.webp 600w, /src/Projects/Eye_Tracking_EN-800.webp 800w, /src/Projects/Eye_Tracking_EN-1200.webp 1200w",
        "fa": "/src/Projects/Eye_Tracking_Fa-400.webp 400w, /src/Projects/Eye_Tracking_Fa-600.webp 600w, /src/Projects/Eye_Tracking_Fa-800.webp 800w, /src/Projects/Eye_Tracking_Fa-1200.webp 1200w"
      },
      "page_title": {
        "en": "Eye-Tracking Smart Home for People with Spinal Cord Injuries",
        "fa": "خانه هوشمند با کنترل چشمی برای افراد دارای آسیب نخاعی"
      },
      "page_paragraphs": [
        {
          "en": "People with severe spinal cord injuries (SCI) often depend on someone else for the smallest change in their room. This system gives some of that control back: a camera follows the user's eyes, the user looks at a command on a panel and confirms it, and an IoT controller carries it out.",
          "fa": "افراد دارای آسیب شدید نخاعی (SCI) برای کوچک‌ترین تغییر در اتاقشان به دیگران وابسته‌اند. این سامانه بخشی از این کنترل را به آن‌ها برمی‌گرداند: دوربین حرکت چشم کاربر را دنبال می‌کند، کاربر به فرمانی روی پنل نگاه می‌کند و آن را تأیید می‌کند و یک کنترلر اینترنت اشیا (IoT) فرمان را اجرا می‌کند."
        },
        {
          "en": "Image processing runs in MATLAB. A custom “Six Segmented” method finds the pupil, estimates where the user is looking, and keeps working with head rotation of up to 20 degrees. A statistically weighted average discards bad samples, which brought correct command recognition to 97%. Tracking works in visible light, and an infrared ring around the camera keeps it working below 5 lux; at night, a fixed gaze turns on the light and opens nine preset emergency SMS messages.",
          "fa": "پردازش تصویر در MATLAB انجام می‌شود. روش اختصاصی Six Segmented مردمک را پیدا می‌کند، نقطه نگاه کاربر را تخمین می‌زند و با چرخش سر تا ۲۰ درجه هم کار می‌کند. میانگین‌گیری وزن‌دار آماری داده‌های نامعتبر را کنار می‌گذارد و به این ترتیب ۹۷٪ فرمان‌ها درست تشخیص داده شدند. ردگیری در نور مرئی انجام می‌شود و حلقه فروسرخ دور دوربین، کار سامانه را زیر ۵ لوکس هم ادامه می‌دهد؛ در شب، نگاه خیره چراغ را روشن می‌کند و ۹ پیامک اضطراری از پیش تعیین‌شده را در اختیار کاربر می‌گذارد."
        },
        {
          "en": "The controller is an Arduino Mega 2560 with a SIM800L cellular module. It drives 10 relay outputs (bed position, lights, temperature) and can send an emergency SMS or call a caregiver. From looking at a command to its execution takes under 10 seconds. The project was carried out with the support of the State Welfare Organization of Khorasan Razavi, and its results were published in Modern Care Journal in 2019.",
          "fa": "کنترلر، یک برد Arduino Mega 2560 با ماژول سیم‌کارت SIM800L است که ۱۰ خروجی رله (جابه‌جایی تخت، روشنایی و دما) را کنترل می‌کند و می‌تواند پیامک اضطراری بفرستد یا با مراقب تماس بگیرد. از نگاه کردن به فرمان تا اجرای آن کمتر از ۱۰ ثانیه طول می‌کشد. این پروژه با حمایت سازمان بهزیستی خراسان رضوی اجرا شد و نتایج آن در سال ۲۰۱۹ در Modern Care Journal منتشر شد."
        }
      ],
      "page_features_title": {
        "en": "At a glance",
        "fa": "در یک نگاه"
      },
      "page_features": [
        {
          "en": "Non-invasive: nothing is attached to the user.",
          "fa": "غیرتهاجمی؛ هیچ وسیله‌ای به بدن کاربر متصل نمی‌شود."
        },
        {
          "en": "97% of commands recognized correctly in tests.",
          "fa": "تشخیص درست ۹۷٪ فرمان‌ها در آزمایش‌ها."
        },
        {
          "en": "Under 10 seconds from look to action.",
          "fa": "کمتر از ۱۰ ثانیه از نگاه تا اجرای فرمان."
        },
        {
          "en": "Works regardless of age, gender, glasses, hairstyle, facial hair or headscarf.",
          "fa": "مستقل از سن، جنسیت، عینک، مدل مو، ریش یا حجاب."
        },
        {
          "en": "User authentication on the network to block unauthorized access.",
          "fa": "احراز هویت کاربران شبکه برای جلوگیری از دسترسی غیرمجاز."
        }
      ],
      "featured": true,
      "paper_link": "https://doi.org/10.5812/modernc.96107",
      "facts": [
        {
          "value": {
            "en": "97%",
            "fa": "۹۷٪"
          },
          "label": {
            "en": "of commands recognized correctly in tests",
            "fa": "فرمان‌ها در آزمایش‌ها درست تشخیص داده شدند"
          }
        },
        {
          "value": {
            "en": "< 10 s",
            "fa": "کمتر از ۱۰ ثانیه"
          },
          "label": {
            "en": "from a look to the action",
            "fa": "از نگاه تا اجرای فرمان"
          }
        },
        {
          "value": {
            "en": "10",
            "fa": "۱۰"
          },
          "label": {
            "en": "relay outputs: bed, lights, temperature",
            "fa": "خروجی رله: تخت، روشنایی و دما"
          }
        }
      ],
      "demo": true,
      "img_detail": {
        "en": "/src/Projects/Eye_Tracking_Detail_EN.webp",
        "fa": "/src/Projects/Eye_Tracking_Detail_Fa.webp"
      },
      "img_detail_srcset": {
        "en": "/src/Projects/Eye_Tracking_Detail_EN-400.webp 400w, /src/Projects/Eye_Tracking_Detail_EN-600.webp 600w, /src/Projects/Eye_Tracking_Detail_EN-800.webp 800w, /src/Projects/Eye_Tracking_Detail_EN-1200.webp 1200w",
        "fa": "/src/Projects/Eye_Tracking_Detail_Fa-400.webp 400w, /src/Projects/Eye_Tracking_Detail_Fa-600.webp 600w, /src/Projects/Eye_Tracking_Detail_Fa-800.webp 800w, /src/Projects/Eye_Tracking_Detail_Fa-1200.webp 1200w"
      }
    },
    {
      "id": "smart-cooling",
      "title": {
        "en": "Smart Home Cooling",
        "fa": "سرمایش هوشمند منزل"
      },
      "short_desc": {
        "en": "Measures temperature and humidity, then decides whether to run the evaporative cooler, the air conditioner or both, and at what power.",
        "fa": "دما و رطوبت را می‌سنجد و تصمیم می‌گیرد کولر آبی، کولر گازی یا هر دو روشن شوند و هرکدام با چند درصد توان کار کنند."
      },
      "page_title": {
        "en": "Smart Home Cooling System",
        "fa": "سامانه هوشمند سرمایش منزل"
      },
      "page_paragraphs": [
        {
          "en": "Many homes have two ways to cool down: an evaporative cooler (water and pads), which is cheap to run but loses its effect in humid air, and a compressor air conditioner, which works in any humidity but uses far more power. This controller makes the choice between them automatically.",
          "fa": "در بسیاری از خانه‌ها دو وسیله سرمایش هست: کولر آبی (آب و پوشال) که مصرف کمی دارد اما در هوای مرطوب کارایی‌اش کم می‌شود، و کولر گازی (تبریدی با کمپرسور) که در هر رطوبتی کار می‌کند اما برق بسیار بیشتری مصرف می‌کند. این کنترلر انتخاب بین این دو را خودکار می‌کند."
        },
        {
          "en": "Sensors measure the indoor temperature and humidity. From these readings the controller decides which system to switch on and sets each one's output as a percentage of full power, instead of simply turning it on and off.",
          "fa": "حسگرها دما و رطوبت داخل خانه را اندازه می‌گیرند. کنترلر بر اساس این داده‌ها تصمیم می‌گیرد کدام سیستم روشن شود و توان هرکدام را به‌صورت درصدی از توان کامل تنظیم می‌کند، نه فقط روشن و خاموش."
        }
      ],
      "page_features_title": {
        "en": "At a glance",
        "fa": "در یک نگاه"
      },
      "page_features": [
        {
          "en": "Temperature and humidity sensing.",
          "fa": "سنجش دما و رطوبت."
        },
        {
          "en": "Chooses the evaporative cooler, the air conditioner, or both.",
          "fa": "انتخاب خودکار بین کولر آبی، کولر گازی یا هر دو."
        },
        {
          "en": "Power set as a percentage, not just on and off.",
          "fa": "تنظیم توان به‌صورت درصدی، نه فقط روشن و خاموش."
        }
      ],
      "icon": "fa-temperature-half",
      "img": {
        "en": "/src/Projects/Smart_Cooling_EN.webp",
        "fa": "/src/Projects/Smart_Cooling_Fa.webp"
      },
      "img_srcset": {
        "en": "/src/Projects/Smart_Cooling_EN-400.webp 400w, /src/Projects/Smart_Cooling_EN-600.webp 600w, /src/Projects/Smart_Cooling_EN-800.webp 800w, /src/Projects/Smart_Cooling_EN-1200.webp 1200w",
        "fa": "/src/Projects/Smart_Cooling_Fa-400.webp 400w, /src/Projects/Smart_Cooling_Fa-600.webp 600w, /src/Projects/Smart_Cooling_Fa-800.webp 800w, /src/Projects/Smart_Cooling_Fa-1200.webp 1200w"
      },
      "img_detail": {
        "en": "/src/Projects/Smart_Cooling_Detail_EN.webp",
        "fa": "/src/Projects/Smart_Cooling_Detail_Fa.webp"
      },
      "img_detail_srcset": {
        "en": "/src/Projects/Smart_Cooling_Detail_EN-400.webp 400w, /src/Projects/Smart_Cooling_Detail_EN-600.webp 600w, /src/Projects/Smart_Cooling_Detail_EN-800.webp 800w, /src/Projects/Smart_Cooling_Detail_EN-1200.webp 1200w",
        "fa": "/src/Projects/Smart_Cooling_Detail_Fa-400.webp 400w, /src/Projects/Smart_Cooling_Detail_Fa-600.webp 600w, /src/Projects/Smart_Cooling_Detail_Fa-800.webp 800w, /src/Projects/Smart_Cooling_Detail_Fa-1200.webp 1200w"
      }
    },
    {
      "id": "yealinkProvision",
      "github_link": "https://github.com/s-heravian/yealinkProvision",
      "bg_color": "#2a2a2a",
      "title": {
        "en": "Yealink Auto-Provisioning Server",
        "fa": "پیکربندی خودکار تلفن‌های Yealink"
      },
      "short_desc": {
        "en": "A Docker and Nginx server that configures Yealink IP phones automatically: each phone gets its own settings and the right firmware for its model.",
        "fa": "سروری مبتنی بر Docker و Nginx که تلفن‌های IP یالینک را خودکار پیکربندی می‌کند؛ هر تلفن تنظیمات خودش و فریم‌ور مناسب مدلش را دریافت می‌کند."
      },
      "img": {
        "en": "/src/Projects/yealink_Provisioning_Tool_EN.webp",
        "fa": "/src/Projects/yealink_Provisioning_Tool_FA.webp"
      },
      "img_srcset": {
        "en": "/src/Projects/yealink_Provisioning_Tool_EN-400.webp 400w, /src/Projects/yealink_Provisioning_Tool_EN-600.webp 600w, /src/Projects/yealink_Provisioning_Tool_EN-800.webp 800w, /src/Projects/yealink_Provisioning_Tool_EN-1200.webp 1200w",
        "fa": "/src/Projects/yealink_Provisioning_Tool_FA-400.webp 400w, /src/Projects/yealink_Provisioning_Tool_FA-600.webp 600w, /src/Projects/yealink_Provisioning_Tool_FA-800.webp 800w, /src/Projects/yealink_Provisioning_Tool_FA-1200.webp 1200w"
      },
      "page_title": {
        "en": "Yealink Auto-Provisioning Server",
        "fa": "پیکربندی خودکار تلفن‌های Yealink"
      },
      "page_paragraphs": [
        {
          "en": "Setting up dozens of Yealink phones by hand is slow and error-prone. This server, running in Docker with Nginx, hands every phone its configuration when it boots: phones find it through DHCP option 66, ask first for a file named after their MAC address, and fall back to a configuration for their model family.",
          "fa": "پیکربندی دستی ده‌ها تلفن یالینک کند و پرخطاست. این سرور که با Docker و Nginx اجرا می‌شود، هر تلفن را هنگام روشن شدن پیکربندی می‌کند: تلفن‌ها سرور را از طریق DHCP Option 66 پیدا می‌کنند، ابتدا فایلی به نام آدرس MAC خود درخواست می‌کنند و اگر نبود، پیکربندی خانواده مدل خود را دریافت می‌کنند."
        },
        {
          "en": "Configuration files contain SIP passwords, so Nginx serves them only to whitelisted voice subnets and logs every blocked request. The container is stateless: on each start it rebuilds everything it serves from a few mapping files and a CSV inventory. A Bash report lists every phone that has checked in, flags outdated firmware, and separates scanners and browsers from real phones.",
          "fa": "فایل‌های پیکربندی شامل رمز SIP هستند؛ برای همین Nginx آن‌ها را فقط به زیرشبکه‌های مجاز صوتی تحویل می‌دهد و هر درخواست ردشده را ثبت می‌کند. کانتینر بدون‌حالت (stateless) است و در هر راه‌اندازی، همه فایل‌ها را از چند فایل نگاشت و یک فهرست CSV از نو می‌سازد. یک گزارش Bash هم تلفن‌های متصل را فهرست می‌کند، فریم‌ورهای قدیمی را مشخص می‌کند و اسکنرها و مرورگرها را از تلفن‌های واقعی جدا می‌کند."
        }
      ],
      "page_features_title": {
        "en": "At a glance",
        "fa": "در یک نگاه"
      },
      "page_features": [
        {
          "en": "Per-phone configuration by MAC address, with a fallback per model family.",
          "fa": "پیکربندی اختصاصی هر تلفن با آدرس MAC و پیکربندی پیش‌فرض برای هر خانواده مدل."
        },
        {
          "en": "Configuration files served only to whitelisted voice subnets.",
          "fa": "تحویل فایل‌های پیکربندی فقط به زیرشبکه‌های مجاز صوتی."
        },
        {
          "en": "SIP hardening against scanners and ghost calls.",
          "fa": "مقاوم‌سازی SIP در برابر اسکنرها و تماس‌های ناشناس (ghost call)."
        },
        {
          "en": "Randomized provisioning delay, so phones coming back after a power cut don't flood the server.",
          "fa": "تأخیر تصادفی در پیکربندی تا پس از قطعی برق، سرور زیر بار درخواست‌ها نرود."
        },
        {
          "en": "Status report: online phones, outdated firmware and blocked requests.",
          "fa": "گزارش وضعیت: تلفن‌های فعال، فریم‌ورهای قدیمی و درخواست‌های مسدودشده."
        }
      ],
      "img_detail": {
        "en": "/src/Projects/yealink_Provisioning_Tool_Detail_EN.webp",
        "fa": "/src/Projects/yealink_Provisioning_Tool_Detail_FA.webp"
      },
      "img_detail_srcset": {
        "en": "/src/Projects/yealink_Provisioning_Tool_Detail_EN-400.webp 400w, /src/Projects/yealink_Provisioning_Tool_Detail_EN-600.webp 600w, /src/Projects/yealink_Provisioning_Tool_Detail_EN-800.webp 800w, /src/Projects/yealink_Provisioning_Tool_Detail_EN-1200.webp 1200w",
        "fa": "/src/Projects/yealink_Provisioning_Tool_Detail_FA-400.webp 400w, /src/Projects/yealink_Provisioning_Tool_Detail_FA-600.webp 600w, /src/Projects/yealink_Provisioning_Tool_Detail_FA-800.webp 800w, /src/Projects/yealink_Provisioning_Tool_Detail_FA-1200.webp 1200w"
      }
    },
    {
      "id": "azmona-bot",
      "github_link": "https://github.com/s-heravian/TBOT_Azmona",
      "bg_color": "#1e3a8a",
      "title": {
        "en": "Azmona Exam Bot",
        "fa": "ربات آزمون آزمونا"
      },
      "short_desc": {
        "en": "A Telegram bot for timed online exams, built in PHP during COVID-19, with a live timer, Jalali dates and PDF result reports.",
        "fa": "ربات تلگرامی برای برگزاری آزمون‌های آنلاین زمان‌دار که در دوران کرونا با PHP ساخته شد؛ با زمان‌سنج زنده، تقویم شمسی و گزارش PDF نتایج."
      },
      "img": {
        "en": "/src/Projects/Azmona-Bot-EN.webp",
        "fa": "/src/Projects/Azmona-Bot-FA.webp"
      },
      "img_srcset": {
        "en": "/src/Projects/Azmona-Bot-EN-400.webp 400w, /src/Projects/Azmona-Bot-EN-600.webp 600w, /src/Projects/Azmona-Bot-EN-800.webp 800w, /src/Projects/Azmona-Bot-EN-1200.webp 1200w",
        "fa": "/src/Projects/Azmona-Bot-FA-400.webp 400w, /src/Projects/Azmona-Bot-FA-600.webp 600w, /src/Projects/Azmona-Bot-FA-800.webp 800w, /src/Projects/Azmona-Bot-FA-1200.webp 1200w"
      },
      "page_title": {
        "en": "Azmona: a Telegram Bot for Online Exams",
        "fa": "آزمونا؛ ربات تلگرامی برگزاری آزمون آنلاین"
      },
      "page_paragraphs": [
        {
          "en": "When classes moved online during COVID-19, teachers needed a simple way to give timed exams to students who were already on Telegram (this was before Telegram was blocked in Iran). Azmona lets a teacher create lessons and exams inside Telegram; students take the exam in the chat, with the remaining time shown live on the message's buttons.",
          "fa": "وقتی کلاس‌ها در دوران کرونا مجازی شدند، مدرسان به راهی ساده برای برگزاری آزمون زمان‌دار برای دانش‌آموزان و دانشجویانی نیاز داشتند که از قبل در تلگرام بودند (پیش از فیلتر شدن تلگرام در ایران). آزمونا به مدرس امکان می‌دهد درس و آزمون را داخل تلگرام بسازد؛ شرکت‌کننده آزمون را در همان گفتگو می‌دهد و زمان باقی‌مانده به‌صورت زنده روی دکمه‌های پیام نمایش داده می‌شود."
        },
        {
          "en": "Scheduled jobs handle exam time limits and send reminders. Results are generated as PDF reports and sent straight to the chat. Version 2.3 moved the bot to the Nutgram framework and PHP 8.4, generates PDFs with mPDF, and keeps all secrets in a .env file.",
          "fa": "کارهای زمان‌بندی‌شده (cron) مهلت آزمون‌ها را مدیریت می‌کنند و یادآوری می‌فرستند. نتایج به‌صورت گزارش PDF ساخته و مستقیم در گفتگو ارسال می‌شود. در نسخه ۲٫۳، ربات به فریم‌ورک Nutgram و PHP 8.4 منتقل شد، ساخت PDF به mPDF سپرده شد و همه اطلاعات محرمانه به فایل ‎.env رفت."
        }
      ],
      "page_features_title": {
        "en": "At a glance",
        "fa": "در یک نگاه"
      },
      "page_features": [
        {
          "en": "Lessons and exams created inside Telegram.",
          "fa": "ساخت درس و آزمون در خود تلگرام."
        },
        {
          "en": "Live countdown on the exam message.",
          "fa": "زمان‌سنج زنده روی پیام آزمون."
        },
        {
          "en": "Dates in the Jalali (Persian) calendar.",
          "fa": "تاریخ‌ها بر اساس تقویم شمسی."
        },
        {
          "en": "PDF result reports delivered in the chat.",
          "fa": "گزارش PDF نتایج در همان گفتگو."
        },
        {
          "en": "Runtime errors reported to the developer through Telegram.",
          "fa": "ارسال خودکار گزارش خطا به توسعه‌دهنده در تلگرام."
        }
      ],
      "img_detail": {
        "en": "/src/Projects/Azmona-Bot-Detail-EN.webp",
        "fa": "/src/Projects/Azmona-Bot-Detail-FA.webp"
      },
      "img_detail_srcset": {
        "en": "/src/Projects/Azmona-Bot-Detail-EN-400.webp 400w, /src/Projects/Azmona-Bot-Detail-EN-600.webp 600w, /src/Projects/Azmona-Bot-Detail-EN-800.webp 800w, /src/Projects/Azmona-Bot-Detail-EN-1200.webp 1200w",
        "fa": "/src/Projects/Azmona-Bot-Detail-FA-400.webp 400w, /src/Projects/Azmona-Bot-Detail-FA-600.webp 600w, /src/Projects/Azmona-Bot-Detail-FA-800.webp 800w, /src/Projects/Azmona-Bot-Detail-FA-1200.webp 1200w"
      }
    }
  ],
  "more_title": {
    "en": "More projects",
    "fa": "پروژه‌های دیگر"
  }
}
