{"id":33420,"date":"2025-11-02T18:02:53","date_gmt":"2025-11-02T15:02:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/"},"modified":"2025-11-02T18:02:53","modified_gmt":"2025-11-02T15:02:53","slug":"ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/","title":{"rendered":"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev kahve kavurucunuzu otomatize etmek i\u00e7in Master Control Program (MCP) sunucular\u0131 kurma s\u00fcrecine odaklan\u0131yor ve bu yolculu\u011fu, yapay zeka destekli geli\u015ftirme ajan\u0131 Warp Agent ile nas\u0131l h\u0131zland\u0131rabilece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. Proje geli\u015ftirme s\u00fcre\u00e7lerinizi optimize ederken, kahve kavurma kalitenizi nas\u0131l bir \u00fcst seviyeye ta\u015f\u0131yabilece\u011finizi ke\u015ffedin!<\/p>\n<p>Sabahlar\u0131 uyan\u0131r uyanmaz taze kavrulmu\u015f kahve kokusunu hayal edin. Bu sadece bir hayal olmak zorunda de\u011fil! Evde kahve kavurmak, bir\u00e7ok kahve tutkunu i\u00e7in e\u015fsiz bir deneyimdir. Ancak, kahvenin aromas\u0131n\u0131, g\u00f6vdesini ve tad\u0131n\u0131 do\u011frudan etkileyen s\u0131cakl\u0131k, s\u00fcre ve hava ak\u0131\u015f\u0131 gibi parametreleri manuel olarak kontrol etmek, \u00e7o\u011fu zaman tutars\u0131z sonu\u00e7lara yol a\u00e7abilir. Her kavurmada ayn\u0131 m\u00fckemmel tad\u0131 yakalamak, tecr\u00fcbe ve b\u00fcy\u00fck bir dikkat gerektirir. \u0130\u015fte tam da bu noktada, otomasyon ve ak\u0131ll\u0131 kontrol sistemleri devreye giriyor. Bir Master Control Program (MCP) sunucusu, kavurma s\u00fcrecinin her a\u015famas\u0131n\u0131 hassasiyetle y\u00f6neterek bu tutars\u0131zl\u0131k sorununu ortadan kald\u0131rmay\u0131 hedefler. Geleneksel yakla\u015f\u0131mlarla bu t\u00fcr karma\u015f\u0131k bir sistemi ba\u015ftan sona geli\u015ftirmek hem zaman al\u0131c\u0131 hem de teknik bilgi birikimi gerektiren zorlu bir s\u00fcre\u00e7 olabilir.<\/p>\n<p>Peki, bu s\u00fcreci nas\u0131l daha verimli, daha h\u0131zl\u0131 ve daha az hata pay\u0131yla ger\u00e7ekle\u015ftirebiliriz? \u0130\u015fte burada Warp Agent gibi ajan tabanl\u0131 geli\u015ftirme ara\u00e7lar\u0131 sahneye \u00e7\u0131k\u0131yor. Warp Agent, yapay zeka destekli yetenekleriyle, sistem mimarisini tasarlamaktan kod par\u00e7ac\u0131klar\u0131 \u00fcretmeye, hatta test senaryolar\u0131 yazmaya kadar bir\u00e7ok a\u015famada geli\u015ftiricilere destek olabilir. Bu, \u00f6zellikle evde kendi otomasyon projenizi geli\u015ftirmek isteyen ancak derinlemesine yaz\u0131l\u0131m m\u00fchendisli\u011fi bilgisine sahip olmayan hobiler i\u00e7in b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar. Bu makalede, Warp Agent&#8217;\u0131n sundu\u011fu imkanlardan faydalanarak, ev kahve kavurucunuzu ak\u0131ll\u0131 bir MCP sunucusu ile nas\u0131l kontrol edebilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Sens\u00f6rlerden akt\u00fcat\u00f6rlere, veri toplamadan ger\u00e7ek zamanl\u0131 kontrole kadar t\u00fcm detaylar\u0131 ele al\u0131rken, Warp Agent&#8217;\u0131n bu s\u00fcreci nas\u0131l bir ajan gibi y\u00f6netti\u011fini ve size zaman kazand\u0131rd\u0131\u011f\u0131n\u0131 g\u00f6rece\u011fiz. Bu yolculuk, sadece daha iyi kahve kavurman\u0131z\u0131 sa\u011flamayacak, ayn\u0131 zamanda modern yaz\u0131l\u0131m geli\u015ftirme yakla\u015f\u0131mlar\u0131n\u0131 deneyimlemenize de olanak tan\u0131yacak.<\/p>\n<h2>Temel Kavramlar: Ak\u0131ll\u0131 Ev Kavurucu \u0130\u00e7in MCP Sunucusu ve Warp Agent&#8217;\u0131n Rol\u00fc Nedir?<\/h2>\n<p>Bu heyecan verici otomasyon projesine ba\u015flamadan \u00f6nce, projenin temel ta\u015flar\u0131n\u0131 olu\u015fturan iki ana kavram\u0131 derinlemesine anlamam\u0131z gerekiyor: Master Control Program (MCP) sunucusu ve Warp Agent ile ajan tabanl\u0131 geli\u015ftirme. Bu iki bile\u015fenin nas\u0131l bir araya gelerek ev kahve kavurma deneyiminizi k\u00f6kten de\u011fi\u015ftirebilece\u011fini ke\u015ffedelim.<\/p>\n<h3>MCP Sunucusu Nedir ve Ev Kahve Kavurucuda Neden \u00d6nemlidir?<\/h3>\n<p>Master Control Program (MCP) terimi genellikle merkezi bir kontrol sistemini ifade eder. Bizim senaryomuzda, MCP sunucusu, ev kahve kavurucunuzun &#8220;beyni&#8221; olarak i\u015flev g\u00f6recek bir yaz\u0131l\u0131m ve donan\u0131m kombinasyonudur. Bu sunucu, kavurma s\u00fcrecindeki t\u00fcm sens\u00f6r verilerini (s\u0131cakl\u0131k, nem, hava ak\u0131\u015f\u0131 vb.) toplar, bu verileri \u00f6nceden tan\u0131mlanm\u0131\u015f kavurma profilleriyle kar\u015f\u0131la\u015ft\u0131r\u0131r ve buna g\u00f6re akt\u00fcat\u00f6rleri (\u0131s\u0131t\u0131c\u0131lar, fanlar, tambur motoru) kontrol eder. Temel amac\u0131, her kavurmada tutarl\u0131, tekrarlanabilir ve optimize edilmi\u015f sonu\u00e7lar elde etmektir.<\/p>\n<p>MCP sunucusunun \u00f6nemi birka\u00e7 ba\u015fl\u0131k alt\u0131nda toplanabilir:<\/p>\n<ul>\n<li><strong>Tutarl\u0131l\u0131k:<\/strong> Manuel kontroldeki insan hatas\u0131n\u0131 ortadan kald\u0131r\u0131r. Her kavurmada ayn\u0131 s\u0131cakl\u0131k e\u011frisi, ayn\u0131 s\u00fcre ve ayn\u0131 hava ak\u0131\u015f\u0131n\u0131 uygulayarak kahve \u00e7ekirdeklerinin her seferinde benzer \u015fekilde kavrulmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Hassasiyet:<\/strong> Dijital sens\u00f6rler ve hassas kontrol algoritmalar\u0131 sayesinde, s\u0131cakl\u0131k gibi kritik parametreleri \u00e7ok daha dar tolerans aral\u0131klar\u0131nda tutabilir.<\/li>\n<li><strong>Veri Odakl\u0131l\u0131k:<\/strong> Her kavurma seans\u0131na ait verileri kaydeder. Bu veriler (s\u0131cakl\u0131k e\u011frileri, s\u00fcre, akt\u00fcat\u00f6r tepkileri) analiz edilerek gelecekteki kavurma profilleri optimize edilebilir, ideal kavurma noktalar\u0131 belirlenebilir.<\/li>\n<li><strong>Uzaktan Eri\u015fim ve Kontrol:<\/strong> Bir web aray\u00fcz\u00fc veya mobil uygulama arac\u0131l\u0131\u011f\u0131yla kavurma s\u00fcrecini uzaktan izleme ve kontrol etme imkan\u0131 sunar. Bu, kavurucunuzu her an her yerden y\u00f6netebilece\u011finiz anlam\u0131na gelir.<\/li>\n<li><strong>Geli\u015ftirilebilirlik:<\/strong> Mod\u00fcler yap\u0131s\u0131 sayesinde yeni \u00f6zellikler (yapay zeka destekli optimizasyon, farkl\u0131 sens\u00f6r entegrasyonlar\u0131) kolayca eklenebilir.<\/li>\n<\/ul>\n<p>Bir MCP sunucusu tipik olarak bir mikrodenetleyici (\u00f6rne\u011fin ESP32) ile sens\u00f6rlerden veri toplar, bu verileri bir ana sunucuya (\u00f6rne\u011fin bir Raspberry Pi veya k\u00fc\u00e7\u00fck bir bilgisayar \u00fczerinde \u00e7al\u0131\u015fan Python tabanl\u0131 bir uygulama) g\u00f6nderir ve ana sunucu bu verileri i\u015fleyip kontrol komutlar\u0131n\u0131 mikrodenetleyiciye geri g\u00f6nderir. Bu d\u00f6ng\u00fc, kahve kavurma s\u00fcrecinin dinamik ve hassas bir \u015fekilde y\u00f6netilmesini sa\u011flar.<\/p>\n<h3>Ajan Geli\u015ftirme ve Warp Agent ile Geli\u015ftirme S\u00fcreci Nas\u0131l H\u0131zlan\u0131r?<\/h3>\n<p>Ajan geli\u015ftirme, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, &#8220;ajan&#8221; ad\u0131 verilen yaz\u0131l\u0131m varl\u0131klar\u0131n\u0131n bir geli\u015ftirme s\u00fcrecinde belirli g\u00f6revleri yerine getirmesine dayan\u0131r. Bu ajanlar, yapay zeka ve otomasyon yeteneklerini kullanarak, insan geli\u015ftiricilerin normalde yapaca\u011f\u0131 i\u015fleri (kod yazma, test etme, hata ay\u0131klama, mimari tasar\u0131m) otomatik veya yar\u0131 otomatik olarak ger\u00e7ekle\u015ftirir. Bu, geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc inan\u0131lmaz derecede h\u0131zland\u0131rabilir ve karma\u015f\u0131kl\u0131\u011f\u0131 azaltabilir.<\/p>\n<p><strong>Warp Agent<\/strong>, bu ajan tabanl\u0131 geli\u015ftirme felsefesinin g\u00fc\u00e7l\u00fc bir \u00f6rne\u011fidir. Bir geli\u015ftirme ajan\u0131 olarak, Warp Agent&#8217;\u0131 do\u011fal dil komutlar\u0131yla y\u00f6nlendirebilirsiniz. \u00d6rne\u011fin, &#8220;bir Flask API&#8217;si olu\u015ftur, kahve kavurma profillerini y\u00f6net, ger\u00e7ek zamanl\u0131 sens\u00f6r verilerini al ve akt\u00fcat\u00f6rleri kontrol et&#8221; gibi bir komut verdi\u011finizde, Warp Agent bu gereksinimleri analiz ederek:<\/p>\n<ul>\n<li>Uygun veritaban\u0131 \u015femalar\u0131n\u0131 tasarlayabilir.<\/li>\n<li>API endpointlerini tan\u0131mlayabilir ve Flask kodu \u00fcretebilir.<\/li>\n<li>Sens\u00f6r verileri i\u00e7in veri modelleri olu\u015fturabilir.<\/li>\n<li>Kontrol algoritmalar\u0131 i\u00e7in iskelet kodlar yazabilir.<\/li>\n<li>Hatta bu kodlar i\u00e7in temel test senaryolar\u0131 bile \u00f6nerebilir.<\/li>\n<\/ul>\n<p>Warp Agent&#8217;\u0131n bu projedeki rol\u00fc, bir geli\u015ftirme asistan\u0131 olarak, mimari kararlar almaktan boilerplate (tekrar eden) kodu yazmaya kadar her ad\u0131mda size yol g\u00f6stermektir. Bu, \u00f6zellikle projenin ba\u015flang\u0131\u00e7 a\u015famalar\u0131nda ve tekrar eden g\u00f6revlerde b\u00fcy\u00fck bir verimlilik sa\u011flar. Geli\u015ftirici olarak sizin odaklanman\u0131z gereken, i\u015f mant\u0131\u011f\u0131, optimizasyon ve kullan\u0131c\u0131 deneyimi gibi daha stratejik alanlar olurken, Warp Agent altyap\u0131 kodlar\u0131n\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131 sizin i\u00e7in halleder. Bu sayede, projeyi \u00e7ok daha k\u0131sa s\u00fcrede hayata ge\u00e7irebilir, daha az teknik engelle kar\u015f\u0131la\u015fabilir ve deneysel yakla\u015f\u0131mlara daha fazla zaman ay\u0131rabilirsiniz. Yani, kahve kavurucunuz i\u00e7in ak\u0131ll\u0131 bir beyin tasarlarken, Warp Agent sizin i\u00e7in bir yard\u0131mc\u0131 beyin g\u00f6revi \u00fcstlenir!<\/p>\n<h2>Ad\u0131m Ad\u0131m Donan\u0131m Kurulumu: Kahve Kavurucunuzu Dijitalle\u015ftirme Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Ak\u0131ll\u0131 kahve kavurma projemizin temeli, elbette, fiziksel d\u00fcnyay\u0131 dijital verilere d\u00f6n\u00fc\u015ft\u00fcrecek ve dijital komutlar\u0131 fiziksel eylemlere \u00e7evirecek do\u011fru donan\u0131m bile\u015fenlerini se\u00e7mek ve kurmaktan ge\u00e7iyor. Bu b\u00f6l\u00fcmde, hangi donan\u0131mlara ihtiyac\u0131m\u0131z oldu\u011funu ve ilk ba\u011flant\u0131lar\u0131 nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>Gerekli Sens\u00f6rler ve Akt\u00fcat\u00f6rler Nelerdir?<\/h3>\n<p>Bir kahve kavurma makinesini kontrol etmek i\u00e7in kritik parametreleri \u00f6l\u00e7meli ve fiziksel bile\u015fenleri y\u00f6netmeliyiz. \u0130\u015fte ihtiyac\u0131m\u0131z olacak temel sens\u00f6rler ve akt\u00fcat\u00f6rler:<\/p>\n<ol>\n<li><strong>S\u0131cakl\u0131k Sens\u00f6rleri (Termokupllar):<\/strong> Kavurma s\u0131ras\u0131nda en kritik parametre s\u0131cakl\u0131kt\u0131r.\n<ul>\n<li><strong>K-Tipi Termokupl:<\/strong> Genellikle kavurucu tamburunun i\u00e7 s\u0131cakl\u0131\u011f\u0131n\u0131 ve \u00e7ekirdek s\u0131cakl\u0131\u011f\u0131n\u0131 \u00f6l\u00e7mek i\u00e7in kullan\u0131l\u0131r. Y\u00fcksek s\u0131cakl\u0131klara dayan\u0131kl\u0131d\u0131rlar.<\/li>\n<li><strong>MAX6675 veya MAX31855 Mod\u00fclleri:<\/strong> Termokupllardan gelen millivolt seviyesindeki sinyalleri mikrodenetleyicinin okuyabilece\u011fi dijital verilere d\u00f6n\u00fc\u015ft\u00fcren arabirim mod\u00fclleridir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Nem Sens\u00f6r\u00fc (Opsiyonel ama Faydal\u0131):<\/strong> \u00d6zellikle kavurman\u0131n ba\u015flar\u0131nda ye\u015fil \u00e7ekirdeklerin i\u00e7indeki nemi anlamak ve \u00e7evresel nemin kavurma \u00fczerindeki etkisini izlemek i\u00e7in kullan\u0131labilir.\n<ul>\n<li><strong>DHT11 veya DHT22:<\/strong> Daha \u00e7ok ortam nemini \u00f6l\u00e7mek i\u00e7in kullan\u0131l\u0131r. E\u011fer sadece kavurucunun d\u0131\u015f ortam nemini izlemek isterseniz uygun olabilir. Kavurucunun i\u00e7indeki y\u00fcksek s\u0131cakl\u0131klara dayan\u0131kl\u0131 de\u011fillerdir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Akt\u00fcat\u00f6rler (Kontrol Elemanlar\u0131):<\/strong>\n<ul>\n<li><strong>Kat\u0131 Hal R\u00f6leleri (SSR &#8211; Solid State Relay):<\/strong> Is\u0131t\u0131c\u0131 gibi y\u00fcksek g\u00fc\u00e7 \u00e7eken bile\u015fenleri mikrodenetleyici ile g\u00fcvenli bir \u015fekilde a\u00e7\u0131p kapatmak ve g\u00fc\u00e7lerini kontrol etmek i\u00e7in kullan\u0131l\u0131r. Geleneksel mekanik r\u00f6lelere g\u00f6re daha h\u0131zl\u0131 anahtarlama ve daha uzun \u00f6m\u00fcr sunarlar.<\/li>\n<li><strong>DC Motor S\u00fcr\u00fcc\u00fcleri:<\/strong> Kavurma tamburunu d\u00f6nd\u00fcren DC motorun h\u0131z\u0131n\u0131 ve y\u00f6n\u00fcn\u00fc kontrol etmek i\u00e7in kullan\u0131l\u0131r. L298N gibi mod\u00fcller s\u0131k\u00e7a tercih edilir.<\/li>\n<li><strong>Fan Kontrol\u00fc (PWM):<\/strong> So\u011futma fanlar\u0131n\u0131n h\u0131z\u0131n\u0131 ayarlamak i\u00e7in darbe geni\u015flik mod\u00fclasyonu (PWM) yetene\u011fine sahip bir MOSFET veya benzeri bir devre kullan\u0131labilir.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Termokupllar\u0131 yerle\u015ftirirken, \u00e7ekirdeklerin homojen bir \u015fekilde kar\u0131\u015ft\u0131\u011f\u0131 ve en iyi temsili s\u0131cakl\u0131\u011f\u0131 sa\u011flad\u0131\u011f\u0131 noktalara yerle\u015ftirmeye \u00f6zen g\u00f6sterin. Genellikle tamburun i\u00e7ine veya tambur y\u00fczeyine yak\u0131n bir nokta tercih edilir.\n<\/div>\n<h3>Mikrodenetleyici Se\u00e7imi ve \u0130lk Ba\u011flant\u0131lar Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Projemizin kalbi olacak mikrodenetleyiciyi se\u00e7mek ve ilk ba\u011flant\u0131lar\u0131 yapmak olduk\u00e7a basittir.<\/p>\n<ol>\n<li><strong>Mikrodenetleyici Se\u00e7imi:<\/strong>\n<ul>\n<li><strong>ESP32:<\/strong> Dahili Wi-Fi ve Bluetooth \u00f6zelliklerine sahip olmas\u0131, IoT projeleri i\u00e7in idealdir. MCP sunucusuna kablosuz olarak veri g\u00f6nderme ve komut alma yetene\u011fi sunar. Python (MicroPython) veya Arduino IDE ile programlanabilir.<\/li>\n<li><strong>Arduino (Uno\/Mega):<\/strong> E\u011fer daha basit bir Wi-Fi mod\u00fcl\u00fc (ESP8266) ile birlikte kullan\u0131lacaksa iyi bir se\u00e7enektir. Geni\u015f bir topluluk deste\u011fi ve bir\u00e7ok k\u00fct\u00fcphanesi mevcuttur.<\/li>\n<\/ul>\n<p>        Bu projede, entegre Wi-Fi ve daha g\u00fc\u00e7l\u00fc i\u015flem yetenekleri nedeniyle ESP32&#8217;yi tercih edece\u011fiz.\n    <\/li>\n<li><strong>Sens\u00f6r ve Akt\u00fcat\u00f6r Ba\u011flant\u0131lar\u0131 (\u00d6rnek ESP32 \u0130\u00e7in):<\/strong>\n<p>Sens\u00f6rleri ve akt\u00fcat\u00f6rleri ESP32&#8217;ye ba\u011flarken, do\u011fru pinleri ve besleme voltajlar\u0131n\u0131 kulland\u0131\u011f\u0131n\u0131zdan emin olun. \u0130\u015fte basit bir \u00f6rnek tablo:<\/p>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Bile\u015fen<\/th>\n<th>ESP32 Ba\u011flant\u0131s\u0131<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>K-Tipi Termokupl (MAX6675)<\/td>\n<td>CLK: GPIO18, CS: GPIO19, DO: GPIO23<\/td>\n<td>SPI protokol\u00fc ile s\u0131cakl\u0131k okuma.<\/td>\n<\/tr>\n<tr>\n<td>SSR (Is\u0131t\u0131c\u0131 Kontrol)<\/td>\n<td>GPIO26 (PWM \u00d6zellikli)<\/td>\n<td>Is\u0131t\u0131c\u0131n\u0131n g\u00fcc\u00fcn\u00fc kontrol etmek i\u00e7in.<\/td>\n<\/tr>\n<tr>\n<td>DC Motor S\u00fcr\u00fcc\u00fc (L298N)<\/td>\n<td>IN1: GPIO16, IN2: GPIO17, EN: GPIO4 (PWM)<\/td>\n<td>Tambur d\u00f6n\u00fc\u015f y\u00f6n\u00fc ve h\u0131z\u0131.<\/td>\n<\/tr>\n<tr>\n<td>Ortam Nem Sens\u00f6r\u00fc (DHT22)<\/td>\n<td>GPIO21<\/td>\n<td>Sadece veri pini tek bir GPIO&#8217;ya ba\u011flan\u0131r.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li><strong>\u0130lk Kod Par\u00e7ac\u0131\u011f\u0131 (ESP32 &#8211; Arduino IDE):<\/strong>\n<p>ESP32&#8217;nizi Arduino IDE ile programlamak i\u00e7in gerekli k\u00fct\u00fcphaneleri (\u00f6rn. <code>Adafruit_MAX6675<\/code>, <code>DHT sensor library<\/code>) kurduktan sonra, sens\u00f6r verilerini okuyup seri monit\u00f6re yazd\u0131rabilirsiniz. \u0130\u015fte bir termokupl okuma \u00f6rne\u011fi:<\/p>\n<pre><code>\n#include <Adafruit_MAX6675.h>\n\nint CLK = 18;\nint CS = 19;\nint DO = 23;\n\nAdafruit_MAX6675 thermocouple(CLK, CS, DO);\n\nvoid setup() {\n  Serial.begin(115200);\n  delay(500);\n  Serial.println(\"MAX6675 Test Baslatildi!\");\n}\n\nvoid loop() {\n  Serial.print(\"Sicaklik (C): \");\n  Serial.println(thermocouple.readCelsius());\n  delay(1000);\n}\n        <\/pre>\n<p><\/code><\/p>\n<p>Bu kod, termokupldan gelen s\u0131cakl\u0131k verisini okur ve seri monit\u00f6re yazd\u0131r\u0131r. Benzer \u015fekilde di\u011fer sens\u00f6rleri de ba\u011flay\u0131p test edebilirsiniz. Bu a\u015famada, donan\u0131m\u0131n d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik \u00f6neme sahiptir. Do\u011fru voltaj ve pin ba\u011flant\u0131lar\u0131n\u0131 sa\u011flad\u0131\u011f\u0131n\u0131zda, sonraki ad\u0131mda bu verileri MCP sunucusuna aktarmaya haz\u0131r olaca\u011f\u0131z.<\/p>\n<h2>Warp Agent ile MCP Sunucusu Geli\u015ftirme Mimarisi: Beyni Olu\u015fturmak<\/h2>\n<p>Donan\u0131m\u0131m\u0131z haz\u0131r oldu\u011funa g\u00f6re, projemizin dijital kalbi olan MCP sunucusunun mimarisini olu\u015fturmaya ve Warp Agent'\u0131n g\u00fcc\u00fcnden faydalanarak ilk kod iskeletini olu\u015fturmaya odaklanabiliriz. Bu ad\u0131m, sistemimizin nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131, verileri nas\u0131l y\u00f6netece\u011fini ve donan\u0131mla nas\u0131l ileti\u015fim kuraca\u011f\u0131n\u0131 belirleyecek.<\/p>\n<h3>Sistem Gereksinimlerini Tan\u0131mlama ve Mimarinin Tasar\u0131m\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Herhangi bir yaz\u0131l\u0131m projesinde oldu\u011fu gibi, MCP sunucusu i\u00e7in de net gereksinimler belirlemek, ba\u015far\u0131l\u0131 bir mimari tasla\u011f\u0131 olu\u015fturman\u0131n anahtar\u0131d\u0131r. Kahve kavurma senaryomuz i\u00e7in temel gereksinimler \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Ger\u00e7ek Zamanl\u0131 Veri Toplama:<\/strong> Sens\u00f6rlerden (s\u0131cakl\u0131k, nem) anl\u0131k veri alabilme.<\/li>\n<li><strong>Veri Saklama:<\/strong> Toplanan sens\u00f6r verilerini ve kavurma profillerini bir veritaban\u0131nda saklayabilme.<\/li>\n<li><strong>Kavurma Profili Y\u00f6netimi:<\/strong> Yeni profiller olu\u015fturma, mevcut profilleri d\u00fczenleme ve silme. Her profilin belirli s\u0131cakl\u0131k e\u011frileri, s\u00fcreler ve akt\u00fcat\u00f6r ayarlar\u0131 i\u00e7ermesi.<\/li>\n<li><strong>Akt\u00fcat\u00f6r Kontrol\u00fc:<\/strong> Is\u0131t\u0131c\u0131, fan ve tambur motorunu kavurma profiline g\u00f6re dinamik olarak kontrol edebilme.<\/li>\n<li><strong>Web Aray\u00fcz\u00fc:<\/strong> Kavurma s\u00fcrecini izleyebilecek, profilleri y\u00f6netebilecek ve manuel kontrol sa\u011flayabilecek kullan\u0131c\u0131 dostu bir web aray\u00fcz\u00fc.<\/li>\n<li><strong>\u0130leti\u015fim:<\/strong> Mikrodenetleyici ile g\u00fcvenilir ve d\u00fc\u015f\u00fck gecikmeli ileti\u015fim (MQTT veya HTTP).<\/li>\n<li><strong>G\u00fcvenlik:<\/strong> API eri\u015fimi i\u00e7in temel g\u00fcvenlik \u00f6nlemleri.<\/li>\n<\/ol>\n<p>Bu gereksinimler do\u011frultusunda, a\u015fa\u011f\u0131daki mimariyi d\u00fc\u015f\u00fcnebiliriz:<\/p>\n<ul>\n<li><strong>Frontend (Kullan\u0131c\u0131 Aray\u00fcz\u00fc):<\/strong> HTML, CSS ve JavaScript (\u00f6rne\u011fin Vue.js veya React) kullanarak interaktif bir web uygulamas\u0131. Bu uygulama, kullan\u0131c\u0131lar\u0131n kavurma s\u00fcrecini ger\u00e7ek zamanl\u0131 olarak g\u00f6rmesini ve kontrol etmesini sa\u011flar.<\/li>\n<li><strong>Backend (MCP Sunucusu):<\/strong> Python tabanl\u0131 bir web \u00e7er\u00e7evesi (Flask veya FastAPI) kullan\u0131larak API'ler geli\u015ftirilir. Bu API'ler:\n<ul>\n<li>Frontend'den gelen isteklere yan\u0131t verir.<\/li>\n<li>Mikrodenetleyiciden sens\u00f6r verilerini al\u0131r ve veritaban\u0131na kaydeder.<\/li>\n<li>Kavurma profillerini y\u00f6netir.<\/li>\n<li>Kavurma s\u00fcreci devam ederken kontrol algoritmalar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Veritaban\u0131:<\/strong> PostgreSQL veya SQLite (k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli projeler i\u00e7in yeterli) kullan\u0131larak sens\u00f6r verileri, kavurma profilleri ve kullan\u0131c\u0131 ayarlar\u0131 saklan\u0131r.<\/li>\n<li><strong>Mesajla\u015fma Protokol\u00fc:<\/strong> Mikrodenetleyici ile backend aras\u0131nda ger\u00e7ek zamanl\u0131 ileti\u015fim i\u00e7in MQTT (Message Queuing Telemetry Transport). Bir MQTT Broker (\u00f6rne\u011fin Mosquitto) bu ileti\u015fimi y\u00f6netir.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Mimarinizi taslarken gelecekteki \u00f6l\u00e7eklenebilirli\u011fi g\u00f6z \u00f6n\u00fcnde bulundurun. \u00d6rne\u011fin, ileride farkl\u0131 sens\u00f6rler veya birden fazla kavurucu eklemeyi d\u00fc\u015f\u00fcnebilirsiniz. Bu, veritaban\u0131 \u015feman\u0131z\u0131 ve API tasar\u0131m\u0131n\u0131z\u0131 etkileyecektir.\n<\/div>\n<h3>Warp Agent'\u0131 Kullanarak \u0130lk Kod \u0130skeletini Nas\u0131l Olu\u015ftururuz?<\/h3>\n<p>\u015eimdi Warp Agent'\u0131n b\u00fcy\u00fcs\u00fcn\u00fc devreye sokma zaman\u0131! Yukar\u0131daki mimari ve gereksinimler do\u011frultusunda, Warp Agent'a do\u011fal dil komutlar\u0131 vererek MCP sunucumuzun temel iskeletini olu\u015fturmas\u0131n\u0131 isteyebiliriz. \u0130\u015fte Warp Agent'a verebilece\u011fimiz bir \u00f6rnek komut (prompt):<\/p>\n<pre><code>\n\"Bir Flask API'si olu\u015ftur. Bu API, ev kahve kavurucu kontrol\u00fc i\u00e7in kullan\u0131lacak.\nGereksinimler:\n1.  Kavurma profillerini y\u00f6netmek i\u00e7in endpoint'ler (CRUD i\u015flemleri: olu\u015ftur, oku, g\u00fcncelle, sil). Bir profilin ad\u0131, hedef s\u0131cakl\u0131k e\u011frisi (JSON format\u0131nda), s\u00fcre ve akt\u00fcat\u00f6r ayarlar\u0131 (fan h\u0131z\u0131, \u0131s\u0131t\u0131c\u0131 g\u00fcc\u00fc) gibi alanlar\u0131 olmal\u0131.\n2.  Ger\u00e7ek zamanl\u0131 sens\u00f6r verilerini (s\u0131cakl\u0131k, nem, zaman damgas\u0131) al\u0131p veritaban\u0131na kaydetmek i\u00e7in bir endpoint.\n3.  Akt\u00fcat\u00f6rleri (\u0131s\u0131t\u0131c\u0131, fan, tambur motoru) kontrol etmek i\u00e7in endpoint'ler.\n4.  Sens\u00f6r verilerini ve kavurma profillerini saklamak i\u00e7in SQLAlchemy ve SQLite veritaban\u0131 kullan.\n5.  Temel hata y\u00f6netimi ve giri\u015f do\u011frulama ekle.\nBu gereksinimlere uygun bir Flask uygulamas\u0131 iskeleti olu\u015ftur, model tan\u0131mlamalar\u0131, API rotalar\u0131 ve temel i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren kodlar\u0131 bana g\u00f6ster.\"\n<\/pre>\n<p><\/code><\/p>\n<p>Warp Agent bu komutu analiz ettikten sonra, size a\u015fa\u011f\u0131daki gibi bir \u00e7\u0131kt\u0131 \u00fcretecektir (basitle\u015ftirilmi\u015f \u00f6rnek):<\/p>\n<pre><code>\n# app.py\nfrom flask import Flask, request, jsonify\nfrom flask_sqlalchemy import SQLAlchemy\nfrom datetime import datetime\nimport json\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/roaster.db'\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\ndb = SQLAlchemy(app)\n\n# Modelleri Tan\u0131mlama\nclass RoastProfile(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    name = db.Column(db.String(80), unique=True, nullable=False)\n    target_temp_curve = db.Column(db.Text, nullable=False) # JSON string olarak saklan\u0131r\n    duration_minutes = db.Column(db.Integer, nullable=False)\n    actuator_settings = db.Column(db.Text, nullable=False) # JSON string\n    created_at = db.Column(db.DateTime, default=datetime.utcnow)\n\n    def to_dict(self):\n        return {\n            \"id\": self.id,\n            \"name\": self.name,\n            \"target_temp_curve\": json.loads(self.target_temp_curve),\n            \"duration_minutes\": self.duration_minutes,\n            \"actuator_settings\": json.loads(self.actuator_settings),\n            \"created_at\": self.created_at.isoformat()\n        }\n\nclass SensorData(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    temperature_c = db.Column(db.Float, nullable=False)\n    humidity_percent = db.Column(db.Float)\n    timestamp = db.Column(db.DateTime, default=datetime.utcnow)\n\n    def to_dict(self):\n        return {\n            \"id\": self.id,\n            \"temperature_c\": self.temperature_c,\n            \"humidity_percent\": self.humidity_percent,\n            \"timestamp\": self.timestamp.isoformat()\n        }\n\n# API Rotalar\u0131\n@app.route('\/profiles', methods=['POST'])\ndef create_profile():\n    data = request.json\n    if not data or not all(k in data for k in [\"name\", \"target_temp_curve\", \"duration_minutes\", \"actuator_settings\"]):\n        return jsonify({\"message\": \"Eksik veri\"}), 400\n    try:\n        new_profile = RoastProfile(\n            name=data['name'],\n            target_temp_curve=json.dumps(data['target_temp_curve']),\n            duration_minutes=data['duration_minutes'],\n            actuator_settings=json.dumps(data['actuator_settings'])\n        )\n        db.session.add(new_profile)\n        db.session.commit()\n        return jsonify(new_profile.to_dict()), 201\n    except Exception as e:\n        return jsonify({\"message\": str(e)}), 500\n\n@app.route('\/sensor_data', methods=['POST'])\ndef receive_sensor_data():\n    data = request.json\n    if not data or not \"temperature_c\" in data:\n        return jsonify({\"message\": \"Sicaklik verisi eksik\"}), 400\n    try:\n        new_data = SensorData(\n            temperature_c=data['temperature_c'],\n            humidity_percent=data.get('humidity_percent') # Opsiyonel\n        )\n        db.session.add(new_data)\n        db.session.commit()\n        return jsonify({\"message\": \"Veri alindi\", \"id\": new_data.id}), 200\n    except Exception as e:\n        return jsonify({\"message\": str(e)}), 500\n\n# Di\u011fer CRUD ve kontrol endpoint'leri burada geli\u015ftirilebilir...\n\nif __name__ == '__main__':\n    with app.app_context():\n        db.create_all() # Veritaban\u0131 tablolar\u0131n\u0131 olu\u015ftur\n    app.run(debug=True, host='0.0.0.0')\n<\/pre>\n<p><\/code><\/p>\n<p>Bu iskelet kod, Warp Agent'\u0131n do\u011fal dil komutlar\u0131n\u0131 nas\u0131l anla\u015f\u0131l\u0131r ve \u00e7al\u0131\u015f\u0131r kodlara d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finin harika bir \u00f6rne\u011fidir. Modelleri tan\u0131ml\u0131yor, veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kuruyor ve sens\u00f6r verilerini al\u0131p profilleri y\u00f6netmek i\u00e7in temel API rotalar\u0131n\u0131 sa\u011fl\u0131yor. Bu sayede, geli\u015ftirme s\u00fcrecinin en zorlu ve tekrar eden k\u0131s\u0131mlar\u0131ndan biri olan ba\u015flang\u0131\u00e7 kodlama a\u015famas\u0131n\u0131 h\u0131zl\u0131ca atlayabiliriz. Warp Agent'\u0131n yard\u0131m\u0131yla, art\u0131k bu temel \u00fczerinde kavurma kontrol mant\u0131\u011f\u0131n\u0131 ve kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc in\u015fa etmeye haz\u0131r\u0131z.<\/p>\n<h2>Ger\u00e7ek Zamanl\u0131 Veri Ak\u0131\u015f\u0131 ve Ak\u0131ll\u0131 Kontrol Algoritmalar\u0131 Nas\u0131l Kurulur?<\/h2>\n<p>MCP sunucumuzun iskeletini Warp Agent sayesinde kurduk. \u015eimdi s\u0131ra, kahve kavurucumuzdan ger\u00e7ek zamanl\u0131 sens\u00f6r verilerini al\u0131p bu verilerle akt\u00fcat\u00f6rleri ak\u0131ll\u0131ca kontrol etme mekanizmas\u0131n\u0131 olu\u015fturmaya geldi. Bu ad\u0131m, sistemimizin canl\u0131 ve dinamik olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>Mikrodenetleyici ve MCP Sunucusu Aras\u0131nda \u0130leti\u015fim Nas\u0131l Kurulur?<\/h3>\n<p>Mikrodenetleyici (ESP32) ile MCP sunucusu aras\u0131ndaki ileti\u015fim, projenin kalbidir. Sens\u00f6r verilerinin g\u00fcvenilir ve d\u00fc\u015f\u00fck gecikmeyle aktar\u0131lmas\u0131, ayr\u0131ca kontrol komutlar\u0131n\u0131n h\u0131zl\u0131ca iletilmesi hayati \u00f6nem ta\u015f\u0131r. Bu ama\u00e7la en uygun protokollerden biri MQTT'dir (Message Queuing Telemetry Transport).<\/p>\n<p><strong>MQTT Nedir?<\/strong> IoT cihazlar\u0131 aras\u0131nda hafif, yay\u0131n\/abone (publish\/subscribe) tabanl\u0131 bir mesajla\u015fma protokol\u00fcd\u00fcr. Merkezi bir \"broker\" (arac\u0131) \u00fczerinden \u00e7al\u0131\u015f\u0131r. Cihazlar (publisher), belirli \"topic\"lere (konulara) mesaj g\u00f6nderir; di\u011fer cihazlar (subscriber) ise bu topic'leri dinleyerek mesajlar\u0131 al\u0131r.<\/p>\n<ol>\n<li><strong>MQTT Broker Kurulumu:<\/strong>\n<p>E\u011fer bir Raspberry Pi veya benzeri bir mini bilgisayarda MCP sunucusunu \u00e7al\u0131\u015ft\u0131r\u0131yorsan\u0131z, ayn\u0131 cihaz \u00fczerine bir MQTT broker (\u00f6rne\u011fin Mosquitto) kurabilirsiniz. Terminalden a\u015fa\u011f\u0131daki komutla kolayca kurulabilir:<\/p>\n<pre><code>\nsudo apt update\nsudo apt install mosquitto mosquitto-clients\nsudo systemctl enable mosquitto\nsudo systemctl start mosquitto\n        <\/pre>\n<p><\/code><\/p>\n<p>Bu, Mosquitto'yu kuracak ve sistem ba\u015flang\u0131c\u0131nda otomatik olarak \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<\/li>\n<li><strong>ESP32'den MQTT ile Sens\u00f6r Verisi G\u00f6nderme:<\/strong>\n<p>ESP32 taraf\u0131nda, <code>PubSubClient<\/code> gibi bir MQTT k\u00fct\u00fcphanesi kullanarak sens\u00f6r verilerini belirli bir topic'e (\u00f6rne\u011fin <code>\/roaster\/temperature<\/code>) g\u00f6nderebiliriz. \u0130\u015fte basitle\u015ftirilmi\u015f bir \u00f6rnek:<\/p>\n<pre><code>\n#include <WiFi.h>\n#include <PubSubClient.h>\n#include <Adafruit_MAX6675.h> \/\/ Termokupl k\u00fct\u00fcphanesi\n\nconst char* ssid = \"WIFI_SSID_ADINIZ\";\nconst char* password = \"WIFI_SIFRENIZ\";\nconst char* mqtt_server = \"MQTT_BROKER_IP_ADRESI\"; \/\/ Raspberry Pi'nizin IP'si\nconst int mqtt_port = 1883;\n\nWiFiClient espClient;\nPubSubClient client(espClient);\n\n\/\/ Termokupl pinleri\nint CLK = 18;\nint CS = 19;\nint DO = 23;\nAdafruit_MAX6675 thermocouple(CLK, CS, DO);\n\nvoid setup_wifi() {\n  delay(10);\n  Serial.print(\"WiFi baglaniliyor \");\n  Serial.println(ssid);\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(\".\");\n  }\n  Serial.println(\"\");\n  Serial.println(\"WiFi baglandi!\");\n  Serial.println(\"IP adresi: \");\n  Serial.println(WiFi.localIP());\n}\n\nvoid reconnect() {\n  while (!client.connected()) {\n    Serial.print(\"MQTT broker'a baglaniliyor...\");\n    if (client.connect(\"ESP32Client\")) { \/\/ Kendi istemci ID'nizi belirleyin\n      Serial.println(\"baglandi\");\n      \/\/ Kontrol komutlar\u0131n\u0131 dinlemek i\u00e7in bir topic'e abone olabilirsiniz\n      client.subscribe(\"\/roaster\/control\"); \n    } else {\n      Serial.print(\"basarisiz, rc=\");\n      Serial.print(client.state());\n      Serial.println(\" 5 saniye sonra tekrar dene\");\n      delay(5000);\n    }\n  }\n}\n\nvoid callback(char* topic, byte* payload, unsigned int length) {\n  Serial.print(\"Mesaj alindi [\");\n  Serial.print(topic);\n  Serial.print(\"] \");\n  String message = \"\";\n  for (int i = 0; i < length; i++) {\n    message += (char)payload[i];\n  }\n  Serial.println(message);\n  \/\/ Gelen kontrol komutlar\u0131n\u0131 burada i\u015fleyebilirsiniz (\u00f6rn. \u0131s\u0131t\u0131c\u0131y\u0131 a\u00e7\/kapat)\n}\n\nvoid setup() {\n  Serial.begin(115200);\n  setup_wifi();\n  client.setServer(mqtt_server, mqtt_port);\n  client.setCallback(callback);\n}\n\nvoid loop() {\n  if (!client.connected()) {\n    reconnect();\n  }\n  client.loop();\n\n  \/\/ Sens\u00f6r verisini oku\n  float currentTemp = thermocouple.readCelsius();\n  if (isnan(currentTemp)) {\n    Serial.println(\"Termokupl okuma hatasi!\");\n  } else {\n    String tempPayload = String(currentTemp);\n    client.publish(\"\/roaster\/temperature\", tempPayload.c_str());\n    Serial.print(\"Sicaklik gonderildi: \");\n    Serial.println(currentTemp);\n  }\n  delay(5000); \/\/ Her 5 saniyede bir veri gonder\n}\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li><strong>MCP Sunucusunda MQTT Client ile Veri Alma:<\/strong>\n<p>Flask uygulaman\u0131zda <code>paho-mqtt<\/code> gibi bir Python k\u00fct\u00fcphanesi kullanarak MQTT broker'dan veri alabilir ve bu veriyi veritaban\u0131na kaydedebilirsiniz. Bu, Flask uygulaman\u0131z\u0131n ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda (thread) veya s\u00fcre\u00e7te \u00e7al\u0131\u015fmas\u0131 gerekebilir.<\/p>\n<pre><code>\n# mqtt_client.py\nimport paho.mqtt.client as mqtt\nimport json\nfrom datetime import datetime\nfrom app import app, db, SensorData # app.py dosyan\u0131zdaki Flask uygulamas\u0131n\u0131 ve modelleri import edin\n\nMQTT_BROKER_IP = \"MQTT_BROKER_IP_ADRESI\"\nMQTT_PORT = 1883\nTEMP_TOPIC = \"\/roaster\/temperature\"\nCONTROL_TOPIC = \"\/roaster\/control\" # Kontrol komutlar\u0131n\u0131 g\u00f6ndermek i\u00e7in\n\ndef on_connect(client, userdata, flags, rc):\n    print(f\"MQTT Broker'a baglandi: {rc}\")\n    client.subscribe(TEMP_TOPIC) # Sicaklik verisini dinle\n\ndef on_message(client, userdata, msg):\n    print(f\"Mesaj alindi - Topic: {msg.topic}, Payload: {msg.payload.decode()}\")\n    if msg.topic == TEMP_TOPIC:\n        try:\n            temperature = float(msg.payload.decode())\n            with app.app_context(): # Flask uygulama baglaminda calistir\n                new_data = SensorData(temperature_c=temperature, timestamp=datetime.utcnow())\n                db.session.add(new_data)\n                db.session.commit()\n                print(f\"Sicaklik verisi veritabanina kaydedildi: {temperature}\u00b0C\")\n        except ValueError:\n            print(\"Gecersiz sicaklik verisi.\")\n        except Exception as e:\n            print(f\"Veritabanina kaydetme hatasi: {e}\")\n\ndef start_mqtt_client():\n    client = mqtt.Client()\n    client.on_connect = on_connect\n    client.on_message = on_message\n    client.connect(MQTT_BROKER_IP, MQTT_PORT, 60)\n    client.loop_forever() # Arka planda calisir\n\nif __name__ == '__main__':\n    start_mqtt_client()\n        <\/pre>\n<p><\/code><\/p>\n<p>Bu kodu ayr\u0131 bir Python beti\u011fi olarak \u00e7al\u0131\u015ft\u0131rabilir veya Flask uygulaman\u0131z\u0131n ba\u015flang\u0131c\u0131nda bir arka plan g\u00f6revi olarak tetikleyebilirsiniz. B\u00f6ylece sens\u00f6r verileri s\u00fcrekli olarak toplanacak ve veritaban\u0131n\u0131za kaydedilecektir.<\/p>\n<\/ol>\n<h3>Warp Agent ile Dinamik Kontrol Algoritmalar\u0131 Nas\u0131l Geli\u015ftirilir?<\/h3>\n<p>Verileri ba\u015far\u0131yla ald\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi bu verileri kullanarak kavurma s\u00fcrecini ak\u0131ll\u0131ca y\u00f6netme zaman\u0131. Warp Agent, karma\u015f\u0131k kontrol algoritmalar\u0131 geli\u015ftirmede de size yard\u0131mc\u0131 olabilir. Amac\u0131m\u0131z, tan\u0131mlanm\u0131\u015f bir kavurma profiline g\u00f6re \u0131s\u0131t\u0131c\u0131 ve fan\u0131 dinamik olarak ayarlamakt\u0131r.<\/p>\n<p><strong>Kontrol Algoritmalar\u0131:<\/strong> Basit kural tabanl\u0131 sistemlerden (\u00f6rne\u011fin, \"Hedef s\u0131cakl\u0131\u011f\u0131n 5 derece alt\u0131ndaysak \u0131s\u0131t\u0131c\u0131y\u0131 %100 a\u00e7\") PID (Proportional-Integral-Derivative) kontrol d\u00f6ng\u00fclerine kadar \u00e7e\u015fitli yakla\u015f\u0131mlar mevcuttur. PID, daha hassas ve kararl\u0131 kontrol sa\u011flar.<\/p>\n<p>Warp Agent'a \u015fu komutu verebiliriz:<\/p>\n<pre><code>\n\"Bir Flask tabanl\u0131 MCP sunucusu i\u00e7in Python kodu olu\u015ftur. Bu kod, mevcut sens\u00f6r s\u0131cakl\u0131\u011f\u0131n\u0131 ve aktif kavurma profilindeki hedef s\u0131cakl\u0131k e\u011frisini kullanarak PID kontrol algoritmas\u0131n\u0131 uygulayacak. Is\u0131t\u0131c\u0131 g\u00fcc\u00fcn\u00fc ve fan h\u0131z\u0131n\u0131 ayarlamak i\u00e7in gerekli hesaplamalar\u0131 yapacak. PID parametreleri (Kp, Ki, Kd) yap\u0131land\u0131r\u0131labilir olmal\u0131. Kontrol d\u00f6ng\u00fcs\u00fc, belirli aral\u0131klarla \u00e7al\u0131\u015fmal\u0131 ve mikrodenetleyiciye kontrol komutlar\u0131n\u0131 MQTT \u00fczerinden yay\u0131nlamal\u0131d\u0131r. Aktif profilin ID'si ve mevcut s\u0131cakl\u0131k bilgisi dikkate al\u0131nmal\u0131.\"\n<\/pre>\n<p><\/code><\/p>\n<p>Warp Agent, bu komut \u00fczerine size PID kontrol\u00fcn\u00fc uygulayan bir fonksiyonun iskeletini ve bunu Flask uygulaman\u0131zla nas\u0131l entegre edece\u011finizi g\u00f6sterecektir. \u00d6rnek bir \u00e7\u0131kt\u0131 \u015f\u00f6yle olabilir:<\/p>\n<pre><code>\n# app.py (devami)\n\n# PID Kontrol Parametreleri (Dinamik olarak ayarlanabilir veya veritaban\u0131ndan okunabilir)\nPID_SETTINGS = {\n    \"Kp\": 2.0,\n    \"Ki\": 0.5,\n    \"Kd\": 1.0,\n    \"output_min\": 0,\n    \"output_max\": 100 # Yuzde olarak guc\n}\n\nlast_error = 0\nintegral_sum = 0\nlast_control_time = datetime.utcnow()\n\ndef calculate_pid_output(current_temp, target_temp, dt_seconds):\n    global last_error, integral_sum, last_control_time\n\n    error = target_temp - current_temp\n    \n    integral_sum += error * dt_seconds\n    integral_sum = max(PID_SETTINGS[\"output_min\"], min(integral_sum, PID_SETTINGS[\"output_max\"])) # Integral sinirlama\n\n    derivative = (error - last_error) \/ dt_seconds if dt_seconds > 0 else 0\n\n    output = (PID_SETTINGS[\"Kp\"] * error) + \\\n             (PID_SETTINGS[\"Ki\"] * integral_sum) + \\\n             (PID_SETTINGS[\"Kd\"] * derivative)\n    \n    output = max(PID_SETTINGS[\"output_min\"], min(output, PID_SETTINGS[\"output_max\"]))\n    \n    last_error = error\n    last_control_time = datetime.utcnow()\n    \n    return output\n\n@app.route('\/start_roast', methods=['POST'])\ndef start_roast():\n    profile_id = request.json.get('profile_id')\n    if not profile_id:\n        return jsonify({\"message\": \"Profil ID'si gerekli\"}), 400\n\n    profile = RoastProfile.query.get(profile_id)\n    if not profile:\n        return jsonify({\"message\": \"Profil bulunamadi\"}), 404\n\n    # Kavurma baslangicini kaydet, PID'yi sifirla vb.\n    global last_error, integral_sum, last_control_time\n    last_error = 0\n    integral_sum = 0\n    last_control_time = datetime.utcnow()\n\n    # Kontrol dongusunu baslat (ayri bir thread veya celery gorevi olarak)\n    # Burada ornek olarak baslangic gosteriliyor, gercek bir implementasyonda arka plan gorevi olmali\n    # threaded_control_loop(profile)\n    return jsonify({\"message\": f\"Kavurma baslatildi: {profile.name}\"}), 200\n\n# Bu fonksiyonda, PID hesaplamasi ve MQTT uzerinden komut gonderme yapilir\n# Gercek uygulamada ayri bir thread veya islem olmali\ndef control_loop(profile):\n    current_roast_time = 0\n    while current_roast_time < profile.duration_minutes * 60:\n        # En son sicaklik verisini veritabanindan cek\n        latest_sensor_data = SensorData.query.order_by(SensorData.timestamp.desc()).first()\n        if latest_sensor_data:\n            current_temp = latest_sensor_data.temperature_c\n            \n            # Profildeki hedef sicakligi bul\n            target_temp_curve = json.loads(profile.target_temp_curve) # Ornegin: [{\"time\": 0, \"temp\": 20}, {\"time\": 60, \"temp\": 100}, ...]\n            # Mevcut zamana en yakin hedef sicakligi bulmak gerekir\n            # Basit ornek: Eger egri liste ise, interpolated_target_temp = interpolate_target_temp(current_roast_time, target_temp_curve)\n            \n            # Simdiye kadar topladigimiz verilere gore bir hedef belirleyelim (basit bir ornek)\n            target_temp = 100 # Bu dinamik olarak profilden gelmeli\n\n            # Zaman farki hesapla\n            current_time = datetime.utcnow()\n            dt_seconds = (current_time - last_control_time).total_seconds()\n            \n            heater_output_percent = calculate_pid_output(current_temp, target_temp, dt_seconds)\n            \n            # MQTT uzerinden kontrol komutunu gonder\n            control_payload = json.dumps({\"heater_power\": heater_output_percent, \"fan_speed\": 50}) # Fan hizi da profilden gelmeli\n            mqtt_client_instance.publish(CONTROL_TOPIC, control_payload)\n            print(f\"Kontrol komutu gonderildi - Isitici: {heater_output_percent}%\")\n\n        time.sleep(5) # Her 5 saniyede bir kontrol et\n        current_roast_time += 5\n\n# MQTT istemcisini ayri bir thread'de baslatmak icin\n# import threading\n# mqtt_thread = threading.Thread(target=start_mqtt_client)\n# mqtt_thread.start()\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod par\u00e7ac\u0131\u011f\u0131, PID kontrol algoritmas\u0131n\u0131n temelini at\u0131yor ve \u0131s\u0131t\u0131c\u0131 g\u00fcc\u00fcn\u00fc ayarlamak i\u00e7in nas\u0131l kullan\u0131labilece\u011fini g\u00f6steriyor. Ger\u00e7ek bir uygulamada, <code>control_loop<\/code> fonksiyonu bir arka plan g\u00f6revi olarak \u00e7al\u0131\u015fmal\u0131 (\u00f6rn. Celery veya ayr\u0131 bir Python s\u00fcreci) ve d\u00fczenli aral\u0131klarla en son sens\u00f6r verilerini \u00e7ekip, aktif kavurma profilindeki hedef s\u0131cakl\u0131k e\u011frisine g\u00f6re PID hesaplamas\u0131 yaparak akt\u00fcat\u00f6rlere komut g\u00f6ndermelidir. Fan h\u0131z\u0131 ve tambur d\u00f6n\u00fc\u015f\u00fc gibi di\u011fer parametreler de benzer \u015fekilde kavurma profili \u00fczerinden kontrol edilebilir.<\/p>\n<p>Warp Agent, bu karma\u015f\u0131k kontrol mant\u0131\u011f\u0131n\u0131 sizin i\u00e7in tasarlayarak ve iskelet kodunu sa\u011flayarak, projenizi \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde uygulanabilir hale getirmenize olanak tan\u0131r. Art\u0131k sistemimiz veri al\u0131yor ve bu verileri kullanarak ak\u0131ll\u0131 kararlar alabiliyor. S\u0131rada, bu kararlar\u0131 ve s\u00fcreci kullan\u0131c\u0131 dostu bir aray\u00fczle sunmak var.<\/p>\n<h2>Kullan\u0131c\u0131 Aray\u00fcz\u00fc ve Mobil Eri\u015fim: Kavurma S\u00fcrecini Elinizde Tutun (H2)<\/h2>\n<p>MCP sunucumuz art\u0131k sens\u00f6r verilerini al\u0131yor ve akt\u00fcat\u00f6rleri kontrol edebiliyor. Ancak t\u00fcm bu verimli i\u015fleyi\u015fi kullan\u0131c\u0131 dostu bir aray\u00fczle sunmad\u0131\u011f\u0131m\u0131z s\u00fcrece, deneyim eksik kalacakt\u0131r. Bu b\u00f6l\u00fcmde, kavurma s\u00fcrecini izlemek ve kontrol etmek i\u00e7in nas\u0131l basit bir web aray\u00fcz\u00fc geli\u015ftirece\u011fimizi ve mobil cihazlar i\u00e7in duyarl\u0131 (responsive) tasar\u0131m ipu\u00e7lar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3>Etkile\u015fimli Bir Web Aray\u00fcz\u00fc ile Kavurma S\u00fcreci Nas\u0131l \u0130zlenir ve Kontrol Edilir?<\/h3>\n<p>Bir web aray\u00fcz\u00fc, kahve kavurma s\u00fcrecini g\u00f6rselle\u015ftirmek, profilleri y\u00f6netmek ve hatta manuel m\u00fcdahalelerde bulunmak i\u00e7in ideal bir yoldur. Flask, Jinja2 \u015fablon motorunu kullanarak basit web sayfalar\u0131 olu\u015fturmak i\u00e7in harika bir se\u00e7enektir. Daha dinamik ve zengin bir deneyim i\u00e7in ise React veya Vue.js gibi bir JavaScript \u00e7er\u00e7evesi kullanabiliriz, ancak ba\u015flang\u0131\u00e7 i\u00e7in Flask ve Jinja2 yeterli olacakt\u0131r.<\/p>\n<p><strong>Aray\u00fcz Temel Bile\u015fenleri:<\/strong><\/p>\n<ul>\n<li><strong>Ana Kontrol Paneli:<\/strong> Mevcut s\u0131cakl\u0131klar\u0131 (\u00e7ekirdek, ortam), kavurma s\u00fcresini, \u0131s\u0131t\u0131c\u0131 g\u00fcc\u00fcn\u00fc ve fan h\u0131z\u0131n\u0131 g\u00f6steren ger\u00e7ek zamanl\u0131 grafikler ve de\u011ferler.<\/li>\n<li><strong>Kavurma Profili Y\u00f6netimi:<\/strong> Yeni profiller olu\u015fturma, mevcut profilleri d\u00fczenleme ve silme formu.<\/li>\n<li><strong>Kavurma Ba\u015flatma\/Durdurma:<\/strong> Tek t\u0131klamayla kavurmay\u0131 ba\u015flatma veya durdurma d\u00fc\u011fmeleri.<\/li>\n<li><strong>Ge\u00e7mi\u015f Kavurmalar:<\/strong> \u00d6nceki kavurma seanslar\u0131n\u0131n \u00f6zetini ve detayl\u0131 grafiklerini g\u00f6r\u00fcnt\u00fcleme.<\/li>\n<\/ul>\n<p>Warp Agent'a a\u015fa\u011f\u0131daki gibi bir komut vererek, temel bir web aray\u00fcz\u00fc iskeleti olu\u015fturmas\u0131n\u0131 isteyebiliriz:<\/p>\n<pre><code>\n\"Flask uygulamam i\u00e7in, ger\u00e7ek zamanl\u0131 s\u0131cakl\u0131k verilerini g\u00f6steren bir kontrol paneli ve kavurma profillerini y\u00f6netmek i\u00e7in bir sayfa i\u00e7eren basit bir web aray\u00fcz\u00fc tasla\u011f\u0131 olu\u015ftur. Kontrol panelinde Chart.js kullanarak dinamik s\u0131cakl\u0131k grafi\u011fi olmal\u0131. Jinja2 \u015fablonlar\u0131 ve temel HTML\/CSS kullan. Flask uygulamas\u0131ndan sens\u00f6r verilerini ve profil bilgilerini \u00e7ekmek i\u00e7in API \u00e7a\u011fr\u0131lar\u0131 yapmal\u0131.\"\n<\/pre>\n<p><\/code><\/p>\n<p>Warp Agent, bu komut \u00fczerine <code>index.html<\/code> ve <code>profiles.html<\/code> gibi Jinja2 \u015fablonlar\u0131 ile birlikte Flask routelar\u0131n\u0131 \u00fcretecektir. \u00d6rnek bir <code>index.html<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code>\n<!-- templates\/index.html -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Ak\u0131ll\u0131 Kahve Kavurucu Kontrol Paneli<\/title>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n    <style>\n        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 20px; background-color: #f4f7f6; color: #333; }\n        .container { max-width: 1200px; margin: auto; background: #fff; padding: 25px; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }\n        h1, h2 { color: #2c3e50; border-bottom: 2px solid #e0e0e0; padding-bottom: 10px; margin-bottom: 20px; }\n        .data-display { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-bottom: 30px; }\n        .data-card { background-color: #ecf0f1; padding: 15px; border-radius: 6px; text-align: center; }\n        .data-card h3 { margin: 0 0 10px 0; color: #34495e; font-size: 1.2em; }\n        .data-card p { font-size: 1.8em; font-weight: bold; color: #2980b9; margin: 0; }\n        .button-group { text-align: center; margin-top: 30px; }\n        .button { background-color: #2ecc71; color: white; padding: 12px 25px; border: none; border-radius: 5px; cursor: pointer; font-size: 1em; margin: 0 10px; transition: background-color 0.3s ease; }\n        .button:hover { background-color: #27ae60; }\n        .button.stop { background-color: #e74c3c; }\n        .button.stop:hover { background-color: #c0392b; }\n        #temperatureChart { max-height: 400px; margin-top: 20px; }\n\n        @media screen and (max-width: 768px) {\n            .data-display {\n                grid-template-columns: 1fr;\n            }\n        }\n        @media screen and (max-width: 480px) {\n            .button-group {\n                display: flex;\n                flex-direction: column;\n            }\n            .button {\n                margin: 10px 0;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>Ak\u0131ll\u0131 Kahve Kavurucu Kontrol Paneli<\/h1>\n\n        <div class=\"data-display\">\n            <div class=\"data-card\">\n                <h3>Mevcut S\u0131cakl\u0131k<\/h3>\n                <p><span id=\"currentTemp\">--<\/span> &deg;C<\/p>\n            <\/div>\n            <div class=\"data-card\">\n                <h3>Kavurma S\u00fcresi<\/h3>\n                <p><span id=\"roastTime\">00:00<\/span><\/p>\n            <\/div>\n            <div class=\"data-card\">\n                <h3>Is\u0131t\u0131c\u0131 G\u00fcc\u00fc<\/h3>\n                <p><span id=\"heaterPower\">--<\/span> %<\/p>\n            <\/div>\n            <div class=\"data-card\">\n                <h3>Fan H\u0131z\u0131<\/h3>\n                <p><span id=\"fanSpeed\">--<\/span> %<\/p>\n            <\/div>\n        <\/div>\n\n        <h2>S\u0131cakl\u0131k E\u011frisi<\/h2>\n        <canvas id=\"temperatureChart\"><\/canvas>\n\n        <div class=\"button-group\">\n            <button class=\"button\" onclick=\"startRoast()\">Kavurmay\u0131 Ba\u015flat<\/button>\n            <button class=\"button stop\" onclick=\"stopRoast()\">Kavurmay\u0131 Durdur<\/button>\n            <button class=\"button\" onclick=\"window.location.href='\/profiles'\">Profilleri Y\u00f6net<\/button>\n        <\/div>\n    <\/div>\n\n    <script>\n        const ctx = document.getElementById('temperatureChart').getContext('2d');\n        const temperatureChart = new Chart(ctx, {\n            type: 'line',\n            data: {\n                labels: [],\n                datasets: [{\n                    label: '\u00c7ekirdek S\u0131cakl\u0131\u011f\u0131 (\u00b0C)',\n                    data: [],\n                    borderColor: 'rgb(75, 192, 192)',\n                    tension: 0.1\n                }]\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    x: {\n                        title: {\n                            display: true,\n                            text: 'Zaman (saniye)'\n                        }\n                    },\n                    y: {\n                        title: {\n                            display: true,\n                            text: 'S\u0131cakl\u0131k (\u00b0C)'\n                        },\n                        beginAtZero: false\n                    }\n                }\n            }\n        });\n\n        \/\/ API'den ger\u00e7ek zamanl\u0131 verileri \u00e7ekme ve grafi\u011fi g\u00fcncelleme\n        async function fetchRealtimeData() {\n            try {\n                const response = await fetch('\/api\/current_status'); \/\/ Flask uygulaman\u0131zdaki bir API endpoint'i\n                const data = await response.json();\n\n                document.getElementById('currentTemp').textContent = data.temperature.toFixed(1);\n                document.getElementById('roastTime').textContent = formatTime(data.roast_duration);\n                document.getElementById('heaterPower').textContent = data.heater_power.toFixed(0);\n                document.getElementById('fanSpeed').textContent = data.fan_speed.toFixed(0);\n\n                \/\/ Grafik verilerini g\u00fcncelle\n                temperatureChart.data.labels.push(data.roast_duration); \/\/ X ekseni i\u00e7in zaman\n                temperatureChart.data.datasets[0].data.push(data.temperature); \/\/ Y ekseni i\u00e7in s\u0131cakl\u0131k\n                temperatureChart.update();\n\n            } catch (error) {\n                console.error(\"Veri \u00e7ekme hatas\u0131:\", error);\n            }\n        }\n\n        function formatTime(seconds) {\n            const minutes = Math.floor(seconds \/ 60);\n            const remainingSeconds = seconds % 60;\n            return <code>${String(minutes).padStart(2, &#039;0&#039;)}:${String(remainingSeconds).padStart(2, &#039;0&#039;)}<\/code>;\n        }\n\n        \/\/ Kavurmay\u0131 ba\u015flat\/durdur fonksiyonlar\u0131 (API \u00e7a\u011fr\u0131lar\u0131)\n        async function startRoast() {\n            \/\/ Bir profil se\u00e7tirip ba\u015flatma API'sine g\u00f6nderilebilir\n            console.log(\"Kavurma baslatiliyor...\");\n            await fetch('\/start_roast', {\n                method: 'POST',\n                headers: {'Content-Type': 'application\/json'},\n                body: JSON.stringify({profile_id: 1}) \/\/ Ornek profil ID\n            });\n        }\n\n        async function stopRoast() {\n            console.log(\"Kavurma durduruluyor...\");\n            await fetch('\/stop_roast', {method: 'POST'});\n        }\n\n        \/\/ Her 5 saniyede bir veri \u00e7ek\n        setInterval(fetchRealtimeData, 5000);\n        fetchRealtimeData(); \/\/ Sayfa y\u00fcklendi\u011finde ilk veriyi \u00e7ek\n    <\/script>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu HTML dosyas\u0131, mevcut verileri g\u00f6steren kartlar, Chart.js ile dinamik bir s\u0131cakl\u0131k grafi\u011fi ve kavurmay\u0131 ba\u015flatma\/durdurma d\u00fc\u011fmeleri i\u00e7erir. JavaScript kodu, Flask API'sinden d\u00fczenli aral\u0131klarla veri \u00e7ekerek aray\u00fcz\u00fc g\u00fcnceller.<\/p>\n<h3>Mobil Cihazlar \u0130\u00e7in Duyarl\u0131 Tasar\u0131m \u0130pu\u00e7lar\u0131 ve Media Query \u00d6rnekleri<\/h3>\n<p>G\u00fcn\u00fcm\u00fczde kullan\u0131c\u0131lar web sitelerine ve uygulamalara \u00e7o\u011funlukla mobil cihazlar\u0131ndan eri\u015fti\u011fi i\u00e7in, aray\u00fcz\u00fcm\u00fcz\u00fcn mobil uyumlu olmas\u0131 kritik \u00f6neme sahiptir. Duyarl\u0131 tasar\u0131m (responsive design), web sayfalar\u0131n\u0131n farkl\u0131 ekran boyutlar\u0131na ve \u00e7\u00f6z\u00fcn\u00fcrl\u00fcklerine otomatik olarak uyum sa\u011flamas\u0131 anlam\u0131na gelir.<\/p>\n<p><strong>Temel \u0130pu\u00e7lar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Meta Viewport Etiketi:<\/strong> Her HTML sayfas\u0131n\u0131n <code><head><\/code> b\u00f6l\u00fcm\u00fcnde <code><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><\/code> etiketini kullan\u0131n. Bu, taray\u0131c\u0131ya sayfan\u0131n cihaz geni\u015fli\u011fine g\u00f6re \u00f6l\u00e7eklenmesini s\u00f6yler.<\/li>\n<li><strong>Ak\u0131\u015fkan Izgaralar (Fluid Grids):<\/strong> <code>px<\/code> yerine <code>em<\/code>, <code>rem<\/code>, <code>%<\/code> veya <code>vw<\/code>\/<code>vh<\/code> gibi g\u00f6receli birimler kullan\u0131n. \u00d6rne\u011fin, <code>grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));<\/code> gibi CSS Grid \u00f6zellikleri, \u00f6\u011felerin otomatik olarak d\u00fczenlenmesini sa\u011flar.<\/li>\n<li><strong>Esnek Resimler:<\/strong> <code>img<\/code> etiketleri i\u00e7in <code>max-width: 100%; height: auto;<\/code> kullanarak resimlerin konteynerlerine s\u0131\u011fmas\u0131n\u0131 sa\u011flay\u0131n.<\/li>\n<li><strong>Medya Sorgular\u0131 (Media Queries):<\/strong> Belirli ekran boyutlar\u0131 i\u00e7in farkl\u0131 stil kurallar\u0131 uygulamak i\u00e7in kullan\u0131l\u0131r. Yukar\u0131daki CSS kodunda \u00f6rneklerini g\u00f6rebilirsiniz.<\/li>\n<\/ul>\n<p><strong>Media Query \u00d6rnekleri (CSS i\u00e7inde):<\/strong><\/p>\n<pre><code>\n    \/* Genel stiller (varsay\u0131lan olarak mobil \u00f6ncelikli) *\/\n    .data-display {\n        display: grid;\n        grid-template-columns: 1fr; \/* Mobil cihazlarda tek s\u00fctun *\/\n        gap: 20px;\n    }\n    .button-group {\n        display: flex;\n        flex-direction: column; \/* Mobil cihazlarda d\u00fc\u011fmeleri alt alta s\u0131rala *\/\n        gap: 10px;\n    }\n\n    \/* Tabletler ve K\u00fc\u00e7\u00fck Ekranlar i\u00e7in (768px ve \u00fczeri) *\/\n    @media screen and (min-width: 768px) {\n        .data-display {\n            grid-template-columns: repeat(2, 1fr); \/* Tabletlerde iki s\u00fctun *\/\n        }\n        .button-group {\n            flex-direction: row; \/* Tabletlerde d\u00fc\u011fmeleri yan yana s\u0131rala *\/\n            justify-content: center;\n        }\n    }\n\n    \/* Masa\u00fcst\u00fc Ekranlar i\u00e7in (1024px ve \u00fczeri) *\/\n    @media screen and (min-width: 1024px) {\n        .data-display {\n            grid-template-columns: repeat(4, 1fr); \/* Masa\u00fcst\u00fcnde d\u00f6rt s\u00fctun *\/\n        }\n    }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu media query \u00f6rnekleri, ekran boyutu de\u011fi\u015ftik\u00e7e veri kartlar\u0131n\u0131n ve d\u00fc\u011fme gruplar\u0131n\u0131n nas\u0131l yeniden d\u00fczenlenece\u011fini g\u00f6sterir. Mobil \u00f6ncelikli bir yakla\u015f\u0131mla ba\u015flay\u0131p, daha b\u00fcy\u00fck ekranlar i\u00e7in stilleri kademeli olarak geni\u015fletmek iyi bir uygulamad\u0131r. Bu sayede, hem k\u00fc\u00e7\u00fck cep telefonlar\u0131ndan hem de b\u00fcy\u00fck masa\u00fcst\u00fc monit\u00f6rlerinden kavurucunuzu kolayca kontrol edebilir ve izleyebilirsiniz. Warp Agent, bu t\u00fcr CSS kodlar\u0131n\u0131 ve HTML yap\u0131lar\u0131n\u0131 da kolayca \u00fcretebilir, bu da size tasar\u0131m s\u00fcrecinde b\u00fcy\u00fck zaman kazand\u0131r\u0131r.<\/p>\n<h2>Veri Analizi ve S\u00fcrekli \u0130yile\u015ftirme: Daha \u0130yi Kahveye Giden Yol Nas\u0131l Bulunur?<\/h2>\n<p>MCP sunucumuz art\u0131k kahve kavurucumuzu kontrol ediyor ve sens\u00f6r verilerini topluyor. Ancak projemizin ger\u00e7ek de\u011feri, sadece otomasyonla s\u0131n\u0131rl\u0131 de\u011fil; toplanan verileri analiz ederek kavurma profillerimizi s\u00fcrekli olarak iyile\u015ftirmek ve m\u00fckemmel kahveye ula\u015fmak da bu de\u011ferin bir par\u00e7as\u0131. Bu b\u00f6l\u00fcmde, verileri nas\u0131l analiz edece\u011fimizi ve sistemi nas\u0131l optimize edebilece\u011fimizi ke\u015ffedece\u011fiz.<\/p>\n<h3>Kavurma Verilerini Analiz Etme ve Optimizasyon F\u0131rsatlar\u0131 Nelerdir?<\/h3>\n<p>Her kavurma seans\u0131nda toplanan veriler, alt\u0131n de\u011ferindedir. S\u0131cakl\u0131k e\u011frileri, kavurma s\u00fcreleri, akt\u00fcat\u00f6r tepkileri, nem de\u011ferleri ve hatta her kavurma sonras\u0131 olu\u015fan kahvenin lezzet profili hakk\u0131ndaki notlar, daha iyi kavurma profilleri olu\u015fturmak i\u00e7in kullan\u0131labilir. Flask uygulaman\u0131zda toplanan <code>SensorData<\/code> ve <code>RoastProfile<\/code> verilerini kullanarak derinlemesine analizler yapabiliriz.<\/p>\n<p><strong>Analiz Edilebilecek Temel Metrikler:<\/strong><\/p>\n<ul>\n<li><strong>S\u0131cakl\u0131k E\u011frisi Tutarl\u0131l\u0131\u011f\u0131:<\/strong> Farkl\u0131 kavurmalardaki s\u0131cakl\u0131k e\u011frilerini (\u00c7ekirdek s\u0131cakl\u0131\u011f\u0131, ortam s\u0131cakl\u0131\u011f\u0131) kar\u015f\u0131la\u015ft\u0131r\u0131n. Hedef profilden sapmalar\u0131 g\u00f6rselle\u015ftirin ve nedenlerini ara\u015ft\u0131r\u0131n.<\/li>\n<li><strong>\"First Crack\" (\u0130lk \u00c7atlama) ve \"Second Crack\" (\u0130kinci \u00c7atlama) Noktalar\u0131:<\/strong> Bu kritik kavurma a\u015famalar\u0131n\u0131n hangi s\u0131cakl\u0131kta ve s\u00fcrede meydana geldi\u011fini kaydedin. Bu noktalar, kahvenin lezzet profilini belirlemede anahtar rol oynar.<\/li>\n<li><strong>Kavurma H\u0131z\u0131 (RoR - Rate of Rise):<\/strong> S\u0131cakl\u0131\u011f\u0131n zaman i\u00e7indeki de\u011fi\u015fim h\u0131z\u0131. RoR e\u011frisi, kavurma s\u00fcrecinin hassas kontrol\u00fc i\u00e7in \u00f6nemlidir. \u0130stenmeyen \"flick\" veya \"crash\" durumlar\u0131n\u0131 belirleyin.<\/li>\n<li><strong>A\u011f\u0131rl\u0131k Kayb\u0131 (Weight Loss - Manuel \u00f6l\u00e7\u00fcm):<\/strong> Kavurma \u00f6ncesi ve sonras\u0131 \u00e7ekirdek a\u011f\u0131rl\u0131\u011f\u0131n\u0131 \u00f6l\u00e7erek kavurma s\u00fcresince kaybedilen nem ve di\u011fer u\u00e7ucu bile\u015fenlerin miktar\u0131n\u0131 de\u011ferlendirin.<\/li>\n<li><strong>Duyusal Notlar (Tasting Notes):<\/strong> Her kavurma sonras\u0131 kahvenin tad\u0131, kokusu ve g\u00f6vdesi hakk\u0131nda notlar al\u0131n. Bu duyusal verileri teknik verilerle ili\u015fkilendirerek hangi profilin hangi lezzet \u00f6zelliklerini verdi\u011fini anlay\u0131n.<\/li>\n<\/ul>\n<p><strong>Veri Analizi i\u00e7in Ara\u00e7lar:<\/strong><\/p>\n<ul>\n<li><strong>Python (Pandas, Matplotlib, Seaborn):<\/strong> Flask uygulaman\u0131z i\u00e7inde veya ayr\u0131 bir analiz beti\u011fi olarak bu k\u00fct\u00fcphaneleri kullanarak verileri i\u015fleyebilir, grafikler olu\u015fturabilir ve istatistiksel analizler yapabilirsiniz.<\/li>\n<li><strong>Web Aray\u00fcz\u00fc Entegrasyonu:<\/strong> Chart.js gibi k\u00fct\u00fcphanelerle ge\u00e7mi\u015f kavurmalar\u0131n s\u0131cakl\u0131k e\u011frilerini web aray\u00fcz\u00fcnde g\u00f6rselle\u015ftirebilirsiniz.<\/li>\n<\/ul>\n<pre><code>\n# Python ile basit veri analizi \u00f6rne\u011fi (Flask uygulamas\u0131nda ayr\u0131 bir route olarak eklenebilir)\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom io import BytesIO\nimport base64\n\n# ... (Flask uygulaman\u0131z\u0131n app, db, SensorData tan\u0131mlar\u0131)\n\n@app.route('\/api\/roast_analysis\/<int:roast_id>', methods=['GET'])\ndef get_roast_analysis(roast_id):\n    # Belirli bir kavurmaya ait sensor verilerini \u00e7ek (bu k\u0131s\u0131m daha detayl\u0131 olmal\u0131,\n    # sensor verilerini hangi kavurma seansina ait oldugunu belirten bir alan eklenmeli)\n    # \u015eimdilik t\u00fcm veriyi \u00e7ekelim, ger\u00e7ekte bir 'roast_session_id' olmal\u0131\n    sensor_data_records = SensorData.query.order_by(SensorData.timestamp).all()\n    \n    if not sensor_data_records:\n        return jsonify({\"message\": \"Analiz edilecek veri bulunamadi\"}), 404\n\n    df = pd.DataFrame([s.to_dict() for s in sensor_data_records])\n    df['timestamp'] = pd.to_datetime(df['timestamp'])\n    df.set_index('timestamp', inplace=True)\n\n    # Basit bir RoR (Rate of Rise) hesaplamas\u0131\n    df['RoR'] = df['temperature_c'].diff() \/ (df.index.to_series().diff().dt.total_seconds())\n    \n    # Grafik olu\u015fturma\n    fig, ax1 = plt.subplots(figsize=(10, 6))\n\n    color = 'tab:red'\n    ax1.set_xlabel('Zaman')\n    ax1.set_ylabel('S\u0131cakl\u0131k (\u00b0C)', color=color)\n    ax1.plot(df.index, df['temperature_c'], color=color, label='\u00c7ekirdek S\u0131cakl\u0131\u011f\u0131')\n    ax1.tick_params(axis='y', labelcolor=color)\n\n    ax2 = ax1.twinx()  # \u0130kinci bir y ekseni olu\u015ftur\n    color = 'tab:blue'\n    ax2.set_ylabel('RoR (\u00b0C\/sn)', color=color)\n    ax2.plot(df.index, df['RoR'], color=color, linestyle='--', label='RoR')\n    ax2.tick_params(axis='y', labelcolor=color)\n\n    fig.tight_layout()\n    plt.title(f'Kavurma {roast_id} Analizi')\n    plt.legend(loc=\"upper left\")\n\n    # Grafi\u011fi base64 string'e d\u00f6n\u00fc\u015ft\u00fcrerek web'e g\u00f6nderme\n    buf = BytesIO()\n    plt.savefig(buf, format='png')\n    buf.seek(0)\n    image_base64 = base64.b64encode(buf.getvalue()).decode('utf-8')\n    plt.close(fig)\n\n    return jsonify({\"analysis_image\": f\"data:image\/png;base64,{image_base64}\", \"data_summary\": df.describe().to_dict()})\n\n<\/pre>\n<p><\/code><\/p>\n<h3>Gelecek Ad\u0131mlar: Yapay Zeka Destekli Otomasyon ve Sistemin G\u00fcvenli\u011fi Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Veri analizi, optimizasyonun ilk ad\u0131m\u0131d\u0131r. Daha ileri d\u00fczeyde, yapay zeka ve makine \u00f6\u011frenimi (ML) modellerini kullanarak kavurma s\u00fcrecini tam otomatik hale getirebiliriz. Warp Agent, bu ileri d\u00fczey \u00f6zelliklerin entegrasyonu i\u00e7in de size yol g\u00f6sterebilir.<\/p>\n<ul>\n<li><strong>Tahmine Dayal\u0131 Kontrol:<\/strong> Ge\u00e7mi\u015f kavurma verileri ve duyusal notlar kullan\u0131larak, bir sonraki kavurman\u0131n sonu\u00e7lar\u0131n\u0131 tahmin eden ML modelleri olu\u015fturulabilir. Bu modeller, mevcut s\u0131cakl\u0131k e\u011frilerine g\u00f6re \u0131s\u0131t\u0131c\u0131 ve fan ayarlamalar\u0131n\u0131 ger\u00e7ek zamanl\u0131 olarak \u00f6nererek veya otomatik olarak uygulayarak ideal RoR'u korumaya yard\u0131mc\u0131 olabilir.<\/li>\n<li><strong>Adaptif Kavurma:<\/strong> \u00c7ekirdek t\u00fcr\u00fc, ba\u015flang\u0131\u00e7 nemi, ortam ko\u015fullar\u0131 gibi de\u011fi\u015fkenlere g\u00f6re kavurma profillerini otomatik olarak adapte eden sistemler geli\u015ftirilebilir.<\/li>\n<li><strong>Sistemin G\u00fcvenli\u011fi:<\/strong> Bir IoT cihaz\u0131 olarak, MCP sunucumuzun g\u00fcvenli\u011fi \u00f6nemlidir.\n<ul>\n<li><strong>API Anahtarlar\u0131\/Kimlik Do\u011frulama:<\/strong> API endpoint'lerine yetkisiz eri\u015fimi engellemek i\u00e7in kimlik do\u011frulama mekanizmalar\u0131 (\u00f6rne\u011fin JWT token'lar) uygulay\u0131n.<\/li>\n<li><strong>Veri \u015eifreleme:<\/strong> \u00d6zellikle hassas veriler aktar\u0131l\u0131rken (HTTPS, TLS\/SSL) ve depolan\u0131rken \u015fifreleme kullan\u0131n.<\/li>\n<li><strong>A\u011f G\u00fcvenli\u011fi:<\/strong> MQTT broker'\u0131n\u0131z\u0131n ve sunucunuzun sadece yerel a\u011fdan veya g\u00fcvenli VPN t\u00fcneli \u00fczerinden eri\u015filebilir oldu\u011fundan emin olun. Varsay\u0131lan portlar\u0131 de\u011fi\u015ftirmek ve zay\u0131f parolalardan ka\u00e7\u0131nmak \u00f6nemlidir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik ve Bak\u0131m:<\/strong> Docker gibi konteyner teknolojileri kullanarak uygulaman\u0131z\u0131 daha kolay da\u011f\u0131tabilir ve y\u00f6netebilirsiniz. Periyodik veritaban\u0131 yedeklemeleri ve sistem g\u00fcncellemeleri, sistemin sa\u011fl\u0131kl\u0131 \u00e7al\u0131\u015fmas\u0131 i\u00e7in hayati \u00f6neme sahiptir.<\/li>\n<\/ul>\n<p>Warp Agent, \"Flask uygulamas\u0131n\u0131 Dockerize et ve \u00fcretim ortam\u0131 i\u00e7in yap\u0131land\u0131rma dosyalar\u0131n\u0131 olu\u015ftur\" veya \"Ge\u00e7mi\u015f kavurma verilerini kullanarak kavurma s\u00fcrecini optimize eden bir makine \u00f6\u011frenimi modeli i\u00e7in Python kodu yaz\" gibi komutlarla bu ileri d\u00fczey ad\u0131mlarda da size destek olabilir. Bu, projenizin sadece \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakla kalmayacak, ayn\u0131 zamanda s\u00fcrekli olarak \u00f6\u011frenmesini ve geli\u015fmesini de m\u00fcmk\u00fcn k\u0131lacakt\u0131r.<\/p>\n<h2>Sonu\u00e7: Ak\u0131ll\u0131 Kahve Kavurucunuzla Gelece\u011fe Bir Ad\u0131m Daha<\/h2>\n<p>Evde kahve kavurmak, tutku ve sab\u0131r gerektiren bir sanatt\u0131r. Bu makale boyunca, bu sanat\u0131 bilimle harmanlayarak, ev kahve kavurucunuzu Master Control Program (MCP) sunucular\u0131 arac\u0131l\u0131\u011f\u0131yla nas\u0131l ak\u0131ll\u0131 ve otomatize bir sisteme d\u00f6n\u00fc\u015ft\u00fcrebilece\u011fimizi ad\u0131m ad\u0131m inceledik. Geleneksel geli\u015ftirme s\u00fcre\u00e7lerinin getirdi\u011fi zorluklar\u0131 a\u015fmak i\u00e7in Warp Agent gibi ajan tabanl\u0131 geli\u015ftirme ara\u00e7lar\u0131n\u0131n ne denli g\u00fc\u00e7l\u00fc bir yard\u0131mc\u0131 olabilece\u011fini g\u00f6rd\u00fck. Donan\u0131m se\u00e7iminden MQTT ile ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na, PID kontrol algoritmalar\u0131ndan kullan\u0131c\u0131 dostu web aray\u00fczlerine ve hatta mobil uyumlulu\u011fa kadar projenin t\u00fcm kritik bile\u015fenlerini ele ald\u0131k. Her ad\u0131mda Warp Agent'\u0131n, karma\u015f\u0131k kod iskeletlerini olu\u015fturarak, API rotalar\u0131n\u0131 tan\u0131mlayarak ve hatta kontrol algoritmalar\u0131 i\u00e7in temel kod par\u00e7ac\u0131klar\u0131 sunarak geli\u015ftirme y\u00fck\u00fcn\u00fc nas\u0131l hafifletti\u011fine tan\u0131k olduk.<\/p>\n<p>Bu yolculuk, sadece daha tutarl\u0131 ve lezzetli kahveler kavurman\u0131z\u0131 sa\u011flamakla kalmayacak, ayn\u0131 zamanda modern IoT ve yaz\u0131l\u0131m geli\u015ftirme metodolojilerini pratik bir \u00f6rnek \u00fczerinden deneyimlemenize olanak tan\u0131yacakt\u0131r. Toplanan verilerle s\u00fcrekli optimizasyon ve gelecekte yapay zeka destekli adaptif kavurma yetenekleri ekleme potansiyeli, bu projenin sadece bir ba\u015flang\u0131\u00e7 oldu\u011funu g\u00f6stermektedir. Kendi kahve kavurma laboratuvar\u0131n\u0131z\u0131 kurarak, hem kahveye olan tutkunuzu besleyecek hem de teknolojik becerilerinizi geli\u015ftireceksiniz. Ak\u0131ll\u0131 kahve kavurucunuzla, her fincanda m\u00fckemmelli\u011fe bir ad\u0131m daha yakla\u015f\u0131n!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n<h4>Warp Agent kullanmak bu projeyi geli\u015ftirmek i\u00e7in zorunlu mu?<\/h4>\n<p>Hay\u0131r, zorunlu de\u011fil. Ancak Warp Agent gibi ajan tabanl\u0131 geli\u015ftirme ara\u00e7lar\u0131, sistem mimarisini tasarlamaktan kod iskeletini olu\u015fturmaya kadar bir\u00e7ok a\u015famada size b\u00fcy\u00fck zaman kazand\u0131r\u0131r ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r. Derinlemesine kodlama bilgisi olmayanlar veya projenin ba\u015flang\u0131c\u0131n\u0131 h\u0131zland\u0131rmak isteyenler i\u00e7in \u00e7ok faydal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n<h4>Bu projeye ba\u015flamak i\u00e7in hangi donan\u0131mlara ihtiyac\u0131m var?<\/h4>\n<p>Temel olarak, bir ev kahve kavurucusu (modifiye edilebilir), ESP32 gibi bir mikrodenetleyici, K-Tipi termokupllar (MAX6675\/MAX31855 mod\u00fclleriyle), SSR (Kat\u0131 Hal R\u00f6lesi) ve bir DC motor s\u00fcr\u00fcc\u00fcs\u00fc (tambur motoru i\u00e7in) gibi bile\u015fenlere ihtiyac\u0131n\u0131z olacakt\u0131r. Ayr\u0131ca, MCP sunucusunu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir Raspberry Pi veya benzeri k\u00fc\u00e7\u00fck bir bilgisayar gereklidir.<\/p>\n<\/li>\n<li>\n<h4>Veri g\u00fcvenli\u011fi nas\u0131l sa\u011flan\u0131r?<\/h4>\n<p>Veri g\u00fcvenli\u011fi i\u00e7in API endpoint'lerine kimlik do\u011frulama (\u00f6rne\u011fin JWT token'lar), aktar\u0131lan veriler i\u00e7in HTTPS\/TLS \u015fifrelemesi ve MQTT broker'\u0131n\u0131z\u0131n g\u00fcvenli yap\u0131land\u0131r\u0131lmas\u0131 \u00f6nemlidir. Ayr\u0131ca, sunucunuzun ve a\u011f\u0131n\u0131z\u0131n d\u0131\u015far\u0131dan yetkisiz eri\u015fime kar\u015f\u0131 korunmas\u0131 gerekir.<\/p>\n<\/li>\n<li>\n<h4>Bu projeye ba\u015flamak i\u00e7in ne kadar kodlama bilgisi gerekir?<\/h4>\n<p>Temel d\u00fczeyde Python (Flask) ve Arduino\/ESP32 (C++) bilgisi faydal\u0131 olacakt\u0131r. Ancak Warp Agent gibi ara\u00e7lar sayesinde, kod iskeletini olu\u015fturma ve baz\u0131 karma\u015f\u0131k algoritmalar\u0131 entegre etme s\u00fcre\u00e7leri sizin i\u00e7in basitle\u015ftirilir, bu da daha az deneyimli geli\u015ftiricilerin bile projeye ba\u015flamas\u0131na olanak tan\u0131r.<\/p>\n<\/li>\n<li>\n<h4>Bu projenin yakla\u015f\u0131k maliyeti ne olur?<\/h4>\n<p>Maliyetler, mevcut bir kahve kavurucunuz olup olmad\u0131\u011f\u0131na ve se\u00e7ti\u011finiz donan\u0131m bile\u015fenlerinin kalitesine g\u00f6re de\u011fi\u015fir. Mikrodenetleyici (ESP32), sens\u00f6rler, r\u00f6leler ve bir Raspberry Pi gibi temel elektronik bile\u015fenler genellikle 100-200 USD aral\u0131\u011f\u0131nda olabilir. E\u011fer s\u0131f\u0131rdan bir kavurucu da alman\u0131z gerekirse, maliyet artacakt\u0131r. Yaz\u0131l\u0131m taraf\u0131nda ise \u00e7o\u011fu ara\u00e7 a\u00e7\u0131k kaynak oldu\u011fu i\u00e7in ek bir maliyet olu\u015fmayacakt\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-33420","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131<\/title>\n<meta name=\"description\" content=\"Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev kahve kavurucunuzu otomatize etmek i\u00e7in Master Control Program (MCP) sunucular\u0131 kurma s\u00fcrecine odaklan\u0131yor ve bu yolculu\u011fu, yapay zeka destekli geli\u015ftirme ajan\u0131 Warp Agent ile nas\u0131l h\u0131zland\u0131rabilece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. Proje geli\u015ftirme s\u00fcre\u00e7lerinizi optimize ederken, kahve kavurma kalitenizi nas\u0131l bir \u00fcst seviyeye ta\u015f\u0131yabilece\u011finizi ke\u015ffedin!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131\" \/>\n<meta property=\"og:description\" content=\"Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev kahve kavurucunuzu otomatize etmek i\u00e7in Master Control Program (MCP) sunucular\u0131 kurma s\u00fcrecine odaklan\u0131yor ve bu yolculu\u011fu, yapay zeka destekli geli\u015ftirme ajan\u0131 Warp Agent ile nas\u0131l h\u0131zland\u0131rabilece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. Proje geli\u015ftirme s\u00fcre\u00e7lerinizi optimize ederken, kahve kavurma kalitenizi nas\u0131l bir \u00fcst seviyeye ta\u015f\u0131yabilece\u011finizi ke\u015ffedin!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-02T15:02:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"36 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131\",\"datePublished\":\"2025-11-02T15:02:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/\"},\"wordCount\":5186,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/\",\"name\":\"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-02T15:02:53+00:00\",\"description\":\"Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev kahve kavurucunuzu otomatize etmek i\u00e7in Master Control Program (MCP) sunucular\u0131 kurma s\u00fcrecine odaklan\u0131yor ve bu yolculu\u011fu, yapay zeka destekli geli\u015ftirme ajan\u0131 Warp Agent ile nas\u0131l h\u0131zland\u0131rabilece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. Proje geli\u015ftirme s\u00fcre\u00e7lerinizi optimize ederken, kahve kavurma kalitenizi nas\u0131l bir \u00fcst seviyeye ta\u015f\u0131yabilece\u011finizi ke\u015ffedin!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131","description":"Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev kahve kavurucunuzu otomatize etmek i\u00e7in Master Control Program (MCP) sunucular\u0131 kurma s\u00fcrecine odaklan\u0131yor ve bu yolculu\u011fu, yapay zeka destekli geli\u015ftirme ajan\u0131 Warp Agent ile nas\u0131l h\u0131zland\u0131rabilece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. Proje geli\u015ftirme s\u00fcre\u00e7lerinizi optimize ederken, kahve kavurma kalitenizi nas\u0131l bir \u00fcst seviyeye ta\u015f\u0131yabilece\u011finizi ke\u015ffedin!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/","og_locale":"tr_TR","og_type":"article","og_title":"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131","og_description":"Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev kahve kavurucunuzu otomatize etmek i\u00e7in Master Control Program (MCP) sunucular\u0131 kurma s\u00fcrecine odaklan\u0131yor ve bu yolculu\u011fu, yapay zeka destekli geli\u015ftirme ajan\u0131 Warp Agent ile nas\u0131l h\u0131zland\u0131rabilece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. Proje geli\u015ftirme s\u00fcre\u00e7lerinizi optimize ederken, kahve kavurma kalitenizi nas\u0131l bir \u00fcst seviyeye ta\u015f\u0131yabilece\u011finizi ke\u015ffedin!","og_url":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-02T15:02:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"36 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131","datePublished":"2025-11-02T15:02:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/"},"wordCount":5186,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/","url":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/","name":"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-02T15:02:53+00:00","description":"Kendi evinizde kusursuz kahve kavurmak, bir sanat ve bilim harman\u0131d\u0131r. Ancak tutarl\u0131l\u0131\u011f\u0131 yakalamak zorlay\u0131c\u0131 olabilir. Bu makale, ev kahve kavurucunuzu otomatize etmek i\u00e7in Master Control Program (MCP) sunucular\u0131 kurma s\u00fcrecine odaklan\u0131yor ve bu yolculu\u011fu, yapay zeka destekli geli\u015ftirme ajan\u0131 Warp Agent ile nas\u0131l h\u0131zland\u0131rabilece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. Proje geli\u015ftirme s\u00fcre\u00e7lerinizi optimize ederken, kahve kavurma kalitenizi nas\u0131l bir \u00fcst seviyeye ta\u015f\u0131yabilece\u011finizi ke\u015ffedin!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ev-kahve-kavurucu-kontrolu-warp-agent-ile-akilli-mcp-sunuculari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ev Kahve Kavurucu Kontrol\u00fc: Warp Agent ile Ak\u0131ll\u0131 MCP Sunucular\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33420","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33420"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33420\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}