{"config":{"lang":["tr","en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"node-red-trexmes-service","text":"trexMes Edge i\u00e7in Node-RED Servis Paketi <p>       Versiyon 1.6.2 \u00b7 GPL-3.0-or-later \u00b7 Asaf Yurdakul     </p> <p><code>node-red-trexmes-service</code>, trexMes Edge panel yaz\u0131l\u0131m\u0131nda \u00e7al\u0131\u015fan Node-RED konnekt\u00f6r eklentisi ile haberle\u015fen, ger\u00e7ek zamanl\u0131 olay (event) yakalama, form tasar\u0131m\u0131 ve kontrol y\u00f6netimi sa\u011flayan bir Node-RED paketidir.</p> <p>Bu paket ne i\u015fe yarar?</p> <p>\u00dcretim sahas\u0131ndaki 150-200 trexMes panelinden gelen olay tetikleyicilerini tek bir Node-RED sunucusunda toplar, ger\u00e7ek zamanl\u0131 WinForm tasar\u0131mlar\u0131 yapabilmenizi sa\u011flar ve panel \u00fczerindeki kontrolleri Node-RED ak\u0131\u015flar\u0131n\u0131zdan y\u00f6netmenize olanak tan\u0131r.</p>"},{"location":"#hzl-baks","title":"H\u0131zl\u0131 Bak\u0131\u015f","text":"\ud83d\udce6 Kurulum <p>Paketi Node-RED'e nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ve \u00f6n gereklilikleri \u00f6\u011frenin.</p> \ud83d\ude80 H\u0131zl\u0131 Ba\u015flang\u0131\u00e7 <p>\u0130lk ak\u0131\u015f\u0131n\u0131z\u0131 5 dakikada aya\u011fa kald\u0131r\u0131n.</p> \ud83c\udfd7\ufe0f Mimari <p>Paket nas\u0131l \u00e7al\u0131\u015f\u0131r, hangi node hangi rol\u00fc \u00fcstlenir?</p> \ud83d\udcda Node Referans\u0131 <p>22 node i\u00e7in detayl\u0131 \u00f6zellik ve kullan\u0131m dok\u00fcmanlar\u0131.</p> \ud83d\udca1 \u00d6rnekler <p>Haz\u0131r ak\u0131\u015f \u00f6rnekleri ve kullan\u0131m senaryolar\u0131.</p> \u2753 SSS <p>S\u0131k\u00e7a sorulan sorular ve sorun giderme.</p>"},{"location":"#nodlara-genel-baks","title":"Nodlara Genel Bak\u0131\u015f","text":"<p>Paket toplam 22 Node-RED node tipi kaydeder ve bunlar\u0131 5 mant\u0131ksal gruba ay\u0131r\u0131r:</p>"},{"location":"#cekirdek-nodlar-2","title":"\ud83d\udfe2 \u00c7ekirdek Nodlar (2)","text":"<p>Her trexMes projesinde mutlaka bulunmas\u0131 gereken altyap\u0131 node'lar\u0131.</p> <p>trex Subscriber Responser</p>"},{"location":"#olay-event-nodlar-8","title":"\ud83d\udd14 Olay (Event) Nodlar\u0131 (8)","text":"<p>trexMes panelinden g\u00f6nderilen olay tipine g\u00f6re trigger sa\u011flayan node'lar. <code>Handle Setter</code>, <code>IsHandled</code> \u00f6zelli\u011fi olan Event node'lar\u0131n\u0131 i\u00e7eren ak\u0131\u015flarda zincirin son trexMes node'u olarak kullan\u0131l\u0131r.</p> <p>Business Events System Events Communication Events Display Events Form Events Display Methods Method Returns Handle Setter</p>"},{"location":"#form-nodlar-5","title":"\ud83e\udde9 Form Nodlar\u0131 (5)","text":"<p>Custom form tasar\u0131m\u0131, kontrol ba\u011flama ve \u00f6zellik y\u00f6netimi.</p> <p>Custom Form Form Bind Controls Control Properties Button Configurator Main Form Action</p>"},{"location":"#islem-nodlar-3","title":"\u2699\ufe0f \u0130\u015flem Nodlar\u0131 (3)","text":"<p>Method \u00e7a\u011f\u0131rma, process tetikleme ve script \u00e7al\u0131\u015ft\u0131rma.</p> <p>Method Invoker Execute Process Execute Script</p>"},{"location":"#yapay-zeka-1","title":"\ud83e\udd16 Yapay Zek\u00e2 (1)","text":"<p>LLM tabanl\u0131 otomatik ak\u0131\u015f \u00fcretici.</p> <p>LLM Flow Builder</p>"},{"location":"#tipik-bir-aksn-gorunumu","title":"Tipik Bir Ak\u0131\u015f\u0131n G\u00f6r\u00fcn\u00fcm\u00fc","text":"<p><code>trex Subscriber</code> ak\u0131\u015ftan ba\u011f\u0131ms\u0131z durur; di\u011fer node'lar\u0131 tetiklemez. Olay ak\u0131\u015flar\u0131 do\u011frudan Event node'lar\u0131ndan ba\u015flar.</p> <pre><code>flowchart LR\n    subgraph Kay\u0131t[\"Kay\u0131t (ba\u011f\u0131ms\u0131z)\"]\n        A[trex Subscriber]\n        DBG[debug\\nopsiyonel]\n        A --&gt; DBG\n    end\n\n    subgraph Akis[\"Olay Ak\u0131\u015f\u0131\"]\n        B[Business Events] --&gt; C[Custom Form]\n        C --&gt; D[Form Bind Controls]\n        D --&gt; E[Responser]\n    end\n\n    style A fill:#58d68d,color:#000\n    style DBG fill:#87ceeb,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000</code></pre> <p>Ak\u0131\u015f kural\u0131</p> <p>Her trexMes projesinde bir adet <code>trex Subscriber</code> bulunmak zorundad\u0131r. Bu node ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015f\u0131r; \u00e7\u0131k\u0131\u015f\u0131na <code>debug</code> ba\u011flan\u0131rsa ba\u011fl\u0131 trexEdge PC'lerin IP'lerini ve panele bildirilen event listesini g\u00f6r\u00fcnt\u00fcleyebilirsiniz. Olay ak\u0131\u015flar\u0131 Event node'lar\u0131ndan ba\u015flar; <code>Responser</code> ile biter.</p>"},{"location":"#gereksinimler","title":"Gereksinimler","text":"Bile\u015fen Minimum S\u00fcr\u00fcm Node.js 18.16+ Node-RED 3.0+ trexMes Edge Node-RED konnekt\u00f6r eklentisi etkin"},{"location":"#lisans-yazar","title":"Lisans &amp; Yazar","text":"<p>Bu paket GPL-3.0-or-later lisans\u0131 alt\u0131nda da\u011f\u0131t\u0131lmaktad\u0131r.</p> <p>Geli\u015ftirici: Asaf Yurdakul \u00b7 trex Digital Manufacturing</p>"},{"location":"degisiklik-gunlugu/","title":"S\u00fcr\u00fcm Notlar\u0131","text":"<p><code>node-red-trexmes-service</code> paketinin s\u00fcr\u00fcm bilgileri.</p>"},{"location":"degisiklik-gunlugu/#gecerli-surum","title":"Ge\u00e7erli S\u00fcr\u00fcm","text":""},{"location":"degisiklik-gunlugu/#v162","title":"v1.6.2","text":"<p>Paketin bu dok\u00fcmantasyonda kapsaml\u0131 olarak ele al\u0131nan g\u00fcncel s\u00fcr\u00fcm\u00fcd\u00fcr.</p>"},{"location":"degisiklik-gunlugu/#temel-ozellikler","title":"Temel \u00d6zellikler","text":"<ul> <li>22 Node-RED node tipi (7 event, 5 form, 3 i\u015flem, 3 \u00e7ekirdek, 1 AI, ve config node'lar\u0131)</li> <li>Custom Form Designer entegrasyonu (<code>customFormDesigner.exe</code>)</li> <li>Method Invoker asenkron Promise.all i\u015fleme</li> <li>LLM Flow Builder ile 6 LLM sa\u011flay\u0131c\u0131 preset'i (OpenAI, Anthropic, Gemini, DeepSeek, Mistral, Groq)</li> <li>Multi-panel destek (150-200 panel ayn\u0131 anda)</li> <li>T\u00fcrk\u00e7e/\u0130ngilizce yerelle\u015ftirme (en-US locale)</li> <li>Statik assets servisi (<code>assets/button-configurator.png</code>)</li> </ul>"},{"location":"degisiklik-gunlugu/#teknik-stack","title":"Teknik Stack","text":"Bile\u015fen S\u00fcr\u00fcm Node.js 18.16+ Node-RED 3.0+ Lisans GPL-3.0-or-later Yazar Asaf Yurdakul Repo GitHub"},{"location":"degisiklik-gunlugu/#bilinen-durumlar","title":"Bilinen Durumlar","text":"<ul> <li>Custom Form Designer yaln\u0131zca Windows'ta \u00e7al\u0131\u015f\u0131r (.exe).</li> <li>LLM API kullan\u0131m\u0131 \u00fccretlidir, harici sa\u011flay\u0131c\u0131lar\u0131n maliyetine tabidir.</li> </ul>"},{"location":"degisiklik-gunlugu/#surum-gecmisi","title":"S\u00fcr\u00fcm Ge\u00e7mi\u015fi","text":"<p>Ge\u00e7mi\u015f s\u00fcr\u00fcm detaylar\u0131</p> <p>1.6.2 \u00f6ncesi s\u00fcr\u00fcmlere ait detayl\u0131 changelog i\u00e7in GitHub Releases sayfas\u0131n\u0131 ziyaret edin.</p>"},{"location":"degisiklik-gunlugu/#genel-versiyon-semas","title":"Genel Versiyon \u015eemas\u0131","text":"<p><code>MAJOR.MINOR.PATCH</code> semantik versiyonlama kullan\u0131l\u0131r:</p> <ul> <li>MAJOR: API'de geriye d\u00f6n\u00fck uyumsuz de\u011fi\u015fiklik</li> <li>MINOR: Yeni node tipi veya \u00f6zellik eklemesi (geriye uyumlu)</li> <li>PATCH: Bug fix, performans iyile\u015ftirme</li> </ul>"},{"location":"degisiklik-gunlugu/#guncelleme-notlar","title":"G\u00fcncelleme Notlar\u0131","text":""},{"location":"degisiklik-gunlugu/#genel-guncelleme","title":"Genel G\u00fcncelleme","text":"<pre><code>cd ~/.node-red\nnpm update node-red-trexmes-service\n</code></pre>"},{"location":"degisiklik-gunlugu/#major-surum-guncellemesi","title":"Major S\u00fcr\u00fcm G\u00fcncellemesi","text":"<p>Major s\u00fcr\u00fcm ge\u00e7i\u015flerinde mutlaka:</p> <ol> <li>Geli\u015ftirme ortam\u0131nda \u00f6nce test edin</li> <li>Mevcut ak\u0131\u015flar\u0131n\u0131z\u0131 yedekleyin (<code>~/.node-red/flows*.json</code> dosyalar\u0131)</li> <li>S\u00fcr\u00fcm notlar\u0131ndaki breaking changes b\u00f6l\u00fcm\u00fcn\u00fc dikkatle okuyun</li> <li>trexMes Edge taraf\u0131n\u0131n uyumlu s\u00fcr\u00fcm oldu\u011funu do\u011frulay\u0131n</li> </ol>"},{"location":"degisiklik-gunlugu/#geri-donus-downgrade","title":"Geri D\u00f6n\u00fc\u015f (Downgrade)","text":"<p>Sorun ya\u015farsan\u0131z belirli bir s\u00fcr\u00fcme d\u00f6nmek i\u00e7in:</p> <pre><code>npm install node-red-trexmes-service@1.6.1\n</code></pre>"},{"location":"degisiklik-gunlugu/#yol-haritas-roadmap","title":"Yol Haritas\u0131 (Roadmap)","text":"<p>A\u015fa\u011f\u0131daki \u00f6zellikler topluluk geri bildirimine ba\u011fl\u0131 olarak de\u011ferlendirilmektedir:</p> <ul> <li> Linux'ta \u00e7al\u0131\u015fan Form Designer alternatifi</li> <li> Yerle\u015fik ak\u0131\u015f \u015fablonu (template) galerisi</li> <li> OpenTelemetry tabanl\u0131 performans metrikleri</li> <li> Daha fazla LLM sa\u011flay\u0131c\u0131 preset'i</li> </ul> <p>\u00d6zellik \u00f6nerisi</p> <p>Eklenmesini istedi\u011finiz bir \u00f6zellik var m\u0131? GitHub Issues \u00fczerinden bizimle payla\u015f\u0131n.</p>"},{"location":"degisiklik-gunlugu/#bagmllklar","title":"Ba\u011f\u0131ml\u0131l\u0131klar","text":"<p><code>v1.6.2</code> itibar\u0131yla paketin ba\u011fl\u0131 oldu\u011fu npm paketleri:</p> Paket Ama\u00e7 <code>express</code> HTTP routing <code>multer</code> Multipart form data <code>raw-body@3</code> Request body parsing <code>cookie@0.7</code> Cookie i\u015fleme di\u011fer Detay i\u00e7in <code>package.json</code>'a bak\u0131n"},{"location":"degisiklik-gunlugu/#gelistirici","title":"Geli\u015ftirici","text":"<p>Asaf Yurdakul \u2014 trex Digital Manufacturing</p> <ul> <li>GitHub: @asafyurdakul</li> <li>LinkedIn: trex \u00fczerinden ula\u015f\u0131labilir</li> <li>Paket: npm</li> <li>Flow Library: Node-RED Flows</li> </ul>"},{"location":"degisiklik-gunlugu/#lisans","title":"Lisans","text":"<p>GPL-3.0-or-later</p>"},{"location":"sss/","title":"S\u0131k\u00e7a Sorulan Sorular (SSS)","text":""},{"location":"sss/#kurulum-baglant","title":"Kurulum &amp; Ba\u011flant\u0131","text":""},{"location":"sss/#s-paketi-kurdum-ama-palettete-gorunmuyor","title":"S: Paketi kurdum ama palette'te g\u00f6r\u00fcnm\u00fcyor?","text":"<p>Node-RED'i yeniden ba\u015flat\u0131n. E\u011fer h\u00e2l\u00e2 g\u00f6r\u00fcnm\u00fcyorsa:</p> <pre><code>cd ~/.node-red\nnpm list node-red-trexmes-service\n</code></pre> <p>ile paketin ger\u00e7ekten y\u00fckl\u00fc oldu\u011fundan emin olun. Yoksa:</p> <pre><code>npm install node-red-trexmes-service\n</code></pre>"},{"location":"sss/#s-cookie072-not-found-hatas-alyorum","title":"S: <code>cookie@0.7.2 not found</code> hatas\u0131 al\u0131yorum","text":"<p>Node.js s\u00fcr\u00fcm\u00fcn\u00fcz \u00e7ok eski. Node.js 18.16 veya \u00fczeri kullan\u0131n:</p> <pre><code>node --version  # v18.16.0+ olmal\u0131\n</code></pre>"},{"location":"sss/#s-trex-subscriber-triggered-ckmyor","title":"S: <code>trex Subscriber</code> \"Triggered\" \u00e7\u0131km\u0131yor","text":"<ul> <li>trexMes Edge'de Node-RED Connector eklentisi etkin mi?</li> <li>Panel'in Node-RED IP/port ayar\u0131 do\u011fru mu?</li> <li>Node-RED <code>httpNodeRoot</code> ayar\u0131 varsay\u0131lan (<code>/</code>) mu?</li> <li>Taray\u0131c\u0131dan <code>http://&lt;node-red-host&gt;:1880/GetSubscribed</code> denenince cevap geliyor mu?</li> </ul>"},{"location":"sss/#s-birden-fazla-trex-subscriber-koyabilir-miyim","title":"S: Birden fazla <code>trex Subscriber</code> koyabilir miyim?","text":"<p>Hay\u0131r. Ayn\u0131 Node-RED kurulumunda yaln\u0131zca bir tane olmal\u0131d\u0131r. Birden fazla varsa HTTP path \u00e7ak\u0131\u015fmas\u0131 olur ve panel kay\u0131t listesi kar\u0131\u015f\u0131r.</p>"},{"location":"sss/#olay-event-sorunlar","title":"Olay (Event) Sorunlar\u0131","text":""},{"location":"sss/#s-olay-nodeum-trigger-almyor","title":"S: Olay node'um trigger alm\u0131yor","text":"<p>Kontrol edin:</p> <ol> <li><code>trex Subscriber</code> deploy edildi mi? Triggered \u00e7\u0131kt\u0131 m\u0131?</li> <li>Event ismi panel taraf\u0131yla birebir mi e\u015fle\u015fiyor (b\u00fcy\u00fck/k\u00fc\u00e7\u00fck harf!)?</li> <li>Panel taraf\u0131nda olay ger\u00e7ekten tetikleniyor mu? (Panel log'una bak\u0131n)</li> <li>Ak\u0131\u015f\u0131 deploy ettiniz mi?</li> </ol>"},{"location":"sss/#s-ayn-olay-birden-fazla-aksta-yakalayabilir-miyim","title":"S: Ayn\u0131 olay\u0131 birden fazla ak\u0131\u015fta yakalayabilir miyim?","text":"<p>Yaln\u0131zca <code>Business Events</code> node'u ile m\u00fcmk\u00fcnd\u00fcr. Di\u011fer Event node t\u00fcrleri (<code>System Events</code>, <code>Form Events</code> vb.) ayn\u0131 olay ad\u0131yla birden fazla kullan\u0131lamaz.</p> <p><code>Business Events</code>'te bu, <code>suffix</code> alan\u0131 arac\u0131l\u0131\u011f\u0131yla sa\u011flan\u0131r. Ayn\u0131 olay\u0131 yakalayacak her ek node'a benzersiz bir suffix de\u011feri (<code>_2</code>, <code>_3</code> gibi) verilmesi yeterlidir:</p> Node <code>event</code> <code>suffix</code> 1. node <code>OnPlanLoaded</code> (bo\u015f) 2. node <code>OnPlanLoaded</code> <code>_2</code> <p>Panel <code>OnPlanLoaded</code>'\u0131 tetikledi\u011finde her iki node da devreye girer ve kendi ak\u0131\u015f\u0131n\u0131 ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015ft\u0131r\u0131r. Her ak\u0131\u015f\u0131n sonunda bir <code>Responser</code> bulunmal\u0131d\u0131r; birden fazla dal tek bir <code>Responser</code>'a ba\u011flanabilir.</p>"},{"location":"sss/#s-ishandled-ne-zaman-true-ne-zaman-false","title":"S: <code>ishandled</code> ne zaman <code>true</code>, ne zaman <code>false</code>?","text":"<ul> <li><code>true</code> \u2192 \"Bu olay\u0131 biz i\u015fledik, panel kendi default handler'\u0131n\u0131 \u00c7ALI\u015eTIRMASIN.\"</li> <li><code>false</code> \u2192 \"Panel kendi default handler'\u0131n\u0131 da \u00e7al\u0131\u015ft\u0131rs\u0131n.\"</li> </ul> <p>Ak\u0131\u015f ortas\u0131nda dinamik karar verecekseniz Handle Setter kullan\u0131n.</p>"},{"location":"sss/#custom-form-designer","title":"Custom Form &amp; Designer","text":""},{"location":"sss/#s-custom-form-designer-calsmyor","title":"S: Custom Form Designer \u00e7al\u0131\u015fm\u0131yor","text":"<ol> <li><code>settings.js</code> i\u00e7inde <code>customFormDesignerPath</code> tan\u0131ml\u0131 m\u0131?</li> <li>Bu yoldaki .exe ger\u00e7ekten var m\u0131?</li> <li>Node-RED'in bu dosyay\u0131 \u00e7al\u0131\u015ft\u0131rma izni var m\u0131?</li> <li>Designer \u00e7\u0131kt\u0131s\u0131n\u0131n yaz\u0131laca\u011f\u0131 <code>C:\\temp\\</code> klas\u00f6r\u00fc eri\u015filebilir mi?</li> </ol> <pre><code>// settings.js i\u00e7inde olmal\u0131\nfunctionGlobalContext: {\n    customFormDesignerPath: \"C:\\\\trex\\\\tools\\\\customFormDesigner.exe\"\n}\n</code></pre>"},{"location":"sss/#s-form-panelde-aclyor-ama-alanlar-bos","title":"S: Form panelde a\u00e7\u0131l\u0131yor ama alanlar bo\u015f","text":"<p>Yayg\u0131n nedenler:</p> <ol> <li><code>Form Bind Controls</code>'taki <code>props</code> listesindeki kontrol isimleri XML'deki ile e\u015fle\u015fmiyor (b\u00fcy\u00fck/k\u00fc\u00e7\u00fck harf!)</li> <li><code>data</code> ve <code>dataType</code> do\u011fru veri kayna\u011f\u0131n\u0131 g\u00f6stermiyor</li> <li><code>Form Bind Controls</code> ak\u0131\u015fta <code>Custom Form</code>'dan sonra geliyor mu? (\u00d6nce form, sonra ba\u011flama!)</li> </ol>"},{"location":"sss/#s-custom-form-xmlimi-nasl-versiyonlamalym","title":"S: Custom Form XML'imi nas\u0131l versiyonlamal\u0131y\u0131m?","text":"<p><code>customformxml</code> alan\u0131n\u0131 bo\u015f b\u0131rak\u0131p <code>Form Design</code> config node kullan\u0131n. Tasar\u0131mlar\u0131n\u0131z flow JSON'una dahil olur ve Git'te de\u011fi\u015fiklikleri takip edebilirsiniz.</p>"},{"location":"sss/#s-formainform-true-ne-zaman-kullanlr","title":"S: <code>formainform: true</code> ne zaman kullan\u0131l\u0131r?","text":"<p>Modal dialog (ayr\u0131 pencere) yerine panelin ana ekran\u0131 \u00fczerinde form basmak istiyorsan\u0131z. <code>formname</code> otomatik olarak <code>\"AppForm\"</code> olur.</p>"},{"location":"sss/#property-buton","title":"Property &amp; Buton","text":""},{"location":"sss/#s-control-propertiesle-butonu-disable-ettim-ama-hala-baslabiliyor","title":"S: <code>Control Properties</code>'le butonu disable ettim ama hala bas\u0131labiliyor","text":"<ul> <li>Property ad\u0131n\u0131 PascalCase ile yazd\u0131\u011f\u0131n\u0131zdan emin olun: <code>Enabled</code> \u2260 <code>enabled</code></li> <li><code>dataType: bool</code> se\u00e7tiniz mi?</li> <li><code>d</code> alan\u0131na ger\u00e7ekten <code>\"true\"</code>/<code>\"false\"</code> (string) yazd\u0131n\u0131z m\u0131?</li> </ul>"},{"location":"sss/#s-buton-tklamasn-yakalayamyorum","title":"S: Buton t\u0131klamas\u0131n\u0131 yakalayam\u0131yorum","text":"<p><code>Button Configurator</code>'da o buton i\u00e7in <code>e</code> (IsToOverrideDefaultHandler) <code>true</code> olmal\u0131. Aksi takdirde panel default handler \u00e7al\u0131\u015f\u0131r, sizin ak\u0131\u015f\u0131n\u0131z tetiklenmez.</p>"},{"location":"sss/#s-buton-indeks-numaralar-nereden-bakacagm","title":"S: Buton indeks numaralar\u0131 nereden bakaca\u011f\u0131m?","text":"<p>Button Configurator sayfas\u0131ndaki g\u00f6rselde t\u00fcm buton indeksleri g\u00f6r\u00fcnmektedir. G\u00f6rsel paket i\u00e7inde <code>assets/button-configurator.png</code> olarak da bulunur.</p>"},{"location":"sss/#method-invoker-returns","title":"Method Invoker &amp; Returns","text":""},{"location":"sss/#s-methodu-cagrdm-ama-cevap-gelmiyor","title":"S: Method'u \u00e7a\u011f\u0131rd\u0131m ama cevap gelmiyor","text":"<ol> <li><code>Method Returns</code> node'u eklediniz mi?</li> <li><code>methodname</code> (Returns'te) ile <code>method</code> (Invoker'da) ayn\u0131 m\u0131?</li> <li>Panel taraf\u0131 ger\u00e7ekten cevap d\u00f6n\u00fcyor mu? (panel log'lar\u0131na bak\u0131n)</li> </ol>"},{"location":"sss/#s-jsonata-ifademde-hata-var","title":"S: JSONata ifademde hata var","text":"<p>\u00d6nce ba\u015fka bir ak\u0131\u015fta <code>change</code> node ile JSONata ifadenizi test edin. Do\u011fru sonucu verdi\u011finden emin olduktan sonra <code>Method Invoker</code> veya <code>Control Properties</code> i\u00e7ine yap\u0131\u015ft\u0131r\u0131n.</p>"},{"location":"sss/#s-parametre-olarak-null-gondermem-gerek","title":"S: Parametre olarak null g\u00f6ndermem gerek","text":"<p><code>dataType: json</code> se\u00e7ip <code>d</code> alan\u0131na <code>null</code> yazabilirsiniz. Veya ak\u0131\u015fta <code>flow</code> context'e <code>null</code> koyup <code>dataType: flow</code> ile okutabilirsiniz.</p>"},{"location":"sss/#responser","title":"Responser","text":""},{"location":"sss/#s-aksm-timeout-veriyor","title":"S: Ak\u0131\u015f\u0131m timeout veriyor","text":"<p>\u00c7o\u011funlukla <code>Responser</code> eksik demektir. T\u00fcm olay ak\u0131\u015flar\u0131n\u0131n sonunda bir <code>Responser</code> olmal\u0131. <code>trex Subscriber</code> istisnad\u0131r (kendi cevab\u0131n\u0131 y\u00f6netir).</p>"},{"location":"sss/#s-birden-fazla-responser-m-koymalym","title":"S: Birden fazla <code>Responser</code> m\u0131 koymal\u0131y\u0131m?","text":"<p>Gerekli de\u011fildir. Birden fazla dal tek bir <code>Responser</code>'a ba\u011flanabilir. Kesinlikle ka\u00e7\u0131n\u0131lmas\u0131 gereken durum, ayn\u0131 dalda pe\u015f pe\u015fe birden fazla <code>Responser</code> kullanmakt\u0131r; HTTP cevab\u0131 yaln\u0131zca bir kez g\u00f6nderilebilir.</p>"},{"location":"sss/#llm-flow-builder","title":"LLM Flow Builder","text":""},{"location":"sss/#s-api-anahtarm-nereye-girdim","title":"S: API anahtar\u0131m\u0131 nereye girdim?","text":"<p>Config node (<code>llm-flow-builder-config</code>) i\u00e7inde API Key alan\u0131na. Bu alan <code>password</code> tipinde oldu\u011fu i\u00e7in flow JSON export'unda g\u00f6r\u00fcnmez.</p>"},{"location":"sss/#s-uretilen-aks-json-parse-hatas-veriyor","title":"S: \u00dcretilen ak\u0131\u015f JSON parse hatas\u0131 veriyor","text":"<p>LLM bazen markdown code-fence (<code>```</code>) ile cevap d\u00f6nd\u00fcr\u00fcr. Node'un kendi temizleyicisi var ama bazen yetmez. \u00c7\u00f6z\u00fcm: <code>systemPrompt</code> alan\u0131na ekleyin: \"Cevab\u0131n\u0131 sadece valid JSON olarak ver, markdown formatlamadan.\"</p>"},{"location":"sss/#s-maliyet-kontrolu-nasl-yaparm","title":"S: Maliyet kontrol\u00fc nas\u0131l yapar\u0131m?","text":"<ul> <li>Geli\u015ftirme yaparken <code>autoDeploy: false</code> tutun</li> <li>Sistem prompt'unuzu k\u0131salt\u0131n (her \u00e7a\u011fr\u0131da g\u00f6nderilir)</li> <li>Daha ucuz modeller deneyin (\u00f6rn. <code>gpt-4o-mini</code>, <code>claude-3-5-haiku</code>)</li> <li>Test ak\u0131\u015flar\u0131n\u0131 s\u00fcrekli \u00e7al\u0131\u015ft\u0131rmaktan ka\u00e7\u0131n\u0131n</li> </ul>"},{"location":"sss/#performans","title":"Performans","text":""},{"location":"sss/#s-200-panel-ayn-anda-calsyor-node-red-yavaslad","title":"S: 200 panel ayn\u0131 anda \u00e7al\u0131\u015f\u0131yor, Node-RED yava\u015flad\u0131","text":"<ul> <li>Ak\u0131\u015f ba\u015f\u0131na 1-2 <code>debug</code> node'u b\u0131rak\u0131n, fazlas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131n</li> <li><code>Communication Events</code> gibi y\u00fcksek frekansl\u0131 node'larda <code>function</code> ile filtreleme yap\u0131n</li> <li>Node-RED projeyi m\u00fcmk\u00fcnse flow ba\u015f\u0131na ay\u0131r\u0131n, her panel grubu i\u00e7in ayr\u0131 flow tab</li> <li>Async i\u015flemleri <code>Method Invoker</code> ile yap\u0131n, fire-and-forget ile bloklamay\u0131n</li> </ul>"},{"location":"sss/#s-tek-bir-aks-5-saniye-suruyor","title":"S: Tek bir ak\u0131\u015f 5 saniye s\u00fcr\u00fcyor","text":"<p>Ak\u0131\u015f sonu <code>Responser</code> panele cevap d\u00f6nmedik\u00e7e panel beklemede kal\u0131r. Bu s\u00fcre b\u00fcy\u00fck olas\u0131l\u0131kla:</p> <ul> <li>Bir <code>function</code> node'unda async I/O</li> <li>Veritaban\u0131 sorgusu</li> <li>HTTP request</li> </ul> <p>\u00c7\u00f6z\u00fcm:</p> <ul> <li>E\u011fer cevab\u0131 ger\u00e7ekten beklemek gerekiyorsa: optimizasyon yap\u0131n (cache, paralel)</li> <li>Beklemek gerekmiyorsa: i\u015flemi <code>Method Invoker</code> ile fire-and-forget yap\u0131n, hemen <code>Responser</code> d\u00f6nd\u00fcr\u00fcn</li> </ul>"},{"location":"sss/#gelistirme-test","title":"Geli\u015ftirme &amp; Test","text":""},{"location":"sss/#s-aks-panelsiz-test-edebilir-miyim","title":"S: Ak\u0131\u015f\u0131 panelsiz test edebilir miyim?","text":"<p>Evet, ancak taray\u0131c\u0131 adres sat\u0131r\u0131ndan de\u011fil. T\u00fcm event node'lar\u0131 <code>POST</code> metodunu kullan\u0131r ve veriyi request body'den bekler; adres sat\u0131r\u0131na parametre ge\u00e7ilemez.</p> <p>Postman veya benzeri bir HTTP istemcisi ile test edebilirsiniz:</p> <ul> <li>Method: <code>POST</code></li> <li>URL: <code>http://&lt;node-red-host&gt;:1880/&lt;EventAd\u0131&gt;</code></li> <li>Body: <code>raw / JSON</code></li> </ul> <pre><code>{\n  \"param1\": \"value1\",\n  \"param2\": \"value2\"\n}\n</code></pre>"},{"location":"sss/#s-msgpayload-arrayinin-icerigini-nasl-debug-ederim","title":"S: <code>msg.payload</code> array'inin i\u00e7eri\u011fini nas\u0131l debug ederim?","text":"<p>Her form/aksiyon node'undan sonra bir <code>debug</code> node ekleyip <code>complete msg</code> se\u00e7in. Sa\u011f paneldeki \u00e7\u0131kt\u0131da <code>payload</code> array'inin her eleman\u0131n\u0131 g\u00f6r\u00fcrs\u00fcn\u00fcz.</p>"},{"location":"sss/#s-aksm-githuba-koyabilir-miyim","title":"S: Ak\u0131\u015f\u0131m\u0131 GitHub'a koyabilir miyim?","text":"<p>Evet. Sadece <code>credentials</code> alanlar\u0131 (LLM API key gibi) flow JSON'una dahil edilmez, bunlar\u0131 ayr\u0131ca y\u00f6netmeniz gerekir.</p>"},{"location":"sss/#genel","title":"Genel","text":""},{"location":"sss/#s-bu-paket-trexmes-edge-olmadan-calsr-m","title":"S: Bu paket trexMes Edge olmadan \u00e7al\u0131\u015f\u0131r m\u0131?","text":"<p>Hay\u0131r. trexMes Edge'in Node-RED Connector eklentisi ba\u011flant\u0131 kurmazsa hi\u00e7bir event tetiklenmez, form bas\u0131lmaz. Paket trexMes ekosistemine \u00f6zg\u00fcd\u00fcr.</p>"},{"location":"sss/#s-lisans-nedir-ticari-kullanabilir-miyim","title":"S: Lisans nedir, ticari kullanabilir miyim?","text":"<p>GPL-3.0-or-later. Ticari kullan\u0131m serbesttir ancak de\u011fi\u015fiklik yap\u0131p da\u011f\u0131t\u0131yorsan\u0131z ayn\u0131 lisansla da\u011f\u0131tmal\u0131s\u0131n\u0131z.</p>"},{"location":"sss/#s-katkda-bulunabilir-miyim","title":"S: Katk\u0131da bulunabilir miyim?","text":"<p>Evet, GitHub repository'sinde issue a\u00e7abilir veya pull request g\u00f6nderebilirsiniz.</p> <p>Sorununuz burada yoksa GitHub Issues \u00fczerinden ileti\u015fime ge\u00e7in.</p>"},{"location":"baslangic/","title":"Ba\u015flang\u0131\u00e7","text":"<p>Bu b\u00f6l\u00fcm, <code>node-red-trexmes-service</code> paketini ilk kez kullanacak geli\u015ftiriciler i\u00e7in ad\u0131m ad\u0131m rehber niteli\u011findedir.</p>"},{"location":"baslangic/#bu-bolumde-neler-var","title":"Bu B\u00f6l\u00fcmde Neler Var?","text":"\ud83d\udce6 Kurulum <p>Node-RED, trexMes Edge konnekt\u00f6r\u00fc ve paketin nas\u0131l kurulaca\u011f\u0131.</p> \ud83d\ude80 H\u0131zl\u0131 Ba\u015flang\u0131\u00e7 <p>5 dakikada ilk ak\u0131\u015f\u0131 aya\u011fa kald\u0131rma.</p> \ud83c\udfd7\ufe0f Mimari Genel Bak\u0131\u015f <p>Paket nas\u0131l \u00e7al\u0131\u015f\u0131r? trexMes Edge ile haberle\u015fme nas\u0131l olur?</p> \ud83d\udce8 Mesaj (msg) Yap\u0131s\u0131 <p>Node'lar aras\u0131nda dola\u015fan `msg.payload` format\u0131 ve `operationtype` kavram\u0131.</p>"},{"location":"baslangic/#onerilen-okuma-sras","title":"\u00d6nerilen Okuma S\u0131ras\u0131","text":"<ol> <li>Kurulum \u2014 \u00d6nce \u00e7al\u0131\u015fan bir kurulum elde edin.</li> <li>Mimari \u2014 Sistemin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlay\u0131n (5 dk okuma).</li> <li>H\u0131zl\u0131 Ba\u015flang\u0131\u00e7 \u2014 \u0130lk ak\u0131\u015f\u0131n\u0131z\u0131 olu\u015fturun.</li> <li>Mesaj Yap\u0131s\u0131 \u2014 Node'lar aras\u0131 veri ak\u0131\u015f\u0131n\u0131 \u00f6\u011frenin.</li> </ol>"},{"location":"baslangic/#onemli-on-bilgi","title":"\u00d6nemli \u00d6n Bilgi","text":"<p>trexMes Edge gereklidir</p> <p>Bu paket ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fmaz. trexMes Edge panel yaz\u0131l\u0131m\u0131n\u0131n \u00fczerinde Node-RED konnekt\u00f6r eklentisi etkin olmak zorundad\u0131r. Aksi takdirde node'lar trigger almaz, custom form'lar panele bas\u0131lmaz ve method invoker hata d\u00f6ner.</p> <p>Tek <code>trex Subscriber</code> kural\u0131</p> <p>Her trexMes projesi/flow'unda yaln\u0131zca bir adet <code>trex Subscriber</code> node'u bulunmal\u0131d\u0131r. Bu node, projedeki t\u00fcm olay (event) node'lar\u0131n\u0131 trexMes paneline kay\u0131t eder.</p>"},{"location":"baslangic/hizli-baslangic/","title":"H\u0131zl\u0131 Ba\u015flang\u0131\u00e7","text":"<p>Bu rehber, ilk trexMes ak\u0131\u015f\u0131n\u0131z\u0131 5 dakika i\u00e7inde aya\u011fa kald\u0131rman\u0131z i\u00e7in yaz\u0131lm\u0131\u015ft\u0131r.</p>"},{"location":"baslangic/hizli-baslangic/#hedef","title":"Hedef","text":"<p>Bir trexMes panelinden gelen Business Event'i yakalay\u0131p Node-RED debug penceresinde g\u00f6steren bir ak\u0131\u015f olu\u015fturaca\u011f\u0131z.</p>"},{"location":"baslangic/hizli-baslangic/#aks-semas","title":"Ak\u0131\u015f \u015eemas\u0131","text":"<p><code>trex Subscriber</code> ba\u011f\u0131ms\u0131z durur; olay ak\u0131\u015f\u0131 do\u011frudan <code>Business Events</code>'ten ba\u015flar.</p> <pre><code>flowchart LR\n    subgraph Kayit[\"Kay\u0131t (ba\u011f\u0131ms\u0131z)\"]\n        A[trex Subscriber]\n    end\n\n    subgraph Akis[\"Olay Ak\u0131\u015f\u0131\"]\n        B[Business Events&lt;br/&gt;OrderStart] --&gt; D[debug]\n    end\n\n    style A fill:#58d68d,color:#000\n    style B fill:#ccffcc,color:#000\n    style D fill:#87ceeb,color:#000</code></pre>"},{"location":"baslangic/hizli-baslangic/#adm-1-yeni-bir-flow-olusturun","title":"Ad\u0131m 1 \u2014 Yeni Bir Flow Olu\u015fturun","text":"<ol> <li>Node-RED aray\u00fcz\u00fcnde + ile yeni bir tab a\u00e7\u0131n (\u00f6rn. \"MyFirstTrexFlow\").</li> </ol>"},{"location":"baslangic/hizli-baslangic/#adm-2-trex-subscriber-ekleyin","title":"Ad\u0131m 2 \u2014 <code>trex Subscriber</code> Ekleyin","text":"<p>Paletten trexMes service kategorisi alt\u0131ndaki <code>trex Subscriber</code> node'unu canvas'a s\u00fcr\u00fckleyin.</p> \u00d6zellik De\u011fer Name (bo\u015f b\u0131rakabilirsiniz) Method <code>get</code> (otomatik) Event <code>/GetSubscribed</code> (varsay\u0131lan) <p>Bu node ne yapar?</p> <p><code>trex Subscriber</code>, projenizdeki t\u00fcm event node'lar\u0131n\u0131n isimlerini trexMes paneline kay\u0131t eder. Panel bu listeye bakarak hangi olaylar\u0131 Node-RED'e g\u00f6nderece\u011fini bilir.</p>"},{"location":"baslangic/hizli-baslangic/#adm-3-business-events-ekleyin","title":"Ad\u0131m 3 \u2014 <code>Business Events</code> Ekleyin","text":"<p>Paletten <code>Business Events</code> node'unu canvas'a s\u00fcr\u00fckleyin ve \u00e7ift t\u0131klayarak yap\u0131land\u0131r\u0131n:</p> \u00d6zellik De\u011fer A\u00e7\u0131klama Name <code>OrderStart</code> (opsiyonel) Ak\u0131\u015f \u00fczerinde g\u00f6stermek i\u00e7in Method <code>get</code> (varsay\u0131lan) HTTP method Event <code>/OrderStartEvent</code> Panel taraf\u0131nda tan\u0131mlanan olay ad\u0131 Is Handled <code>false</code> Bu olay\u0131 bizim ak\u0131\u015f\u0131m\u0131z m\u0131 i\u015fleyecek? <p>Event ismi nereden geliyor?</p> <p><code>Event</code> alan\u0131na yazd\u0131\u011f\u0131n\u0131z de\u011fer, trexMes Edge taraf\u0131nda tan\u0131ml\u0131 olay isimleriyle birebir e\u015fle\u015fmelidir (b\u00fcy\u00fck/k\u00fc\u00e7\u00fck harf duyarl\u0131). Panel yap\u0131land\u0131rmas\u0131ndan do\u011fru ismi \u00f6\u011frenin.</p>"},{"location":"baslangic/hizli-baslangic/#adm-4-debug-nodeu-ekleyin","title":"Ad\u0131m 4 \u2014 <code>debug</code> Node'u Ekleyin","text":"<p>Standart Node-RED <code>debug</code> node'unu s\u00fcr\u00fckleyip <code>Business Events</code> \u00e7\u0131k\u0131\u015f\u0131na ba\u011flay\u0131n. <code>debug</code> \u00f6zelliklerinde:</p> <ul> <li>Output: <code>complete msg object</code></li> </ul>"},{"location":"baslangic/hizli-baslangic/#adm-5-deploy","title":"Ad\u0131m 5 \u2014 Deploy","text":"<p>Sa\u011f \u00fcstteki k\u0131rm\u0131z\u0131 Deploy butonuna t\u0131klay\u0131n. Ba\u011flant\u0131 ba\u015far\u0131l\u0131 kurulduysa:</p> <ul> <li><code>trex Subscriber</code> node'unun alt\u0131nda k\u0131sa bir s\u00fcre ye\u015fil \"Triggered\" durumu g\u00f6r\u00fcn\u00fcr.</li> <li>Sa\u011f panelde debug \u00e7\u0131kt\u0131s\u0131, panelden olay tetiklendi\u011finde belirir.</li> </ul>"},{"location":"baslangic/hizli-baslangic/#beklenen-ckt","title":"Beklenen \u00c7\u0131kt\u0131","text":"<p>Panel taraf\u0131nda <code>OrderStartEvent</code> tetiklendi\u011finde Node-RED debug panelinde \u015funa benzer bir mesaj g\u00f6rmelisiniz:</p> <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"orderNo\": \"ORD-2026-0001\",\n    \"operatorId\": \"OP-007\",\n    \"machineId\": \"M-12\"\n  },\n  \"req\": { /* HTTP request bilgisi */ },\n  \"res\": { /* HTTP response wrapper */ }\n}\n</code></pre>"},{"location":"baslangic/hizli-baslangic/#sonraki-adm-veriyi-forma-yanstmak","title":"Sonraki Ad\u0131m: Veriyi Form'a Yans\u0131tmak","text":"<p>\u0130lerleyen \u00f6rneklerde bu yap\u0131y\u0131 geni\u015fleterek:</p> <ol> <li>Gelen olay verisiyle bir Custom Form a\u00e7aca\u011f\u0131z.</li> <li>Form alanlar\u0131n\u0131 Form Bind Controls ile dolduraca\u011f\u0131z.</li> <li>Form \u00fczerindeki butonlar\u0131 Button Configurator ile yap\u0131land\u0131raca\u011f\u0131z.</li> <li>Ak\u0131\u015f sonunda Responser ile cevap d\u00f6nd\u00fcrece\u011fiz.</li> </ol> <p>Custom Form Ak\u0131\u015f\u0131 \u00f6rne\u011fine ge\u00e7 \u2192</p>"},{"location":"baslangic/hizli-baslangic/#yaygn-hatalar","title":"Yayg\u0131n Hatalar","text":"<p>Olay tetiklenmiyor</p> <ul> <li><code>trex Subscriber</code> node'unun durumu kontrol edin (Triggered \u00e7\u0131k\u0131yor mu?)</li> <li>trexMes Edge'de Node-RED Connector eklentisi etkin mi?</li> <li><code>Event</code> alan\u0131ndaki isim trexMes'teki ile tam olarak e\u015fle\u015fiyor mu?</li> <li>Bu projede birden fazla <code>trex Subscriber</code> mi var? (Olmamal\u0131!)</li> </ul> <p>Ayn\u0131 olay\u0131 birden fazla ak\u0131\u015f i\u015fliyor</p> <p>Ayn\u0131 <code>Event</code> ismine sahip birden fazla <code>Business Events</code> node'u kullan\u0131rsan\u0131z hepsi tetiklenir. Bu davran\u0131\u015f bilin\u00e7li olmal\u0131d\u0131r.</p> <p>Custom Form \u00e7\u0131kt\u0131s\u0131 yok</p> <p>Custom Form kullan\u0131yorsan\u0131z Designer \u00e7\u0131kt\u0131s\u0131 <code>C:\\temp\\&lt;formname&gt;_form_design.xml</code> konumunda olmal\u0131d\u0131r. Kurulum sayfas\u0131ndaki Custom Form Designer b\u00f6l\u00fcm\u00fcne bak\u0131n.</p>"},{"location":"baslangic/kurulum/","title":"Kurulum","text":"<p><code>node-red-trexmes-service</code> paketinin Node-RED ortam\u0131na kurulmas\u0131 ve trexMes Edge ile entegrasyonu ad\u0131m ad\u0131m anlat\u0131lm\u0131\u015ft\u0131r.</p>"},{"location":"baslangic/kurulum/#gereksinimler","title":"Gereksinimler","text":"Bile\u015fen Minimum S\u00fcr\u00fcm A\u00e7\u0131klama Node.js 18.16 veya \u00fczeri LTS s\u00fcr\u00fcm\u00fc \u00f6nerilir Node-RED 3.0 veya \u00fczeri npm \u00fczerinden veya OS paketinden trexMes Edge G\u00fcncel s\u00fcr\u00fcm Node-RED konnekt\u00f6r eklentisi etkin olmal\u0131d\u0131r \u0130\u015fletim Sistemi Windows / Linux Custom Form Designer i\u00e7in Windows \u00f6nerilir"},{"location":"baslangic/kurulum/#adm-1-nodejs-dogrulamas","title":"Ad\u0131m 1 \u2014 Node.js Do\u011frulamas\u0131","text":"<p>Komut sat\u0131r\u0131nda Node.js s\u00fcr\u00fcm\u00fcn\u00fcz\u00fc kontrol edin:</p> <pre><code>node --version\n# v18.16.0 veya \u00fczeri olmal\u0131\n</code></pre> <p>Eski Node.js s\u00fcr\u00fcm\u00fc</p> <p>Paket i\u00e7indeki baz\u0131 ba\u011f\u0131ml\u0131l\u0131klar (<code>raw-body@3</code>, <code>multer</code>, <code>cookie@0.7</code>) eski Node.js s\u00fcr\u00fcmlerinde \u00e7al\u0131\u015fmaz. Mutlaka 18.16+ kullan\u0131n.</p>"},{"location":"baslangic/kurulum/#adm-2-node-red-kurulumu","title":"Ad\u0131m 2 \u2014 Node-RED Kurulumu","text":"<p>E\u011fer hen\u00fcz Node-RED kurulu de\u011filse:</p> Windows / Linux / macOSWindows (y\u00f6netici) <pre><code>npm install -g --unsafe-perm node-red\n</code></pre> <pre><code>npm install -g node-red\n</code></pre> <p>Kurulumdan sonra ba\u015flat\u0131n:</p> <pre><code>node-red\n</code></pre> <p>Taray\u0131c\u0131dan <code>http://localhost:1880</code> adresine giderek aray\u00fcz\u00fc kontrol edin.</p>"},{"location":"baslangic/kurulum/#adm-3-paketi-kurma","title":"Ad\u0131m 3 \u2014 Paketi Kurma","text":""},{"location":"baslangic/kurulum/#yontem-a-palette-manager-uzerinden-onerilen","title":"Y\u00f6ntem A: Palette Manager \u00fczerinden (\u00f6nerilen)","text":"<ol> <li>Node-RED aray\u00fcz\u00fcnde sa\u011f \u00fcstteki men\u00fcden Manage palette'i a\u00e7\u0131n.</li> <li>Install sekmesine ge\u00e7in.</li> <li>Arama kutusuna <code>node-red-trexmes-service</code> yaz\u0131n.</li> <li>Install butonuna t\u0131klay\u0131n.</li> </ol>"},{"location":"baslangic/kurulum/#yontem-b-komut-satrndan","title":"Y\u00f6ntem B: Komut sat\u0131r\u0131ndan","text":"<p>Node-RED kullan\u0131c\u0131 klas\u00f6r\u00fcn\u00fcze gidin (genelde <code>~/.node-red</code> veya <code>C:\\Users\\&lt;kullanici&gt;\\.node-red</code>):</p> <pre><code>cd ~/.node-red\nnpm install node-red-trexmes-service\n</code></pre> <p>Sonra Node-RED'i yeniden ba\u015flat\u0131n.</p>"},{"location":"baslangic/kurulum/#yontem-c-yerel-kaynak-klasorden","title":"Y\u00f6ntem C: Yerel kaynak klas\u00f6rden","text":"<p>Geli\u015ftirme/test ama\u00e7l\u0131 yerel klas\u00f6rden kurmak i\u00e7in:</p> <pre><code>cd ~/.node-red\nnpm install C:\\node-red-nodes\\node-red-trexmes-service\\nodes\n</code></pre>"},{"location":"baslangic/kurulum/#adm-4-kurulumu-dogrulama","title":"Ad\u0131m 4 \u2014 Kurulumu Do\u011frulama","text":"<p>Node-RED aray\u00fcz\u00fcnde sol paletin alt\u0131na bak\u0131n. <code>trexMes service</code> kategorisi alt\u0131nda a\u015fa\u011f\u0131daki node'lar\u0131 g\u00f6rmelisiniz:</p> <ul> <li><code>trex Subscriber</code></li> <li><code>Business Events</code>, <code>System Events</code>, <code>Communication Events</code>, <code>Display Events</code>, <code>Form Events</code></li> <li><code>Display Methods</code>, <code>Method Returns</code>, <code>Responser</code></li> <li><code>Custom Form</code>, <code>Form Bind Controls</code>, <code>Control Properties</code></li> <li><code>Button Configurator</code>, <code>Main Form Action</code></li> <li><code>Method Invoker</code>, <code>Execute Process</code>, <code>Execute Script</code></li> <li><code>Handle Setter</code>, <code>LLM Flow Builder</code></li> </ul> <p>Paket ba\u015far\u0131yla kuruldu</p> <p>Yukar\u0131daki node'lar paletinizde g\u00f6r\u00fcn\u00fcyorsa kurulum tamamlanm\u0131\u015f demektir. H\u0131zl\u0131 Ba\u015flang\u0131\u00e7 ile devam edebilirsiniz.</p>"},{"location":"baslangic/kurulum/#adm-5-trexmes-edge-taraf","title":"Ad\u0131m 5 \u2014 trexMes Edge Taraf\u0131","text":"<p>Node-RED taraf\u0131ndaki paket tek ba\u015f\u0131na yetmez. trexMes Edge panel yaz\u0131l\u0131m\u0131nda Node-RED konnekt\u00f6r eklentisinin etkin oldu\u011fundan emin olun:</p> <ol> <li>trexMes Edge yap\u0131land\u0131rma ekran\u0131n\u0131 a\u00e7\u0131n.</li> <li>Plugins sekmesinden Node-RED Connector'\u0131 aktif edin.</li> <li>Node-RED sunucusunun IP ve port bilgisini panele tan\u0131t\u0131n (varsay\u0131lan: <code>http://&lt;node-red-host&gt;:1880</code>).</li> <li>Paneli yeniden ba\u015flat\u0131n.</li> </ol> <p>Ba\u011flant\u0131 kontrol\u00fc</p> <p>Ak\u0131\u015f\u0131 deploy edip <code>trex Subscriber</code> node'unun durum \u00e7ubu\u011funu (status) kontrol edin. Ye\u015fil \"Triggered\" etiketi g\u00f6r\u00fcyorsan\u0131z panel ile ba\u011flant\u0131 sa\u011flanm\u0131\u015f demektir.</p>"},{"location":"baslangic/kurulum/#custom-form-designer-istege-bagl","title":"Custom Form Designer (\u0130ste\u011fe Ba\u011fl\u0131)","text":"<p><code>Custom Form</code> node'unda XML-tabanl\u0131 form tasar\u0131mc\u0131s\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilmek i\u00e7in Windows \u00fczerinde bir <code>customFormDesigner.exe</code> yard\u0131mc\u0131s\u0131 gerekir. Bu yolu Node-RED <code>settings.js</code> dosyas\u0131nda global context olarak tan\u0131t\u0131n:</p> <pre><code>// ~/.node-red/settings.js\nfunctionGlobalContext: {\n    customFormDesignerPath: \"C:\\\\trex\\\\tools\\\\customFormDesigner.exe\"\n},\n</code></pre> <p>Designer \u00e7al\u0131\u015ft\u0131\u011f\u0131nda \u00e7\u0131kt\u0131 \u015fu konuma yaz\u0131l\u0131r:</p> <pre><code>C:\\temp\\&lt;filename&gt;_form_design.xml\n</code></pre>"},{"location":"baslangic/kurulum/#guncelleme","title":"G\u00fcncelleme","text":"<p>Paketi g\u00fcncellemek i\u00e7in:</p> <pre><code>cd ~/.node-red\nnpm update node-red-trexmes-service\n</code></pre> <p>Veya Palette Manager \u2192 Nodes sekmesinden g\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin.</p>"},{"location":"baslangic/kurulum/#kaldrma","title":"Kald\u0131rma","text":"<pre><code>cd ~/.node-red\nnpm uninstall node-red-trexmes-service\n</code></pre> <p>Ak\u0131\u015flarda kullan\u0131lan node'lar</p> <p>Paketi kald\u0131rmadan \u00f6nce, kullanan t\u00fcm ak\u0131\u015flar\u0131 durdurun veya silin. Aksi takdirde Node-RED yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda \"Missing types\" hatas\u0131 al\u0131rs\u0131n\u0131z.</p>"},{"location":"baslangic/kurulum/#sorun-giderme","title":"Sorun Giderme","text":"Sorun \u00c7\u00f6z\u00fcm Paket palette'te g\u00f6r\u00fcnm\u00fcyor Node-RED'i yeniden ba\u015flat\u0131n (<code>Ctrl+C</code> ve <code>node-red</code>) \"Missing type: trex Subscriber\" Paket y\u00fcklenmemi\u015f olabilir; <code>npm list</code> ile kontrol edin <code>cookie@0.7.2 not found</code> Node.js s\u00fcr\u00fcm\u00fcn\u00fcz\u00fc 18.16+'a y\u00fckseltin Olay node'lar\u0131 trigger alm\u0131yor trexMes Edge'de Node-RED Connector eklentisini kontrol edin Custom Form designer \u00e7al\u0131\u015fm\u0131yor <code>settings.js</code> i\u00e7inde <code>customFormDesignerPath</code> tan\u0131m\u0131n\u0131 kontrol edin"},{"location":"baslangic/mesaj-yapisi/","title":"Mesaj (msg) Yap\u0131s\u0131","text":"<p>Bu sayfa, <code>node-red-trexmes-service</code> node'lar\u0131 aras\u0131nda dola\u015fan <code>msg</code> nesnesinin anatomisini, \u00fcretilen <code>operationtype</code> de\u011ferlerini ve <code>dataType</code> (msg/flow/global/...) \u00e7\u00f6z\u00fcmlemesini detayl\u0131 a\u00e7\u0131klar.</p>"},{"location":"baslangic/mesaj-yapisi/#temel-yaklasm","title":"Temel Yakla\u015f\u0131m","text":"<p>Pakette t\u00fcm form/aksiyon node'lar\u0131 ayn\u0131 s\u00f6zle\u015fmeyi kullan\u0131r:</p> <ol> <li>Giri\u015f: \u00d6nceki node'dan gelen <code>msg.payload</code> ya bir array ya da scalar olabilir.</li> <li>\u00c7\u0131k\u0131\u015f: <code>msg.payload</code> her zaman bir array'dir; node kendi operasyonunu sona ekler.</li> </ol> <pre><code>flowchart LR\n    A[msg.payload&lt;br/&gt;any] --&gt; N[Node X]\n    N --&gt; B[msg.payload&lt;br/&gt;= prevOps + newOp]\n\n    style N fill:#ccffcc,color:#000</code></pre>"},{"location":"baslangic/mesaj-yapisi/#giris-cozumleme-sozlesmesi","title":"Giri\u015f \u00c7\u00f6z\u00fcmleme S\u00f6zle\u015fmesi","text":"<p>Her node \u015fu Standart blo\u011fu \u00e7al\u0131\u015ft\u0131r\u0131r:</p> <pre><code>let payload = msg.payload;\nlet receiveddata = null;\n\nif (Array.isArray(payload)) {\n    // \u00d6nceki bir form/event node'undan zincirleme geliyor\n    if (payload.length &gt; 0 &amp;&amp; payload[0].receiveddata !== undefined) {\n        receiveddata = msg.payload[0].receiveddata;\n    }\n} else {\n    // \u0130lk giri\u015fte (Event node'undan gelir)\n    receiveddata = msg.payload;\n    msg.payload = [];   // &lt;-- yeniden array yap\u0131l\u0131r\n}\n</code></pre> <p><code>receiveddata</code> nedir?</p> <p>Panelden gelen ham olay verisini ta\u015f\u0131yan de\u011ferdir. Zincirin ilk eleman\u0131nda bir kez set edilir; sonraki t\u00fcm operasyonlara aktar\u0131l\u0131r. Panel taraf\u0131 bu veriyi karar mant\u0131\u011f\u0131nda kullan\u0131r.</p>"},{"location":"baslangic/mesaj-yapisi/#operasyon-format","title":"Operasyon Format\u0131","text":"<p>Her node <code>msg.payload</code> array'ine bir operation object ekler. En s\u0131k kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z alanlar:</p> Alan Tip A\u00e7\u0131klama <code>operationtype</code> string \u0130\u015flem t\u00fcr\u00fc (zorunlu) <code>name</code> string Hedef form / kontrol ad\u0131 <code>receiveddata</code> any Orijinal olay verisi <code>value</code> any \u0130\u015fleme \u00f6zg\u00fc de\u011fer <code>customformxml</code> string Form XML'i (Custom Form i\u00e7in) <code>bindcontrols</code> array Ba\u011flanacak kontroller listesi <code>continueevent</code> string|bool Sonraki event ak\u0131\u015f\u0131 kontrol\u00fc <code>message</code> string Method ismi / script kodu <code>isstyled</code> boolean Form stillendirildi mi?"},{"location":"baslangic/mesaj-yapisi/#butun-operationtype-degerleri","title":"B\u00fct\u00fcn <code>operationtype</code> De\u011ferleri","text":"<p>Pakette 11 farkl\u0131 operationtype \u00fcretilir:</p> CustomDialogMainFormBindControlControlPropertiesUIButtonConfigTriggerMainMethodInvokerProcessExecuteProcessExecuteScriptTrexEventHandler <p>\u00dcreten: <code>Custom Form</code> (formainform=<code>false</code>) Anlam\u0131: Panelde yeni bir modal/dialog form a\u00e7.</p> <pre><code>{\n  \"operationtype\": \"CustomDialog\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderEntryForm\",\n  \"continueevent\": \"Continue\",\n  \"customformxml\": \"&lt;form&gt;...&lt;/form&gt;\",\n  \"isstyled\": true\n}\n</code></pre> <p>\u00dcreten: <code>Custom Form</code> (formainform=<code>true</code>) Anlam\u0131: Panelin ana formunu yeni i\u00e7erikle g\u00fcncelle.</p> <pre><code>{\n  \"operationtype\": \"MainForm\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderEntryForm\",\n  \"continueevent\": \"Break\",\n  \"customformxml\": \"&lt;form&gt;...&lt;/form&gt;\",\n  \"isstyled\": true\n}\n</code></pre> <p>\u00dcreten: <code>Form Bind Controls</code> Anlam\u0131: Form \u00fczerindeki kontrollere veri ba\u011fla.</p> <pre><code>{\n  \"operationtype\": \"BindControl\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderEntryForm\",\n  \"bindcontrols\": [\n    { \"Name\": \"txtOrderNo\",  \"FieldName\": \"orderNo\"  },\n    { \"Name\": \"txtCustomer\", \"FieldName\": \"customer\" }\n  ],\n  \"value\": { \"orderNo\": \"ORD-001\", \"customer\": \"ACME\" }\n}\n</code></pre> <p>\u00dcreten: <code>Control Properties</code> Anlam\u0131: Kontrollerin g\u00f6rsel/i\u015flevsel \u00f6zelliklerini ayarla.</p> <pre><code>{\n  \"operationtype\": \"ControlProperties\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderEntryForm\",\n  \"value\": [\n    { \"ControlName\": \"btnSubmit\", \"PropertyName\": \"Enabled\", \"Value\": true },\n    { \"ControlName\": \"lblTitle\",  \"PropertyName\": \"Text\",    \"Value\": \"Yeni Sipari\u015f\" }\n  ]\n}\n</code></pre> <p>\u00dcreten: <code>Button Configurator</code> Anlam\u0131: Form \u00fczerindeki butonlar\u0131n g\u00f6r\u00fcn\u00fcm/davran\u0131\u015f\u0131n\u0131 yap\u0131land\u0131r.</p> <pre><code>{\n  \"operationtype\": \"UIButtonConfig\",\n  \"receiveddata\": { /* event data */ },\n  \"value\": [\n    {\n      \"ButtonIndexType\": 0,\n      \"DefaultCaption\": \"Kaydet\",\n      \"IsVisible\": true,\n      \"IsToOverrideDefaultHandler\": true,\n      \"ComponentName\": \"btnSave\"\n    }\n  ]\n}\n</code></pre> <p>\u00dcreten: <code>Main Form Action</code> Anlam\u0131: Ana formdaki bir butonu tetikle.</p> <pre><code>{\n  \"operationtype\": \"TriggerMain\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"3\"\n}\n</code></pre> <p>\u00dcreten: <code>Method Invoker</code> Anlam\u0131: Panel taraf\u0131ndaki bir method'u \u00e7a\u011f\u0131r.</p> <pre><code>{\n  \"operationtype\": \"MethodInvokerProcess\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"GetOrderDetails\",\n  \"message\": \"OrderService.GetOrderDetails\",\n  \"value\": [\n    { \"ParameterName\": \"orderNo\", \"Value\": \"ORD-001\" }\n  ]\n}\n</code></pre> <p>\u00dcreten: <code>Execute Process</code> Anlam\u0131: Panel taraf\u0131nda tan\u0131ml\u0131 bir process'i tetikle.</p> <pre><code>{\n  \"operationtype\": \"ExecuteProcess\",\n  \"receiveddata\": { /* event data */ },\n  \"message\": \"ProductionStart\"\n}\n</code></pre> <p>\u00dcreten: <code>Execute Script</code> Anlam\u0131: Bir form \u00fczerinde script \u00e7al\u0131\u015ft\u0131r.</p> <pre><code>{\n  \"operationtype\": \"ExecuteScript\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderForm\",\n  \"message\": \"if(value &gt; 100) { btnAlert.Visible = true; }\"\n}\n</code></pre> <p>\u00dcreten: <code>Handle Setter</code> Anlam\u0131: Olay\u0131n handle edilip edilmedi\u011fini panele bildir.</p> <pre><code>{\n  \"operationtype\": \"TrexEventHandler\",\n  \"continueevent\": false\n}\n</code></pre>"},{"location":"baslangic/mesaj-yapisi/#datatype-cozumleme","title":"<code>dataType</code> \u00c7\u00f6z\u00fcmleme","text":"<p>Bir \u00e7ok node (<code>Form Bind Controls</code>, <code>Control Properties</code>, <code>Method Invoker</code>) parametre de\u011ferlerini farkl\u0131 kaynaklardan okuyabilir. Bu kaynak <code>dataType</code> ile belirtilir:</p> <code>dataType</code> Kaynak \u00d6rnek <code>msg</code> Ge\u00e7erli mesaj nesnesinden <code>msg.payload.orderNo</code> <code>flow</code> Flow context <code>flow.get(\"currentOrder\")</code> <code>global</code> Global context <code>global.get(\"config.companyName\")</code> <code>num</code> Sabit say\u0131 <code>42</code> <code>json</code> Sabit JSON <code>{\"a\":1}</code> <code>bool</code> Sabit boolean <code>true</code> / <code>false</code> <code>jsonata</code> JSONata ifadesi <code>$.items[price &gt; 100]</code>"},{"location":"baslangic/mesaj-yapisi/#cozumleme-mantg","title":"\u00c7\u00f6z\u00fcmleme Mant\u0131\u011f\u0131","text":"<pre><code>switch (item.dt) {  // item.dt = dataType\n    case 'msg':\n        computedValue = RED.util.getMessageProperty(msg, item.d);\n        break;\n    case 'flow':\n        computedValue = node.context().flow.get(item.d);\n        break;\n    case 'global':\n        computedValue = node.context().global.get(item.d);\n        break;\n    case 'num':\n        computedValue = Number(item.d);\n        break;\n    case 'json':\n        try { computedValue = JSON.parse(item.d); }\n        catch (e) { computedValue = null; }\n        break;\n    case 'bool':\n        computedValue = item.d === 'true';\n        break;\n    case 'jsonata':\n        let expr = RED.util.prepareJSONataExpression(item.d, node);\n        RED.util.evaluateJSONataExpression(expr, msg, /* callback */);\n        break;\n}\n</code></pre>"},{"location":"baslangic/mesaj-yapisi/#continueevent-davrans","title":"<code>continueevent</code> Davran\u0131\u015f\u0131","text":"<p><code>continueevent</code> alan\u0131, panele \"bu form/olay sonras\u0131nda ak\u0131\u015f nas\u0131l ilerlesin?\" sorusunu cevaplar.</p> De\u011fer Anlam\u0131 <code>\"Continue\"</code> Form kapat\u0131ld\u0131\u011f\u0131nda ak\u0131\u015f devam etsin <code>\"Break\"</code> Ak\u0131\u015f burada dursun <code>true</code> / <code>false</code> <code>Handle Setter</code> \u00fcretiminde: olay handle edildi mi?"},{"location":"baslangic/mesaj-yapisi/#formainform-mainform-vs-customdialog-davrans","title":"<code>formainform</code> (MainForm vs CustomDialog) Davran\u0131\u015f\u0131","text":"<p>Bir\u00e7ok form node'unda <code>formainform</code> bayra\u011f\u0131 vard\u0131r:</p> <ul> <li><code>false</code> \u2192 Operasyon modal dialog olarak \u00e7al\u0131\u015f\u0131r (<code>operationtype: CustomDialog</code>).</li> <li><code>true</code> \u2192 Operasyon ana form \u00fczerinde uygulan\u0131r (<code>operationtype: MainForm</code>); <code>formname</code> otomatik olarak <code>\"AppForm\"</code> olur.</li> </ul> <pre><code>var formname = node.formname;\nif (n.formainform == true) {\n    formname = \"AppForm\";\n}\n</code></pre>"},{"location":"baslangic/mesaj-yapisi/#tipik-bir-tam-aks-msgpayloadu","title":"Tipik Bir Tam Ak\u0131\u015f <code>msg.payload</code>'u","text":"<p>A\u015fa\u011f\u0131da iki node'dan ge\u00e7mi\u015f tipik bir payload g\u00f6sterilmi\u015ftir:</p> <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"req\": { /* HTTP request */ },\n  \"res\": { /* HTTP response wrapper */ },\n  \"payload\": [\n    {\n      \"operationtype\": \"CustomDialog\",\n      \"receiveddata\": { \"orderNo\": \"ORD-001\", \"qty\": 50 },\n      \"name\": \"OrderForm\",\n      \"continueevent\": \"Continue\",\n      \"customformxml\": \"&lt;form&gt;...&lt;/form&gt;\",\n      \"isstyled\": true\n    },\n    {\n      \"operationtype\": \"BindControl\",\n      \"receiveddata\": { \"orderNo\": \"ORD-001\", \"qty\": 50 },\n      \"name\": \"OrderForm\",\n      \"bindcontrols\": [\n        { \"Name\": \"txtOrderNo\", \"FieldName\": \"orderNo\" },\n        { \"Name\": \"txtQty\",     \"FieldName\": \"qty\"     }\n      ],\n      \"value\": { \"orderNo\": \"ORD-001\", \"qty\": 50 }\n    }\n  ]\n}\n</code></pre> <p><code>Responser</code> bu <code>payload</code> array'ini oldu\u011fu gibi HTTP cevab\u0131nda panele g\u00f6nderir.</p>"},{"location":"baslangic/mesaj-yapisi/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Debug node'unu sevin</p> <p>Ak\u0131\u015f geli\u015ftirirken her form/aksiyon node'undan sonra bir <code>debug</code> node ba\u011flay\u0131n. <code>msg.payload</code> array'ini g\u00f6rerek operasyonlar\u0131n do\u011fru s\u0131rada eklenip eklenmedi\u011fini do\u011frulay\u0131n.</p> <p>JSONata'y\u0131 tercih edin</p> <p>Karma\u015f\u0131k d\u00f6n\u00fc\u015ft\u00fcrmeler i\u00e7in <code>dataType: jsonata</code> se\u00e7ene\u011fi <code>function</code> node'una alternatif olarak \u00e7ok g\u00fc\u00e7l\u00fcd\u00fcr. \u00d6rnek: <code>payload.items[status=\"active\"].total</code></p> <p>S\u0131ralama \u00f6nemli</p> <p>Panel <code>msg.payload</code> array'indeki operasyonlar\u0131 s\u0131ral\u0131 uygular. \u00d6nce <code>CustomDialog</code>, sonra <code>BindControl</code>, sonra <code>ControlProperties</code> mant\u0131kl\u0131 bir s\u0131rad\u0131r. S\u0131ray\u0131 bozarsan\u0131z hen\u00fcz a\u00e7\u0131lmam\u0131\u015f forma veri ba\u011flamaya \u00e7al\u0131\u015f\u0131rs\u0131n\u0131z.</p>"},{"location":"baslangic/mimari/","title":"Mimari Genel Bak\u0131\u015f","text":"<p>Bu sayfa, <code>node-red-trexmes-service</code> paketinin i\u00e7 mimarisini, trexMes Edge ile haberle\u015fme \u015feklini ve node'lar aras\u0131 veri ak\u0131\u015f\u0131n\u0131 a\u00e7\u0131klar.</p>"},{"location":"baslangic/mimari/#yuksek-seviye-mimari","title":"Y\u00fcksek Seviye Mimari","text":"<pre><code>flowchart TB\n    subgraph TREX[\"trexMes Edge Panel Yaz\u0131l\u0131m\u0131\"]\n        PANEL[Panel UI&lt;br/&gt;WinForm]\n        CONN[Node-RED&lt;br/&gt;Connector Plugin]\n    end\n\n    subgraph NRED[\"Node-RED Sunucu\"]\n        SUB[trex Subscriber]\n        EV[Event Nodes]\n        FORM[Form Nodes]\n        ACTION[Action Nodes]\n        RESP[Responser]\n    end\n\n    PANEL -- \"Event Trigger\" --&gt; CONN\n    CONN -- \"HTTP GET /event\" --&gt; EV\n    EV --&gt; FORM\n    FORM --&gt; ACTION\n    ACTION --&gt; RESP\n    RESP -- \"HTTP Response\" --&gt; CONN\n    CONN -- \"Render / Action\" --&gt; PANEL\n\n    SUB -. \"Olay listesi kayd\u0131\" .- CONN\n\n    style PANEL fill:#fef3c7,color:#000\n    style CONN fill:#fef3c7,color:#000\n    style SUB fill:#58d68d,color:#000\n    style EV fill:#ccffcc,color:#000\n    style FORM fill:#ccffcc,color:#000\n    style ACTION fill:#ccffcc,color:#000\n    style RESP fill:#ccffcc,color:#000</code></pre>"},{"location":"baslangic/mimari/#bilesenlerin-rolleri","title":"Bile\u015fenlerin Rolleri","text":""},{"location":"baslangic/mimari/#1-trexmes-edge-panel-connector-plugin","title":"1. trexMes Edge Panel + Connector Plugin","text":"<p>\u00dcretim sahas\u0131ndaki fiziksel/sanal panel \u00fczerinde \u00e7al\u0131\u015fan ana yaz\u0131l\u0131md\u0131r. \u0130\u00e7indeki Node-RED Connector eklentisi:</p> <ul> <li>Panel \u00fczerindeki t\u00fcm UI olaylar\u0131n\u0131 HTTP isteklerine \u00e7evirir.</li> <li>Bu istekleri Node-RED sunucusuna g\u00f6nderir.</li> <li>Node-RED'den d\u00f6nen cevapla panelde WinForm render eder, kontrol \u00f6zelliklerini g\u00fcnceller, method \u00e7a\u011fr\u0131lar\u0131na yan\u0131t verir.</li> </ul>"},{"location":"baslangic/mimari/#2-node-red-sunucu","title":"2. Node-RED Sunucu","text":"<p>trexMes panellerinden gelen istekleri i\u015fleyen ve cevaplayan sunucudur. Tek bir Node-RED kurulumu 150-200 paneli ayn\u0131 anda y\u00f6netebilir.</p>"},{"location":"baslangic/mimari/#node-kategorileri-ve-sorumluluklar","title":"Node Kategorileri ve Sorumluluklar\u0131","text":"Kategori Rol\u00fc \u00d6rnek Node'lar \u00c7ekirdek Altyap\u0131 / kay\u0131t <code>trex Subscriber</code>, <code>Responser</code> Olay (Event) Panelden gelen tetikleyiciler + olay kesme <code>Business Events</code>, <code>Form Events</code>, \u2026, <code>Handle Setter</code> Form Panel \u00fczerinde UI \u00fcretme/g\u00fcncelleme <code>Custom Form</code>, <code>Form Bind Controls</code>, \u2026 \u0130\u015flem Method \u00e7a\u011f\u0131rma, process tetikleme <code>Method Invoker</code>, <code>Execute Process</code>, \u2026 Yapay Zek\u00e2 LLM ile ak\u0131\u015f \u00fcretimi <code>LLM Flow Builder</code>"},{"location":"baslangic/mimari/#olay-yasam-dongusu-event-lifecycle","title":"Olay Ya\u015fam D\u00f6ng\u00fcs\u00fc (Event Lifecycle)","text":"<p>Bir olay\u0131n panelden tetiklenip Node-RED'de i\u015flenmesi \u015fu ad\u0131mlardan ge\u00e7er:</p> <pre><code>sequenceDiagram\n    autonumber\n    participant Panel as trexMes Panel\n    participant Conn as Node-RED Connector\n    participant Sub as trex Subscriber\n    participant Ev as Business Events\n    participant Form as Custom Form\n    participant Resp as Responser\n\n    Note over Panel,Resp: BA\u015eLANGI\u00c7 (deploy an\u0131nda)\n    Conn-&gt;&gt;Sub: GET /GetSubscribed\n    Sub-&gt;&gt;Sub: T\u00fcm event node'lar\u0131n\u0131 topla\n    Sub--&gt;&gt;Conn: { subs: [...], handleds: [...] }\n    Conn-&gt;&gt;Panel: Olay listesini kaydet\n\n    Note over Panel,Resp: \u00c7ALI\u015eMA ZAMANI\n    Panel-&gt;&gt;Conn: \"OrderStart\" olay\u0131 tetiklendi\n    Conn-&gt;&gt;Ev: GET /OrderStartEvent + payload\n    Ev-&gt;&gt;Form: msg.payload (event verisi)\n    Form-&gt;&gt;Form: XML form tasar\u0131m\u0131n\u0131 haz\u0131rla\n    Form-&gt;&gt;Resp: msg.payload (operationtype: CustomDialog)\n    Resp--&gt;&gt;Conn: HTTP 200 + render JSON\n    Conn-&gt;&gt;Panel: WinForm'u panelde a\u00e7</code></pre>"},{"location":"baslangic/mimari/#anahtar-noktalar","title":"Anahtar Noktalar","text":"<ol> <li>Tek bir <code>trex Subscriber</code>: Deploy an\u0131nda bir kez \u00e7al\u0131\u015f\u0131r, projedeki t\u00fcm event node'lar\u0131n\u0131n isimlerini panele bildirir.</li> <li>Her event ak\u0131\u015f\u0131 bir HTTP iste\u011fidir: Panel HTTP <code>GET</code> ile olay tetikler, Node-RED ak\u0131\u015f\u0131 \u00e7al\u0131\u015f\u0131r, sonunda HTTP cevab\u0131 d\u00f6ner.</li> <li><code>Responser</code> kapat\u0131c\u0131d\u0131r: Cevap d\u00f6nmeden panel beklemede kal\u0131r. Baz\u0131 node'lar (\u00f6rn. <code>trex Subscriber</code>) bunu kendili\u011finden y\u00f6netir; di\u011fer olay ak\u0131\u015flar\u0131nda manuel eklenmelidir.</li> </ol>"},{"location":"baslangic/mimari/#mesaj-aks-anatomisi","title":"Mesaj Ak\u0131\u015f\u0131 Anatomisi","text":"<p>T\u00fcm node'lar aras\u0131nda dola\u015fan <code>msg.payload</code> asl\u0131nda bir operation array'dir. Her node bu array'e kendi \"operasyonunu\" <code>push</code> eder:</p> <pre><code>msg.payload = [\n  {\n    operationtype: \"CustomDialog\",\n    name: \"OrderForm\",\n    customformxml: \"&lt;form&gt;...&lt;/form&gt;\"\n  },\n  {\n    operationtype: \"BindControl\",\n    name: \"OrderForm\",\n    bindcontrols: [\n      { Name: \"txtOrderNo\", FieldName: \"orderNo\" }\n    ],\n    value: { orderNo: \"ORD-001\" }\n  },\n  {\n    operationtype: \"UIButtonConfig\",\n    value: [ /* button configs */ ]\n  }\n]\n</code></pre> <p><code>Responser</code> bu array'i tek HTTP cevab\u0131nda panele g\u00f6nderir. Panel s\u0131rayla bu operasyonlar\u0131 yorumlar:</p> <code>operationtype</code> Anlam\u0131 Hangi node \u00fcretir? <code>CustomDialog</code> Yeni form a\u00e7 <code>Custom Form</code> (formainform=false) <code>MainForm</code> Ana formu g\u00fcncelle <code>Custom Form</code> (formainform=true) <code>BindControl</code> Form alanlar\u0131na veri ba\u011fla <code>Form Bind Controls</code> <code>ControlProperties</code> Kontrol \u00f6zelliklerini ayarla <code>Control Properties</code> <code>UIButtonConfig</code> Buton konfig\u00fcrasyonu <code>Button Configurator</code> <code>TriggerMain</code> Ana form butonu tetikle <code>Main Form Action</code> <code>MethodInvokerProcess</code> Panel method'unu \u00e7a\u011f\u0131r <code>Method Invoker</code> <code>ExecuteProcess</code> Process tetikle <code>Execute Process</code> <code>ExecuteScript</code> Form \u00fczerinde script \u00e7al\u0131\u015ft\u0131r <code>Execute Script</code> <code>TrexEventHandler</code> Olay handle bilgisi <code>Handle Setter</code> <p>Mesaj yap\u0131s\u0131 detaylar\u0131 \u2192</p>"},{"location":"baslangic/mimari/#event-tipleri-ve-yetenekleri","title":"Event Tipleri ve Yetenekleri","text":"<p>Paket 8 farkl\u0131 event tipi sa\u011flar. Bu tipler panel taraf\u0131ndaki olay s\u0131n\u0131fland\u0131rmas\u0131yla birebir e\u015fle\u015fir:</p> Event Tipi Tipik Kullan\u0131m Business Events \u0130\u015f ak\u0131\u015f\u0131 olaylar\u0131 (sipari\u015f ba\u015flama, \u00fcretim bitirme, vs.) System Events Sistem seviyesi olaylar (boot, login, shutdown) Communication Events \u0130leti\u015fim katman\u0131 olaylar\u0131 (PLC, OPC, sens\u00f6r) Display Events UI \u00fczerindeki g\u00f6sterim olaylar\u0131 Form Events Form \u00fczerindeki etkile\u015fim olaylar\u0131 (button click vs.) Display Methods Ana form metod tetikleyicileri Method Returns Method invocation cevaplar\u0131"},{"location":"baslangic/mimari/#handle-edildi-kavram","title":"\"Handle Edildi\" Kavram\u0131","text":"<p>Baz\u0131 olaylar panel taraf\u0131nda varsay\u0131lan bir i\u015fleyiciye sahiptir. Node-RED ak\u0131\u015f\u0131n\u0131z bu olay\u0131 yakalad\u0131\u011f\u0131nda panelin de kendi i\u015fleyicisinin \u00e7al\u0131\u015fmas\u0131n\u0131 isteyip istemedi\u011finizi belirtmelisiniz:</p> <ul> <li><code>ishandled = true</code> \u2192 \"Bu olay\u0131 Node-RED y\u00f6netti, panel kendi i\u015fleyicisini \u00c7ALI\u015eTIRMASIN.\"</li> <li><code>ishandled = false</code> \u2192 \"Panel kendi i\u015fleyicisini de \u00e7al\u0131\u015ft\u0131rs\u0131n.\"</li> </ul> <p>Bu davran\u0131\u015f olay node'lar\u0131n\u0131n Is Handled alan\u0131 veya ak\u0131\u015f ortas\u0131nda Handle Setter ile dinamik olarak kontrol edilebilir.</p>"},{"location":"baslangic/mimari/#coklu-panel-senaryosu","title":"\u00c7oklu Panel Senaryosu","text":"<p>Ayn\u0131 Node-RED ak\u0131\u015f\u0131 150-200 paneli ayn\u0131 anda y\u00f6netebilir. Her panelin IP'si gelen <code>req.ip</code> \u00fczerinden ayr\u0131\u015ft\u0131r\u0131l\u0131r:</p> <pre><code>// trex Subscriber \u00e7\u0131k\u0131\u015f\u0131\n{\n  payload: {\n    client: \"192.168.1.42\",     // Hangi panel?\n    subs: [ /* event listesi */ ],\n    handleds: [ /* handle edilenler */ ]\n  }\n}\n</code></pre> <p>Ak\u0131\u015f\u0131n\u0131zda panel-bazl\u0131 ayr\u0131m yapmak i\u00e7in <code>msg.payload.client</code> veya <code>msg.req.ip</code> \u00fczerinden filtre uygulayabilirsiniz.</p>"},{"location":"baslangic/mimari/#sonraki-adm","title":"Sonraki Ad\u0131m","text":"<p>Mesaj Yap\u0131s\u0131 sayfas\u0131nda <code>operationtype</code> format\u0131n\u0131n her alan\u0131 detayl\u0131 incelenmi\u015ftir.</p>"},{"location":"nodlar/","title":"Node Referans\u0131","text":"<p><code>node-red-trexmes-service</code> paketi toplam 23 Node-RED node tipi kaydeder. Bu sayfa hepsini kategorilere ay\u0131r\u0131p arad\u0131\u011f\u0131n\u0131z\u0131 h\u0131zl\u0131ca bulman\u0131z\u0131 sa\u011flar.</p>"},{"location":"nodlar/#cekirdek-nodlar","title":"\u00c7ekirdek Nodlar","text":"<p>Her trexMes projesinde mutlaka bulunmas\u0131 gereken altyap\u0131 node'lar\u0131.</p> Node I/O A\u00e7\u0131klama trex Subscriber 0 \u2192 1 Projedeki t\u00fcm event'leri panele kaydeder. Her projede 1 adet zorunlu. Responser 1 \u2192 0 HTTP cevab\u0131n\u0131 panele d\u00f6ner. Olay ak\u0131\u015flar\u0131n\u0131n sonunda olmal\u0131d\u0131r."},{"location":"nodlar/#olay-event-nodlar","title":"Olay (Event) Nodlar\u0131","text":"<p>Panel taraf\u0131ndan tetiklenen olaylar\u0131 yakalayan, inputs=0, outputs=1 olan node'lar. Hepsi <code>trex Subscriber</code> ile ayn\u0131 altyap\u0131y\u0131 payla\u015f\u0131r.</p> <p><code>Handle Setter</code>, <code>IsHandled</code> \u00f6zelli\u011fi bulunan Event node'lar\u0131n\u0131 i\u00e7eren ak\u0131\u015flarda zincirin son trexMes node'u olarak eklenir; <code>IsHandled=true</code> ayarland\u0131\u011f\u0131nda ilgili olaya ait t\u00fcm i\u015flemler kesilir.</p> Node I/O A\u00e7\u0131klama Business Events 0 \u2192 1 \u0130\u015f ak\u0131\u015f\u0131 olaylar\u0131 System Events 0 \u2192 1 Sistem seviyesi olaylar Communication Events 0 \u2192 1 \u0130leti\u015fim katman\u0131 olaylar\u0131 Display Events 0 \u2192 1 UI g\u00f6sterim olaylar\u0131 Form Events 0 \u2192 1 Form \u00fczerindeki etkile\u015fimler Display Methods 0 \u2192 1 Ana form method tetikleyicileri Method Returns 0 \u2192 1 Method invocation cevaplar\u0131 Handle Setter 1 \u2192 1 Olay ak\u0131\u015f\u0131n\u0131n sonunda <code>IsHandled</code> de\u011ferini dinamik olarak set eder; <code>true</code> oldu\u011funda panel olay\u0131 kesintiye u\u011frat\u0131r <p>T\u00fcm olay tiplerinin genel bak\u0131\u015f\u0131 \u2192</p>"},{"location":"nodlar/#form-nodlar","title":"Form Nodlar\u0131","text":"<p>Custom form tasar\u0131m\u0131, kontrol ba\u011flama ve \u00f6zellik y\u00f6netimi.</p> Node I/O A\u00e7\u0131klama Custom Form 1 \u2192 1 XML tabanl\u0131 form tasar\u0131m\u0131 olu\u015fturur Form Bind Controls 1 \u2192 1 Form alanlar\u0131na veri ba\u011flar Control Properties 1 \u2192 1 Kontrol \u00f6zelliklerini ayarlar Button Configurator 1 \u2192 1 Form \u00fczerindeki butonlar\u0131 yap\u0131land\u0131r\u0131r Main Form Action 1 \u2192 1 Ana formdaki butonlar\u0131 tetikler"},{"location":"nodlar/#islem-action-nodlar","title":"\u0130\u015flem (Action) Nodlar\u0131","text":"<p>Method \u00e7a\u011f\u0131rma, process tetikleme ve script \u00e7al\u0131\u015ft\u0131rma.</p> Node I/O A\u00e7\u0131klama Method Invoker 1 \u2192 1 Panel method'unu \u00e7a\u011f\u0131r\u0131r, parametre ge\u00e7er Context Getter 1 \u2192 1 \u0130stasyona ait StateContext verisini sorgular Execute Process 1 \u2192 1 Panel'de tan\u0131ml\u0131 process'i tetikler Execute Script 1 \u2192 1 Form \u00fczerinde script \u00e7al\u0131\u015ft\u0131r\u0131r"},{"location":"nodlar/#yapay-zeka","title":"Yapay Zek\u00e2","text":"<p>LLM ile otomatik ak\u0131\u015f \u00fcretimi.</p> Node I/O A\u00e7\u0131klama LLM Flow Builder 1 \u2192 1 Do\u011fal dil komutuyla Node-RED ak\u0131\u015f\u0131 \u00fcretir"},{"location":"nodlar/#ortak-ozellikler","title":"Ortak \u00d6zellikler","text":""},{"location":"nodlar/#renk-kodlamas","title":"Renk Kodlamas\u0131","text":"<p>Node'lar paletteki yerlerini kolayca tan\u0131mak i\u00e7in 3 renk grubuna ayr\u0131lm\u0131\u015ft\u0131r:</p> <p>trex Subscriber Koyu ye\u015fil (<code>#58D68D</code>) \u2014 \u00c7ekirdek/ana node'lar</p> <p>Business Events A\u00e7\u0131k ye\u015fil (<code>#CCFFCC</code>) \u2014 Servis/i\u015flem node'lar\u0131 (\u00e7o\u011funluk)</p> <p>LLM Flow Builder Parlak ye\u015fil (<code>#99FF33</code>) \u2014 AI/yard\u0131mc\u0131 ara\u00e7lar</p>"},{"location":"nodlar/#kategori","title":"Kategori","text":"<p>Paletteki kategori ad\u0131: <code>trexMes service</code></p>"},{"location":"nodlar/#ikon","title":"\u0130kon","text":"<p>\u00c7o\u011fu node trexMes logosu olan <code>trex.png</code> ikonunu kullan\u0131r. <code>LLM Flow Builder</code> istisnad\u0131r (<code>font-awesome/fa-magic</code>).</p>"},{"location":"nodlar/#hangi-nodeu-ne-zaman-kullanmalym","title":"Hangi Node'u Ne Zaman Kullanmal\u0131y\u0131m?","text":"<p>Senaryo bazl\u0131 h\u0131zl\u0131 se\u00e7im rehberi:</p> \u0130htiya\u00e7 \u00d6nerilen Node Projede ilk node'u koymak istiyorum <code>trex Subscriber</code> Panel'den bir olay yakalamak istiyorum \u0130lgili <code>* Events</code> node Panelde yeni bir form a\u00e7mak istiyorum <code>Custom Form</code> Form alan\u0131na veri y\u00fcklemek istiyorum <code>Form Bind Controls</code> Bir butonu gizlemek/yaz\u0131s\u0131n\u0131 de\u011fi\u015ftirmek istiyorum <code>Control Properties</code> veya <code>Button Configurator</code> Panel'deki bir method'u \u00e7a\u011f\u0131rmak istiyorum <code>Method Invoker</code> \u0130stasyona ait durum verisini okumak istiyorum <code>Context Getter</code> Panel'de bir process tetiklemek istiyorum <code>Execute Process</code> Olay\u0131n handled durumunu dinamik de\u011fi\u015ftirmek istiyorum <code>Handle Setter</code> Do\u011fal dilden ak\u0131\u015f \u00fcretmek istiyorum <code>LLM Flow Builder</code>"},{"location":"nodlar/#sonraki-adm","title":"Sonraki Ad\u0131m","text":"<p>Bir node'a t\u0131klayarak detay sayfas\u0131na gidin. Her node sayfas\u0131 \u015funlar\u0131 i\u00e7erir:</p> <ul> <li>\u00d6zet (ne i\u015fe yarar, hangi I/O)</li> <li>Property tablosu (t\u00fcm yap\u0131land\u0131rma alanlar\u0131)</li> <li>\u00c7\u0131k\u0131\u015f payload \u00f6rne\u011fi</li> <li>Tipik kullan\u0131m ak\u0131\u015f \u015femas\u0131</li> <li>S\u0131k kar\u015f\u0131la\u015f\u0131lan hatalar</li> </ul>"},{"location":"nodlar/business-events/","title":"Business Events","text":"Business Events Inputs: 0 Outputs: 1 Kategori: trexMes service <p>trexMes panelindeki i\u015f ak\u0131\u015f\u0131 olaylar\u0131na abone olur. \u00dcretim, sipari\u015f, vardiya gibi i\u015f s\u00fcre\u00e7lerine ba\u011fl\u0131 tetiklemeleri yakalar.</p>"},{"location":"nodlar/business-events/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>method</code> string <code>get</code> HTTP method (otomatik) <code>event</code> string (bo\u015f) Panel'in tetikleyece\u011fi HTTP path <code>ishandled</code> boolean <code>false</code> Node-RED handle ediyor mu? <code>suffix</code> string \u2014 Event ismine eklenecek son ek (\u00f6zel alan)"},{"location":"nodlar/business-events/#olay-listesi","title":"Olay Listesi","text":"<p><code>Event</code> alan\u0131 combobox ile se\u00e7ilir. Mevcut se\u00e7enekler kategorilere g\u00f6re grupland\u0131r\u0131lm\u0131\u015ft\u0131r:</p>"},{"location":"nodlar/business-events/#proses-analiz","title":"Proses / Analiz","text":"Olay A\u00e7\u0131klama <code>OnProcessDataAnalysisAlertOccured</code> Proses verisi analizinde tolerans d\u0131\u015f\u0131 de\u011fer alg\u0131land\u0131\u011f\u0131nda tetiklenir. <code>OnProcessDataAnalysisProcessing</code> Proses verisi analiz edilirken tetiklenir. IsHandled true ise arg\u00fcmanlardan d\u00f6nen analiz nesnesi i\u015flenir. <code>OnShiftDefectsQuerying</code> trex Edge analiz ekran\u0131nda \u0131skarta analizi i\u00e7in sorgulama ger\u00e7ekle\u015ftirilirken f\u0131rlat\u0131l\u0131r. <code>OnShiftProductivityCalculated</code> Vardiya \u00fcretkenli\u011fi hesapland\u0131\u011f\u0131nda tetiklenir."},{"location":"nodlar/business-events/#lot-malzeme","title":"Lot / Malzeme","text":"Olay A\u00e7\u0131klama <code>OnConsumedLotEntriesDeleting</code> T\u00fcketilen lot kay\u0131tlar\u0131 silinirken tetiklenir. <code>OnLotEntriesDeletingOnProductionCompletion</code> \u00dcretim tamamland\u0131\u011f\u0131nda lot kay\u0131tlar\u0131 silinirken tetiklenir. <code>OnLotDeleted</code> Lot silindi\u011finde tetiklenir. <code>OnMaterialCounterIncreased</code> Malzeme sayac\u0131 art\u0131r\u0131ld\u0131\u011f\u0131nda tetiklenir. <code>OnMaterialLotSelectionProcessed</code> Malzeme lot se\u00e7imi i\u015flendi\u011finde tetiklenir. <code>OnPlanLotsFromLotEntriesGenerating</code> Lot giri\u015flerinden plan lotlar\u0131 olu\u015fturulurken tetiklenir. <code>OnPlanMaterialsQuerying</code> Plan malzemeleri sorgulan\u0131rken tetiklenir. <code>OnCurrentLotBalancesValidating</code> Mevcut lot bakiyeleri do\u011frulan\u0131rken tetiklenir."},{"location":"nodlar/business-events/#iskarta","title":"Iskarta","text":"Olay A\u00e7\u0131klama <code>OnDefectAmountQuerying</code> Iskarta miktar\u0131 sorgulan\u0131rken tetiklenir. <code>OnDefectEntryCreated</code> Iskarta giri\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnDefectEntryDeleted</code> Iskarta giri\u015fi silindi\u011finde tetiklenir. <code>OnDefectQuantityConverting</code> Iskarta miktar\u0131 \u00e7evrimi s\u0131ras\u0131nda tetiklenir. <code>OnSerieDefectCreated</code> Seri bazl\u0131 \u0131skarta olu\u015fturuldu\u011funda tetiklenir."},{"location":"nodlar/business-events/#belge","title":"Belge","text":"Olay A\u00e7\u0131klama <code>OnDocumentNotFound</code> Belge bulunamad\u0131\u011f\u0131nda tetiklenir."},{"location":"nodlar/business-events/#takm","title":"Tak\u0131m","text":"Olay A\u00e7\u0131klama <code>OnTeamChanged</code> Tak\u0131m de\u011fi\u015fti\u011finde tetiklenir."},{"location":"nodlar/business-events/#forklift","title":"Forklift","text":"Olay A\u00e7\u0131klama <code>OnForkliftOrderCreated</code> Forklift sipari\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnForkliftFetchOrderCreating</code> Forklift alma sipari\u015fi olu\u015fturulurken tetiklenir. <code>OnForkliftGetOrderCreating</code> Forklift getirme sipari\u015fi olu\u015fturulurken tetiklenir. <code>OnForkliftOrderUpdated</code> Forklift sipari\u015fi g\u00fcncellendi\u011finde tetiklenir. <code>OnForkliftOrdersQuerying</code> Forklift sipari\u015fleri sorgulan\u0131rken tetiklenir."},{"location":"nodlar/business-events/#plan-is-emri","title":"Plan / \u0130\u015f Emri","text":"Olay A\u00e7\u0131klama <code>OnCreatedProductionPlanLoading</code> Olu\u015fturulan \u00fcretim plan\u0131 y\u00fcklenirken tetiklenir. <code>OnCurrentPlanInfoSet</code> Mevcut plan bilgisi ayarland\u0131\u011f\u0131nda tetiklenir. <code>OnJobOrderQueryGenerating</code> \u0130\u015f emri sorgusu olu\u015fturulurken tetiklenir. <code>OnJobOrderSelecting</code> \u0130\u015f emri se\u00e7ilirken tetiklenir. <code>OnOperatorAddedNextPlan</code> Operat\u00f6r sonraki plana eklendi\u011finde tetiklenir. <code>OnOperatorDeletedNextPlan</code> Operat\u00f6r sonraki plandan silindi\u011finde tetiklenir. <code>OnPlanChanged</code> Plan de\u011fi\u015fti\u011finde tetiklenir. <code>OnPlanLoaded</code> Plan y\u00fcklendi\u011finde tetiklenir. <code>OnPlanLoadViaOpcStockNoFailed</code> OPC stok no ile plan y\u00fckleme ba\u015far\u0131s\u0131z oldu\u011funda tetiklenir. <code>OnPlanSelecting</code> Plan se\u00e7ilirken tetiklenir. <code>OnPlanSelectionApproved</code> Plan se\u00e7imi onayland\u0131\u011f\u0131nda tetiklenir. <code>OnPlanSelectViabilityChecking</code> Plan se\u00e7im uygunlu\u011fu kontrol edilirken tetiklenir. <code>OnPlanStartViabilityChecking</code> Plan ba\u015flatma uygunlu\u011fu kontrol edilirken tetiklenir. <code>OnProductionPlanChanging</code> \u00dcretim plan\u0131 de\u011fi\u015ftirilirken tetiklenir. <code>OnProductionPlanCreated</code> \u00dcretim plan\u0131 olu\u015fturuldu\u011funda tetiklenir. <code>OnProductionPlanJobOrdersAppending</code> \u00dcretim plan\u0131na i\u015f emirleri eklenirken tetiklenir. <code>OnProductionPlanQueryGenerating</code> \u00dcretim plan\u0131 sorgusu olu\u015fturulurken tetiklenir."},{"location":"nodlar/business-events/#etiket","title":"Etiket","text":"Olay A\u00e7\u0131klama <code>OnLabelPrinting</code> Etiket bas\u0131m\u0131 s\u0131ras\u0131nda tetiklenir. <code>OnLabelReprinting</code> Etiket yeniden bas\u0131m\u0131 s\u0131ras\u0131nda tetiklenir. <code>OnUnapprovedProductionReceiptLabelPrinting</code> Onays\u0131z \u00fcretim fi\u015fi etiketi bas\u0131l\u0131rken tetiklenir."},{"location":"nodlar/business-events/#dil","title":"Dil","text":"Olay A\u00e7\u0131klama <code>OnLanguageChanged</code> Dil de\u011fi\u015fti\u011finde tetiklenir. <code>OnLanguageSelectionChanged</code> Dil se\u00e7imi de\u011fi\u015fti\u011finde tetiklenir."},{"location":"nodlar/business-events/#bakm","title":"Bak\u0131m","text":"Olay A\u00e7\u0131klama <code>OnMaintenanceOrderCompleted</code> Bak\u0131m emri tamamland\u0131\u011f\u0131nda tetiklenir. <code>OnMaintenanceOrderCreated</code> Bak\u0131m emri olu\u015fturuldu\u011funda tetiklenir. <code>OnMaintenancePlanSetting</code> Bak\u0131m plan\u0131 ayarlan\u0131rken tetiklenir. <code>OnMaintenanceServiceReceiptCreated</code> Bak\u0131m servis fi\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnMaintenanceServiceRequestCreated</code> Bak\u0131m servis talebi olu\u015fturuldu\u011funda tetiklenir. <code>OnOperatorCreatingMaintenanceOrder</code> Operat\u00f6r bak\u0131m emri olu\u015ftururken tetiklenir. <code>OnOperatorMaintenaceInterventionEnded</code> Operat\u00f6r bak\u0131m m\u00fcdahalesi bitti\u011finde tetiklenir. <code>OnPeriodicalMaintenanceApproved</code> Periyodik bak\u0131m onayland\u0131\u011f\u0131nda tetiklenir. <code>OnPeriodicalMaintenanceConditionChecking</code> Periyodik bak\u0131m ko\u015fulu kontrol edilirken tetiklenir."},{"location":"nodlar/business-events/#pokayoke","title":"PokaYoke","text":"Olay A\u00e7\u0131klama <code>OnPokaYokeBarcodeValidating</code> PokaYoke barkod do\u011frulamas\u0131 yap\u0131l\u0131rken tetiklenir. <code>OnPokaYokeComponentChanging</code> PokaYoke bile\u015fen de\u011fi\u015ftirilirken tetiklenir."},{"location":"nodlar/business-events/#uretim-hz-tamamlanma","title":"\u00dcretim / H\u0131z / Tamamlanma","text":"Olay A\u00e7\u0131klama <code>OnPlanCompletionSummaryCalculated</code> Plan tamamlanma \u00f6zeti hesapland\u0131\u011f\u0131nda tetiklenir. <code>OnPlanCompletionSummaryCalculatedSetting</code> Plan tamamlanma \u00f6zeti ayarlan\u0131rken tetiklenir. <code>OnCurrentSpeedCalculated</code> Mevcut h\u0131z hesapland\u0131\u011f\u0131nda tetiklenir. <code>OnCurrentSpeedCalculating</code> Mevcut h\u0131z hesaplan\u0131rken tetiklenir. <code>OnEstimatedCompletionTimeCalculating</code> Tahmini biti\u015f s\u00fcresi hesaplan\u0131rken tetiklenir. <code>OnJoblessProductionOccured</code> \u0130\u015fsiz \u00fcretim ger\u00e7ekle\u015fti\u011finde tetiklenir. <code>OnNoShiftTimeProductionOccuring</code> Vardiya d\u0131\u015f\u0131 \u00fcretim ger\u00e7ekle\u015firken tetiklenir. <code>OnProductionSectionEntryCreated</code> \u00dcretim kesit giri\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnProductionSectionEntryCreating</code> \u00dcretim kesit giri\u015fi olu\u015fturulurken tetiklenir. <code>OnProductionSectionEntryUndefinedStockDetected</code> Tan\u0131ms\u0131z stok alg\u0131land\u0131\u011f\u0131nda tetiklenir. <code>OnProductionSectionEntryUpdating</code> \u00dcretim kesit giri\u015fi g\u00fcncellenirken tetiklenir. <code>OnProductionCompleted</code> \u00dcretim tamamland\u0131\u011f\u0131nda tetiklenir. <code>OnProductionCompleting</code> \u00dcretim tamamlanmak \u00fczereyken tetiklenir. <code>OnProductionContinuing</code> \u00dcretime devam edilirken tetiklenir. <code>OnProductionFinishStatusChecking</code> \u00dcretim biti\u015f durumu kontrol edilirken tetiklenir. <code>OnProductionInfoResetted</code> \u00dcretim bilgileri s\u0131f\u0131rland\u0131\u011f\u0131nda tetiklenir. <code>OnProductionInfoSet</code> \u00dcretim bilgileri ayarland\u0131\u011f\u0131nda tetiklenir. <code>OnProductionQuantityConverting</code> \u00dcretim miktar\u0131 \u00e7evrilirken tetiklenir. <code>OnProductionSummaryUpdated</code> \u00dcretim \u00f6zeti g\u00fcncellendi\u011finde tetiklenir. <code>OnRotationSpeedCalculating</code> D\u00f6n\u00fc\u015f h\u0131z\u0131 hesaplan\u0131rken tetiklenir. <code>OnPlannedSpeedCalculating</code> Planlanan h\u0131z hesaplan\u0131rken tetiklenir. <code>OnSignalProductionEnding</code> Sinyal ile \u00fcretim biti\u015fi tetiklendi\u011finde tetiklenir."},{"location":"nodlar/business-events/#sayac","title":"Saya\u00e7","text":"Olay A\u00e7\u0131klama <code>OnCounterIncrementViabilityChecked</code> Saya\u00e7 art\u0131r\u0131m uygunlu\u011fu kontrol edildi\u011finde tetiklenir. <code>OnOpcProductionCounterIncreasing</code> OPC \u00fczerinden \u00fcretim sayac\u0131 art\u0131r\u0131l\u0131rken tetiklenir. <code>OnOperatorCounterIncreasing</code> Operat\u00f6r sayac\u0131 art\u0131r\u0131rken tetiklenir. <code>OnProductionCounterIncreased</code> \u00dcretim sayac\u0131 art\u0131r\u0131ld\u0131\u011f\u0131nda tetiklenir. <code>OnProductionCounterIncrementCompleted</code> \u00dcretim sayac\u0131 art\u0131r\u0131m tamamland\u0131\u011f\u0131nda tetiklenir. <code>OnStockProductionCounterIncreased</code> Stok \u00fcretim sayac\u0131 art\u0131r\u0131ld\u0131\u011f\u0131nda tetiklenir."},{"location":"nodlar/business-events/#cevrim-suresi-parametre","title":"\u00c7evrim S\u00fcresi / Parametre","text":"Olay A\u00e7\u0131klama <code>OnCoefficientChangeSaved</code> \u00c7arpan de\u011fi\u015fikli\u011fi kaydedildi\u011finde tetiklenir. <code>OnCyclePeriodSet</code> \u00c7evrim s\u00fcresi ayarland\u0131\u011f\u0131nda tetiklenir. <code>OnCyclePeriodSetting</code> \u00c7evrim s\u00fcresi ayarlan\u0131rken tetiklenir. <code>OnProPlanCycleFromStockCycleSetting</code> Stok \u00e7evriminden \u00fcretim plan\u0131 \u00e7evrimi ayarlan\u0131rken tetiklenir. <code>OnSelectedJobOrderProductionParametersSetting</code> Se\u00e7ili i\u015f emri \u00fcretim parametreleri ayarlan\u0131rken tetiklenir. <code>OnSpecPortSelected</code> Spec port se\u00e7ildi\u011finde tetiklenir. <code>OnStockCoefficientChangeSaving</code> Stok \u00fcretim \u00e7arpan\u0131 de\u011fi\u015ftirilirken tetiklenir. <code>OnStockEquipmentMatchViabilityChecking</code> Stok ekipman uyumu kontrol edilirken tetiklenir."},{"location":"nodlar/business-events/#fis","title":"Fi\u015f","text":"Olay A\u00e7\u0131klama <code>OnEditedProductionReceiptSaving</code> D\u00fczenlenen \u00fcretim fi\u015fi kaydedilmeden \u00f6nce tetiklenir. <code>OnEditProductionReceiptSaved</code> D\u00fczenlenen \u00fcretim fi\u015fi kaydedildi\u011finde tetiklenir. <code>OnPlanReceiptCreated</code> Plan fi\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnPlanReceiptCreating</code> Plan fi\u015fi olu\u015fturulurken tetiklenir. <code>OnPlanReceiptMaterialsCreated</code> Plan fi\u015fi malzemeleri olu\u015fturuldu\u011funda tetiklenir. <code>OnPidReceiptCreated</code> \u00d6n \u00fcretim fi\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnPidReceiptCreating</code> \u00d6n \u00fcretim fi\u015fi olu\u015fturulurken tetiklenir. <code>OnPidSectionReceiptCreated</code> \u00dcretim kesit fi\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnProductionReceiptCreated</code> \u00dcretim fi\u015fi olu\u015fturuldu\u011funda tetiklenir. <code>OnProductionReceiptCreating</code> \u00dcretim fi\u015fi olu\u015fturulmadan hemen \u00f6nce tetiklenir. <code>OnProductionReceiptEditQuantityConverting</code> \u00dcretim fi\u015fi d\u00fczenlenirken miktar \u00e7evrimi s\u0131ras\u0131nda tetiklenir. <code>OnProductionReceiptEditReceiptLoading</code> D\u00fczenleme i\u00e7in \u00fcretim fi\u015fi y\u00fcklenirken tetiklenir. <code>OnProductionReceiptEditSaving</code> D\u00fczenlenen \u00fcretim fi\u015fi kaydedilirken tetiklenir. <code>OnProductionReceiptIntegrating</code> \u00dcretim fi\u015fi entegrasyonu s\u0131ras\u0131nda tetiklenir. <code>OnProductionReceiptIntegrationSaving</code> \u00dcretim fi\u015fi entegrasyon kayd\u0131 yap\u0131l\u0131rken tetiklenir. <code>OnSubProductReceiptsCreating</code> Yan \u00fcr\u00fcn fi\u015fleri olu\u015fturulurken tetiklenir. <code>OnUnapprovedProductionReceiptIntegrating</code> Onays\u0131z \u00fcretim fi\u015fi entegrasyonu s\u0131ras\u0131nda tetiklenir. <code>OnUnapprovedProductionReceiptUsedMaterialSelecting</code> Onays\u0131z fi\u015flerde sarf malzemesi se\u00e7ilirken tetiklenir. <code>OnUserDefinedReceiptDataCreated</code> Kullan\u0131c\u0131 tan\u0131ml\u0131 fi\u015f verisi olu\u015fturuldu\u011funda tetiklenir. <code>OnProductionReceiptUserDefinedFieldsGetting</code> \u00dcretim fi\u015fi i\u00e7in kullan\u0131c\u0131 tan\u0131ml\u0131 alanlar haz\u0131rlan\u0131rken tetiklenir."},{"location":"nodlar/business-events/#uretim-onay","title":"\u00dcretim Onay\u0131","text":"Olay A\u00e7\u0131klama <code>OnFractionalAmountProductionConfirmed</code> K\u0131smi miktarl\u0131 otomatik \u00fcretim onay\u0131 ger\u00e7ekle\u015fti\u011finde tetiklenir. <code>OnOperatorApprovedProductionConfirmationAmount</code> Operat\u00f6r \u00fcretim miktar onay\u0131n\u0131 verdi\u011finde tetiklenir. <code>OnOperatorApprovingProductionConfirmationAmount</code> Operat\u00f6r \u00fcretim miktar onay\u0131 verirken tetiklenir. <code>OnOperatorApprovingProductionSaveAmount</code> Operat\u00f6r \u00fcretim kaydetme miktar\u0131 onaylarken tetiklenir (obsolete). <code>OnProductionConfirmationAmountValidating</code> \u00dcretim onay miktar\u0131 do\u011frulan\u0131rken tetiklenir. <code>OnOperatorProductionConfirming</code> Operat\u00f6r \u00fcretim onay\u0131n\u0131 ba\u015flat\u0131rken tetiklenir. <code>OnProductionConfirmationCompleted</code> \u00dcretim onay i\u015flemi tamamland\u0131\u011f\u0131nda tetiklenir. <code>OnProductionConfirmationCompleting</code> \u00dcretim onay i\u015flemi tamamlanmak \u00fczereyken tetiklenir. <code>OnProductionConfirmed</code> \u00dcretim onay\u0131 ger\u00e7ekle\u015fti\u011finde tetiklenir. <code>OnProductionConfirmationAllowanceChecked</code> \u00dcretim onay izni kontrol edildi\u011finde tetiklenir. <code>OnProductionConfirmationStarted</code> \u00dcretim onay i\u015flemi ba\u015flad\u0131\u011f\u0131nda tetiklenir. <code>OnProductionConfirmationViabilityChecking</code> \u00dcretim onay uygunlu\u011fu kontrol edilirken tetiklenir. <code>OnProductionConfirming</code> \u00dcretim onay i\u015flemi ba\u015flat\u0131l\u0131rken tetiklenir. <code>OnSignalProductionConfirmed</code> Sinyal ile \u00fcretim onay\u0131 ger\u00e7ekle\u015fti\u011finde tetiklenir. <code>OnSignalProductionConfirming</code> Sinyal ile \u00fcretim onay\u0131 ba\u015flamadan \u00f6nce tetiklenir."},{"location":"nodlar/business-events/#kalite","title":"Kalite","text":"Olay A\u00e7\u0131klama <code>OnQualityReceiptCreated</code> Kalite fi\u015fi olu\u015fturuldu\u011funda tetiklenir."},{"location":"nodlar/business-events/#vardiya","title":"Vardiya","text":"Olay A\u00e7\u0131klama <code>OnShiftChanged</code> Vardiya de\u011fi\u015fti\u011finde tetiklenir. <code>OnShiftChanging</code> Vardiya de\u011fi\u015fimi s\u0131ras\u0131nda tetiklenir."},{"location":"nodlar/business-events/#durus","title":"Duru\u015f","text":"Olay A\u00e7\u0131klama <code>OnAuthorizationRequiredStoppageEnding</code> Yetki gerektiren duru\u015f bitirilirken tetiklenir. <code>OnStoppageChanging</code> Duru\u015f de\u011fi\u015ftirilirken tetiklenir. <code>OnStoppageChanged</code> Duru\u015f de\u011fi\u015ftirildi\u011finde tetiklenir. <code>OnStoppageEnding</code> Duru\u015f bitirilirken tetiklenir. <code>OnStoppageEnded</code> Duru\u015f bitti\u011finde tetiklenir. <code>OnStoppageReasonEquipmentSelected</code> Duru\u015f sebebi ekipman\u0131 se\u00e7ildi\u011finde tetiklenir. <code>OnStoppageSelected</code> Duru\u015f se\u00e7ildi\u011finde tetiklenir. <code>OnStoppageSelecting</code> Duru\u015f se\u00e7ilirken tetiklenir. <code>OnStoppageStarted</code> Duru\u015f ba\u015flad\u0131\u011f\u0131nda tetiklenir. <code>OnTestModeChanged</code> Test modu de\u011fi\u015fti\u011finde tetiklenir. <code>OnUndefinedStoppageChanged</code> Tan\u0131ms\u0131z duru\u015f de\u011fi\u015ftirildi\u011finde tetiklenir. <code>OnUndefinedStoppageChanging</code> Tan\u0131ms\u0131z duru\u015f de\u011fi\u015ftirilirken tetiklenir. <code>OnUndefinedStoppagesListing</code> Tan\u0131ms\u0131z duru\u015flar listelenirken tetiklenir. <code>OnUndefinedStoppagesQuerying</code> Tan\u0131ms\u0131z duru\u015flar sorgulan\u0131rken tetiklenir. <code>OnPlannedStoppageEstimatedDurationReached</code> Planl\u0131 duru\u015f tahmini s\u00fcresine ula\u015f\u0131ld\u0131\u011f\u0131nda tetiklenir."},{"location":"nodlar/business-events/#is-istasyonu","title":"\u0130\u015f \u0130stasyonu","text":"Olay A\u00e7\u0131klama <code>OnWorkStationStatusEntryCreating</code> \u0130\u015f istasyonu durum kayd\u0131 olu\u015fturulurken tetiklenir. <code>OnWorkStationStatusItemEntryCreating</code> \u0130\u015f istasyonu durum kalem kayd\u0131 olu\u015fturulurken tetiklenir. <code>OnWorkStationStatesSet</code> \u0130\u015f istasyonu durumlar\u0131 ayarland\u0131\u011f\u0131nda tetiklenir. <code>OnWorkStationInfoLoaded</code> \u0130\u015f istasyonu bilgileri y\u00fcklendi\u011finde tetiklenir."},{"location":"nodlar/business-events/#ornek-kullanm","title":"\u00d6rnek Kullan\u0131m","text":"<pre><code>flowchart LR\n    A[Business Events&lt;br/&gt;OrderStartEvent] --&gt; B[Custom Form&lt;br/&gt;Sipari\u015f Detay Formu]\n    B --&gt; C[Form Bind Controls&lt;br/&gt;Sipari\u015f No, \u00dcr\u00fcn]\n    C --&gt; D[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/business-events/#giris-mesaj","title":"Giri\u015f Mesaj\u0131","text":"<pre><code>{\n  \"_msgid\": \"abc123\",\n  \"req\": { \"ip\": \"192.168.1.42\", \"query\": {...} },\n  \"res\": { /* response wrapper */ },\n  \"payload\": {\n    \"orderNo\": \"ORD-2026-0001\",\n    \"operatorId\": \"OP-007\",\n    \"machineId\": \"M-12\",\n    \"productCode\": \"PRD-X100\",\n    \"qty\": 100\n  }\n}\n</code></pre>"},{"location":"nodlar/business-events/#suffix-alan","title":"<code>suffix</code> Alan\u0131","text":"<p><code>suffix</code>, yaln\u0131zca <code>Business Events</code> node'una \u00f6zg\u00fc bir aland\u0131r. Ayn\u0131 panel olay\u0131n\u0131 birden fazla <code>Business Events</code> node'unun yakalamas\u0131 gerekti\u011finde kullan\u0131l\u0131r.</p> <p>Node-RED, her <code>Business Events</code> node'unu ayr\u0131 bir HTTP endpoint olarak kaydeder. Ayn\u0131 <code>event</code> de\u011ferine sahip ikinci bir node eklendi\u011finde endpoint \u00e7ak\u0131\u015fmas\u0131 olu\u015fur. <code>suffix</code> alan\u0131na herhangi bir de\u011fer yaz\u0131lmas\u0131 bu \u00e7ak\u0131\u015fmay\u0131 \u00f6nler:</p> Node <code>event</code> <code>suffix</code> Kaydedilen Endpoint 1. node <code>OnPlanLoaded</code> (bo\u015f) <code>/OnPlanLoaded</code> 2. node <code>OnPlanLoaded</code> <code>_2</code> <code>/OnPlanLoaded_2</code> 3. node <code>OnPlanLoaded</code> <code>_3</code> <code>/OnPlanLoaded_3</code> <p>Panel <code>OnPlanLoaded</code> olay\u0131n\u0131 tetikledi\u011finde t\u00fcm bu node'lar birlikte tetiklenir; her biri ba\u011f\u0131ms\u0131z ak\u0131\u015f\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.</p> <p>Di\u011fer Event node'lar\u0131nda suffix yoktur</p> <p><code>suffix</code> alan\u0131 yaln\u0131zca <code>Business Events</code>'e aittir. Di\u011fer Event node t\u00fcrlerinde (<code>System Events</code>, <code>Form Events</code> vb.) ayn\u0131 olay ad\u0131 birden fazla kullan\u0131lamaz.</p>"},{"location":"nodlar/business-events/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>\u0130sim standardizasyonu</p> <p>\u0130\u015f olaylar\u0131n\u0131n isminin sonuna her zaman <code>Event</code> eklenmesi tavsiye edilir (<code>OrderStartEvent</code>, <code>ProductionEndEvent</code>). Bu, kay\u0131t listesinde s\u0131ral\u0131 g\u00f6r\u00fcnmesini sa\u011flar.</p> <p>Suffix de\u011feri \u00f6nemli de\u011fil</p> <p>Suffix alan\u0131na yaz\u0131lan de\u011ferin anlam\u0131 yoktur; \u00e7ak\u0131\u015fmay\u0131 \u00f6nlemek i\u00e7in yeterlidir. <code>_2</code>, <code>_3</code> gibi s\u0131ral\u0131 de\u011ferler okunabilirlik a\u00e7\u0131s\u0131ndan tavsiye edilir.</p>"},{"location":"nodlar/business-events/#ilgili","title":"\u0130lgili","text":"<ul> <li>Olay Nodlar\u0131 Genel Bak\u0131\u015f</li> <li>Custom Form</li> <li>H\u0131zl\u0131 Ba\u015flang\u0131\u00e7</li> </ul>"},{"location":"nodlar/button-configurator/","title":"Button Configurator","text":"Button Configurator Inputs: 1 Outputs: 1 Kategori: trexMes service <p>trexMes Main Form veya di\u011fer operasyon formlar\u0131ndaki standart butonlar\u0131 yap\u0131land\u0131r\u0131r. Buton g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc, etiketi, varsay\u0131lan handler override durumu gibi ayarlar\u0131 tek seferde y\u00f6netir.</p>"},{"location":"nodlar/button-configurator/#buton-indeksleri","title":"Buton \u0130ndeksleri","text":"<p>Main Form ve operasyon formlar\u0131ndaki butonlar 0-indexed olarak s\u0131ral\u0131d\u0131r. A\u015fa\u011f\u0131daki g\u00f6rselde her butonun ID numaras\u0131 g\u00f6r\u00fcnmektedir:</p> <p></p> <p>\u00d6nemli</p> <p><code>props</code> listesindeki <code>p</code> de\u011feri 1'den ba\u015flar (kullan\u0131c\u0131 dostu). Kod taraf\u0131nda <code>ButtonIndexType = p - 1</code> d\u00f6n\u00fc\u015f\u00fcm\u00fc yap\u0131l\u0131r.</p>"},{"location":"nodlar/button-configurator/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>formname</code> string (bo\u015f) Hedef form ad\u0131 <code>formainform</code> boolean <code>false</code> Ana form (<code>AppForm</code>) m\u0131? <code>props</code> array <code>[]</code> Buton konfig\u00fcrasyon listesi"},{"location":"nodlar/button-configurator/#props-yaps","title":"<code>props</code> Yap\u0131s\u0131","text":"<p>Her sat\u0131r 5 alandan olu\u015fur:</p> Anahtar A\u00e7\u0131klama \u00d6rnek <code>p</code> Buton indeksi (1-based) <code>1</code>, <code>2</code>, <code>3</code> <code>v</code> Varsay\u0131lan etiket (<code>DefaultCaption</code>) <code>\"Kaydet\"</code> <code>d</code> G\u00f6r\u00fcn\u00fcr m\u00fc? (<code>IsVisible</code>) <code>true</code> <code>e</code> Default handler override? <code>true</code> (kendi handler'\u0131m\u0131z \u00e7al\u0131\u015fs\u0131n) <code>f</code> Component ad\u0131 (<code>ComponentName</code>) <code>\"btnSave\"</code> <pre><code>[\n  {\n    \"p\": \"1\",\n    \"v\": \"Yeni Sipari\u015f\",\n    \"d\": true,\n    \"e\": false,\n    \"f\": \"btnNewOrder\"\n  },\n  {\n    \"p\": \"2\",\n    \"v\": \"Kaydet\",\n    \"d\": true,\n    \"e\": true,\n    \"f\": \"btnSave\"\n  },\n  {\n    \"p\": \"5\",\n    \"v\": \"\u0130ptal\",\n    \"d\": false,\n    \"e\": false,\n    \"f\": \"btnCancel\"\n  }\n]\n</code></pre>"},{"location":"nodlar/button-configurator/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<pre><code>{\n  \"operationtype\": \"UIButtonConfig\",\n  \"receiveddata\": { /* event data */ },\n  \"value\": [\n    {\n      \"ButtonIndexType\": 0,\n      \"DefaultCaption\": \"Yeni Sipari\u015f\",\n      \"IsVisible\": true,\n      \"IsToOverrideDefaultHandler\": false,\n      \"ComponentName\": \"btnNewOrder\"\n    },\n    {\n      \"ButtonIndexType\": 1,\n      \"DefaultCaption\": \"Kaydet\",\n      \"IsVisible\": true,\n      \"IsToOverrideDefaultHandler\": true,\n      \"ComponentName\": \"btnSave\"\n    }\n  ]\n}\n</code></pre>"},{"location":"nodlar/button-configurator/#istooverridedefaulthandler-davrans","title":"<code>IsToOverrideDefaultHandler</code> Davran\u0131\u015f\u0131","text":"De\u011fer Anlam <code>true</code> Panel'in varsay\u0131lan buton i\u015flevini iptal et, sadece bizim handler'\u0131m\u0131z (<code>Form Events</code>) \u00e7al\u0131\u015fs\u0131n <code>false</code> Panel'in standart i\u015flevi devam etsin (\u00f6rn. \"\u0130ptal\" panel default'unda formu kapat\u0131r)"},{"location":"nodlar/button-configurator/#komponent-ismi-yeniden-tanmlama","title":"Komponent \u0130smi Yeniden Tan\u0131mlama","text":"<p><code>ComponentName</code> alan\u0131 sayesinde sistemdeki buton indeksini \u00f6zel bir isimle \u00e7a\u011f\u0131rabilirsiniz. Bu sayede:</p> <ul> <li>Bir <code>Form Events</code> node'unda buton click yakalarken indeks yerine isim kullanabilirsiniz.</li> <li>Birden fazla projede ayn\u0131 isim/i\u015f mant\u0131\u011f\u0131 tutarl\u0131 kal\u0131r.</li> </ul>"},{"location":"nodlar/button-configurator/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events] --&gt; B[Custom Form&lt;br/&gt;OrderEntryForm]\n    B --&gt; C[Form Bind Controls]\n    C --&gt; D[Button Configurator&lt;br/&gt;Yeni/Kaydet/\u0130ptal]\n    D --&gt; E[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/button-configurator/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Buton hala g\u00f6r\u00fcnm\u00fcyor / de\u011fi\u015fmedi</p> <ul> <li><code>formname</code> do\u011fru mu girildi? (<code>formainform: true</code> ise <code>AppForm</code>)</li> <li>Buton indeksi ge\u00e7erli aral\u0131kta m\u0131? (G\u00f6rsele bak\u0131n)</li> <li>Ak\u0131\u015fta <code>Custom Form</code> \u00f6nce gelmi\u015f mi?</li> </ul> <p>Buton t\u0131klamas\u0131 cevaps\u0131z kal\u0131yor</p> <p><code>IsToOverrideDefaultHandler: true</code> set ettiyseniz mutlaka bir <code>Form Events</code> ile buton click'i yakalay\u0131p i\u015flem yap\u0131n. Aksi takdirde t\u0131klama sessizce yutulur.</p>"},{"location":"nodlar/button-configurator/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>\u0130sim standardizasyonu</p> <p><code>ComponentName</code>'leri <code>btnSave</code>, <code>btnCancel</code>, <code>btnNew</code> gibi prefix'li tutmak <code>Form Events</code> node'lar\u0131nda d\u00fczenli yakalama sa\u011flar.</p> <p>Konfig\u00fcrasyonu reuse etmek</p> <p>Ayn\u0131 buton d\u00fczenini birden fazla formda kullan\u0131yorsan\u0131z bu node'u link out / link in ile payla\u015f\u0131labilir bir alt-ak\u0131\u015fa yerle\u015ftirin.</p>"},{"location":"nodlar/button-configurator/#ilgili","title":"\u0130lgili","text":"<ul> <li>Custom Form</li> <li>Form Events \u2014 Buton t\u0131klamas\u0131 yakalama</li> <li>Main Form Action \u2014 Buton tetikleme</li> </ul>"},{"location":"nodlar/communication-events/","title":"Communication Events","text":"Communication Events Inputs: 0 Outputs: 1 Kategori: trexMes service <p>trexMes panelindeki ileti\u015fim katman\u0131 olaylar\u0131na abone olur. PLC, OPC, Modbus, sens\u00f6r veya di\u011fer cihaz ba\u011flant\u0131 durumu de\u011fi\u015fikliklerini yakalar.</p>"},{"location":"nodlar/communication-events/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>method</code> string <code>get</code> HTTP method (otomatik) <code>event</code> string (bo\u015f) Panel'in tetikleyece\u011fi HTTP path <code>ishandled</code> boolean <code>false</code> Node-RED handle ediyor mu?"},{"location":"nodlar/communication-events/#olay-listesi","title":"Olay Listesi","text":"<p><code>Event</code> alan\u0131 combobox ile se\u00e7ilir. Mevcut se\u00e7enekler:</p> Olay A\u00e7\u0131klama <code>OnAssemblyPictureSignalChanged</code> Montaj resim g\u00f6sterim sinyalinin de\u011fi\u015fimi s\u0131ras\u0131nda f\u0131rlat\u0131l\u0131r. <code>OnBarcodeScanned</code> Uygulama ana ekran\u0131 veya COM barkod okuyucu ile ger\u00e7ekle\u015ftirilen barkod okutma i\u015flemlerinde tetiklenir. <code>OnBarcodeScanning</code> Barkod okutma i\u015flemlerinde standart barkod kurgular\u0131 \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce tetiklenir. IsHandled true ise standart i\u015flem yap\u0131lmaz. <code>OnNotificationMessageProcessing</code> Bildirim mesaj\u0131 al\u0131nd\u0131\u011f\u0131nda tetiklenir. IsHandled true ise sadece mesaj durumu g\u00f6sterildi olarak g\u00fcncellenir. <code>OnDigitalInputValueChanged</code> Dijital input sinyal de\u011feri de\u011fi\u015fti\u011finde tetiklenir. <code>OnDigitalInputValueChanging</code> Dijital input sinyal de\u011feri de\u011fi\u015fmek \u00fczere oldu\u011funda tetiklenir. <code>OnDigitalOutputValueChanged</code> Dijital output sinyal de\u011feri de\u011fi\u015fti\u011finde tetiklenir. <code>OnDigitalOutputValueChanging</code> Dijital output sinyal de\u011feri de\u011fi\u015fmek \u00fczere oldu\u011funda tetiklenir. <code>OnIOCardDataCoalesced</code> IO kart \u00fczerinden al\u0131nan sinyal verisinin \u00e7\u00f6z\u00fcmlenmesinden hemen \u00f6nce tetiklenir. <code>OnJobOrderStockBarcodeScanned</code> \u0130\u015f emri veya stok barkodu tarat\u0131l\u0131p ilgili i\u015flem ger\u00e7ekle\u015ftirildi\u011finde tetiklenir. <code>OnJobOrderStockBarcodeScanning</code> \u0130\u015f emri veya stok barkodu tarat\u0131ld\u0131\u011f\u0131nda tetiklenir. IsHandled true ise standart i\u015flemler es ge\u00e7ilir. <code>OnLotBarcodeScanning</code> Sarf lot giri\u015fi i\u00e7in barkod okutma i\u015flemi ger\u00e7ekle\u015ftirildi\u011finde tetiklenir. IsHandled true ise standart i\u015flemler es ge\u00e7ilir. <code>OnNgpCommandProcessing</code> trex Lite \u00fczerinden gelen istek i\u015flenmeden hemen \u00f6nce tetiklenir. IsHandled true ise standart kurgu i\u015fletilmez. <code>OnPortDataChanged</code> OPC haberle\u015fmesi \u00fczerinden ger\u00e7ekle\u015fen veri portu de\u011fer de\u011fi\u015fimi i\u015flendi\u011finde tetiklenir. <code>OnPortDataChanging</code> OPC haberle\u015fmesi \u00fczerinden ger\u00e7ekle\u015fen veri portu de\u011fer de\u011fi\u015fimi i\u015flenmek \u00fczere oldu\u011funda tetiklenir. <code>OnPortManagerConnected</code> IO kart ile port y\u00f6neticisi aras\u0131nda ba\u011flant\u0131 ger\u00e7ekle\u015ftirildi\u011finde tetiklenir. <code>OnPortManagerInitialized</code> Sinyal port y\u00f6neticisi aya\u011fa kalkt\u0131\u011f\u0131nda tetiklenir. <code>OnPortManagerInitializing</code> Sinyal port y\u00f6neticisi aya\u011fa kalkt\u0131\u011f\u0131 esnada tetiklenir. <code>OnPortParametersLoaded</code> Sinyal port parametre tan\u0131mlar\u0131 y\u00fcklendi\u011finde tetiklenir. <code>OnProductionConfirmationSignalChanged</code> \u00dcretim onay sinyali ile \u00fcretim onay\u0131 ger\u00e7ekle\u015ftirildi\u011finde tetiklenir. <code>OnProductionConfirmationSignalInputValuesSetting</code> \u00dcretim onay s\u00fcreci sonras\u0131 sinyal input de\u011ferlerinin set edilmesi s\u0131ras\u0131nda tetiklenir. <code>OnSerialPortBarcodeScanning</code> Seri port \u00fczerinden barkod okutma i\u015flemi ger\u00e7ekle\u015ftirildi\u011finde standart i\u015flemler \u00f6ncesi tetiklenir. <code>OnSerieBarcodeScanning</code> Serili \u00fcretim barkod i\u015flemleri ger\u00e7ekle\u015ftirilmeden hemen \u00f6nce tetiklenir. <code>OnSocketMessageInterpreted</code> OPC haberle\u015fmesi amac\u0131 ile dinlenen TCP socket \u00fczerinden gelen mesaj \u00e7\u00f6z\u00fcmlendi\u011finde tetiklenir. <code>OnStoppageSignalChanged</code> Duru\u015f sinyal input durumu de\u011fi\u015fti\u011finde tetiklenir. <code>OnDefectEntrySignalChanged</code> Iskarta giri\u015f sinyal input durumu de\u011fi\u015fti\u011finde tetiklenir."},{"location":"nodlar/communication-events/#ornek-kullanm","title":"\u00d6rnek Kullan\u0131m","text":"<pre><code>flowchart LR\n    A[Communication Events&lt;br/&gt;OnBarcodeScanned] --&gt; B[function&lt;br/&gt;Barkod i\u015fle]\n    B --&gt; C[Custom Form&lt;br/&gt;Sonu\u00e7 Ekran\u0131]\n    C --&gt; D[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/communication-events/#giris-mesaj","title":"Giri\u015f Mesaj\u0131","text":"<pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"deviceId\": \"PLC-01\",\n    \"deviceType\": \"Siemens S7-1200\",\n    \"status\": \"Disconnected\",\n    \"errorCode\": \"TIMEOUT\",\n    \"timestamp\": \"2026-05-11T10:15:30Z\"\n  }\n}\n</code></pre>"},{"location":"nodlar/communication-events/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Otomatik alarm</p> <p><code>PLCConnectionLost</code> olay\u0131 geldi\u011finde Slack/Teams/SMS bildirimi g\u00f6nderen bir ak\u0131\u015f kurabilirsiniz.</p> <p>Saha veri toplama</p> <p><code>SensorReading</code> olay\u0131n\u0131 y\u00fcksek frekansta (saniyede 10+) i\u015fliyorsan\u0131z, debug node'unu kapat\u0131n, sadece InfluxDB/MQTT'ye yaz\u0131n.</p>"},{"location":"nodlar/communication-events/#ilgili","title":"\u0130lgili","text":"<ul> <li>Olay Nodlar\u0131 Genel Bak\u0131\u015f</li> <li>Method Invoker</li> </ul>"},{"location":"nodlar/context-getter/","title":"Context Getter","text":"Context Getter Inputs: 1 Outputs: 1 Kategori: trexMes service <p>Belirtilen WorkStation'a ait bir StateContext'i trexMes panelinden sorgular. Sonu\u00e7 asenkron olarak Method Returns node'u \u00fczerinden al\u0131n\u0131r.</p>"},{"location":"nodlar/context-getter/#ozet","title":"\u00d6zet","text":"<p>Method Invoker karde\u015fi</p> <p>Context Getter, Method Invoker ile ayn\u0131 asenkron ileti\u015fim modelini kullan\u0131r. Fark \u015fudur: Method Invoker bir servis method'u \u00e7a\u011f\u0131r\u0131r, Context Getter ise bir StateContext snapshot'\u0131 ister.</p>"},{"location":"nodlar/context-getter/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Node ad\u0131. Method Returns ile e\u015fle\u015fmelidir <code>context</code> combobox <code>AnalysisStateContext</code> Sorgulanacak StateContext <code>workstationid</code> num | msg <code>0</code> Sorgulanacak istasyon ID'si <code>workstationidType</code> <code>\"num\"</code> | <code>\"msg\"</code> <code>\"num\"</code> WorkStation ID de\u011fer kayna\u011f\u0131"},{"location":"nodlar/context-getter/#context-secenekleri-25-adet","title":"Context Se\u00e7enekleri (25 adet)","text":"Context Kapsam <code>AnalysisStateContext</code> OEE, performans, vardiya analizleri <code>BarcodeStateContext</code> Barkod okutma konfig\u00fcrasyonu <code>CapacityStateContext</code> \u00c7evrim s\u00fcresi, max kapasite, h\u0131z <code>ConsumptionStateContext</code> Sarf t\u00fcketimi ve lot verileri <code>CounterStateContext</code> \u00dcretim saya\u00e7lar\u0131 ve sinyal portlar\u0131 <code>DefectStateContext</code> Iskarta miktarlar\u0131 ve konfig\u00fcrasyonlar\u0131 <code>EmployeeStateContext</code> Personel giri\u015f/\u00e7\u0131k\u0131\u015f ve tak\u0131m bilgisi <code>EnergyStateContext</code> Enerji t\u00fcketim verileri (kW) <code>EquipmentStateContext</code> Mevcut ekipman bilgisi ve konfig\u00fcrasyonu <code>ForkliftStateContext</code> Forklift g\u00f6revi olu\u015fturma ve takibi <code>LabelStateContext</code> Etiket yaz\u0131c\u0131 konfig\u00fcrasyonu <code>LineStateContext</code> Hat \u00fcretimi, master istasyon, duru\u015f aktar\u0131m\u0131 <code>MaintenanceStateContext</code> Bak\u0131m plan\u0131, aktif bak\u0131m i\u015f emri <code>OpcStateContext</code> OPC \u00fczerinden ekipman/stok/h\u0131z konfig\u00fcrasyonu <code>OperationStateContext</code> Mevcut operasyon bilgileri <code>ProcessDataStateContext</code> Proses veri analiz de\u011ferleri <code>ProductionConfirmationStateContext</code> \u00dcretim bildirimi konfig\u00fcrasyon ve son kay\u0131tlar <code>ProductionPlanStateContext</code> Y\u00fckl\u00fc plan bilgileri, stoklar, i\u015f emirleri <code>ProductionToleranceStateContext</code> \u00dcretim tolerans kontrol de\u011ferleri <code>QualityControlStateContext</code> Kalite kontrol tan\u0131mlar\u0131 ve output konfig\u00fcrasyonlar\u0131 <code>RobotModelStateContext</code> Robot model \u00fcretim kurgusu <code>ScaleStateContext</code> Terazi a\u011f\u0131rl\u0131k ve port verileri <code>SerieStateContext</code> Mevcut \u00fcr\u00fcn seri barkodu <code>StoppageStateContext</code> Mevcut duru\u015f bilgileri, s\u00fcre, output konfig\u00fcrasyonlar\u0131 <code>WorkStationStateContext</code> \u0130stasyon kimlik ve i\u015f merkezi bilgileri <p>Property a\u00e7\u0131klamalar\u0131</p> <p>Node edit\u00f6r panelinde Context se\u00e7imi de\u011fi\u015ftik\u00e7e, se\u00e7ilen context'e ait t\u00fcm property'lerin a\u00e7\u0131klamalar\u0131 WorkStation ID alan\u0131n\u0131n alt\u0131nda g\u00f6r\u00fcn\u00fcr.</p>"},{"location":"nodlar/context-getter/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<p>Context Getter, Method Invoker ile ayn\u0131 <code>msg.payload</code> array pattern'ini kullan\u0131r. Sorgu nesnesi <code>msg.payload</code> dizisine eklenir:</p> <pre><code>// msg.payload (array)\n[\n  {\n    \"message\"      : \"ProductionPlanStateContext\",\n    \"valuelabel\"   : 5,\n    \"name\"         : \"PlanContext\",\n    \"operationtype\": \"ContextGetterProcess\"\n  }\n]\n</code></pre> <p>\u00d6nceki node'dan gelen <code>msg.payload</code> bir nesne ise (dizi de\u011fil) \u00f6nce <code>receiveddata</code> olarak saklan\u0131r, ard\u0131ndan diziye sar\u0131l\u0131r \u2014 bu sayede zincirdeki veriler kaybolmaz.</p> Alan A\u00e7\u0131klama <code>message</code> Se\u00e7ili StateContext ad\u0131 <code>valuelabel</code> Sorgulanacak istasyon ID'si <code>name</code> Node ad\u0131 \u2014 Method Returns e\u015fle\u015fmesi bu alanla yap\u0131l\u0131r <code>operationtype</code> Sabit: <code>\"ContextGetterProcess\"</code>"},{"location":"nodlar/context-getter/#calsma-modeli","title":"\u00c7al\u0131\u015fma Modeli","text":"<pre><code>sequenceDiagram\n    autonumber\n    participant Event as Business Events\n    participant CG as Context Getter\n    participant Resp as Responser\n    participant Panel as trexMes Panel\n    participant MR as Method Returns\n\n    Event-&gt;&gt;CG: msg geldi\n    CG-&gt;&gt;CG: msg.payload dizisine sorgu eklendi\n    CG-&gt;&gt;Resp: msg iletildi\n    Resp--&gt;&gt;Panel: HTTP cevab\u0131 (context sorgusu)\n    Note over Panel: Context snapshot haz\u0131rlan\u0131yor...\n    Panel-&gt;&gt;MR: Context verisi g\u00f6nderildi (ayr\u0131 HTTP)\n    MR-&gt;&gt;MR: Yeni ak\u0131\u015f ba\u015flad\u0131</code></pre>"},{"location":"nodlar/context-getter/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events&lt;br/&gt;OnShiftStarted] --&gt; B[Context Getter&lt;br/&gt;AnalysisStateContext&lt;br/&gt;wsId=5]\n    B --&gt; C[Responser]\n\n    D[Method Returns&lt;br/&gt;AnalysisStateContext] --&gt; E[function&lt;br/&gt;OEE hesapla]\n    E --&gt; F[Custom Form&lt;br/&gt;Vardiya ekran\u0131]\n    F --&gt; G[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000\n    style F fill:#ccffcc,color:#000\n    style G fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/context-getter/#method-returns-ile-baglant","title":"Method Returns ile Ba\u011flant\u0131","text":"<p>Name e\u015fle\u015fmesi zorunludur</p> <p>Context Getter node'unun <code>name</code> alan\u0131, ilgili Method Returns node'undaki <code>methodname</code> se\u00e7imi ile birebir e\u015fle\u015fmelidir.</p> <pre><code>Context Getter  \u2192  name: \"ProductionPlanStateContext\"\nMethod Returns  \u2192  methodname: \"ProductionPlanStateContext\"   \u2713\n</code></pre> <p>Method Returns edit\u00f6r panelinde a\u00e7\u0131l\u0131r liste, ak\u0131\u015ftaki t\u00fcm Method Invoker ve Context Getter node adlar\u0131n\u0131 otomatik listeler; elle yazmak gerekmez.</p>"},{"location":"nodlar/context-getter/#workstation-id-kaynag","title":"WorkStation ID Kayna\u011f\u0131","text":"<p><code>workstationidType</code> de\u011ferine g\u00f6re iki farkl\u0131 kullan\u0131m:</p> Sabit say\u0131 (num)Mesajdan oku (msg) <p><pre><code>WorkStation ID: 5   (num)\n</code></pre> Her \u00e7a\u011fr\u0131da ayn\u0131 istasyon sorgulan\u0131r.</p> <p><pre><code>WorkStation ID: payload.workStationId   (msg)\n</code></pre> \u00d6nceki node'dan gelen mesaj i\u00e7indeki de\u011fer kullan\u0131l\u0131r. Dinamik istasyon se\u00e7imi i\u00e7in tercih edilir.</p>"},{"location":"nodlar/context-getter/#ornek-senaryo-uretim-plan-verisi-okuma","title":"\u00d6rnek Senaryo \u2014 \u00dcretim Plan\u0131 Verisi Okuma","text":"<ol> <li><code>Business Events</code> \u2014 <code>OnOrderStarted</code> tetiklenir; <code>msg.payload.workStationId = 3</code></li> <li><code>Context Getter</code> \u2014 <code>ProductionPlanStateContext</code>, workstationid = <code>msg.payload.workStationId</code></li> <li><code>Responser</code> \u2014 \u00e7a\u011fr\u0131 ak\u0131\u015f\u0131 kapand\u0131</li> <li>Panel plan verisini haz\u0131rlar ve g\u00f6nderir</li> <li><code>Method Returns</code> (ad\u0131: <code>ProductionPlanStateContext</code>) tetiklenir</li> <li><code>function</code> node \u2014 <code>msg.payload.PlanQuantity</code>, <code>msg.payload.LeftAmountForPlanCompletion</code> okunur</li> <li><code>Custom Form</code> \u2014 plan durumu ekranda g\u00f6sterilir</li> </ol>"},{"location":"nodlar/context-getter/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Method Returns tetiklenmiyor</p> <ul> <li>Context Getter'\u0131n <code>name</code> alan\u0131 ile Method Returns'teki <code>methodname</code> uyu\u015fuyor mu?</li> <li>Context Getter ak\u0131\u015fa eklenip deploy edildi mi?</li> </ul> <p>WorkStation ID 0 geliyor</p> <p><code>workstationidType</code> = <code>msg</code> se\u00e7iliyken \u00f6nceki node'dan gerekli alan gelmiyor olabilir. Bir <code>debug</code> node ile <code>msg</code> i\u00e7eri\u011fini kontrol edin.</p> <p>Context verisi bo\u015f</p> <p>\u0130lgili WorkStation panelde tan\u0131ml\u0131 de\u011fil veya context o an dolu de\u011fil olabilir. Panel log'lar\u0131n\u0131 kontrol edin.</p>"},{"location":"nodlar/context-getter/#ilgili","title":"\u0130lgili","text":"<ul> <li>Method Returns \u2014 Context sorgu cevab\u0131n\u0131 yakala</li> <li>Method Invoker \u2014 Servis method \u00e7a\u011fr\u0131s\u0131 i\u00e7in</li> <li>Responser \u2014 Her ak\u0131\u015f\u0131n sonu</li> </ul>"},{"location":"nodlar/control-properties/","title":"Control Properties","text":"Control Properties Inputs: 1 Outputs: 1 Kategori: trexMes service <p>Form \u00fczerindeki kontrollerin g\u00f6rsel ve davran\u0131\u015fsal \u00f6zelliklerini \u00e7al\u0131\u015fma zaman\u0131nda ayarlar. Visible, Enabled, Text, ForeColor gibi her t\u00fcrl\u00fc property atamas\u0131n\u0131 yapar.</p>"},{"location":"nodlar/control-properties/#ozet","title":"\u00d6zet","text":"<p><code>Form Bind Controls</code> veri ba\u011flarken, <code>Control Properties</code> \u00f6zellik atar. \u0130kisi birbirini tamamlar:</p> <ul> <li>\"Bu textbox'a sipari\u015f numaras\u0131n\u0131 yaz\" \u2192 <code>Form Bind Controls</code></li> <li>\"Bu butonu gizle, etiketi k\u0131rm\u0131z\u0131 yap\" \u2192 <code>Control Properties</code></li> </ul>"},{"location":"nodlar/control-properties/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>formname</code> string (bo\u015f) Hedef form ad\u0131 <code>formainform</code> boolean <code>false</code> Ana form (<code>AppForm</code>) m\u0131? <code>props</code> array <code>[]</code> \u00d6zellik atama listesi"},{"location":"nodlar/control-properties/#props-yaps","title":"<code>props</code> Yap\u0131s\u0131","text":"<p>Her sat\u0131r 4 alan i\u00e7erir:</p> Anahtar A\u00e7\u0131klama \u00d6rnek <code>p</code> Kontrol ad\u0131 (ControlName) <code>btnSubmit</code> <code>v</code> \u00d6zellik ad\u0131 (PropertyName) <code>Enabled</code> <code>d</code> De\u011fer veya path <code>true</code> <code>dt</code> De\u011fer kayna\u011f\u0131 (dataType) <code>bool</code> <pre><code>[\n  { \"p\": \"btnSubmit\", \"v\": \"Enabled\",   \"d\": \"true\",          \"dt\": \"bool\" },\n  { \"p\": \"lblTitle\",  \"v\": \"Text\",      \"d\": \"Yeni Sipari\u015f\",  \"dt\": \"str\"  },\n  { \"p\": \"txtQty\",    \"v\": \"ForeColor\", \"d\": \"Red\",           \"dt\": \"str\"  },\n  { \"p\": \"btnSave\",   \"v\": \"Visible\",   \"d\": \"payload.canSave\",\"dt\": \"msg\" }\n]\n</code></pre>"},{"location":"nodlar/control-properties/#datatype-cesitleri","title":"<code>dataType</code> \u00c7e\u015fitleri","text":"<p><code>dt</code> alan\u0131 de\u011ferin nereden okunaca\u011f\u0131n\u0131 belirler:</p> <code>dataType</code> Anlam Tipik Kullan\u0131m <code>msg</code> Mesaj nesnesinden Dinamik de\u011ferler <code>flow</code> Flow context Ge\u00e7ici state <code>global</code> Global context Sabit ayarlar <code>num</code> Sabit say\u0131 <code>42</code>, <code>100</code> <code>json</code> Sabit JSON <code>{\"color\":\"red\"}</code> <code>bool</code> Sabit boolean <code>true</code>, <code>false</code> <code>jsonata</code> JSONata ifadesi <code>$count(payload.items) &gt; 5</code> di\u011fer Sabit string <code>\"Red\"</code>, <code>\"Verdana\"</code>"},{"location":"nodlar/control-properties/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<pre><code>{\n  \"operationtype\": \"ControlProperties\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderForm\",\n  \"value\": [\n    { \"ControlName\": \"btnSubmit\", \"PropertyName\": \"Enabled\",   \"Value\": true   },\n    { \"ControlName\": \"lblTitle\",  \"PropertyName\": \"Text\",      \"Value\": \"Yeni\" },\n    { \"ControlName\": \"txtQty\",    \"PropertyName\": \"ForeColor\", \"Value\": \"Red\"  }\n  ]\n}\n</code></pre>"},{"location":"nodlar/control-properties/#asenkron-islem-modeli","title":"Asenkron \u0130\u015flem Modeli","text":"<p>Node, t\u00fcm property atamalar\u0131n\u0131 <code>Promise.all</code> ile paralel \u00e7\u00f6z\u00fcmler:</p> <pre><code>let tasks = node.props.map((item) =&gt; {\n    return new Promise((resolve, reject) =&gt; {\n        switch (item.dt) {\n            case 'msg':    computedValue = RED.util.getMessageProperty(msg, item.d); break;\n            case 'flow':   computedValue = node.context().flow.get(item.d); break;\n            case 'global': computedValue = node.context().global.get(item.d); break;\n            case 'jsonata':\n                // Async JSONata \u00e7\u00f6z\u00fcmlemesi\n                let expr = RED.util.prepareJSONataExpression(item.d, node);\n                RED.util.evaluateJSONataExpression(expr, msg, (err, result) =&gt; {\n                    err ? reject(err) : resolve({\n                        ControlName: item.p,\n                        PropertyName: item.v,\n                        Value: result\n                    });\n                });\n                return;\n            // ...\n        }\n        resolve({ ControlName: item.p, PropertyName: item.v, Value: computedValue });\n    });\n});\n\nPromise.all(tasks).then((bindcontrols) =&gt; { /* msg.payload.push */ });\n</code></pre>"},{"location":"nodlar/control-properties/#tipik-property-isimleri","title":"Tipik Property \u0130simleri","text":"<p>WinForm kontrolleri i\u00e7in en s\u0131k kullan\u0131lan \u00f6zellikler:</p> Property Tip \u00d6rnek De\u011fer <code>Visible</code> bool <code>true</code> / <code>false</code> <code>Enabled</code> bool <code>true</code> / <code>false</code> <code>Text</code> string <code>\"Kaydet\"</code> <code>BackColor</code> string <code>\"Red\"</code>, <code>\"#FF0000\"</code> <code>ForeColor</code> string <code>\"White\"</code> <code>Font.Bold</code> bool <code>true</code> <code>Width</code> number <code>200</code> <code>Height</code> number <code>40</code>"},{"location":"nodlar/control-properties/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events] --&gt; B[Custom Form]\n    B --&gt; C[Form Bind Controls]\n    C --&gt; D[Control Properties&lt;br/&gt;btnSave.Enabled=true]\n    D --&gt; E[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/control-properties/#onemli-notlar","title":"\u00d6nemli Notlar","text":"<p>Property isimleri b\u00fcy\u00fck harfle ba\u015flar</p> <p>WinForm property isimleri PascalCase'dir: <code>Visible</code>, <code>Enabled</code>, <code>Text</code>, <code>BackColor</code> \u2014 k\u00fc\u00e7\u00fck harfle ba\u015flamazlar.</p> <p>Form hen\u00fcz a\u00e7\u0131lmad\u0131ysa</p> <p><code>Control Properties</code> panele property atama g\u00f6nderir; ancak form hen\u00fcz a\u00e7\u0131lmam\u0131\u015fsa atama uygulanamaz. Ak\u0131\u015fta \u00f6nce <code>Custom Form</code> olmal\u0131d\u0131r.</p>"},{"location":"nodlar/control-properties/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Property uygulanm\u0131yor</p> <ul> <li>Property ad\u0131 yaz\u0131m\u0131 do\u011fru mu? (<code>Visible</code> \u2260 <code>visible</code>)</li> <li>Kontrol ad\u0131 XML'deki ile e\u015fle\u015fiyor mu?</li> <li><code>dataType</code> se\u00e7imi tutarl\u0131 m\u0131? <code>bool</code> se\u00e7tiyseniz de\u011fer <code>\"true\"</code>/<code>\"false\"</code> string olmal\u0131.</li> </ul> <p>JSONata hatas\u0131</p> <p>JSONata ifadesi sentaks hatas\u0131 i\u00e7eriyorsa node hata f\u0131rlat\u0131r. \u0130fadeyi \u00f6nce ba\u015fka bir ak\u0131\u015fta <code>change</code> node'unda test edin.</p>"},{"location":"nodlar/control-properties/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Toplu disable/enable</p> <p>Bir formun t\u00fcm input'lar\u0131n\u0131 disable etmek istiyorsan\u0131z her birini tek tek listelemek yerine bir <code>function</code> node ile dinamik liste olu\u015fturun ve <code>dataType: jsonata</code> ile d\u00f6nd\u00fcr\u00fcn.</p> <p>Renkler i\u00e7in string format\u0131</p> <p>Renk de\u011ferleri i\u00e7in WinForm Color enum isimleri (<code>Red</code>, <code>LightBlue</code>, <code>Crimson</code>) veya HTML hex (<code>#FF0000</code>) kullan\u0131labilir.</p>"},{"location":"nodlar/control-properties/#ilgili","title":"\u0130lgili","text":"<ul> <li>Custom Form</li> <li>Form Bind Controls</li> <li>Button Configurator</li> <li>Mesaj Yap\u0131s\u0131 \u2014 dataType</li> </ul>"},{"location":"nodlar/custom-form/","title":"Custom Form","text":"Custom Form Inputs: 1 Outputs: 1 Kategori: trexMes service <p>trexMes panelinde \u00e7al\u0131\u015fma zaman\u0131nda \u00f6zel form a\u00e7ar. XML format\u0131nda tan\u0131mlanm\u0131\u015f form tasar\u0131m\u0131n\u0131 panele g\u00f6nderir. Panel bu XML'i parse ederek WinForm UI'\u0131 olu\u015fturur.</p>"},{"location":"nodlar/custom-form/#ozet","title":"\u00d6zet","text":"<p><code>Custom Form</code> bu paketin g\u00f6rsel aray\u00fcz taraf\u0131n\u0131n kalbidir. Modal dialog veya ana form (main form) \u00fczerine yeni i\u00e7erik basabilirsiniz. Form i\u00e7eri\u011fi XML format\u0131ndad\u0131r ve genellikle birlikte gelen Custom Form Designer arac\u0131 ile g\u00f6rsel olarak tasarlan\u0131r.</p>"},{"location":"nodlar/custom-form/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Form'un panel taraf\u0131ndaki ad\u0131 <code>customformxml</code> string (bo\u015f) XML format\u0131nda form tasar\u0131m\u0131 <code>isstyled</code> boolean <code>false</code> Form stillendirilmi\u015f mi? <code>formainform</code> boolean <code>false</code> Ana form \u00fczerinde mi g\u00f6sterece\u011fiz? <code>designformname</code> string (bo\u015f) Linked Form Design node'unun ad\u0131"},{"location":"nodlar/custom-form/#xml-kaynak-secenekleri","title":"XML Kaynak Se\u00e7enekleri","text":"<p>Form XML'i iki kaynaktan sa\u011flanabilir:</p> <ol> <li>Do\u011frudan <code>customformxml</code> alan\u0131na yap\u0131\u015ft\u0131r\u0131larak</li> <li><code>Form Design</code> config node'undan link verilerek (<code>designformname</code> ile)</li> </ol> <pre><code>if (node.designformname) {\n    RED.nodes.eachNode(function (n) {\n        if (n.type === \"Form Design\" &amp;&amp; n.name === node.designformname) {\n            if (n.formdesignxml) {\n                selectedXml = n.formdesignxml;\n            }\n        }\n    });\n}\nif (node.customformxml !== \"\") {\n    selectedXml = node.customformxml;  // Inline override\n}\n</code></pre> <p>Hangi kaynak kullan\u0131l\u0131r?</p> <p><code>customformxml</code> alan\u0131 dolu ise her zaman o kullan\u0131l\u0131r. Bo\u015f b\u0131rak\u0131rsan\u0131z <code>Form Design</code> config node'undaki XML kullan\u0131l\u0131r. Bu sayede ayn\u0131 tasar\u0131m\u0131 birden fazla <code>Custom Form</code> node'unda payla\u015fabilirsiniz.</p>"},{"location":"nodlar/custom-form/#formainform-davrans","title":"<code>formainform</code> Davran\u0131\u015f\u0131","text":"De\u011fer Anlam <code>operationtype</code> <code>continueevent</code> <code>false</code> Modal dialog olarak a\u00e7 <code>CustomDialog</code> <code>Continue</code> <code>true</code> Ana formu g\u00fcncelle (<code>AppForm</code>) <code>MainForm</code> <code>Break</code>"},{"location":"nodlar/custom-form/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<p><code>msg.payload</code> array'ine eklenen operasyon:</p> <pre><code>{\n  \"operationtype\": \"CustomDialog\",\n  \"receiveddata\": { \"orderNo\": \"ORD-001\" },\n  \"name\": \"OrderEntryForm\",\n  \"continueevent\": \"Continue\",\n  \"customformxml\": \"&lt;form&gt;...&lt;/form&gt;\",\n  \"isstyled\": true\n}\n</code></pre>"},{"location":"nodlar/custom-form/#xml-format","title":"XML Format\u0131","text":"<p>Form XML'i <code>trexForm.Designer</code> taraf\u0131ndan \u00fcretilen WinForms tabanl\u0131 bir formatt\u0131r. K\u00f6k eleman <code>&lt;Object name=\"CustomForm\" type=\"trexForm.Designer.CustomForm, ...\"&gt;</code> \u015feklindedir; her kontrol de ayr\u0131 bir <code>&lt;Object&gt;</code> olarak i\u00e7 i\u00e7e tan\u0131mlan\u0131r.</p>"},{"location":"nodlar/custom-form/#genel-yap","title":"Genel Yap\u0131","text":"<pre><code>&lt;Object name=\"CustomForm\" type=\"trexForm.Designer.CustomForm, trexForm.Designer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\" version=\"1\"&gt;\n    &lt;!-- Form \u00f6zellikleri --&gt;\n    &lt;AutoValidate&gt;EnablePreventFocusChange&lt;/AutoValidate&gt;\n    &lt;BackColor&gt;Control&lt;/BackColor&gt;\n    &lt;ClientSize&gt;600, 400&lt;/ClientSize&gt;\n    &lt;Font&gt;Microsoft Sans Serif, 8.25pt&lt;/Font&gt;\n    &lt;Name&gt;CustomForm&lt;/Name&gt;\n\n    &lt;!-- Kontroller \u2014 her biri ayr\u0131 &lt;Object&gt; --&gt;\n    &lt;Object type=\"System.Windows.Forms.Label, System.Windows.Forms, ...\" name=\"lblBaslik\"&gt;\n        &lt;Text&gt;Ba\u015fl\u0131k&lt;/Text&gt;\n        &lt;Location&gt;20, 20&lt;/Location&gt;\n        &lt;Size&gt;200, 30&lt;/Size&gt;\n        &lt;TabIndex&gt;0&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Button, System.Windows.Forms, ...\" name=\"btnTamam\"&gt;\n        &lt;Text&gt;TAMAM&lt;/Text&gt;\n        &lt;Location&gt;20, 100&lt;/Location&gt;\n        &lt;Size&gt;120, 40&lt;/Size&gt;\n        &lt;TabIndex&gt;1&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n&lt;/Object&gt;\n</code></pre>"},{"location":"nodlar/custom-form/#ornek-label-ve-buton","title":"\u00d6rnek: Label ve Buton","text":"<p>A\u015fa\u011f\u0131daki XML, form \u00fczerinde bir adet b\u00fcy\u00fck ba\u015fl\u0131k etiketi ve sar\u0131 zemin renkli bir buton tan\u0131mlar:</p> <pre><code>&lt;Object name=\"CustomForm\" type=\"trexForm.Designer.CustomForm, trexForm.Designer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\" version=\"1\"&gt;\n    &lt;AutoValidate&gt;EnablePreventFocusChange&lt;/AutoValidate&gt;\n    &lt;BackColor&gt;LightCoral&lt;/BackColor&gt;\n    &lt;ClientSize&gt;556, 369&lt;/ClientSize&gt;\n    &lt;AutoScaleDimensions&gt;6, 13&lt;/AutoScaleDimensions&gt;\n    &lt;Cursor&gt;Default&lt;/Cursor&gt;\n    &lt;Font&gt;Microsoft Sans Serif, 8.25pt&lt;/Font&gt;\n    &lt;ForeColor&gt;ControlText&lt;/ForeColor&gt;\n    &lt;Name&gt;CustomForm&lt;/Name&gt;\n    &lt;RightToLeft&gt;No&lt;/RightToLeft&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"lblMesaj\"&gt;\n        &lt;TextAlign&gt;MiddleCenter&lt;/TextAlign&gt;\n        &lt;Text&gt;Label1&lt;/Text&gt;\n        &lt;Dock&gt;Top&lt;/Dock&gt;\n        &lt;Font&gt;Microsoft Sans Serif, 20.25pt, style=Bold&lt;/Font&gt;\n        &lt;Location&gt;0, 0&lt;/Location&gt;\n        &lt;Name&gt;lblMesaj&lt;/Name&gt;\n        &lt;Size&gt;556, 145&lt;/Size&gt;\n        &lt;TabIndex&gt;1&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"btnTamam\"&gt;\n        &lt;BackColor&gt;Yellow&lt;/BackColor&gt;\n        &lt;FlatAppearance control=\"true\"&gt;\n            &lt;Object type=\"System.Windows.Forms.FlatButtonAppearance, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"FlatButtonAppearance1\"/&gt;\n        &lt;/FlatAppearance&gt;\n        &lt;Text&gt;TAMAM&lt;/Text&gt;\n        &lt;UseVisualStyleBackColor&gt;False&lt;/UseVisualStyleBackColor&gt;\n        &lt;Font&gt;Microsoft Sans Serif, 15.75pt&lt;/Font&gt;\n        &lt;Location&gt;174, 251&lt;/Location&gt;\n        &lt;Name&gt;btnTamam&lt;/Name&gt;\n        &lt;Size&gt;192, 100&lt;/Size&gt;\n        &lt;TabIndex&gt;0&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n&lt;/Object&gt;\n</code></pre> <p>Bu tasar\u0131mda:</p> <ul> <li><code>lblMesaj</code> \u2014 forma \u00fcstten (<code>Dock: Top</code>) sabitlenen, 20.25pt kal\u0131n fontlu bir etiket</li> <li><code>btnTamam</code> \u2014 sar\u0131 arka planl\u0131, ortada konumland\u0131r\u0131lm\u0131\u015f bir buton</li> </ul> <p>Form Events ile Olay Dinleme</p> <p>Form \u00fczerindeki kontrol olaylar\u0131 (buton t\u0131klamas\u0131, de\u011fer de\u011fi\u015fimi vb.) Form Events nodu ile dinlenebilir. <code>btnTamam</code>'\u0131n t\u0131klanmas\u0131n\u0131 yakalamak i\u00e7in <code>Form Events</code> nodunu ayn\u0131 ak\u0131\u015fa ekleyin ve ilgili kontrol ad\u0131n\u0131 (<code>btnTamam</code>) belirtin.</p>"},{"location":"nodlar/custom-form/#sk-kullanlan-kontrol-tipleri","title":"S\u0131k Kullan\u0131lan Kontrol Tipleri","text":"Kontrol <code>type</code> De\u011feri (k\u0131salt\u0131lm\u0131\u015f) Etiket <code>System.Windows.Forms.Label</code> Buton <code>System.Windows.Forms.Button</code> Metin Kutusu <code>System.Windows.Forms.TextBox</code> Say\u0131sal Giri\u015f <code>System.Windows.Forms.NumericUpDown</code> Onay Kutusu <code>System.Windows.Forms.CheckBox</code> A\u00e7\u0131l\u0131r Liste <code>System.Windows.Forms.ComboBox</code> DataGridView <code>System.Windows.Forms.DataGridView</code> <p>Tasar\u0131m\u0131 elle yazmay\u0131n</p> <p>XML format\u0131 karma\u015f\u0131k oldu\u011fundan Custom Form Designer arac\u0131n\u0131 kullan\u0131n. Designer'dan d\u0131\u015fa aktar\u0131lan XML do\u011frudan <code>customformxml</code> alan\u0131na yap\u0131\u015ft\u0131r\u0131labilir.</p>"},{"location":"nodlar/custom-form/#custom-form-designer-entegrasyonu","title":"Custom Form Designer Entegrasyonu","text":"<p>Node aray\u00fcz\u00fcnde \"Designer'da A\u00e7\" butonu bulunur. Bu buton <code>customFormDesigner.exe</code> arac\u0131n\u0131 ba\u015flat\u0131r:</p> <pre><code>RED.httpAdmin.post(\"/custom-form/run-exe\", function (req, res) {\n    const exePath = RED.settings.functionGlobalContext.customFormDesignerPath;\n    const process = spawn(exePath, [filename + \"|\" + xmlContent]);\n    // Designer kapand\u0131\u011f\u0131nda \u00e7\u0131kt\u0131y\u0131 oku\n    const outputPath = \"c:\\\\temp\\\\\" + filename + \"_form_design.xml\";\n});\n</code></pre>"},{"location":"nodlar/custom-form/#gereksinimler","title":"Gereksinimler","text":"<ol> <li>Windows i\u015fletim sistemi</li> <li><code>customFormDesigner.exe</code> dosyas\u0131 mevcut</li> <li>Node-RED <code>settings.js</code> i\u00e7inde tan\u0131ml\u0131:</li> </ol> <pre><code>functionGlobalContext: {\n    customFormDesignerPath: \"C:\\\\trex\\\\tools\\\\customFormDesigner.exe\"\n}\n</code></pre> <ol> <li>\u00c7\u0131kt\u0131 dosyas\u0131 <code>C:\\temp\\&lt;formname&gt;_form_design.xml</code> konumuna yaz\u0131l\u0131r.</li> </ol>"},{"location":"nodlar/custom-form/#form-design-config-node","title":"Form Design Config Node","text":"<p><code>Custom Form</code> ile birlikte <code>Form Design</code> ad\u0131nda ayr\u0131 bir config node tipi de kaydedilir. Bu node yaln\u0131zca XML i\u00e7eri\u011fini tutar; ak\u0131\u015fa eklenemez (palette'te g\u00f6r\u00fcnmez).</p> Alan A\u00e7\u0131klama <code>name</code> Tasar\u0131m ad\u0131 (birden fazla form i\u00e7in ay\u0131rt edici) <code>formdesignxml</code> XML i\u00e7eri\u011fi <p>Custom Form node'unda <code>designformname</code> alan\u0131na bu config'in ad\u0131n\u0131 yazarak link verirsiniz.</p>"},{"location":"nodlar/custom-form/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events] --&gt; B[Custom Form&lt;br/&gt;OrderForm]\n    B --&gt; C[Form Bind Controls&lt;br/&gt;Veriyi ba\u011fla]\n    C --&gt; D[Button Configurator&lt;br/&gt;Butonlar\u0131 ayarla]\n    D --&gt; E[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/custom-form/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Designer \u00e7al\u0131\u015fm\u0131yor</p> <p><code>settings.js</code> i\u00e7inde <code>customFormDesignerPath</code> tan\u0131ml\u0131 m\u0131? Dosya yolu do\u011fru ve dosya ger\u00e7ekten var m\u0131?</p> <p>Designer Output not found</p> <p>Designer'\u0131n \u00e7\u0131kt\u0131y\u0131 yazaca\u011f\u0131 <code>C:\\temp\\</code> klas\u00f6r\u00fc eri\u015filebilir mi? Node-RED'in yazma izni var m\u0131?</p> <p>Form panelde g\u00f6z\u00fckm\u00fcyor</p> <ul> <li><code>customformxml</code> veya <code>designformname</code> bo\u015f kalm\u0131\u015f olabilir</li> <li>XML format\u0131 ge\u00e7erli mi? (A\u00e7\u0131kta kalm\u0131\u015f tag, ge\u00e7ersiz attribute)</li> <li>Ak\u0131\u015f sonunda <code>Responser</code> var m\u0131?</li> </ul>"},{"location":"nodlar/custom-form/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>XML'i versiyon kontrol\u00fcne al\u0131n</p> <p><code>customformxml</code> alan\u0131na b\u00fcy\u00fck XML yap\u0131\u015ft\u0131rmak yerine <code>Form Design</code> config node kullan\u0131n. Bu node'un i\u00e7eri\u011fi flow JSON'una dahil olur ve git'te de\u011fi\u015fiklikleri takip edebilirsiniz.</p> <p>Stillendirme</p> <p><code>isstyled: true</code> se\u00e7ene\u011fi, panel taraf\u0131n\u0131n form i\u00e7eri\u011fine temaya \u00f6zel stilleri uygulamas\u0131n\u0131 sa\u011flar. Custom temalarla \u00e7al\u0131\u015f\u0131yorsan\u0131z mutlaka aktif edin.</p>"},{"location":"nodlar/custom-form/#ilgili-nodlar","title":"\u0130lgili Nodlar","text":"<ul> <li>Form Bind Controls \u2014 Form alanlar\u0131na veri ba\u011flama</li> <li>Control Properties \u2014 Kontrol \u00f6zelliklerini ayarlama</li> <li>Button Configurator \u2014 Form butonlar\u0131n\u0131 yap\u0131land\u0131rma</li> <li>Form Events \u2014 Form etkile\u015fim olaylar\u0131</li> </ul>"},{"location":"nodlar/display-events/","title":"Display Events","text":"Display Events Inputs: 0 Outputs: 1 Kategori: trexMes service <p>trexMes panelindeki g\u00f6sterim (display) seviyesi olaylar\u0131na abone olur. Ekran yenileme, sayfa de\u011fi\u015fimi, g\u00f6r\u00fcn\u00fcm ge\u00e7i\u015fi gibi UI g\u00f6sterim olaylar\u0131n\u0131 yakalar.</p>"},{"location":"nodlar/display-events/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>method</code> string <code>get</code> HTTP method (otomatik) <code>event</code> string (bo\u015f) Panel'in tetikleyece\u011fi HTTP path <code>ishandled</code> boolean <code>false</code> Node-RED handle ediyor mu?"},{"location":"nodlar/display-events/#olay-listesi","title":"Olay Listesi","text":"<p><code>Event</code> alan\u0131 combobox ile se\u00e7ilir. Mevcut se\u00e7enekler:</p> Olay A\u00e7\u0131klama <code>OnBarcodeTextBoxSetting</code> Ana ekranda barkod metin kutusu ayarlar\u0131 yap\u0131land\u0131r\u0131l\u0131rken tetiklenir. <code>OnCommandKeyProcessing</code> Aray\u00fczde komut tu\u015fu girdisi i\u015flenirken tetiklenir. <code>OnDefectEntryOperatorConfirmationFailed</code> Iskarta giri\u015finde ek operat\u00f6r onay\u0131 istendi\u011fi ve onay al\u0131namad\u0131\u011f\u0131 durumda tetiklenir. <code>OnDefectSelected</code> Iskarta buton se\u00e7im i\u015flemi ger\u00e7ekle\u015ftirildi\u011finde ve miktar giri\u015f ekran\u0131 g\u00f6sterilmeden hemen \u00f6nce tetiklenir. IsHandled true ise alternatif \u0131skarta ekran\u0131 kullan\u0131labilir. <code>OnEventDetailSelectionsListing</code> Olay detay se\u00e7imleri listelenmeden hemen \u00f6nce tetiklenir. <code>OnForkliftTakeTransferSelecting</code> Forklift mamul-yar\u0131 mamul g\u00f6t\u00fcrme operasyonu ger\u00e7ekle\u015ftirilmek istendi\u011finde tetiklenir. IsHandled true ise standart kurgu i\u015fletilmez. <code>OnJobInformationEquipmentCounterTextSetting</code> \u0130\u015f bilgi panelinde ekipman saya\u00e7 metinleri ayarlan\u0131rken tetiklenir. <code>OnJobLoadColumnCellFormatSetting</code> \u0130\u015f se\u00e7im ekran\u0131 gridinde sat\u0131r renklendirme i\u00e7in kullan\u0131labilir. IsHandled true ise renkler arg\u00fcmanlardan al\u0131n\u0131r. <code>OnJobOrderSearching</code> \u0130\u015f emri se\u00e7im ekran\u0131nda arama yerinde barkod okutulduktan sonra tetiklenir. <code>OnMainFormCounterTextsSetting</code> Ana form \u00fczerinde g\u00f6sterilen saya\u00e7 metinleri ayarlan\u0131rken tetiklenir. <code>OnMainFormNoteTextSetting</code> Ana form \u00fczerinde g\u00f6sterilen not metni ayarlan\u0131rken tetiklenir. <code>OnMainUserControlJobOrderPanelClicked</code> trex Edge ana ekran\u0131n sa\u011f k\u0131sm\u0131ndaki \u00fcretilen i\u015f emirleri tablar\u0131ndan biri t\u0131kland\u0131\u011f\u0131nda tetiklenir. <code>OnOperationSpecFormOpening</code> Manuel ya da otomatik olarak operasyon parametreleri ekran\u0131 a\u00e7\u0131lmadan hemen \u00f6nce tetiklenir. <code>OnOperatorCreatingDefectEntry</code> Iskarta ekran\u0131nda kaydet butonuna bas\u0131ld\u0131\u011f\u0131 s\u0131rada her \u0131skarta i\u00e7in tetiklenir. <code>OnOperatorPlanLoadButtonClicking</code> Operat\u00f6r taraf\u0131ndan i\u015f y\u00fckle butonuna bas\u0131ld\u0131\u011f\u0131nda tetiklenir. IsHandled true ise alternatif i\u015f y\u00fckleme ak\u0131\u015f\u0131 kullan\u0131labilir. <code>OnOperatorPlanLoaded</code> Operat\u00f6r plan\u0131 y\u00fcklendikten sonra tetiklenir. <code>OnOtherOperationsFormClosed</code> Di\u011fer i\u015flemler formu kapat\u0131ld\u0131\u011f\u0131nda tetiklenir. <code>OnPitchLabelSetting</code> \u0130lgili ekranlarda pitch etiket metni ayarlan\u0131rken tetiklenir. <code>OnPlanContinueQuestionAsking</code> \u00dcretim sonras\u0131 \"\u0130\u015fe Devam Edilecek Mi?\" sorusu sorulmadan hemen \u00f6nce tetiklenir. <code>OnPlanSearching</code> \u0130\u015f se\u00e7im ekran\u0131nda \u00fcretim plan\u0131 arama i\u015fleminden hemen \u00f6nce tetiklenir. <code>OnPlanSelectionDetailClicked</code> \u0130\u015f se\u00e7im ekran\u0131nda Detay butonuna t\u0131kland\u0131\u011f\u0131nda tetiklenir. <code>OnPlanSelectionFormOpening</code> Plan se\u00e7im formu a\u00e7\u0131lmadan hemen \u00f6nce tetiklenir. <code>OnProductionAmountLeftTextSetting</code> Ekrandaki kalan \u00fcretim miktar\u0131 metni ayarlan\u0131rken tetiklenir. <code>OnProductionApproveFormOpening</code> \u00dcretim onay ekran\u0131 a\u00e7\u0131lmadan hemen \u00f6nce tetiklenir. <code>OnProductionApproveGridSet</code> \u00dcretim onay ekran\u0131 grid temel ayarlar\u0131 uygulan\u0131rken tetiklenir. <code>OnProductionApproveGridSetting</code> \u00dcretim onay ekran\u0131nda i\u015f emri - stok \u00fcretim detay gridine veri doldurulma an\u0131nda tetiklenir. <code>OnProductionApproveOperatorDataGridSetting</code> \u00dcretim onay ekran\u0131nda operat\u00f6r veri gridi yap\u0131land\u0131r\u0131l\u0131rken tetiklenir. <code>OnScreenSaverShowning</code> Ekran koruyucu g\u00f6sterilme an\u0131nda tetiklenir. IsHandled true ise ekran koruyucu g\u00f6sterilmez. <code>OnShiftEventFormOpening</code> Vardiya olay formu a\u00e7\u0131lmadan \u00f6nce tetiklenir. <code>OnUIButtonConfigurationSet</code> Aray\u00fcz buton konfig\u00fcrasyonlar\u0131 ayarlan\u0131rken tetiklenir. <code>OnWorkStationSelected</code> \u0130stasyon se\u00e7im i\u015flemi ger\u00e7ekle\u015ftirildi\u011finde tetiklenir. <code>OnStoppageDescriptionFormOpening</code> Duru\u015f a\u00e7\u0131klama formu a\u00e7\u0131lmadan \u00f6nce tetiklenir. IsHandled true ise alternatif a\u00e7\u0131klama ekran\u0131 kullan\u0131labilir. <code>OnStockEquipmentMatchDisplaying</code> Stok-ekipman e\u015fle\u015fme bilgisi g\u00f6sterilirken tetiklenir."},{"location":"nodlar/display-events/#ornek-kullanm","title":"\u00d6rnek Kullan\u0131m","text":"<pre><code>flowchart LR\n    A[Display Events&lt;br/&gt;OnOperatorPlanLoaded] --&gt; B[function&lt;br/&gt;Plan bilgisini i\u015fle]\n    B --&gt; C[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/display-events/#giris-mesaj","title":"Giri\u015f Mesaj\u0131","text":"<pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"fromPage\": \"HomeView\",\n    \"toPage\": \"OrderView\",\n    \"timestamp\": \"2026-05-11T11:20:00Z\",\n    \"trigger\": \"user\"\n  }\n}\n</code></pre>"},{"location":"nodlar/display-events/#ilgili","title":"\u0130lgili","text":"<ul> <li>Olay Nodlar\u0131 Genel Bak\u0131\u015f</li> <li>Form Events</li> </ul>"},{"location":"nodlar/display-methods/","title":"Display Methods","text":"Display Methods Inputs: 0 Outputs: 1 Kategori: trexMes service <p>trexMes ana form (Main Form) \u00fczerindeki \u00f6zel metod tetikleyicilerine abone olur. Ana ekran \u00fczerindeki tek ba\u015f\u0131na \u00e7a\u011fr\u0131lan metodlar\u0131 yakalar.</p>"},{"location":"nodlar/display-methods/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>method</code> string <code>get</code> HTTP method (otomatik) <code>event</code> string (bo\u015f) Panel'in tetikleyece\u011fi HTTP path"},{"location":"nodlar/display-methods/#olay-listesi","title":"Olay Listesi","text":"<p><code>Event</code> alan\u0131 combobox ile se\u00e7ilir. Mevcut se\u00e7enekler:</p> Olay A\u00e7\u0131klama <code>GetMainUserControl</code> Ana kullan\u0131c\u0131 kontrol\u00fcn\u00fc d\u00f6nd\u00fcrmek i\u00e7in tetiklenir. <code>GetUIButtonConfiguration</code> Aray\u00fcz buton konfig\u00fcrasyonunu d\u00f6nd\u00fcrmek i\u00e7in tetiklenir."},{"location":"nodlar/display-methods/#ornek-kullanm","title":"\u00d6rnek Kullan\u0131m","text":"<pre><code>flowchart LR\n    A[Display Methods&lt;br/&gt;GetCurrentOrder] --&gt; B[function&lt;br/&gt;DB sorgu]\n    B --&gt; C[Form Bind Controls&lt;br/&gt;Form alanlar\u0131n\u0131 doldur]\n    C --&gt; D[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/display-methods/#giris-mesaj","title":"Giri\u015f Mesaj\u0131","text":"<pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"methodName\": \"GetCurrentOrder\",\n    \"parameters\": {\n      \"machineId\": \"M-12\"\n    }\n  }\n}\n</code></pre>"},{"location":"nodlar/display-methods/#ilgili","title":"\u0130lgili","text":"<ul> <li>Olay Nodlar\u0131 Genel Bak\u0131\u015f</li> <li>Method Returns</li> <li>Method Invoker</li> </ul>"},{"location":"nodlar/event-subscribers/","title":"Olay (Event) Nodlar\u0131 \u2014 Genel Bak\u0131\u015f","text":"<p>Paket, trexMes panellerinden gelen olaylar\u0131 yakalamak i\u00e7in 8 ayr\u0131 event node tipi sa\u011flar. Hepsi <code>event-subscribers.js</code> dosyas\u0131nda tan\u0131mlanm\u0131\u015f olup ayn\u0131 altyap\u0131y\u0131 payla\u015f\u0131r; yaln\u0131zca kategori amac\u0131yla ayr\u0131lm\u0131\u015ft\u0131r.</p>"},{"location":"nodlar/event-subscribers/#olay-node-listesi","title":"Olay Node Listesi","text":"Node Tipik Kullan\u0131m Business Events \u0130\u015f ak\u0131\u015f\u0131 olaylar\u0131 (sipari\u015f ba\u015flama, \u00fcretim bitirme, vardiya de\u011fi\u015fimi\u2026) System Events Sistem seviyesi olaylar (boot, login, shutdown, lock) Communication Events \u0130leti\u015fim katman\u0131 olaylar\u0131 (PLC, OPC, modbus, sens\u00f6r) Display Events UI \u00fczerindeki g\u00f6sterim olaylar\u0131 Form Events Form etkile\u015fim olaylar\u0131 (button click, focus, validate) Display Methods Ana form metod tetikleyicileri Method Returns Method invocation cevaplar\u0131 <p>T\u00fcm event node'lar\u0131 temelde ayn\u0131d\u0131r</p> <p>Pakete bak\u0131ld\u0131\u011f\u0131nda 8 farkl\u0131 event tipi olmas\u0131na ra\u011fmen kod taraf\u0131nda hepsi <code>EventSubscribers</code> adl\u0131 tek bir fonksiyon ile olu\u015fturulmu\u015ftur. Aralar\u0131ndaki tek fark palette \u00fczerindeki kategori ad\u0131d\u0131r. Bu sayede ak\u0131\u015f\u0131n\u0131zda hangi olay\u0131n hangi gruba ait oldu\u011funu g\u00f6rsel olarak ay\u0131rt edebilirsiniz.</p>"},{"location":"nodlar/event-subscribers/#ortak-ozellikler","title":"Ortak \u00d6zellikler","text":""},{"location":"nodlar/event-subscribers/#io","title":"I/O","text":"<p>T\u00fcm event node'lar\u0131: 0 giri\u015f, 1 \u00e7\u0131k\u0131\u015f</p>"},{"location":"nodlar/event-subscribers/#renk","title":"Renk","text":"<p>Business Events A\u00e7\u0131k ye\u015fil \u2014 Servis kategorisi.</p>"},{"location":"nodlar/event-subscribers/#property-tablosu-ortak","title":"Property Tablosu (Ortak)","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Node-RED canvas \u00fczerinde g\u00f6sterilecek ad <code>method</code> string <code>get</code> HTTP method (otomatik) <code>event</code> string (bo\u015f) Panel'in \u00e7a\u011f\u0131raca\u011f\u0131 HTTP path <code>ishandled</code> boolean <code>false</code> Bu olay Node-RED taraf\u0131ndan m\u0131 handle edilecek? <code>suffix</code> string \u2014 (Sadece <code>Business Events</code>) Event ismine eklenecek son ek"},{"location":"nodlar/event-subscribers/#calsma-mantg","title":"\u00c7al\u0131\u015fma Mant\u0131\u011f\u0131","text":"<pre><code>sequenceDiagram\n    participant Panel as trexMes Panel\n    participant Conn as Node-RED Connector\n    participant Ev as Business Events\n    participant Flow as Ak\u0131\u015f\n    participant Resp as Responser\n\n    Panel-&gt;&gt;Conn: Event tetiklendi\n    Conn-&gt;&gt;Ev: GET /OrderStartEvent + payload\n    Ev-&gt;&gt;Flow: msg.payload (event verisi)\n    Flow-&gt;&gt;Resp: ...i\u015flenmi\u015f payload\n    Resp--&gt;&gt;Conn: HTTP 200\n    Conn--&gt;&gt;Panel: \u0130\u015flem tamamland\u0131</code></pre>"},{"location":"nodlar/event-subscribers/#olay-kayt-listesi-subscription","title":"Olay Kay\u0131t Listesi (Subscription)","text":"<p>Deploy an\u0131nda her event node, <code>trex Subscriber</code>'\u0131n \u00e7a\u011fr\u0131s\u0131 \u00fczerinden otomatik tespit edilir. Panel taraf\u0131na g\u00f6nderilecek listenin yap\u0131s\u0131:</p> <pre><code>RED.nodes.eachNode(function (n) {\n    if (eventTypes.has(n.type)) {\n        let runtimeNode = RED.nodes.getNode(n.id);\n        let eName = runtimeNode.event.replace(/\\//g, \"\");\n        matchingNodes.push(eName);\n        if (runtimeNode.ishandled === true) {\n            matchingHandlers.push(eName + \"|handled\");\n        }\n    }\n});\n</code></pre>"},{"location":"nodlar/event-subscribers/#eventtypes-seti-js-tarafndan","title":"<code>eventTypes</code> Set'i (JS taraf\u0131ndan)","text":"<pre><code>const eventTypes = new Set([\n    \"Business Events\",\n    \"System Events\",\n    \"Communication Events\",\n    \"Display Events\",\n    \"Form Events\",\n    \"Display Methods\",\n    \"Method Returns\"\n]);\n</code></pre>"},{"location":"nodlar/event-subscribers/#tipik-aks-yaps","title":"Tipik Ak\u0131\u015f Yap\u0131s\u0131","text":"<pre><code>flowchart LR\n    A[Business Events] --&gt; B[Custom Form]\n    B --&gt; C[Form Bind Controls]\n    C --&gt; D[Control Properties]\n    D --&gt; E[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/event-subscribers/#giris-mesaj-msg","title":"Giri\u015f Mesaj\u0131 (<code>msg</code>)","text":"<p>Olay tetiklendi\u011finde a\u015fa\u011f\u0131daki yap\u0131da mesaj \u00fcretilir:</p> <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"req\": { /* Express HTTP request */ },\n  \"res\": { /* HTTP response wrapper */ },\n  \"payload\": { /* Panel'den gelen ham olay verisi */ }\n}\n</code></pre> Alan A\u00e7\u0131klama <code>req</code> Express Request nesnesi \u2014 IP, headers, query bilgileri <code>res</code> Cevap wrapper \u2014 <code>Responser</code> bunu kullan\u0131r <code>payload</code> Panel'in g\u00f6nderdi\u011fi query/body verisi"},{"location":"nodlar/event-subscribers/#ishandled-kavram","title":"<code>ishandled</code> Kavram\u0131","text":"<p>Olay tipi panel taraf\u0131nda varsay\u0131lan bir i\u015fleyiciye sahip olabilir. Node-RED ak\u0131\u015f\u0131n\u0131z bu olay\u0131 yakalad\u0131\u011f\u0131nda panele:</p> <ul> <li><code>ishandled = true</code> \u2192 \"Bu olay\u0131 ben i\u015fledim, sen de i\u015fleyiciyi tetikleme.\"</li> <li><code>ishandled = false</code> \u2192 \"Sen kendi i\u015fleyicini de \u00e7al\u0131\u015ft\u0131r.\"</li> </ul> <p>Bu davran\u0131\u015f\u0131 ak\u0131\u015f ortas\u0131nda dinamik de\u011fi\u015ftirmek i\u00e7in Handle Setter kullan\u0131n.</p>"},{"location":"nodlar/event-subscribers/#notlar","title":"Notlar","text":"<p>Event isminde slash</p> <p><code>event</code> alan\u0131na <code>/OrderStart</code> veya <code>OrderStart</code> yazabilirsiniz. Node otomatik olarak ba\u015f\u0131na <code>/</code> ekler. Panel kay\u0131t listesinde slash'lar kald\u0131r\u0131larak g\u00f6nderilir.</p> <p>Ayn\u0131 event ismi tekrar etmemeli</p> <p>Ayn\u0131 <code>event</code> ismine sahip birden fazla node varsa HTTP path \u00e7ak\u0131\u015fmas\u0131 olur. Farkl\u0131 kategorilerde olsalar bile ayn\u0131 ismi kullanmay\u0131n.</p> <p>Form Events'te <code>formname</code></p> <p><code>Form Events</code> node'unda <code>ishandled</code> yerine <code>formname</code> alan\u0131 vard\u0131r. Hangi forma ait oldu\u011funu belirtir.</p>"},{"location":"nodlar/event-subscribers/#hzl-karslastrma","title":"H\u0131zl\u0131 Kar\u015f\u0131la\u015ft\u0131rma","text":"Node \u00d6zel Alan Tipik Path \u00d6rne\u011fi Business Events <code>suffix</code> <code>/OrderStartEvent</code> System Events \u2014 <code>/SystemBootEvent</code> Communication Events \u2014 <code>/PLCConnectionLost</code> Display Events \u2014 <code>/DisplayRefresh</code> Form Events <code>formname</code> <code>/MainForm_ButtonClick</code> Display Methods \u2014 <code>/GetCurrentOrder</code> Method Returns <code>methodname</code> <code>/OrderCreated</code>"},{"location":"nodlar/event-subscribers/#sonraki-adm","title":"Sonraki Ad\u0131m","text":"<p>Her event tipinin kendi sayfas\u0131nda \u00f6zel kullan\u0131m \u00f6rnekleri bulunur. Sol men\u00fcden istedi\u011finizi se\u00e7in.</p>"},{"location":"nodlar/execute-process/","title":"Execute Process","text":"Execute Process Inputs: 1 Outputs: 1 Kategori: trexMes service <p>trexMes panel taraf\u0131nda tan\u0131ml\u0131 bir process'i tetikler. Method \u00e7a\u011fr\u0131s\u0131ndan farkl\u0131 olarak <code>Execute Process</code> parametre almaz \u2014 sadece process ismini panele bildirir, panel kendi mant\u0131\u011f\u0131na g\u00f6re i\u015fletim yapar.</p>"},{"location":"nodlar/execute-process/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>processname</code> string (bo\u015f) Tetiklenecek process ad\u0131"},{"location":"nodlar/execute-process/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<pre><code>{\n  \"operationtype\": \"ExecuteProcess\",\n  \"receiveddata\": { /* event data */ },\n  \"message\": \"ProductionStart\"\n}\n</code></pre> <p><code>message</code> alan\u0131 <code>processname</code> de\u011ferini ta\u015f\u0131r.</p>"},{"location":"nodlar/execute-process/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events&lt;br/&gt;OrderStartEvent] --&gt; B[Execute Process&lt;br/&gt;ProductionStart]\n    B --&gt; C[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/execute-process/#method-invoker-vs-execute-process-karslastrmas","title":"Method Invoker vs Execute Process Kar\u015f\u0131la\u015ft\u0131rmas\u0131","text":"Method Invoker Execute Process Parametre al\u0131r m\u0131? Evet Hay\u0131r Cevap d\u00f6ner mi? Evet (Method Returns ile) Hay\u0131r Tipik kullan\u0131m Veri sorgulama / i\u015fleme \u00d6nceden tan\u0131ml\u0131 i\u015flemi ba\u015flatma Asenkron mu? Evet Fire-and-forget"},{"location":"nodlar/execute-process/#ornek-senaryolar","title":"\u00d6rnek Senaryolar","text":"<ul> <li><code>ProductionStart</code> \u2014 \u00dcretim s\u00fcrecini ba\u015flat</li> <li><code>ShiftChange</code> \u2014 Vardiya de\u011fi\u015fimi prosed\u00fcr\u00fcn\u00fc tetikle</li> <li><code>DailyClose</code> \u2014 G\u00fcn sonu kapan\u0131\u015f i\u015flemleri</li> <li><code>PrintReport</code> \u2014 Standart raporu yaz\u0131c\u0131ya g\u00f6nder</li> <li><code>BackupData</code> \u2014 Yedekleme prosed\u00fcr\u00fc</li> </ul>"},{"location":"nodlar/execute-process/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Process tetiklenmiyor</p> <ul> <li><code>processname</code> panel taraf\u0131ndaki process tan\u0131m\u0131yla birebir mi e\u015fle\u015fiyor?</li> <li>Panel taraf\u0131nda bu process ger\u00e7ekten tan\u0131ml\u0131 m\u0131?</li> </ul> <p>Process ba\u015flad\u0131 ama sonu\u00e7 bilinmiyor</p> <p><code>Execute Process</code> cevap d\u00f6nmedi\u011fi i\u00e7in i\u015flem fire-and-forget'tir. Sonu\u00e7 bilmek istiyorsan\u0131z <code>Method Invoker</code> kullan\u0131n veya panel taraf\u0131ndan bir <code>Business Events</code> ile process tamamlanma bildirimi g\u00f6ndermesini sa\u011flay\u0131n.</p>"},{"location":"nodlar/execute-process/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Tetik ve dinle pattern'i</p> <p>Process tetikledikten sonra \"tamamland\u0131\" olay\u0131 i\u00e7in ayr\u0131 bir event node ile dinleme yap\u0131n:</p> <pre><code>[Ak\u0131\u015f 1] OrderEvent \u2192 Execute Process (ProductionStart) \u2192 Responser\n[Ak\u0131\u015f 2] Business Events (ProductionStartedEvent) \u2192 ...\n</code></pre> <p>\u0130simlendirme standard\u0131</p> <p>Process isimlerini PascalCase ile yaz\u0131n (<code>ProductionStart</code>, <code>DailyClose</code>). Bu, panel taraf\u0131ndaki C# enumlar\u0131yla uyumlu olur.</p>"},{"location":"nodlar/execute-process/#ilgili","title":"\u0130lgili","text":"<ul> <li>Method Invoker \u2014 Parametreli method \u00e7a\u011fr\u0131s\u0131</li> <li>Execute Script \u2014 Form \u00fczerinde script \u00e7al\u0131\u015ft\u0131r</li> <li>Mesaj Yap\u0131s\u0131</li> </ul>"},{"location":"nodlar/execute-script/","title":"Execute Script","text":"Execute Script Inputs: 1 Outputs: 1 Kategori: trexMes service <p>Belirli bir form \u00fczerinde \u00f6zel script kodu \u00e7al\u0131\u015ft\u0131r\u0131r. Panel taraf\u0131nda script motorunu tetikleyerek karma\u015f\u0131k UI manip\u00fclasyonlar\u0131n\u0131 ger\u00e7ekle\u015ftirir.</p>"},{"location":"nodlar/execute-script/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>formname</code> string (bo\u015f) Script'i \u00e7al\u0131\u015ft\u0131racak form <code>script</code> string (bo\u015f) Script kodu"},{"location":"nodlar/execute-script/#dinamik-script-msgscript","title":"Dinamik Script (<code>msg.script</code>)","text":"<p>E\u011fer ak\u0131\u015f i\u00e7inde <code>msg.script</code> de\u011fi\u015fkeni set edilmi\u015fse, node bu de\u011feri statik <code>script</code> alan\u0131 yerine kullan\u0131r:</p> <pre><code>let script = msg.script;\nif (script === undefined || script === null) {\n    script = node.script;  // fallback\n}\n</code></pre> <p>Bu sayede script i\u00e7eri\u011fi ak\u0131\u015f i\u00e7inde dinamik olarak \u00fcretilebilir.</p>"},{"location":"nodlar/execute-script/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<pre><code>{\n  \"operationtype\": \"ExecuteScript\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderForm\",\n  \"message\": \"if(value &gt; 100) { btnAlert.Visible = true; }\"\n}\n</code></pre>"},{"location":"nodlar/execute-script/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events] --&gt; B[function&lt;br/&gt;Script \u00fcret]\n    B --&gt; C[Execute Script&lt;br/&gt;OrderForm]\n    C --&gt; D[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/execute-script/#ornek-scriptler","title":"\u00d6rnek Script'ler","text":""},{"location":"nodlar/execute-script/#kosullu-gorunurluk","title":"Ko\u015fullu G\u00f6r\u00fcn\u00fcrl\u00fck","text":"<pre><code>if (txtQty.Text != \"\" &amp;&amp; int.Parse(txtQty.Text) &gt; 100) {\n    lblWarning.Visible = true;\n    lblWarning.Text = \"Y\u00fcksek miktar uyar\u0131s\u0131!\";\n} else {\n    lblWarning.Visible = false;\n}\n</code></pre>"},{"location":"nodlar/execute-script/#toplam-hesaplama","title":"Toplam Hesaplama","text":"<pre><code>decimal toplam = decimal.Parse(txtBirimFiyat.Text) * decimal.Parse(txtAdet.Text);\ntxtToplam.Text = toplam.ToString(\"N2\");\n</code></pre>"},{"location":"nodlar/execute-script/#renk-degistirme","title":"Renk De\u011fi\u015ftirme","text":"<pre><code>if (cmbStatus.SelectedItem.ToString() == \"Acil\") {\n    pnlMain.BackColor = Color.Red;\n} else {\n    pnlMain.BackColor = Color.White;\n}\n</code></pre>"},{"location":"nodlar/execute-script/#onemli-notlar","title":"\u00d6nemli Notlar","text":"<p>Script dili paneldedir</p> <p>Bu node script i\u00e7eri\u011fine dokunmaz; sadece panele iletir. Script dili (genellikle C# veya VB.NET) ve sentaks panel'in script motoruna ba\u011fl\u0131d\u0131r.</p> <p>Form aktif olmal\u0131</p> <p>Script'in \u00e7al\u0131\u015faca\u011f\u0131 form panel \u00fczerinde a\u00e7\u0131k olmal\u0131d\u0131r. Aksi takdirde panel script'i \u00e7al\u0131\u015ft\u0131ramaz.</p> <p>G\u00fcvenlik</p> <p>Script i\u00e7eri\u011fini kullan\u0131c\u0131 girdisinden olu\u015fturuyorsan\u0131z (\u00f6rn. form alan\u0131ndan) enjeksiyon riski vard\u0131r. Mutlaka sanitize edin.</p>"},{"location":"nodlar/execute-script/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Script \u00e7al\u0131\u015fm\u0131yor</p> <ul> <li><code>formname</code> do\u011fru mu girildi?</li> <li>Hedef form ger\u00e7ekten a\u00e7\u0131k m\u0131?</li> <li>Script sentaks hatas\u0131 i\u00e7eriyor olabilir \u2014 panel logunu kontrol edin.</li> </ul> <p>msg.script ile script alan\u0131 \u00e7eli\u015fiyor</p> <p>Her ikisi de doluysa <code>msg.script</code> \u00f6ncelik kazan\u0131r. Statik alan de\u011fi\u015fmiyor g\u00f6r\u00fcnebilir.</p>"},{"location":"nodlar/execute-script/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Script \u015fablonu</p> <p>Karma\u015f\u0131k script'leri ak\u0131\u015f i\u00e7inde <code>function</code> node ile parametre de\u011ferlerine g\u00f6re dinamik \u00fcretin:</p> <pre><code>msg.script = `lbl1.Text = \"${msg.payload.title}\";\n              txt2.Text = \"${msg.payload.value}\";`;\nreturn msg;\n</code></pre> <p>Birden fazla sat\u0131r</p> <p>Script \u00e7ok sat\u0131rl\u0131 olabilir; node d\u00fcz string olarak g\u00f6nderir. Panel taraf\u0131 sat\u0131r sonlar\u0131n\u0131 da i\u015fler.</p>"},{"location":"nodlar/execute-script/#ilgili","title":"\u0130lgili","text":"<ul> <li>Custom Form</li> <li>Control Properties \u2014 Property atama i\u00e7in tercih edin</li> <li>Method Invoker \u2014 Karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 i\u00e7in</li> </ul>"},{"location":"nodlar/form-bind-controls/","title":"Form Bind Controls","text":"Form Bind Controls Inputs: 1 Outputs: 1 Kategori: trexMes service <p>Custom Form \u00fczerindeki kontrolleri (textbox, label, checkbox vs.) veriye ba\u011flar. Hangi kontrol\u00fcn hangi veri alan\u0131na ba\u011flanaca\u011f\u0131n\u0131 tan\u0131mlar ve panele ba\u011flama bilgisini g\u00f6nderir.</p>"},{"location":"nodlar/form-bind-controls/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>formname</code> string (bo\u015f) Hangi formun kontrollerine ba\u011flanacak? <code>formainform</code> boolean <code>false</code> Ana form (<code>AppForm</code>) m\u0131? <code>props</code> array <code>[]</code> Ba\u011flama listesi: <code>{p: controlName, v: fieldName}</code> <code>data</code> string (bo\u015f) Veriyi nereden okuyaca\u011f\u0131z (path) <code>dataType</code> string \u2014 Kaynak: <code>msg</code>, <code>flow</code>, <code>global</code>, vs."},{"location":"nodlar/form-bind-controls/#props-yaps","title":"<code>props</code> Yap\u0131s\u0131","text":"<p>Edit\u00f6r aray\u00fcz\u00fcnde her sat\u0131r iki s\u00fctundan olu\u015fur:</p> S\u00fctun Anahtar A\u00e7\u0131klama Property (<code>p</code>) Kontrol ad\u0131 XML'deki <code>name</code> attribute'u (\u00f6rn. <code>txtOrderNo</code>) Value (<code>v</code>) Field ad\u0131 Verinin i\u00e7indeki property ad\u0131 (\u00f6rn. <code>orderNo</code>) <pre><code>[\n  { \"p\": \"txtOrderNo\",  \"v\": \"orderNo\" },\n  { \"p\": \"txtCustomer\", \"v\": \"customer\" },\n  { \"p\": \"txtQty\",      \"v\": \"qty\" }\n]\n</code></pre>"},{"location":"nodlar/form-bind-controls/#veri-kaynag-data-datatype","title":"Veri Kayna\u011f\u0131 (<code>data</code> + <code>dataType</code>)","text":"<p><code>dataType</code> ile de\u011fer \u015fu kaynaklardan okunabilir:</p> <code>dataType</code> <code>data</code> \u00f6rne\u011fi Anlam\u0131 <code>msg</code> <code>payload.order</code> <code>msg.payload.order</code> <code>flow</code> <code>currentOrder</code> <code>flow.get(\"currentOrder\")</code> <code>global</code> <code>defaultUser</code> <code>global.get(\"defaultUser\")</code> <p>T\u00fcm <code>dataType</code> se\u00e7enekleri \u2192</p>"},{"location":"nodlar/form-bind-controls/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<pre><code>{\n  \"operationtype\": \"BindControl\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"OrderForm\",\n  \"bindcontrols\": [\n    { \"Name\": \"txtOrderNo\",  \"FieldName\": \"orderNo\" },\n    { \"Name\": \"txtCustomer\", \"FieldName\": \"customer\" },\n    { \"Name\": \"txtQty\",      \"FieldName\": \"qty\" }\n  ],\n  \"value\": {\n    \"orderNo\": \"ORD-001\",\n    \"customer\": \"ACME\",\n    \"qty\": 100\n  }\n}\n</code></pre>"},{"location":"nodlar/form-bind-controls/#formainform-davrans","title":"<code>formainform</code> Davran\u0131\u015f\u0131","text":"De\u011fer <code>formname</code> Otomatik Senaryo <code>false</code> Kullan\u0131c\u0131 tan\u0131ml\u0131 Custom dialog'a ba\u011flama <code>true</code> <code>\"AppForm\"</code> Ana form'a ba\u011flama <pre><code>var formname = node.formname;\nif (n.formainform == true) {\n    formname = \"AppForm\";\n}\n</code></pre>"},{"location":"nodlar/form-bind-controls/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events&lt;br/&gt;OrderStartEvent] --&gt; B[Custom Form&lt;br/&gt;OrderForm]\n    B --&gt; C[Form Bind Controls&lt;br/&gt;txt* \u2192 orderNo,...]\n    C --&gt; D[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/form-bind-controls/#onemli-konular","title":"\u00d6nemli Konular","text":""},{"location":"nodlar/form-bind-controls/#value-hesaplama-mantg","title":"<code>value</code> Hesaplama Mant\u0131\u011f\u0131","text":"<p><code>value</code> alan\u0131 tek bir nesne olarak g\u00f6nderilir; panel her kontrol i\u00e7in kendi <code>FieldName</code>'i bu nesneden okur.</p> <p>E\u011fer <code>data</code> bo\u015f b\u0131rak\u0131l\u0131rsa <code>value: null</code> olur ve panel <code>receiveddata</code>'y\u0131 kullan\u0131r.</p>"},{"location":"nodlar/form-bind-controls/#birden-fazla-form","title":"Birden Fazla Form","text":"<p>Her form i\u00e7in ayr\u0131 bir <code>Form Bind Controls</code> node'u kullan\u0131n. Ayn\u0131 node birden fazla formu y\u00f6netemez.</p>"},{"location":"nodlar/form-bind-controls/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Form alanlar\u0131 bo\u015f kal\u0131yor</p> <ul> <li>Kontrol adlar\u0131 (<code>p</code>) XML'deki <code>name</code> ile birebir e\u015fle\u015fiyor mu? (B\u00fcy\u00fck/k\u00fc\u00e7\u00fck harf duyarl\u0131)</li> <li><code>dataType</code> do\u011fru mu? <code>msg</code> se\u00e7tiniz ama <code>data</code> yolu yanl\u0131\u015f olabilir.</li> <li>Ak\u0131\u015fta <code>Custom Form</code> <code>Form Bind Controls</code>'tan \u00f6nce geliyor mu?</li> </ul> <p>Veri yap\u0131s\u0131 uyumsuz</p> <p><code>value</code> nesnesinde <code>FieldName</code> ile e\u015fle\u015fen property olmal\u0131. \u00d6rnek: <code>bindcontrol</code> <code>{Name: \"txtA\", FieldName: \"a\"}</code> ise <code>value.a</code> mevcut olmal\u0131.</p>"},{"location":"nodlar/form-bind-controls/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>JSONata ile d\u00f6n\u00fc\u015ft\u00fcrme</p> <p>Veriyi oldu\u011fu gibi ba\u011flamak yerine d\u00f6n\u00fc\u015ft\u00fcrmek istiyorsan\u0131z:</p> <ol> <li>\u00d6nce bir <code>function</code> veya <code>change</code> node ile veriyi \u015fekillendirin</li> <li>Sonu\u00e7lar\u0131 <code>flow</code> context'e koyun</li> <li><code>Form Bind Controls</code>'ta <code>dataType: flow</code> kullan\u0131n</li> </ol> <p>Kontrol isimlendirme standart\u0131</p> <p>XML form tasar\u0131m\u0131nda kontrol isimlerini tip prefix'leriyle adland\u0131r\u0131n (<code>txt*</code> textbox, <code>chk*</code> checkbox, <code>cb*</code> combobox). Bu, debug'\u0131 kolayla\u015ft\u0131r\u0131r.</p>"},{"location":"nodlar/form-bind-controls/#ilgili","title":"\u0130lgili","text":"<ul> <li>Custom Form \u2014 Form tasar\u0131m\u0131</li> <li>Control Properties \u2014 Statik \u00f6zellik atama</li> <li>Mesaj Yap\u0131s\u0131</li> </ul>"},{"location":"nodlar/form-events/","title":"Form Events","text":"Form Events Inputs: 0 Outputs: 1 Kategori: trexMes service <p>Form \u00fczerindeki etkile\u015fim olaylar\u0131na abone olur. Button click, focus, blur, validate gibi UI tetiklemelerini yakalar.</p>"},{"location":"nodlar/form-events/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>method</code> string <code>post</code> HTTP method (otomatik) <code>formname</code> string <code>CustomForm</code> \u0130zlenecek formun ad\u0131 (combobox'tan se\u00e7ilir \u2014 ak\u0131\u015ftaki <code>Custom Form</code> node'lar\u0131n\u0131 listeler) <code>control</code> string (bo\u015f) \u0130zlenecek kontrol\u00fcn ad\u0131 (\u00f6rn. <code>btnTamam</code>) <code>eventname</code> string <code>Click</code> Kontrol olay\u0131 t\u00fcr\u00fc (combobox ile se\u00e7ilir) <code>formainform</code> boolean <code>false</code> Ana form (AppForm) \u00fczerindeki kontrol m\u00fc? <code>eventtime</code> string <code>After</code> Olay zaman\u0131: <code>After</code> veya <code>Before</code> (<code>formainform=true</code> iken g\u00f6r\u00fcn\u00fcr) <p>\u00d6zel yap\u0131</p> <p><code>Form Events</code>, di\u011fer event node'lar\u0131ndan farkl\u0131d\u0131r: form ad\u0131 + kontrol ad\u0131 + olay t\u00fcr\u00fc kombinasyonuna abone olur. <code>formname</code> alan\u0131, ak\u0131\u015ftaki mevcut <code>Custom Form</code> node'lar\u0131n\u0131 otomatik listeleyen bir combobox't\u0131r.</p>"},{"location":"nodlar/form-events/#olay-turleri-eventname","title":"Olay T\u00fcrleri (<code>eventname</code>)","text":"<p><code>eventname</code> alan\u0131 combobox ile se\u00e7ilir. Mevcut se\u00e7enekler:</p> Olay T\u00fcr\u00fc A\u00e7\u0131klama <code>Click</code> Kontrol t\u0131kland\u0131\u011f\u0131nda <code>Changed</code> Kontrol de\u011feri de\u011fi\u015fti\u011finde <code>Load</code> Kontrol y\u00fcklendi\u011finde <code>Tick</code> Zamanlay\u0131c\u0131 olay\u0131 <code>KeyEnter</code> Enter tu\u015funa bas\u0131ld\u0131\u011f\u0131nda <code>SelectionChanged</code> Se\u00e7im de\u011fi\u015fti\u011finde"},{"location":"nodlar/form-events/#ornek-kullanm","title":"\u00d6rnek Kullan\u0131m","text":"<pre><code>flowchart LR\n    A[Form Events&lt;br/&gt;btnTamam Click] --&gt; B[Method Invoker&lt;br/&gt;SaveOrder]\n    B --&gt; C[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/form-events/#giris-mesaj","title":"Giri\u015f Mesaj\u0131","text":"<p>Button click \u00f6rnek:</p> <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"formName\": \"OrderForm\",\n    \"controlName\": \"btnSubmit\",\n    \"eventType\": \"click\",\n    \"formData\": {\n      \"orderNo\": \"ORD-001\",\n      \"qty\": 100,\n      \"customer\": \"ACME\"\n    }\n  }\n}\n</code></pre>"},{"location":"nodlar/form-events/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Form alanlar\u0131n\u0131 okumak</p> <p>Button click event'inde <code>payload.formData</code> i\u00e7erisinde t\u00fcm form alanlar\u0131n\u0131n anl\u0131k de\u011ferleri gelir. Bu sayede her alan i\u00e7in ayr\u0131 event tan\u0131mlamak gerekmez.</p> <p>Validate event</p> <p>Form kaydedilmeden \u00f6nce bir <code>validate</code> event tan\u0131mlarsan\u0131z, sunucu taraf\u0131nda validasyon yap\u0131p <code>Handle Setter</code> ile ak\u0131\u015f\u0131 kesebilirsiniz.</p>"},{"location":"nodlar/form-events/#ilgili","title":"\u0130lgili","text":"<ul> <li>Olay Nodlar\u0131 Genel Bak\u0131\u015f</li> <li>Button Configurator</li> <li>Main Form Action</li> </ul>"},{"location":"nodlar/handle-setter/","title":"Handle Setter","text":"Handle Setter Inputs: 1 Outputs: 1 Kategori: trexMes service <p><code>IsHandled</code> \u00f6zelli\u011fi bulunan Event node'lar\u0131n\u0131 i\u00e7eren ak\u0131\u015flarda, di\u011fer trexMes node'lar\u0131n\u0131n ard\u0131ndan zincire eklenir ve olay\u0131n handle durumunu \u00e7al\u0131\u015fma zaman\u0131nda set eder. <code>IsHandled = true</code> ayarland\u0131\u011f\u0131nda panel, ilgili olaya ait t\u00fcm i\u015flemleri keser.</p>"},{"location":"nodlar/handle-setter/#ozet","title":"\u00d6zet","text":"<p><code>IsHandled</code> \u00f6zelli\u011fi olan Event node'lar\u0131 (<code>Business Events</code>, <code>Form Events</code> vb.) bu de\u011feri statik olarak tan\u0131mlar. <code>Handle Setter</code> ise ak\u0131\u015f\u0131n o noktas\u0131ndaki duruma g\u00f6re \u2014 \u00f6rne\u011fin bir \u00f6nceki node'dan gelen veriye veya flow context'e bakarak \u2014 bu karar\u0131 dinamik olarak verir.</p> <p>Konumu</p> <p><code>Handle Setter</code>, ak\u0131\u015ftaki di\u011fer trexMes node'lar\u0131ndan sonra, <code>Responser</code>'dan \u00f6nce gelir. Ak\u0131\u015f\u0131 tetiklemez; yaln\u0131zca <code>msg.payload</code> array'ine <code>TrexEventHandler</code> operasyonu ekler.</p>"},{"location":"nodlar/handle-setter/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Node-RED canvas \u00fczerinde g\u00f6sterilecek ad <code>isHandled</code> any \u2014 Handle de\u011feri veya kaynak path <code>isHandledType</code> string <code>bool</code> De\u011ferin nereden okunaca\u011f\u0131: <code>bool</code>, <code>msg</code>, <code>flow</code>"},{"location":"nodlar/handle-setter/#ishandledtype-secenekleri","title":"<code>isHandledType</code> Se\u00e7enekleri","text":"Tip Anlam\u0131 \u00d6rnek <code>isHandled</code> <code>bool</code> Sabit boolean <code>true</code> veya <code>false</code> <code>msg</code> Mesaj nesnesinden oku <code>payload.isHandled</code> <code>flow</code> Flow context'ten oku <code>currentHandledState</code>"},{"location":"nodlar/handle-setter/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<p><code>msg.payload</code> array'ine \u015fu operasyonu ekler:</p> <pre><code>{\n  \"operationtype\": \"TrexEventHandler\",\n  \"continueevent\": false\n}\n</code></pre> <p><code>continueevent</code> de\u011feri <code>isHandled</code>'in tersidir:</p> <code>isHandled</code> <code>continueevent</code> Anlam <code>true</code> <code>false</code> \"Node-RED handle etti, panel kendi i\u015fleyicisini \u00c7ALI\u015eTIRMASIN\" <code>false</code> <code>true</code> \"Panel kendi i\u015fleyicisini de \u00e7al\u0131\u015ft\u0131rs\u0131n\""},{"location":"nodlar/handle-setter/#davrans-kodu","title":"Davran\u0131\u015f Kodu","text":"<pre><code>let isHandled;\nswitch (node.isHandledType) {\n    case \"bool\":\n        isHandled = node.isHandled;\n        break;\n    case \"msg\":\n        isHandled = RED.util.getMessageProperty(msg, node.isHandled);\n        break;\n    case \"flow\":\n        isHandled = node.context().flow.get(node.isHandled);\n        break;\n}\n\nisHandled = (isHandled === true);  // Strict cast\n\nif (!Array.isArray(msg.payload)) {\n    node.status({ fill: \"red\", shape: \"ring\",\n                  text: \"payload should be a json array\" });\n    return;\n}\n\nmsg.payload.push({\n    operationtype: \"TrexEventHandler\",\n    continueevent: !isHandled\n});\n</code></pre>"},{"location":"nodlar/handle-setter/#tipik-kullanm","title":"Tipik Kullan\u0131m","text":"<p><code>Handle Setter</code>, di\u011fer trexMes node'lar\u0131ndan sonra, <code>Responser</code>'dan hemen \u00f6nce konumlan\u0131r:</p> <pre><code>flowchart LR\n    A[Business Events] --&gt; B[Custom Form\\nveya di\u011fer node'lar]\n    B --&gt; C[function\\nkarar mant\u0131\u011f\u0131]\n    C --&gt; D[Handle Setter\\nmsg.shouldHandle]\n    D --&gt; E[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000</code></pre> <p><code>IsHandled = true</code> oldu\u011funda panel, bu olaya ba\u011fl\u0131 kendi i\u015fleyicisini \u00e7al\u0131\u015ft\u0131rmaz; i\u015flem kesilir.</p>"},{"location":"nodlar/handle-setter/#ornek-function-node-kodu","title":"\u00d6rnek Function Node Kodu","text":"<p>Ak\u0131\u015f i\u00e7inde karar verip <code>Handle Setter</code>'a y\u00f6nlendirmek i\u00e7in:</p> <pre><code>// function node i\u00e7inde\nconst orderNo = msg.payload.orderNo;\nconst isPremium = await checkPremium(orderNo);\n\n// Premium sipari\u015fleri biz i\u015fleyelim, di\u011ferlerini panel\nmsg.shouldHandle = isPremium;  // bool\nreturn msg;\n</code></pre> <p>Ard\u0131ndan <code>Handle Setter</code>'da:</p> <ul> <li><code>isHandled</code>: <code>shouldHandle</code></li> <li><code>isHandledType</code>: <code>msg</code></li> </ul>"},{"location":"nodlar/handle-setter/#onemli-uyar","title":"\u00d6nemli Uyar\u0131","text":"<p>msg.payload array olmak zorunda</p> <p><code>Handle Setter</code> <code>msg.payload</code>'\u0131n array olmas\u0131n\u0131 bekler. E\u011fer \u00f6ncesinde bir form/event node \u00e7al\u0131\u015fmam\u0131\u015fsa array olmayacakt\u0131r.</p> <p>\u00c7\u00f6z\u00fcm: \u00d6nce bir <code>Custom Form</code> veya benzeri node'tan ge\u00e7irin, ya da function node ile:</p> <pre><code>if (!Array.isArray(msg.payload)) {\n    msg.payload = [];\n}\nreturn msg;\n</code></pre>"},{"location":"nodlar/handle-setter/#durum-gostergesi","title":"Durum G\u00f6stergesi","text":"<p>Hata durumunda node alt\u0131nda:</p> <pre><code>[red ring] payload should be a json array\n</code></pre>"},{"location":"nodlar/handle-setter/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>payload should be a json array</p> <p>Yukar\u0131daki uyar\u0131 b\u00f6l\u00fcm\u00fcne bak\u0131n \u2014 <code>msg.payload</code> array de\u011fil.</p> <p>isHandled her zaman false</p> <p><code>isHandledType</code> do\u011fru ayarlanm\u0131\u015f m\u0131? <code>bool</code> se\u00e7tiyseniz <code>isHandled</code> alan\u0131nda de\u011fer literal <code>true</code>/<code>false</code> olmal\u0131d\u0131r.</p>"},{"location":"nodlar/handle-setter/#ilgili-nodlar","title":"\u0130lgili Nodlar","text":"<ul> <li>Olay Nodlar\u0131 \u2014 T\u00fcm event node'lar\u0131 statik <code>Is Handled</code> alan\u0131na sahiptir</li> <li>Mesaj Yap\u0131s\u0131 \u2014 <code>TrexEventHandler</code> operationtype detay\u0131</li> </ul>"},{"location":"nodlar/llm-flow-builder/","title":"LLM Flow Builder","text":"LLM Flow Builder Inputs: 1 Outputs: 1 Kategori: trexMes service <p>Yapay zek\u00e2 ile Node-RED ak\u0131\u015f\u0131 \u00fcreten asistan node. Bir LLM (Large Language Model) sa\u011flay\u0131c\u0131s\u0131na do\u011fal dilde komut g\u00f6ndererek otomatik ak\u0131\u015f JSON'u \u00fcretir; isterseniz ak\u0131\u015f\u0131 otomatik olarak import ve deploy edebilir.</p> <p>Di\u011fer node'lardan fark\u0131</p> <p>Bu node trexMes operasyonu \u00fcretmez \u2014 Node-RED ortam\u0131nda geli\u015ftirici asistan\u0131 olarak \u00e7al\u0131\u015f\u0131r. Ak\u0131\u015f JSON'\u0131 \u00fcreterek geli\u015ftirici verimlili\u011fini art\u0131r\u0131r.</p>"},{"location":"nodlar/llm-flow-builder/#property-tablosu","title":"Property Tablosu","text":""},{"location":"nodlar/llm-flow-builder/#ana-node-llm-flow-builder","title":"Ana Node (<code>llm-flow-builder</code>)","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>llmConfig</code> config node (bo\u015f) LLM ba\u011flant\u0131 yap\u0131land\u0131rmas\u0131 <code>autoImport</code> boolean <code>false</code> \u00dcretilen ak\u0131\u015f\u0131 otomatik import et <code>autoDeploy</code> boolean <code>false</code> Import sonras\u0131 otomatik deploy et <code>flowTab</code> string (bo\u015f) Ak\u0131\u015f\u0131n import edilece\u011fi sekme ad\u0131"},{"location":"nodlar/llm-flow-builder/#config-node-llm-flow-builder-config","title":"Config Node (<code>llm-flow-builder-config</code>)","text":"Alan Tip A\u00e7\u0131klama <code>name</code> string Config takma ad\u0131 <code>provider</code> enum LLM sa\u011flay\u0131c\u0131s\u0131 <code>apiUrl</code> string API endpoint <code>modelName</code> string Model ad\u0131 <code>apiKey</code> password (credential) API anahtar\u0131"},{"location":"nodlar/llm-flow-builder/#desteklenen-llm-saglayclar","title":"Desteklenen LLM Sa\u011flay\u0131c\u0131lar\u0131","text":"<p>Config node, 6 pop\u00fcler sa\u011flay\u0131c\u0131 i\u00e7in preset sunar:</p> Provider API URL Varsay\u0131lan Model OpenAI <code>https://api.openai.com/v1/chat/completions</code> <code>gpt-4o</code> Anthropic <code>https://api.anthropic.com/v1/messages</code> <code>claude-sonnet-4-20250514</code> Google Gemini <code>https://generativelanguage.googleapis.com/v1beta/...</code> <code>gemini-2.0-flash</code> DeepSeek <code>https://api.deepseek.com/v1/chat/completions</code> <code>deepseek-chat</code> Mistral <code>https://api.mistral.ai/v1/chat/completions</code> <code>mistral-large-latest</code> Groq <code>https://api.groq.com/openai/v1/chat/completions</code> <code>llama-3.3-70b-versatile</code> Custom (manuel) (manuel)"},{"location":"nodlar/llm-flow-builder/#sistem-prompt","title":"Sistem Prompt","text":"<p>Node, sistem promptunu her zaman paket klas\u00f6r\u00fcndeki <code>systemprompt.txt</code> dosyas\u0131ndan otomatik olarak okur. Edit\u00f6rden de\u011fi\u015ftirilemez; dosyay\u0131 do\u011frudan d\u00fczenleyin. Dosya her mesajda yeniden okundu\u011fundan Node-RED yeniden ba\u015flat\u0131lmadan g\u00fcncellenebilir.</p> <p><code>systemprompt.txt</code> LLM'e \u015funlar\u0131 \u00f6\u011fretir:</p> <ul> <li>Node-RED ak\u0131\u015f JSON format\u0131n\u0131 ve zorunlu kurallar\u0131</li> <li><code>node-red-trexmes-service</code> paketindeki t\u00fcm node tiplerini ve property'lerini</li> <li>Business, Communication, Display ve System Events node'lar\u0131n\u0131n t\u00fcm event adlar\u0131n\u0131 ve T\u00fcrk\u00e7e a\u00e7\u0131klamalar\u0131n\u0131</li> <li>Tipik ak\u0131\u015f desenlerini (observe, form, button handling, conditional handle) \u00f6rneklerle</li> </ul>"},{"location":"nodlar/llm-flow-builder/#event-secimi","title":"Event Se\u00e7imi","text":"<p>LLM, verilen prompta g\u00f6re a\u00e7\u0131klamalar\u0131 okuyarak en uygun event'i otomatik se\u00e7er. \u00d6rne\u011fin:</p> Prompt Se\u00e7ilen Event Node Tipi <code>\"Barkod okununca ak\u0131\u015f ba\u015flas\u0131n\"</code> <code>OnBarcodeScanned</code> Communication Events <code>\"Plan y\u00fcklendi\u011finde form a\u00e7\"</code> <code>OnPlanLoaded</code> Business Events <code>\"Uygulama a\u00e7\u0131l\u0131\u015f\u0131nda kar\u015f\u0131lama g\u00f6ster\"</code> <code>OnApplicationStarted</code> System Events <code>\"Operat\u00f6r i\u015f y\u00fckle butonuna bast\u0131\u011f\u0131nda...\"</code> <code>OnOperatorPlanLoadButtonClicking</code> Display Events <code>\"Duru\u015f ba\u015flad\u0131\u011f\u0131nda bildir\"</code> <code>OnStoppageStarted</code> Business Events <p>A\u00e7\u0131klay\u0131c\u0131 prompt yaz\u0131n</p> <p>Senaryo ne kadar a\u00e7\u0131k anlat\u0131l\u0131rsa LLM event se\u00e7imi o kadar isabetli olur. \"\u00dcretim onayland\u0131\u011f\u0131nda\" gibi ifadeler <code>OnProductionConfirmed</code> ile e\u015fle\u015fir; \"saya\u00e7 artt\u0131\u011f\u0131nda\" ise <code>OnProductionCounterIncreased</code> ile.</p>"},{"location":"nodlar/llm-flow-builder/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[inject&lt;br/&gt;Komut: 'OrderStart yakala...'] --&gt; B[LLM Flow Builder]\n    B --&gt; C[debug&lt;br/&gt;\u00dcretilen flow JSON]\n\n    style A fill:#87ceeb,color:#000\n    style B fill:#99ff33,color:#000\n    style C fill:#87ceeb,color:#000</code></pre>"},{"location":"nodlar/llm-flow-builder/#komut-ornekleri","title":"Komut \u00d6rnekleri","text":"Komut Se\u00e7ilen Event \u00dcretilen Ak\u0131\u015f <code>\"Plan y\u00fcklenince form a\u00e7\"</code> <code>OnPlanLoaded</code> (Business) trex Subscriber + Business Events + Custom Form + Responser <code>\"Barkod okundu\u011funda sipari\u015f bilgisini g\u00f6ster\"</code> <code>OnBarcodeScanned</code> (Communication) trex Subscriber + Communication Events + Custom Form + Form Bind Controls + Responser <code>\"Uygulama a\u00e7\u0131l\u0131\u015f\u0131nda kar\u015f\u0131lama ekran\u0131 g\u00f6ster\"</code> <code>OnApplicationStarted</code> (System) trex Subscriber + System Events + Custom Form + Responser <code>\"Operat\u00f6r i\u015f y\u00fckle butonuna bast\u0131\u011f\u0131nda alternatif ak\u0131\u015f \u00e7al\u0131\u015ft\u0131r\"</code> <code>OnOperatorPlanLoadButtonClicking</code> (Display) trex Subscriber + Display Events(ishandled=true) + Handle Setter + Responser <code>\"Duru\u015f ba\u015flad\u0131\u011f\u0131nda debug'a yaz\"</code> <code>OnStoppageStarted</code> (Business) trex Subscriber + Business Events + debug + Responser"},{"location":"nodlar/llm-flow-builder/#otomatik-import-ve-deploy","title":"Otomatik Import ve Deploy","text":"<p>\u00dc\u00e7 olas\u0131 mod vard\u0131r:</p> <code>autoImport</code> <code>autoDeploy</code> Davran\u0131\u015f <code>false</code> herhangi Sadece \u00fcretir, debug \u00e7\u0131k\u0131\u015f\u0131 verir <code>true</code> <code>false</code> Yeni sekmeye ekler ama deploy etmez <code>true</code> <code>true</code> Sekmeye ekler ve deploy eder <p>Otomatik deploy'a dikkat</p> <p><code>autoDeploy: true</code> ayar\u0131 \u00e7al\u0131\u015fan Node-RED'i de\u011fi\u015ftirir. \u00dcretim ortam\u0131nda kapal\u0131 tutun; sadece geli\u015ftirme ortam\u0131nda kullan\u0131n.</p>"},{"location":"nodlar/llm-flow-builder/#giris-mesaj","title":"Giri\u015f Mesaj\u0131","text":"<p><code>msg.payload</code> alan\u0131nda do\u011fal dilde komut beklenir:</p> <pre><code>{\n  \"payload\": \"Bana her PLC ba\u011flant\u0131 kopmas\u0131 olay\u0131nda uyar\u0131 veren bir ak\u0131\u015f olu\u015ftur.\"\n}\n</code></pre>"},{"location":"nodlar/llm-flow-builder/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<p>\u00dcretilen ak\u0131\u015f JSON'u:</p> <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"flow\": [\n      {\n        \"id\": \"node1\",\n        \"type\": \"trex Subscriber\",\n        \"name\": \"\"\n      },\n      {\n        \"id\": \"node2\",\n        \"type\": \"Communication Events\",\n        \"event\": \"/PLCConnectionLost\",\n        \"ishandled\": false\n      }\n      // ...\n    ],\n    \"imported\": true,\n    \"deployed\": false,\n    \"tabName\": \"AI_Generated\"\n  }\n}\n</code></pre>"},{"location":"nodlar/llm-flow-builder/#api-izinleri-ve-maliyet","title":"API \u0130zinleri ve Maliyet","text":"<p>API anahtar\u0131</p> <p>Her LLM sa\u011flay\u0131c\u0131s\u0131 i\u00e7in kendi geli\u015ftirici hesab\u0131n\u0131zdan API anahtar\u0131 edinmeniz gerekir. Anahtar <code>credentials</code> olarak password tipinde saklan\u0131r; flow JSON export'ta g\u00f6r\u00fcnmez.</p> <p>Maliyet fark\u0131ndal\u0131\u011f\u0131</p> <p>LLM \u00e7a\u011fr\u0131lar\u0131 \u00fccretlidir. Her flow \u00fcretimi ~1000-3000 token t\u00fcketebilir. S\u00fcrekli test yaparken h\u0131zl\u0131 maliyet birikebilir.</p>"},{"location":"nodlar/llm-flow-builder/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>401 / 403</p> <p>API anahtar\u0131 yanl\u0131\u015f veya ge\u00e7ersiz. Anahtar\u0131n panel/proje yetkisi oldu\u011fundan emin olun.</p> <p>Model ad\u0131 bulunamad\u0131</p> <p>Se\u00e7ti\u011finiz model sa\u011flay\u0131c\u0131n\u0131n katalo\u011funda yoksa (\u00f6rn. eski/yeni isim) hata gelir. Sa\u011flay\u0131c\u0131n\u0131n dok\u00fcmantasyonundan g\u00fcncel model adlar\u0131n\u0131 teyit edin.</p> <p>Ge\u00e7ersiz JSON</p> <p>LLM bazen markdown code-fence (<code>```</code>) ile cevap d\u00f6nd\u00fcrebilir. Node i\u00e7 ayr\u0131\u015ft\u0131r\u0131c\u0131 bunu temizler; yine de hata al\u0131yorsan\u0131z <code>systemPrompt</code>'unuza \"sadece valid JSON d\u00f6nd\u00fcr\" ekleyin.</p> <p>Token limit a\u015f\u0131ld\u0131</p> <p>Sistem prompt \u00e7ok uzunsa (\u00f6zellikle paket geni\u015fledik\u00e7e) baz\u0131 modellerin limitini a\u015fabilirsiniz. Daha b\u00fcy\u00fck context destekleyen bir modele ge\u00e7in.</p>"},{"location":"nodlar/llm-flow-builder/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>\u00d6nce manuel deneyin</p> <p>Tipik ak\u0131\u015f desenlerini \u00f6nce manuel kurun, \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun. Sonra ayn\u0131s\u0131 i\u00e7in LLM'e komut verirseniz daha tutarl\u0131 sonu\u00e7 al\u0131rs\u0131n\u0131z.</p> <p>Daha iyi sonu\u00e7lar i\u00e7in detay</p> <p>\"Sipari\u015f yakala\" yerine \"Business Events node'u ile <code>OrderStartEvent</code> yakala, gelen orderNo ile Custom Form a\u00e7, txt** kontrolleri ba\u011fla, Responser ile bitir\" gibi a\u00e7\u0131k komutlar \u00fcretim kalitesini art\u0131r\u0131r.</p> <p>\u00d6zel sistem prompt</p> <p>\u015eirketinize/projenize \u00f6zel kurallar (isimlendirme standartlar\u0131, kullan\u0131lmas\u0131 yasak node tipleri) varsa <code>systemprompt.txt</code> dosyas\u0131n\u0131n sonuna ekleyin. Dosya her \u00e7a\u011fr\u0131da okundu\u011fundan de\u011fi\u015fiklik an\u0131nda ge\u00e7erli olur.</p>"},{"location":"nodlar/llm-flow-builder/#ilgili","title":"\u0130lgili","text":"<ul> <li>Node Referans\u0131</li> <li>Mimari Genel Bak\u0131\u015f</li> <li>Custom Form</li> </ul>"},{"location":"nodlar/main-form-action/","title":"Main Form Action","text":"Main Form Action Inputs: 1 Outputs: 1 Kategori: trexMes service <p>trexMes ana form (Main Form) \u00fczerindeki butonlar\u0131n tetikleme aksiyonunu do\u011frudan programatik olarak \u00e7al\u0131\u015ft\u0131r\u0131r. Manuel t\u0131klama yerine ak\u0131\u015ftan tetikleme yapman\u0131z\u0131 sa\u011flar.</p>"},{"location":"nodlar/main-form-action/#ozet","title":"\u00d6zet","text":"<p>Bu node, panel kullan\u0131c\u0131s\u0131n\u0131n \"Manuel olarak butona basm\u0131\u015f\" gibi davranmas\u0131n\u0131 sa\u011flar. Otomatik i\u015f ak\u0131\u015f\u0131 senaryolar\u0131nda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r:</p> <p>\"\u00dcretim biten her par\u00e7ada Main Form'daki 'Saya\u00e7 S\u0131f\u0131rla' butonunu otomatik tetikle.\"</p>"},{"location":"nodlar/main-form-action/#buton-indeksleri","title":"Buton \u0130ndeksleri","text":"<p>Buton ID'leri 1-based olarak girilir. \u0130ndeksleri g\u00f6rsel olarak g\u00f6rmek i\u00e7in:</p> <p></p>"},{"location":"nodlar/main-form-action/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>buttonindex</code> string (bo\u015f) Tetiklenecek buton numaras\u0131 (1-based)"},{"location":"nodlar/main-form-action/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<pre><code>{\n  \"operationtype\": \"TriggerMain\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"3\"\n}\n</code></pre> <p><code>name</code> alan\u0131 tetiklenecek butonun indeksini ta\u015f\u0131r.</p>"},{"location":"nodlar/main-form-action/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Communication Events&lt;br/&gt;SensorReading] --&gt; B[switch&lt;br/&gt;qty &gt;= 100?]\n    B --&gt; C[Main Form Action&lt;br/&gt;Buton 3]\n    C --&gt; D[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/main-form-action/#ornek-senaryo","title":"\u00d6rnek Senaryo","text":"<p>Otomatik \u00dcretim Sayac\u0131 S\u0131f\u0131rlama:</p> <ol> <li>Sens\u00f6r 100 par\u00e7a sayac\u0131 sinyali g\u00f6nderir \u2192 <code>Communication Events</code></li> <li>Ak\u0131\u015f, Main Form'daki \"Saya\u00e7 S\u0131f\u0131rla\" butonunun (\u00f6rn. indeks 7) aksiyonunu tetikler.</li> <li>Panel sanki operat\u00f6r t\u0131klam\u0131\u015f gibi davran\u0131r, saya\u00e7 s\u0131f\u0131rlan\u0131r.</li> </ol>"},{"location":"nodlar/main-form-action/#onemli-notlar","title":"\u00d6nemli Notlar","text":"<p>Sadece Main Form i\u00e7in</p> <p>Bu node yaln\u0131zca ana form (Main Form / AppForm) \u00fczerindeki butonlar\u0131 tetikler. Custom dialog veya operasyon formlar\u0131 i\u00e7in kullan\u0131lamaz; onlar i\u00e7in Method Invoker tercih edin.</p> <p>\u0130ndeks do\u011frulamas\u0131</p> <p>Ge\u00e7ersiz bir buton indeksi (<code>0</code>, <code>99</code>, negatif) g\u00f6nderirseniz panel sessizce yutar. Hata mesaj\u0131 d\u00f6nmez; ak\u0131\u015f normal akar.</p>"},{"location":"nodlar/main-form-action/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Buton tetiklenmiyor</p> <ul> <li><code>buttonindex</code> 1-based girildi mi? (<code>0</code> de\u011fil <code>1</code>)</li> <li>Buton g\u00f6r\u00fcn\u00fcr durumda m\u0131? G\u00f6r\u00fcnmeyen butonun tetiklenmesi panel'in default davran\u0131\u015f\u0131na ba\u011fl\u0131d\u0131r.</li> <li>O buton disabled m\u0131?</li> </ul>"},{"location":"nodlar/main-form-action/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>\u00c7ok ad\u0131ml\u0131 i\u015flemler</p> <p>Birden fazla butonun s\u0131rayla tetiklenmesi gerekiyorsa, ak\u0131\u015fta pe\u015f pe\u015fe <code>Main Form Action</code> node'lar\u0131 koyabilirsiniz. Her biri kendi operasyonunu <code>msg.payload</code> array'ine ekler ve panel hepsini s\u0131rayla i\u015fler.</p> <p>Konfig\u00fcrasyon ile birlikte</p> <p>Yeni bir Main Form y\u00fcklendikten sonra butonlar\u0131 tetiklemeden \u00f6nce mutlaka <code>Button Configurator</code> ile yap\u0131land\u0131r\u0131n. G\u00f6r\u00fcnmeyen/disabled butonlar\u0131n tetiklenmesi anlams\u0131z olur.</p>"},{"location":"nodlar/main-form-action/#ilgili","title":"\u0130lgili","text":"<ul> <li>Button Configurator \u2014 Butonlar\u0131 yap\u0131land\u0131r</li> <li>Form Events \u2014 Buton t\u0131klama yakalama</li> <li>Method Invoker \u2014 Method \u00e7a\u011f\u0131rma alternatifi</li> </ul>"},{"location":"nodlar/method-invoker/","title":"Method Invoker","text":"Method Invoker Inputs: 1 Outputs: 1 Kategori: trexMes service <p>trexMes panel taraf\u0131nda tan\u0131ml\u0131 bir method'u \u00e7a\u011f\u0131r\u0131r. Parametre de\u011ferlerini dinamik olarak (msg/flow/global/jsonata) hesaplay\u0131p panele g\u00f6nderir.</p>"},{"location":"nodlar/method-invoker/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>service</code> string (bo\u015f) Servis ad\u0131 (\u00f6rn. <code>OrderService</code>) <code>method</code> string (bo\u015f) Method ad\u0131 (\u00f6rn. <code>SaveOrder</code>) <code>props</code> array <code>[]</code> Parametre listesi <code>data</code> string (bo\u015f) (legacy) Veri kaynak yolu <code>dataType</code> string \u2014 (legacy) Veri kaynak tipi"},{"location":"nodlar/method-invoker/#props-yaps","title":"<code>props</code> Yap\u0131s\u0131","text":"<p>Her sat\u0131r bir method parametresi:</p> Anahtar A\u00e7\u0131klama \u00d6rnek <code>p</code> Parametre ad\u0131 (<code>ParameterName</code>) <code>orderNo</code> <code>v</code> (unused) \u2014 <code>d</code> De\u011fer veya path <code>payload.orderNo</code> <code>dt</code> De\u011fer kayna\u011f\u0131 (dataType) <code>msg</code>, <code>flow</code>, <code>global</code>, vs. <pre><code>[\n  { \"p\": \"orderNo\",    \"d\": \"payload.orderNo\", \"dt\": \"msg\" },\n  { \"p\": \"quantity\",   \"d\": \"50\",              \"dt\": \"num\" },\n  { \"p\": \"operatorId\", \"d\": \"currentUser\",     \"dt\": \"flow\" }\n]\n</code></pre>"},{"location":"nodlar/method-invoker/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<pre><code>{\n  \"operationtype\": \"MethodInvokerProcess\",\n  \"receiveddata\": { /* event data */ },\n  \"name\": \"SaveOrder\",\n  \"message\": \"OrderService.SaveOrder\",\n  \"value\": [\n    { \"ParameterName\": \"orderNo\",    \"Value\": \"ORD-001\" },\n    { \"ParameterName\": \"quantity\",   \"Value\": 50 },\n    { \"ParameterName\": \"operatorId\", \"Value\": \"OP-007\" }\n  ]\n}\n</code></pre> <p><code>message</code> alan\u0131 <code>service.method</code> format\u0131nda otomatik olu\u015fturulur.</p>"},{"location":"nodlar/method-invoker/#datatype-cesitleri","title":"<code>dataType</code> \u00c7e\u015fitleri","text":"<code>dataType</code> Anlam \u00d6rnek <code>d</code> <code>msg</code> Mesaj nesnesinden <code>payload.orderNo</code> <code>flow</code> Flow context <code>currentOrder</code> <code>global</code> Global context <code>defaultMachine</code> <code>num</code> Sabit say\u0131 <code>42</code> <code>json</code> Sabit JSON <code>{\"prio\":1}</code> <code>bool</code> Sabit boolean <code>true</code> <code>jsonata</code> JSONata ifadesi <code>payload.items[type='A'].id</code> di\u011fer Sabit string <code>\"ACME\"</code> <p>Detay \u2192</p>"},{"location":"nodlar/method-invoker/#tipik-aks-asenkron-method-cagrs","title":"Tipik Ak\u0131\u015f (Asenkron Method \u00c7a\u011fr\u0131s\u0131)","text":"<pre><code>flowchart LR\n    A[Form Events&lt;br/&gt;btnSave click] --&gt; B[Method Invoker&lt;br/&gt;OrderService.SaveOrder]\n    B --&gt; C[Responser]\n\n    D[Method Returns&lt;br/&gt;SaveOrder] --&gt; E[switch&lt;br/&gt;success?]\n    E --&gt;|true| F[Custom Form&lt;br/&gt;Onay]\n    E --&gt;|false| G[Custom Form&lt;br/&gt;Hata]\n    F --&gt; H[Responser]\n    G --&gt; H\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style F fill:#ccffcc,color:#000\n    style G fill:#ccffcc,color:#000\n    style H fill:#ccffcc,color:#000</code></pre> <p>\u0130ki ayr\u0131 ak\u0131\u015f</p> <p>Method \u00e7a\u011fr\u0131s\u0131 asenkron'dur. \u0130lk ak\u0131\u015f <code>Method Invoker</code> ile \u00e7a\u011fr\u0131y\u0131 yapar ve <code>Responser</code> ile kapan\u0131r. Method cevab\u0131 geldi\u011finde ayr\u0131 bir ak\u0131\u015f <code>Method Returns</code> ile tetiklenir.</p>"},{"location":"nodlar/method-invoker/#asenkron-islem-modeli","title":"Asenkron \u0130\u015flem Modeli","text":"<p><code>Control Properties</code> ile ayn\u0131 asenkron pattern'i kullan\u0131r:</p> <pre><code>let tasks = node.props.map((item) =&gt; {\n    return new Promise((resolve, reject) =&gt; {\n        switch (item.dt) {\n            case 'msg':    /* ... */; break;\n            case 'flow':   /* ... */; break;\n            case 'jsonata':\n                // Async JSONata\n                RED.util.evaluateJSONataExpression(expr, msg, (err, result) =&gt; {\n                    err ? reject(err) : resolve({\n                        ParameterName: item.p,\n                        Value: result\n                    });\n                });\n                return;\n            // ...\n        }\n        resolve({ ParameterName: item.p, Value: computedValue });\n    });\n});\n\nPromise.all(tasks).then((params) =&gt; {\n    msg.payload.push({\n        operationtype: \"MethodInvokerProcess\",\n        name: node.name,\n        message: node.service + \".\" + node.method,\n        value: params\n    });\n    node.send(msg);\n});\n</code></pre>"},{"location":"nodlar/method-invoker/#onemli-notlar","title":"\u00d6nemli Notlar","text":"<p>Method ismi format\u0131</p> <p><code>service.method</code> format\u0131 panel taraf\u0131nda tan\u0131ml\u0131 method ismi ile birebir e\u015fle\u015fmelidir. Servis ad\u0131 yoksa bo\u015f b\u0131rak\u0131n; <code>message</code> alan\u0131 <code>.method</code> olarak gider \u2014 bu durumun panel beklentisine uydu\u011fundan emin olun.</p> <p>Parametre tip uyumsuzlu\u011fu</p> <p><code>dataType: num</code> se\u00e7tiyseniz de\u011fer <code>Number()</code> ile d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. <code>\"abc\"</code> g\u00f6nderirseniz <code>NaN</code> olur ve panel hata verir.</p>"},{"location":"nodlar/method-invoker/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Method not found</p> <p>Panel taraf\u0131ndaki method ismi yaz\u0131m\u0131 do\u011fru mu? B\u00fcy\u00fck/k\u00fc\u00e7\u00fck harf duyarl\u0131 olabilir.</p> <p>Parametre tip hatas\u0131</p> <p>Panel'in bekledi\u011fi parametre tipiyle g\u00f6nderdi\u011finiz <code>dataType</code> uyu\u015fmuyor olabilir. \u00d6rn. panel <code>int</code> bekliyor, siz <code>str</code> g\u00f6nderiyorsunuz.</p> <p>Cevap gelmiyor</p> <p><code>Method Returns</code> node'u ekledi mi? <code>methodname</code> alan\u0131 <code>Method Invoker</code>'daki <code>method</code> ile ayn\u0131 m\u0131?</p>"},{"location":"nodlar/method-invoker/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Servis ad\u0131 bo\u015fsa</p> <p><code>service</code> alan\u0131n\u0131 bo\u015f b\u0131rak\u0131rsan\u0131z <code>message: \".SaveOrder\"</code> \u015feklinde olur. Daha g\u00fczel g\u00f6r\u00fcnmesi i\u00e7in tek bir kelime de yazabilirsiniz (<code>Order</code>).</p> <p>Method timeout</p> <p>Uzun s\u00fcren i\u015flemleri (rapor \u00fcretme, toplu g\u00fcncelleme) method \u00e7a\u011fr\u0131s\u0131 ile ba\u015flat\u0131n. Cevab\u0131 <code>Method Returns</code>'ten al\u0131n. Bu sayede ilk HTTP request bloklamaz.</p>"},{"location":"nodlar/method-invoker/#ilgili","title":"\u0130lgili","text":"<ul> <li>Method Returns \u2014 Method cevab\u0131n\u0131 yakala (Context Getter cevaplar\u0131 da buradan al\u0131n\u0131r)</li> <li>Context Getter \u2014 StateContext sorgusu i\u00e7in alternatif node</li> <li>Display Methods \u2014 Panel'in method \u00e7a\u011fr\u0131s\u0131n\u0131 yakala</li> <li>Execute Process \u2014 Process tetikleme alternatifi</li> </ul>"},{"location":"nodlar/method-returns/","title":"Method Returns","text":"Method Returns Inputs: 0 Outputs: 1 Kategori: trexMes service <p>Method Invoker veya Context Getter ile ba\u015flat\u0131lan asenkron bir i\u015flemin d\u00f6n\u00fc\u015f verisini yakalar. Panel taraf\u0131 i\u015flemi tamamlay\u0131p cevap g\u00f6nderdi\u011finde bu node tetiklenir.</p>"},{"location":"nodlar/method-returns/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>methodname</code> string (bo\u015f) Cevab\u0131n\u0131 dinlemek istedi\u011finiz Method Invoker veya Context Getter node'unun ad\u0131 <p>methodname = node ad\u0131</p> <p><code>methodname</code> alan\u0131ndaki a\u00e7\u0131l\u0131r listede ak\u0131\u015ftaki t\u00fcm Method Invoker ve Context Getter node'lar\u0131n\u0131n adlar\u0131 listelenir. Se\u00e7ilen ad, kaynak node'un <code>name</code> alan\u0131yla birebir e\u015fle\u015fmelidir.</p>"},{"location":"nodlar/method-returns/#hangi-nodelardan-cevap-alr","title":"Hangi Node'lardan Cevap Al\u0131r?","text":"Kaynak Node Cevap Tipi A\u00e7\u0131klama Method Invoker Method return de\u011feri Panel servisindeki method'un d\u00f6nd\u00fcrd\u00fc\u011f\u00fc veri Context Getter StateContext snapshot Sorgulanan istasyona ait context property de\u011ferleri"},{"location":"nodlar/method-returns/#asenkron-calsma-modeli","title":"Asenkron \u00c7al\u0131\u015fma Modeli","text":"<p>Method Invoker veya Context Getter \u00e7a\u011fr\u0131s\u0131 iki ayr\u0131 ak\u0131\u015f olu\u015fturur:</p> <pre><code>sequenceDiagram\n    participant Flow as Node-RED Ak\u0131\u015f\u0131\n    participant Panel as trexMes Panel\n    participant Returns as Method Returns\n\n    Flow-&gt;&gt;Panel: Method Invoker / Context Getter (HTTP)\n    Flow-&gt;&gt;Flow: Responser \u2192 ak\u0131\u015f kapand\u0131\n    Note over Panel: Panel i\u015flemi ger\u00e7ekle\u015ftiriyor...\n    Panel-&gt;&gt;Returns: Cevap geldi (ayr\u0131 HTTP iste\u011fi)\n    Returns-&gt;&gt;Flow: Yeni ak\u0131\u015f ba\u015flad\u0131</code></pre> <p>Neden iki ak\u0131\u015f?</p> <p>\u0130lk ak\u0131\u015f \u00e7a\u011fr\u0131y\u0131 yapar ve <code>Responser</code> ile kapan\u0131r. Panel asenkron olarak i\u015flemi tamamlad\u0131ktan sonra Node-RED'e geri d\u00f6ner; bu noktada <code>Method Returns</code> yeni bir ak\u0131\u015f ba\u015flat\u0131r. Uzun s\u00fcren i\u015flemler bu sayede HTTP timeout'a d\u00fc\u015fmeden \u00e7al\u0131\u015f\u0131r.</p>"},{"location":"nodlar/method-returns/#tipik-kullanm-method-invoker-ile","title":"Tipik Kullan\u0131m \u2014 Method Invoker ile","text":"<pre><code>flowchart LR\n    A[Form Events&lt;br/&gt;btnSave click] --&gt; B[Method Invoker&lt;br/&gt;OrderService.SaveOrder]\n    B --&gt; C[Responser]\n\n    D[Method Returns&lt;br/&gt;SaveOrder] --&gt; E[switch&lt;br/&gt;success?]\n    E --&gt;|true| F[Custom Form&lt;br/&gt;Onay]\n    E --&gt;|false| G[Custom Form&lt;br/&gt;Hata]\n    F --&gt; H[Responser]\n    G --&gt; H\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style F fill:#ccffcc,color:#000\n    style G fill:#ccffcc,color:#000\n    style H fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/method-returns/#tipik-kullanm-context-getter-ile","title":"Tipik Kullan\u0131m \u2014 Context Getter ile","text":"<pre><code>flowchart LR\n    A[Business Events&lt;br/&gt;OnOrderStarted] --&gt; B[Context Getter&lt;br/&gt;ProductionPlanStateContext]\n    B --&gt; C[Responser]\n\n    D[Method Returns&lt;br/&gt;ProductionPlanStateContext] --&gt; E[function&lt;br/&gt;Plan verisini i\u015fle]\n    E --&gt; F[Custom Form&lt;br/&gt;Bilgi ekran\u0131]\n    F --&gt; G[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style F fill:#ccffcc,color:#000\n    style G fill:#ccffcc,color:#000\n    style G fill:#ccffcc,color:#000</code></pre> <p>Node ad\u0131 e\u015fle\u015fmesi</p> <p><code>Method Returns</code> node'undaki methodname se\u00e7imi, kaynak node'un <code>name</code> alan\u0131 ile birebir e\u015fle\u015fmelidir.</p> <ul> <li>Method Invoker ad\u0131 <code>\"SaveOrder\"</code> ise \u2192 <code>methodname = SaveOrder</code></li> <li>Context Getter ad\u0131 <code>\"ProductionPlanStateContext\"</code> ise \u2192 <code>methodname = ProductionPlanStateContext</code></li> </ul>"},{"location":"nodlar/method-returns/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<p>Panelden d\u00f6nen veri <code>msg.payload</code> i\u00e7inde gelir. \u0130\u00e7erik kayna\u011fa g\u00f6re de\u011fi\u015fir:</p> Method Invoker Cevab\u0131Context Getter Cevab\u0131 <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"methodName\": \"SaveOrder\",\n    \"returnValue\": {\n      \"success\": true,\n      \"orderId\": 4521\n    },\n    \"executionTime\": 245\n  }\n}\n</code></pre> <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"PlanId\": 1042,\n    \"PlanQuantity\": 500.0,\n    \"PlanTotalProductionQuantity\": 312.0,\n    \"LeftAmountForPlanCompletion\": 188.0,\n    \"PlanWorkStartDate\": \"2026-05-19T08:00:00Z\",\n    \"PlanNote\": \"\u00d6ncelikli sipari\u015f\"\n  }\n}\n</code></pre>"},{"location":"nodlar/method-returns/#ornek-senaryo-context-getter-ile-uretim-verisi-okuma","title":"\u00d6rnek Senaryo \u2014 Context Getter ile \u00dcretim Verisi Okuma","text":"<ol> <li><code>Business Events</code> \u2014 <code>OnShiftStarted</code> tetiklenir.</li> <li><code>Context Getter</code> \u2014 <code>AnalysisStateContext</code> sorgusu yap\u0131l\u0131r, <code>WorkStationId = 5</code>.</li> <li><code>Responser</code> \u2014 ilk ak\u0131\u015f kapan\u0131r.</li> <li>Panel context verisini haz\u0131rlar ve Node-RED'e g\u00f6nderir.</li> <li><code>Method Returns</code> (ad\u0131: <code>AnalysisStateContext</code>) tetiklenir.</li> <li><code>function</code> node \u2014 <code>msg.payload.ShiftOeePercent</code> okunur.</li> <li><code>Custom Form</code> \u2014 OEE de\u011feri ekranda g\u00f6sterilir.</li> </ol>"},{"location":"nodlar/method-returns/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Method Returns hi\u00e7 tetiklenmiyor</p> <ul> <li>Kaynak node ad\u0131 ile <code>methodname</code> e\u015fle\u015fiyor mu?</li> <li><code>Method Invoker</code> / <code>Context Getter</code> node'u ak\u0131\u015fta deploy edildi mi?</li> <li>Panel taraf\u0131nda ilgili servis/context aktif mi?</li> </ul> <p>Yanl\u0131\u015f veri geliyor</p> <p>Ak\u0131\u015fta birden fazla <code>Method Invoker</code> veya <code>Context Getter</code> varsa her birinin <code>name</code> alan\u0131n\u0131n benzersiz oldu\u011fundan emin olun.</p>"},{"location":"nodlar/method-returns/#ilgili","title":"\u0130lgili","text":"<ul> <li>Method Invoker \u2014 Servis method'u \u00e7a\u011f\u0131ran node</li> <li>Context Getter \u2014 StateContext sorgulayan node</li> <li>Display Methods \u2014 Panel'in method tetiklemelerini yakala</li> </ul>"},{"location":"nodlar/responser/","title":"Responser","text":"Responser Inputs: 1 Outputs: 0 Kategori: trexMes service <p>Olay tabanl\u0131 ak\u0131\u015flar\u0131n kapat\u0131c\u0131s\u0131d\u0131r. trexMes panele HTTP cevab\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr. Her event ak\u0131\u015f\u0131n\u0131n sonunda mutlaka bulunmal\u0131d\u0131r (baz\u0131 node'lar bunu otomatik y\u00f6netir).</p>"},{"location":"nodlar/responser/#ozet","title":"\u00d6zet","text":"<p>Ak\u0131\u015f sonland\u0131r\u0131c\u0131</p> <p><code>Business Events</code>, <code>System Events</code> gibi olay node'lar\u0131yla ba\u015flayan ak\u0131\u015flar mutlaka bir <code>Responser</code> ile sonlanmal\u0131d\u0131r. Aksi takdirde panel cevap bekler, ak\u0131\u015f as\u0131l\u0131 kal\u0131r ve timeout hatas\u0131 al\u0131rs\u0131n\u0131z.</p>"},{"location":"nodlar/responser/#ne-zaman-kullanlr","title":"Ne Zaman Kullan\u0131l\u0131r?","text":"<ul> <li>Her olay (event) tabanl\u0131 ak\u0131\u015f\u0131n sonunda</li> <li>Custom form / control / method invocation operasyonlar\u0131ndan sonra cevap d\u00f6nd\u00fcrmek i\u00e7in</li> </ul>"},{"location":"nodlar/responser/#hangi-akslarda-gerekli-degildir","title":"Hangi Ak\u0131\u015flarda Gerekli DE\u011e\u0130LD\u0130R?","text":"<ul> <li><code>trex Subscriber</code> kendi cevab\u0131n\u0131 y\u00f6netir \u2014 sonuna <code>Responser</code> koymay\u0131n.</li> <li><code>Method Returns</code> asenkron bir ak\u0131\u015f ba\u015flat\u0131r \u2014 gerekli olmayabilir.</li> </ul>"},{"location":"nodlar/responser/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Node-RED canvas \u00fczerinde g\u00f6sterilecek ad <code>statusCode</code> string (bo\u015f) HTTP cevap kodunu zorla ayarlamak i\u00e7in (\u00f6rn. <code>200</code>, <code>400</code>) <code>headers</code> object <code>{}</code> HTTP cevap header'lar\u0131"},{"location":"nodlar/responser/#davrans","title":"Davran\u0131\u015f","text":"<p><code>Responser</code> ald\u0131\u011f\u0131 <code>msg</code>'i analiz eder ve panele \u015fu \u015fekilde cevap d\u00f6ner:</p> <pre><code>// Stat\u00fc kodu belirleme (\u00f6ncelik s\u0131ras\u0131)\nstatusCode = node.statusCode || msg.statusCode || 200;\n\n// Payload tip kontrol\u00fc\nif (typeof msg.payload === \"object\" &amp;&amp; !Buffer.isBuffer(msg.payload)) {\n    msg.res._res.status(statusCode).jsonp(msg.payload);\n} else {\n    msg.res._res.status(statusCode).send(msg.payload);\n}\n</code></pre>"},{"location":"nodlar/responser/#cookie-ve-header-yonetimi","title":"Cookie ve Header Y\u00f6netimi","text":"<p><code>msg.headers</code> ve <code>msg.cookies</code> set edilmi\u015fse otomatik olarak HTTP cevab\u0131na eklenir:</p> <pre><code>// Ak\u0131\u015f i\u00e7inde\nmsg.headers = { \"x-custom\": \"value\" };\nmsg.cookies = { sessionId: \"abc123\" };\n</code></pre>"},{"location":"nodlar/responser/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<pre><code>flowchart LR\n    A[Business Events] --&gt; B[Custom Form]\n    B --&gt; C[Form Bind Controls]\n    C --&gt; D[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/responser/#cks-yok","title":"\u00c7\u0131k\u0131\u015f Yok","text":"<p><code>Responser</code> <code>outputs: 0</code> oldu\u011fu i\u00e7in sonras\u0131na ba\u015fka node ba\u011flayamazs\u0131n\u0131z. Ak\u0131\u015f burada sona erer.</p>"},{"location":"nodlar/responser/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Panel cevap beklemede as\u0131l\u0131 kal\u0131yor</p> <p>Ak\u0131\u015fta <code>Responser</code> eksik. Olay node'undan ba\u015flayan ak\u0131\u015f\u0131n sonuna bir <code>Responser</code> eklenmelidir. Birden fazla dal tek bir <code>Responser</code>'a ba\u011flanabilir.</p> <p>Cevap iki kere d\u00f6n\u00fcyor uyar\u0131s\u0131</p> <p>Ayn\u0131 <code>msg.res</code> \u00fczerinden iki kere cevap d\u00f6nd\u00fcr\u00fclmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda ortaya \u00e7\u0131kar. Birden fazla <code>Responser</code> ayn\u0131 dalda pe\u015f pe\u015fe gelmemelidir.</p> <p>Hata: msg.res is undefined</p> <p>Bu node'a <code>msg.res</code> ta\u015f\u0131mayan bir ak\u0131\u015ftan geliyorsan\u0131z (\u00f6rn. <code>inject</code> ile manuel ba\u015flat\u0131lan flow) cevap d\u00f6necek bir HTTP iste\u011fi yoktur. Sadece ger\u00e7ek olay ak\u0131\u015flar\u0131nda \u00e7al\u0131\u015f\u0131r.</p>"},{"location":"nodlar/responser/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Hata cevab\u0131 d\u00f6nmek istiyorum</p> <p>Ak\u0131\u015f\u0131n bir noktas\u0131nda hata olu\u015ftu ve panele <code>400</code> veya <code>500</code> d\u00f6nd\u00fcrmek istiyorsan\u0131z:</p> <pre><code>// Function node i\u00e7inde\nmsg.statusCode = 400;\nmsg.payload = { error: \"Invalid order number\" };\nreturn msg;\n</code></pre> <p>Sonra <code>Responser</code> bunu otomatik kullan\u0131r.</p> <p>JSON yerine d\u00fcz metin</p> <p><code>msg.payload</code> bir string ise d\u00fcz metin g\u00f6nderilir. <code>object</code> ise JSON olarak g\u00f6nderilir.</p>"},{"location":"nodlar/responser/#ilgili-nodlar","title":"\u0130lgili Nodlar","text":"<ul> <li>trex Subscriber \u2014 Kendi cevab\u0131n\u0131 y\u00f6netir</li> <li>Olay Nodlar\u0131 \u2014 T\u00fcm olay node'lar\u0131 <code>Responser</code> ile sonland\u0131r\u0131l\u0131r</li> </ul>"},{"location":"nodlar/system-events/","title":"System Events","text":"System Events Inputs: 0 Outputs: 1 Kategori: trexMes service <p>trexMes panelindeki sistem seviyesi olaylar\u0131na abone olur. Panel a\u00e7\u0131lmas\u0131, kapanmas\u0131, kilitleme, kullan\u0131c\u0131 giri\u015fi gibi sistemsel tetiklemeleri yakalar.</p>"},{"location":"nodlar/system-events/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Canvas \u00fczerinde g\u00f6sterilecek ad <code>method</code> string <code>get</code> HTTP method (otomatik) <code>event</code> string (bo\u015f) Panel'in tetikleyece\u011fi HTTP path <code>ishandled</code> boolean <code>false</code> Node-RED handle ediyor mu?"},{"location":"nodlar/system-events/#olay-listesi","title":"Olay Listesi","text":"<p><code>Event</code> alan\u0131 combobox ile se\u00e7ilir. Mevcut se\u00e7enekler:</p> Olay A\u00e7\u0131klama <code>OnApplicationClosing</code> Uygulama kapanma a\u015famas\u0131nda ana form kapat\u0131lmadan hemen \u00f6nce tetiklenir. <code>OnApplicationStarted</code> Uygulama aya\u011fa kalkt\u0131\u011f\u0131nda ana ekran g\u00f6steriminden hemen \u00f6nce tetiklenir. <code>OnGlobalTimerTicked</code> Arka planda ger\u00e7ekle\u015fen periyodik i\u015flemler i\u00e7in kullan\u0131lan Timer Tick olay\u0131nda tetiklenir. Benzer periyodik i\u015flemler i\u00e7in kullan\u0131labilir."},{"location":"nodlar/system-events/#ornek-kullanm","title":"\u00d6rnek Kullan\u0131m","text":"<pre><code>flowchart LR\n    A[System Events&lt;br/&gt;OnApplicationStarted] --&gt; B[Custom Form&lt;br/&gt;Kar\u015f\u0131lama Ekran\u0131]\n    B --&gt; C[Responser]\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000</code></pre>"},{"location":"nodlar/system-events/#giris-mesaj","title":"Giri\u015f Mesaj\u0131","text":"<pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"userId\": \"USR-007\",\n    \"userName\": \"Ahmet Y\u0131lmaz\",\n    \"loginTime\": \"2026-05-11T08:30:00Z\",\n    \"panelId\": \"PNL-A-15\"\n  }\n}\n</code></pre>"},{"location":"nodlar/system-events/#ipuclar","title":"\u0130pu\u00e7lar\u0131","text":"<p>Audit logging</p> <p><code>UserLoginEvent</code> ve <code>UserLogoutEvent</code> olaylar\u0131n\u0131 yakalay\u0131p veritaban\u0131na yazarak panel ba\u015f\u0131na denetim (audit) kay\u0131tlar\u0131 tutabilirsiniz.</p> <p>Otomatik form y\u00fckleme</p> <p><code>SystemBootEvent</code> ile panel a\u00e7\u0131l\u0131r a\u00e7\u0131lmaz varsay\u0131lan bir form y\u00fcklenmesini sa\u011flayabilirsiniz.</p>"},{"location":"nodlar/system-events/#ilgili","title":"\u0130lgili","text":"<ul> <li>Olay Nodlar\u0131 Genel Bak\u0131\u015f</li> <li>Custom Form</li> </ul>"},{"location":"nodlar/trex-subscriber/","title":"trex Subscriber","text":"trex Subscriber Inputs: 0 Outputs: 1 Kategori: trexMes service <p>Projedeki t\u00fcm event node'lar\u0131n\u0131n isimlerini trexMes paneline kaydeder. Bu node sayesinde panel hangi olaylar\u0131 Node-RED'e g\u00f6nderece\u011fini bilir.</p>"},{"location":"nodlar/trex-subscriber/#ozet","title":"\u00d6zet","text":"<p>Her projede 1 ADET zorunlu</p> <p>Bu node, paketin omurgas\u0131d\u0131r. trexMes Edge ile ilk haberle\u015fmeyi kuran node'tur. Bir projede birden fazla <code>trex Subscriber</code> bulunamaz.</p>"},{"location":"nodlar/trex-subscriber/#ne-zaman-kullanlr","title":"Ne Zaman Kullan\u0131l\u0131r?","text":"<ul> <li>Yeni bir trexMes ak\u0131\u015f\u0131 olu\u015ftururken ilk eklenmesi gereken node.</li> <li>Deploy an\u0131nda otomatik tetiklenir; taray\u0131c\u0131/manuel input gerekmez.</li> </ul>"},{"location":"nodlar/trex-subscriber/#property-tablosu","title":"Property Tablosu","text":"Alan Tip Varsay\u0131lan A\u00e7\u0131klama <code>name</code> string \u2014 Node-RED canvas \u00fczerinde g\u00f6sterilecek ad (opsiyonel) <code>method</code> string <code>get</code> HTTP method (otomatik, de\u011fi\u015ftirilmez) <code>event</code> string <code>/GetSubscribed</code> Panel'in event listesi sormak i\u00e7in \u00e7a\u011f\u0131raca\u011f\u0131 HTTP path"},{"location":"nodlar/trex-subscriber/#cks-mesaj","title":"\u00c7\u0131k\u0131\u015f Mesaj\u0131","text":"<p>Bu node'un \u00e7\u0131k\u0131\u015f\u0131 yaln\u0131zca tan\u0131 (diagnostic) ama\u00e7l\u0131d\u0131r; di\u011fer node'lar\u0131 tetiklemek i\u00e7in kullan\u0131lmaz.</p> <p>\u00c7\u0131k\u0131\u015fa bir <code>debug</code> node'u ba\u011fland\u0131\u011f\u0131nda, her <code>GET /GetSubscribed</code> iste\u011finde \u015fu bilgiler g\u00f6r\u00fcnt\u00fclenir:</p> <pre><code>{\n  \"_msgid\": \"abc123\",\n  \"payload\": {\n    \"client\": \"192.168.1.42\",\n    \"subs\": [\n      \"OrderStartEvent\",\n      \"OrderEndEvent\",\n      \"MachineStatusEvent\"\n    ],\n    \"handleds\": [\n      \"OrderStartEvent|handled\"\n    ]\n  }\n}\n</code></pre>"},{"location":"nodlar/trex-subscriber/#alanlar","title":"Alanlar","text":"Alan A\u00e7\u0131klama <code>client</code> \u0130ste\u011fi yapan trexEdge end\u00fcstriyel PC'nin IP adresi <code>subs</code> Panele bildirilen event listesi (bu projedeki t\u00fcm Event node isimleri) <code>handleds</code> <code>ishandled=true</code> olan event'ler (sonuna <code>\\|handled</code> eklenir) <p>Ne i\u015fe yarar?</p> <p><code>debug</code> \u00e7\u0131kt\u0131s\u0131 sayesinde hangi trexEdge PC'lerin Node-RED servisine ba\u011fland\u0131\u011f\u0131n\u0131 ve her ba\u011flant\u0131da panele hangi event listesinin iletildi\u011fini anl\u0131k olarak izleyebilirsiniz. Bu bilgi \u00fcretim hatt\u0131 izleme ve ba\u011flant\u0131 sorun giderme i\u00e7in kullan\u0131l\u0131r.</p>"},{"location":"nodlar/trex-subscriber/#davrans","title":"Davran\u0131\u015f","text":"<pre><code>sequenceDiagram\n    autonumber\n    participant Panel\n    participant TrexSub as trex Subscriber\n    participant Other as Di\u011fer Event Nodlar\u0131\n\n    Note over Panel,TrexSub: Deploy an\u0131nda\n    Panel-&gt;&gt;TrexSub: GET /GetSubscribed\n    TrexSub-&gt;&gt;TrexSub: RED.nodes.eachNode()\n    TrexSub-&gt;&gt;TrexSub: 8 event tipini tara\n    TrexSub--&gt;&gt;Panel: { subs: [...], handleds: [...] }\n    Note over Panel: Panel listeyi kaydetti\n    Panel-&gt;&gt;Other: \u00c7al\u0131\u015fma zaman\u0131 olay tetikleri ba\u015flar</code></pre>"},{"location":"nodlar/trex-subscriber/#hangi-event-tipleri-listeleniyor","title":"Hangi Event Tipleri Listeleniyor?","text":"<p><code>trex Subscriber</code> a\u015fa\u011f\u0131daki node tiplerini otomatik tarar:</p> <ul> <li><code>Business Events</code></li> <li><code>System Events</code></li> <li><code>Communication Events</code></li> <li><code>Display Events</code></li> <li><code>Form Events</code></li> <li><code>Display Methods</code></li> <li><code>Method Returns</code></li> </ul>"},{"location":"nodlar/trex-subscriber/#otomatik-cevap","title":"Otomatik Cevap","text":"<p>Bu node kendi <code>Responser</code>'\u0131n\u0131 i\u00e7erir. Ak\u0131\u015f\u0131n\u0131za ayr\u0131 bir <code>Responser</code> eklemeniz gerekmez. \u00c7\u0131k\u0131\u015f mesaj\u0131 bilgi ama\u00e7l\u0131d\u0131r (debug i\u00e7in kullanabilirsiniz).</p> <pre><code>// JS taraf\u0131ndan otomatik yap\u0131l\u0131r\nnode.send({ payload: { client, subs, handleds } });\n// Ayn\u0131 zamanda HTTP cevab\u0131 panele d\u00f6ner\nres.status(200).jsonp([...subs, ...handleds]);\n</code></pre>"},{"location":"nodlar/trex-subscriber/#durum-status-gostergesi","title":"Durum (Status) G\u00f6stergesi","text":"<p>Node tetiklendi\u011finde alt\u0131nda 500 ms boyunca:</p> <pre><code>[yellow dot] Triggered\n</code></pre> <p>g\u00f6r\u00fcn\u00fcr ve kaybolur.</p>"},{"location":"nodlar/trex-subscriber/#tipik-aks","title":"Tipik Ak\u0131\u015f","text":"<p><code>trex Subscriber</code> her zaman tek ba\u015f\u0131na durur; di\u011fer node'lara ba\u011flanmaz ve onlar\u0131 tetiklemez. Tan\u0131 amac\u0131yla \u00e7\u0131k\u0131\u015f\u0131na <code>debug</code> ba\u011flanabilir.</p> <pre><code>flowchart LR\n    A[trex Subscriber] --&gt; B[debug\\nopsiyonel]\n\n    style A fill:#58d68d,color:#000\n    style B fill:#87ceeb,color:#000</code></pre> <pre><code>flowchart LR\n    C[Business Events] --&gt; D[...] --&gt; E[Responser]\n\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000</code></pre> <p>Olay ak\u0131\u015flar\u0131 Event node'lar\u0131ndan ba\u015flar; <code>trex Subscriber</code>'dan de\u011fil.</p>"},{"location":"nodlar/trex-subscriber/#sk-karslaslan-hatalar","title":"S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar","text":"<p>Triggered \u00e7\u0131km\u0131yor</p> <ul> <li>trexMes Edge'de Node-RED Connector eklentisi etkin mi?</li> <li>Panel'in Node-RED IP/port ayar\u0131 do\u011fru mu?</li> <li><code>httpNodeRoot</code> ayar\u0131 <code>false</code> m\u0131? (Olmamal\u0131; varsay\u0131lan\u0131 b\u0131rak\u0131n.)</li> </ul> <p>Subs listesi bo\u015f</p> <p>Hen\u00fcz hi\u00e7 event node'u eklemedi\u011finiz anlam\u0131na gelir. Bir <code>Business Events</code> ekleyip yeniden deploy edin.</p> <p>Birden fazla trex Subscriber uyar\u0131s\u0131</p> <p>Ayn\u0131 flow'da iki adet <code>trex Subscriber</code> varsa ikinci ekleme HTTP path \u00e7ak\u0131\u015fmas\u0131na yol a\u00e7ar. Tek bir tane b\u0131rak\u0131n.</p>"},{"location":"nodlar/trex-subscriber/#ileri-konular","title":"\u0130leri Konular","text":""},{"location":"nodlar/trex-subscriber/#custom-event-path","title":"Custom <code>event</code> Path","text":"<p>Varsay\u0131lan <code>/GetSubscribed</code> yerine farkl\u0131 bir path kullanmak isterseniz, trexMes panel taraf\u0131n\u0131n da bu path'i bilmesi gerekir. Genellikle de\u011fi\u015ftirmemeniz \u00f6nerilir.</p>"},{"location":"nodlar/trex-subscriber/#httpnodemiddleware-ve-cors","title":"<code>httpNodeMiddleware</code> ve CORS","text":"<p>Node-RED <code>settings.js</code> i\u00e7inde tan\u0131ml\u0131 <code>httpNodeMiddleware</code> ve <code>httpNodeCors</code> ayarlar\u0131 bu node taraf\u0131ndan otomatik uygulan\u0131r. \u00d6zel middleware kullan\u0131yorsan\u0131z etkilenir.</p>"},{"location":"nodlar/trex-subscriber/#ilgili-nodlar","title":"\u0130lgili Nodlar","text":"<ul> <li>Business Events \u2014 Listelenen i\u015f olaylar\u0131n\u0131 i\u015fler</li> <li>Responser \u2014 Di\u011fer event ak\u0131\u015flar\u0131n\u0131n kapat\u0131c\u0131s\u0131</li> <li>Olay Nodlar\u0131 Genel Bak\u0131\u015f</li> </ul>"},{"location":"ornekler/","title":"\u00d6rnekler","text":"<p>Bu b\u00f6l\u00fcm, <code>node-red-trexmes-service</code> paketi ile ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 nas\u0131l \u00e7\u00f6zece\u011finizi g\u00f6steren ad\u0131m ad\u0131m ak\u0131\u015f \u00f6rnekleri i\u00e7erir.</p>"},{"location":"ornekler/#mevcut-ornekler","title":"Mevcut \u00d6rnekler","text":"\ud83d\udfe2 Temel Ak\u0131\u015f <p>Bir Business Event yakalay\u0131p debug'a basan en basit kullan\u0131m.</p> \ud83e\udde9 Custom Form Ak\u0131\u015f\u0131 <p>Olay verisinden form a\u00e7, alanlar\u0131 ba\u011fla, kaydet butonuyla bitir.</p> \ud83c\udf9b\ufe0f Buton Konfig\u00fcrasyonu <p>Main Form butonlar\u0131n\u0131 yap\u0131land\u0131r, t\u0131klamay\u0131 yakala ve method \u00e7a\u011f\u0131r.</p>"},{"location":"ornekler/#her-ornegin-yaps","title":"Her \u00d6rne\u011fin Yap\u0131s\u0131","text":"<p>Her \u00f6rnek sayfas\u0131 \u015fu kal\u0131b\u0131 izler:</p> <ol> <li>Hedef \u2014 Ne yapaca\u011f\u0131z?</li> <li>\u00d6nko\u015fullar \u2014 Hangi panel/Node-RED ayarlar\u0131 gerekli?</li> <li>Ak\u0131\u015f \u015eemas\u0131 \u2014 Mermaid diyagram\u0131</li> <li>Ad\u0131m Ad\u0131m Yap\u0131land\u0131rma \u2014 Her node i\u00e7in neler girilecek</li> <li>Flow JSON \u2014 Kopyala-yap\u0131\u015ft\u0131r ile import edilebilir kod</li> <li>Beklenen \u00c7\u0131kt\u0131 \u2014 \u00c7al\u0131\u015ft\u0131\u011f\u0131nda ne g\u00f6receksiniz?</li> <li>Yayg\u0131n Sorunlar \u2014 Kar\u015f\u0131la\u015fabilece\u011finiz hatalar</li> </ol>"},{"location":"ornekler/#akslar-import-etmek","title":"Ak\u0131\u015flar\u0131 Import Etmek","text":"<p>\u00d6rnek sayfalar\u0131nda verilen Flow JSON kodunu Node-RED'e \u015fu \u015fekilde aktar\u0131n:</p> <ol> <li>Node-RED aray\u00fcz\u00fcnde sa\u011f \u00fcstteki men\u00fcden Import se\u00e7in.</li> <li>Clipboard sekmesine ge\u00e7in.</li> <li>JSON kodunu yap\u0131\u015ft\u0131r\u0131n.</li> <li>New flow veya Current flow se\u00e7ene\u011fini belirleyin.</li> <li>Import butonuna t\u0131klay\u0131n.</li> <li>Sa\u011f \u00fcstteki k\u0131rm\u0131z\u0131 Deploy butonu ile aktif edin.</li> </ol> <p>\u0130\u00e7erikleri kendi projenize uyarlay\u0131n</p> <p>\u00d6rneklerdeki event isimleri, form adlar\u0131 ve method isimleri kendi trexMes ortam\u0131n\u0131zla e\u015fle\u015fmelidir. Birebir kopyalamak yerine kendi event/form/method isimlerinize g\u00f6re de\u011fi\u015ftirin.</p>"},{"location":"ornekler/#sralama","title":"S\u0131ralama","text":"<p>Hen\u00fcz ba\u015flamad\u0131ysan\u0131z a\u015fa\u011f\u0131daki s\u0131ra \u00f6nerilir:</p> <ol> <li>Temel Ak\u0131\u015f \u2014 \u00c7al\u0131\u015fan ba\u011flant\u0131y\u0131 do\u011frulay\u0131n.</li> <li>Custom Form Ak\u0131\u015f\u0131 \u2014 G\u00f6rsel aray\u00fcz \u00fcretimini \u00f6\u011frenin.</li> <li>Buton Konfig\u00fcrasyonu \u2014 Etkile\u015fim ekleyin.</li> </ol>"},{"location":"ornekler/buton-konfigurasyonu/","title":"\u00d6rnek: Buton Konfig\u00fcrasyonu","text":"<p>Bu \u00f6rnekte trexMes Main Form \u00fczerindeki standart butonlar\u0131 yap\u0131land\u0131racak, t\u0131klamalar\u0131n\u0131 yakalay\u0131p Method Invoker ile panel method'unu \u00e7a\u011f\u0131raca\u011f\u0131z.</p>"},{"location":"ornekler/buton-konfigurasyonu/#hedef","title":"Hedef","text":"<ol> <li>Sistem a\u00e7\u0131ld\u0131\u011f\u0131nda Main Form'da 3 buton g\u00f6r\u00fcn\u00fcr olsun: \"Yeni\", \"Kaydet\", \"\u0130ptal\".</li> <li>Operat\u00f6r \"Kaydet\" butonuna bast\u0131\u011f\u0131nda <code>Form Events</code> ile yakalayal\u0131m.</li> <li>Form verisini panel'in <code>OrderService.SaveOrder</code> method'una ge\u00e7elim.</li> <li>Cevap geldi\u011finde onay ekran\u0131 g\u00f6sterelim.</li> </ol>"},{"location":"ornekler/buton-konfigurasyonu/#onkosullar","title":"\u00d6nko\u015fullar","text":"<ul> <li>\u00c7al\u0131\u015fan trexMes Edge ba\u011flant\u0131s\u0131</li> <li>Panel taraf\u0131nda <code>OrderService.SaveOrder</code> method'u tan\u0131ml\u0131</li> <li>Main Form \u00fczerinde 1-10 aras\u0131 buton indeksleri kullan\u0131labilir</li> </ul>"},{"location":"ornekler/buton-konfigurasyonu/#buton-indeksleri","title":"Buton \u0130ndeksleri","text":"<p>A\u015fa\u011f\u0131daki g\u00f6rselde Main Form'daki butonlar\u0131n indeks numaralar\u0131 g\u00f6r\u00fcnmektedir:</p> <p></p>"},{"location":"ornekler/buton-konfigurasyonu/#aks-semas","title":"Ak\u0131\u015f \u015eemas\u0131","text":"<pre><code>flowchart TB\n    subgraph init[\"AKI\u015e 1: Sistem Ba\u015flatma\"]\n        A[System Events&lt;br/&gt;UserLoginEvent] --&gt; B[Button Configurator&lt;br/&gt;1=Yeni, 2=Kaydet, 5=\u0130ptal]\n        B --&gt; C[Responser]\n    end\n\n    subgraph click[\"AKI\u015e 2: T\u0131klama Yakalama\"]\n        D[Form Events&lt;br/&gt;btnSave click] --&gt; E[Method Invoker&lt;br/&gt;OrderService.SaveOrder]\n        E --&gt; F[Responser]\n    end\n\n    subgraph ret[\"AKI\u015e 3: Method Cevab\u0131\"]\n        G[Method Returns&lt;br/&gt;SaveOrder] --&gt; H[switch&lt;br/&gt;success?]\n        H --&gt;|true| I[Custom Form&lt;br/&gt;Onay]\n        H --&gt;|false| J[Custom Form&lt;br/&gt;Hata]\n        I --&gt; K[Responser]\n        J --&gt; K\n    end\n\n    style A fill:#ccffcc,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000\n    style F fill:#ccffcc,color:#000\n    style G fill:#ccffcc,color:#000\n    style I fill:#ccffcc,color:#000\n    style J fill:#ccffcc,color:#000\n    style K fill:#ccffcc,color:#000</code></pre>"},{"location":"ornekler/buton-konfigurasyonu/#adm-adm-yaplandrma","title":"Ad\u0131m Ad\u0131m Yap\u0131land\u0131rma","text":""},{"location":"ornekler/buton-konfigurasyonu/#aks-1-sistem-baslatma","title":"Ak\u0131\u015f 1: Sistem Ba\u015flatma","text":""},{"location":"ornekler/buton-konfigurasyonu/#11-system-events","title":"1.1. <code>System Events</code>","text":"Alan De\u011fer Name <code>UserLogin</code> Event <code>/UserLoginEvent</code> Is Handled <code>false</code>"},{"location":"ornekler/buton-konfigurasyonu/#12-button-configurator","title":"1.2. <code>Button Configurator</code>","text":"Alan De\u011fer Name <code>MainFormButtons</code> Form In Main Form <code>true</code> Form Name (otomatik AppForm) <p><code>props</code> listesi:</p> <code>p</code> (Index) <code>v</code> (Caption) <code>d</code> (Visible) <code>e</code> (Override) <code>f</code> (Name) <code>1</code> <code>\"Yeni Sipari\u015f\"</code> <code>true</code> <code>false</code> <code>btnNewOrder</code> <code>2</code> <code>\"Kaydet\"</code> <code>true</code> <code>true</code> <code>btnSave</code> <code>5</code> <code>\"\u0130ptal\"</code> <code>true</code> <code>false</code> <code>btnCancel</code> <p>Info</p> <p><code>e=true</code> (override) demek: \"Bu butonun panel-default davran\u0131\u015f\u0131 yerine bizim ak\u0131\u015f\u0131m\u0131z \u00e7al\u0131\u015fs\u0131n.\" Sadece Kaydet butonunu \u00f6zelle\u015ftirdi\u011fimiz i\u00e7in sadece onu override ediyoruz.</p>"},{"location":"ornekler/buton-konfigurasyonu/#13-responser","title":"1.3. <code>Responser</code>","text":"<p>T\u00fcm varsay\u0131lan de\u011ferlerle.</p>"},{"location":"ornekler/buton-konfigurasyonu/#aks-2-tklama-yakalama","title":"Ak\u0131\u015f 2: T\u0131klama Yakalama","text":""},{"location":"ornekler/buton-konfigurasyonu/#21-form-events","title":"2.1. <code>Form Events</code>","text":"Alan De\u011fer Name <code>SaveClick</code> Event <code>/AppForm_btnSave_Click</code> Form Name <code>AppForm</code>"},{"location":"ornekler/buton-konfigurasyonu/#22-method-invoker","title":"2.2. <code>Method Invoker</code>","text":"Alan De\u011fer Name <code>SaveOrder</code> Service <code>OrderService</code> Method <code>SaveOrder</code> <p><code>props</code> listesi:</p> <code>p</code> (Param) <code>d</code> (Data) <code>dt</code> (Type) <code>orderNo</code> <code>payload.formData.orderNo</code> <code>msg</code> <code>customer</code> <code>payload.formData.customer</code> <code>msg</code> <code>qty</code> <code>payload.formData.qty</code> <code>msg</code> <code>operatorId</code> <code>currentUser.id</code> <code>flow</code>"},{"location":"ornekler/buton-konfigurasyonu/#23-responser","title":"2.3. <code>Responser</code>","text":"<p>T\u00fcm varsay\u0131lan de\u011ferlerle.</p>"},{"location":"ornekler/buton-konfigurasyonu/#aks-3-method-cevab","title":"Ak\u0131\u015f 3: Method Cevab\u0131","text":""},{"location":"ornekler/buton-konfigurasyonu/#31-method-returns","title":"3.1. <code>Method Returns</code>","text":"Alan De\u011fer Name <code>SaveOrderReturn</code> Method Name <code>SaveOrder</code>"},{"location":"ornekler/buton-konfigurasyonu/#32-switch-node-standart-node-red","title":"3.2. <code>switch</code> Node (Standart Node-RED)","text":"<p><code>payload.returnValue.success</code> de\u011ferine bakarak iki dala ayr\u0131l\u0131r:</p> <ul> <li>Dal 1: <code>== true</code> \u2192 Onay formu</li> <li>Dal 2: <code>!= true</code> \u2192 Hata formu</li> </ul>"},{"location":"ornekler/buton-konfigurasyonu/#33-onay-custom-form","title":"3.3. Onay <code>Custom Form</code>","text":"<p>Basit bir bilgi formu: \"Sipari\u015f #X ba\u015far\u0131yla kaydedildi.\"</p>"},{"location":"ornekler/buton-konfigurasyonu/#34-hata-custom-form","title":"3.4. Hata <code>Custom Form</code>","text":"<p>Basit bir uyar\u0131 formu: \"Kay\u0131t s\u0131ras\u0131nda hata olu\u015ftu.\"</p>"},{"location":"ornekler/buton-konfigurasyonu/#35-responser","title":"3.5. <code>Responser</code>","text":"<p>\u0130ki dal\u0131 tek bir <code>Responser</code>'a ba\u011flay\u0131n.</p>"},{"location":"ornekler/buton-konfigurasyonu/#method-invoker-cks","title":"Method Invoker \u00c7\u0131k\u0131\u015f\u0131","text":"<pre><code>{\n  \"operationtype\": \"MethodInvokerProcess\",\n  \"receiveddata\": { /* form click data */ },\n  \"name\": \"SaveOrder\",\n  \"message\": \"OrderService.SaveOrder\",\n  \"value\": [\n    { \"ParameterName\": \"orderNo\",    \"Value\": \"ORD-001\" },\n    { \"ParameterName\": \"customer\",   \"Value\": \"ACME\" },\n    { \"ParameterName\": \"qty\",        \"Value\": 50 },\n    { \"ParameterName\": \"operatorId\", \"Value\": \"OP-007\" }\n  ]\n}\n</code></pre>"},{"location":"ornekler/buton-konfigurasyonu/#method-returns-girisi","title":"Method Returns Giri\u015fi","text":"<p>Panel method'u ba\u015far\u0131l\u0131 tamamlad\u0131\u011f\u0131nda:</p> <pre><code>{\n  \"payload\": {\n    \"methodName\": \"SaveOrder\",\n    \"returnValue\": {\n      \"success\": true,\n      \"orderId\": 4521,\n      \"createdAt\": \"2026-05-11T14:30:00Z\"\n    },\n    \"executionTime\": 245\n  }\n}\n</code></pre> <p>Hata durumunda:</p> <pre><code>{\n  \"payload\": {\n    \"methodName\": \"SaveOrder\",\n    \"returnValue\": {\n      \"success\": false,\n      \"errorCode\": \"DB_TIMEOUT\",\n      \"errorMessage\": \"Veritaban\u0131 zaman a\u015f\u0131m\u0131\"\n    }\n  }\n}\n</code></pre>"},{"location":"ornekler/buton-konfigurasyonu/#beklenen-davrans","title":"Beklenen Davran\u0131\u015f","text":""},{"location":"ornekler/buton-konfigurasyonu/#operator-giris-an","title":"Operat\u00f6r Giri\u015f An\u0131","text":"<ol> <li><code>UserLoginEvent</code> tetiklenir.</li> <li>Main Form'da 1, 2 ve 5 numaral\u0131 butonlar g\u00f6r\u00fcn\u00fcr hale gelir:<ul> <li>Buton 1: \"Yeni Sipari\u015f\" (panel default davran\u0131\u015f\u0131)</li> <li>Buton 2: \"Kaydet\" (bizim ak\u0131\u015f\u0131m\u0131z tetiklenecek)</li> <li>Buton 5: \"\u0130ptal\" (panel default davran\u0131\u015f\u0131)</li> </ul> </li> <li>Di\u011fer butonlar gizli kal\u0131r.</li> </ol>"},{"location":"ornekler/buton-konfigurasyonu/#operator-kaydete-bastgnda","title":"Operat\u00f6r Kaydet'e Bast\u0131\u011f\u0131nda","text":"<ol> <li><code>Form Events</code> tetiklenir, form verileri <code>msg.payload.formData</code>'da gelir.</li> <li><code>Method Invoker</code> parametreleri toplar, <code>OrderService.SaveOrder</code> \u00e7a\u011fr\u0131l\u0131r.</li> <li>\u0130lk ak\u0131\u015f kapan\u0131r (<code>Responser</code>).</li> <li>Panel veritaban\u0131 i\u015flemini yapar (~300 ms).</li> <li>Cevap gelir \u2192 <code>Method Returns</code> tetiklenir.</li> <li><code>switch</code> ba\u015far\u0131 durumuna g\u00f6re dallara ay\u0131r\u0131r.</li> <li>Uygun form (<code>Onay</code> veya <code>Hata</code>) panelde g\u00f6sterilir.</li> </ol>"},{"location":"ornekler/buton-konfigurasyonu/#yaygn-sorunlar","title":"Yayg\u0131n Sorunlar","text":"<p>Butonlar g\u00f6r\u00fcnmedi</p> <ul> <li><code>formainform: true</code> oldu\u011fundan emin olun.</li> <li>Buton indeksleri 1-10 aral\u0131\u011f\u0131nda m\u0131?</li> <li>Ak\u0131\u015fta <code>Responser</code> var m\u0131?</li> </ul> <p>Kaydet butonu h\u00e2l\u00e2 panel default'unu \u00e7al\u0131\u015ft\u0131r\u0131yor</p> <p><code>Button Configurator</code>'da o butonun <code>e</code> (IsToOverrideDefaultHandler) true olmal\u0131.</p> <p>Form Events tetiklenmiyor</p> <ul> <li>Buton <code>ComponentName</code> (<code>f</code> alan\u0131) <code>Form Events</code> event ismiyle uyumlu mu?</li> <li>Event isminde <code>/AppForm_btnSave_Click</code> gibi formname prefix var m\u0131?</li> </ul> <p>Method cevab\u0131 gelmiyor</p> <ul> <li><code>Method Returns</code>'teki <code>methodname</code>, <code>Method Invoker</code>'daki <code>method</code> ile ayn\u0131 m\u0131?</li> <li>Panel taraf\u0131nda method ger\u00e7ekten cevap d\u00f6n\u00fcyor mu? (panel log'una bak\u0131n)</li> </ul>"},{"location":"ornekler/buton-konfigurasyonu/#ileri-konular","title":"\u0130leri Konular","text":""},{"location":"ornekler/buton-konfigurasyonu/#coklu-method-cevab-dinleme","title":"\u00c7oklu Method Cevab\u0131 Dinleme","text":"<p>Birden fazla <code>Method Returns</code> node'u kullanabilirsiniz; her biri farkl\u0131 method ismi dinler. Bu sayede ayn\u0131 flow'da paralel olarak SaveOrder, DeleteOrder, UpdateStock cevaplar\u0131n\u0131 dinleyebilirsiniz.</p>"},{"location":"ornekler/buton-konfigurasyonu/#hata-recover","title":"Hata Recover","text":"<p><code>Method Returns</code> mesaj\u0131nda <code>success: false</code> geldi\u011finde <code>Method Invoker</code>'\u0131 tekrar tetikleyerek retry mant\u0131\u011f\u0131 kurabilirsiniz. Bu durumda retry say\u0131s\u0131n\u0131 <code>flow</code> context'te tutmaya dikkat edin.</p>"},{"location":"ornekler/buton-konfigurasyonu/#tamamland","title":"Tamamland\u0131!","text":"<p>\u00dc\u00e7 temel \u00f6rne\u011fi tamamlad\u0131n\u0131z. Art\u0131k trexMes paneliniz ile karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131 kurabilirsiniz.</p> <p>Sonraki ad\u0131mlar i\u00e7in Node Referans\u0131 b\u00f6l\u00fcm\u00fcndeki t\u00fcm node'lar\u0131 inceleyin ve SSS sayfas\u0131ndaki sorun gidermeyle tan\u0131\u015f\u0131n.</p>"},{"location":"ornekler/custom-form-akisi/","title":"\u00d6rnek: Custom Form Ak\u0131\u015f\u0131","text":"<p>Bu \u00f6rnekte panel'den gelen sipari\u015f verisini bir Custom Form \u00fczerinde g\u00f6sterecek, alanlar\u0131na ba\u011flayacak ve kontrol \u00f6zelliklerini ayarlayaca\u011f\u0131z.</p>"},{"location":"ornekler/custom-form-akisi/#hedef","title":"Hedef","text":"<p><code>OrderStartEvent</code> tetiklendi\u011finde:</p> <ol> <li>Panel ekran\u0131nda <code>OrderEntryForm</code> adl\u0131 bir form a\u00e7\u0131ls\u0131n.</li> <li>Gelen sipari\u015f bilgisi form alanlar\u0131na otomatik ba\u011flans\u0131n.</li> <li>Buton g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc duruma g\u00f6re ayarlans\u0131n.</li> <li>Ak\u0131\u015f sonunda panele cevap d\u00f6ns\u00fcn.</li> </ol>"},{"location":"ornekler/custom-form-akisi/#onkosullar","title":"\u00d6nko\u015fullar","text":"<ul> <li>Temel Ak\u0131\u015f \u00f6rne\u011finin \u00e7al\u0131\u015f\u0131yor olmas\u0131</li> <li>Form i\u00e7in XML tasar\u0131m haz\u0131r (a\u015fa\u011f\u0131da \u00f6rnek var)</li> <li><code>customFormDesigner.exe</code> (opsiyonel, Designer kullan\u0131lacaksa)</li> </ul>"},{"location":"ornekler/custom-form-akisi/#aks-semas","title":"Ak\u0131\u015f \u015eemas\u0131","text":"<pre><code>flowchart LR\n    subgraph Kayit[\"Kay\u0131t (ba\u011f\u0131ms\u0131z)\"]\n        A[trex Subscriber]\n    end\n\n    subgraph Akis[\"Olay Ak\u0131\u015f\u0131\"]\n        B[Business Events&lt;br/&gt;OrderStartEvent] --&gt; C[Custom Form&lt;br/&gt;OrderEntryForm]\n        C --&gt; D[Form Bind Controls&lt;br/&gt;txt* \u2192 orderNo,...]\n        D --&gt; E[Control Properties&lt;br/&gt;btnSave.Enabled=true]\n        E --&gt; F[Responser]\n    end\n\n    style A fill:#58d68d,color:#000\n    style B fill:#ccffcc,color:#000\n    style C fill:#ccffcc,color:#000\n    style D fill:#ccffcc,color:#000\n    style E fill:#ccffcc,color:#000\n    style F fill:#ccffcc,color:#000</code></pre>"},{"location":"ornekler/custom-form-akisi/#form-xml-tasarm","title":"Form XML Tasar\u0131m\u0131","text":"<p><code>Custom Form</code> node'unun <code>customformxml</code> alan\u0131na yap\u0131\u015ft\u0131raca\u011f\u0131m\u0131z XML, <code>trexForm.Designer</code> taraf\u0131ndan \u00fcretilen WinForms format\u0131ndad\u0131r:</p> <pre><code>&lt;Object name=\"CustomForm\" type=\"trexForm.Designer.CustomForm, trexForm.Designer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\" version=\"1\"&gt;\n    &lt;AutoValidate&gt;EnablePreventFocusChange&lt;/AutoValidate&gt;\n    &lt;BackColor&gt;Control&lt;/BackColor&gt;\n    &lt;ClientSize&gt;600, 400&lt;/ClientSize&gt;\n    &lt;Font&gt;Microsoft Sans Serif, 8.25pt&lt;/Font&gt;\n    &lt;Name&gt;CustomForm&lt;/Name&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"lblOrderNo\"&gt;\n        &lt;Text&gt;Sipari\u015f No:&lt;/Text&gt;\n        &lt;Location&gt;20, 20&lt;/Location&gt;\n        &lt;Size&gt;100, 20&lt;/Size&gt;\n        &lt;TabIndex&gt;0&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n    &lt;Object type=\"System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"txtOrderNo\"&gt;\n        &lt;Location&gt;140, 20&lt;/Location&gt;\n        &lt;Size&gt;200, 20&lt;/Size&gt;\n        &lt;TabIndex&gt;1&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"lblCustomer\"&gt;\n        &lt;Text&gt;M\u00fc\u015fteri:&lt;/Text&gt;\n        &lt;Location&gt;20, 60&lt;/Location&gt;\n        &lt;Size&gt;100, 20&lt;/Size&gt;\n        &lt;TabIndex&gt;2&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n    &lt;Object type=\"System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"txtCustomer\"&gt;\n        &lt;Location&gt;140, 60&lt;/Location&gt;\n        &lt;Size&gt;200, 20&lt;/Size&gt;\n        &lt;TabIndex&gt;3&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"lblQty\"&gt;\n        &lt;Text&gt;Miktar:&lt;/Text&gt;\n        &lt;Location&gt;20, 100&lt;/Location&gt;\n        &lt;Size&gt;100, 20&lt;/Size&gt;\n        &lt;TabIndex&gt;4&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n    &lt;Object type=\"System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"txtQty\"&gt;\n        &lt;Minimum&gt;1&lt;/Minimum&gt;\n        &lt;Maximum&gt;9999&lt;/Maximum&gt;\n        &lt;Location&gt;140, 100&lt;/Location&gt;\n        &lt;Size&gt;100, 20&lt;/Size&gt;\n        &lt;TabIndex&gt;5&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"lblWarning\"&gt;\n        &lt;Text&gt;&lt;/Text&gt;\n        &lt;ForeColor&gt;Red&lt;/ForeColor&gt;\n        &lt;Location&gt;20, 140&lt;/Location&gt;\n        &lt;Size&gt;320, 20&lt;/Size&gt;\n        &lt;TabIndex&gt;6&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n\n    &lt;Object type=\"System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"btnSave\"&gt;\n        &lt;Text&gt;Kaydet&lt;/Text&gt;\n        &lt;Location&gt;20, 200&lt;/Location&gt;\n        &lt;Size&gt;120, 40&lt;/Size&gt;\n        &lt;TabIndex&gt;7&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n    &lt;Object type=\"System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" name=\"btnCancel\"&gt;\n        &lt;Text&gt;\u0130ptal&lt;/Text&gt;\n        &lt;Location&gt;160, 200&lt;/Location&gt;\n        &lt;Size&gt;120, 40&lt;/Size&gt;\n        &lt;TabIndex&gt;8&lt;/TabIndex&gt;\n    &lt;/Object&gt;\n&lt;/Object&gt;\n</code></pre> <p>XML'i elle yazmay\u0131n</p> <p>Yukar\u0131daki XML <code>trexForm.Designer</code> arac\u0131 ile g\u00f6rsel olarak tasarlan\u0131p d\u0131\u015fa aktar\u0131labilir. Kontrol adlar\u0131 (<code>txtOrderNo</code>, <code>btnSave</code> vb.) <code>Form Bind Controls</code> ve <code>Control Properties</code> nodlar\u0131nda kullan\u0131laca\u011f\u0131ndan b\u00fcy\u00fck/k\u00fc\u00e7\u00fck harfe dikkat edin.</p>"},{"location":"ornekler/custom-form-akisi/#adm-adm-yaplandrma","title":"Ad\u0131m Ad\u0131m Yap\u0131land\u0131rma","text":""},{"location":"ornekler/custom-form-akisi/#1-trex-subscriber-bagmsz","title":"1. <code>trex Subscriber</code> (Ba\u011f\u0131ms\u0131z)","text":"<p>Temel Ak\u0131\u015f \u00f6rne\u011findeki gibi varsay\u0131lan ayarlarla ekleyin.</p>"},{"location":"ornekler/custom-form-akisi/#2-business-events","title":"2. <code>Business Events</code>","text":"Alan De\u011fer Name <code>OrderStart</code> Method <code>get</code> Event <code>/OrderStartEvent</code> Is Handled <code>false</code>"},{"location":"ornekler/custom-form-akisi/#3-custom-form","title":"3. <code>Custom Form</code>","text":"Alan De\u011fer Name <code>OrderForm</code> Form Name <code>OrderEntryForm</code> Custom Form XML (yukar\u0131daki XML) Is Styled <code>true</code> Form In Main Form <code>false</code> (modal dialog) Design Form Name (bo\u015f)"},{"location":"ornekler/custom-form-akisi/#4-form-bind-controls","title":"4. <code>Form Bind Controls</code>","text":"Alan De\u011fer Name <code>BindOrder</code> Form Name <code>OrderEntryForm</code> Form In Main Form <code>false</code> Data Type <code>msg</code> Data <code>payload</code> Props (a\u015fa\u011f\u0131daki tablo) <p><code>props</code> listesi:</p> <code>p</code> (Property) <code>v</code> (Value Field) <code>txtOrderNo</code> <code>orderNo</code> <code>txtCustomer</code> <code>customer</code> <code>txtQty</code> <code>qty</code>"},{"location":"ornekler/custom-form-akisi/#5-control-properties","title":"5. <code>Control Properties</code>","text":"Alan De\u011fer Name <code>SetProperties</code> Form Name <code>OrderEntryForm</code> Form In Main Form <code>false</code> Props (a\u015fa\u011f\u0131daki tablo) <p><code>props</code> listesi:</p> <code>p</code> (Control) <code>v</code> (Property) <code>d</code> (Value) <code>dt</code> (Type) <code>btnSave</code> <code>Enabled</code> <code>true</code> <code>bool</code> <code>lblWarning</code> <code>Visible</code> <code>false</code> <code>bool</code>"},{"location":"ornekler/custom-form-akisi/#6-responser","title":"6. <code>Responser</code>","text":"<p>T\u00fcm varsay\u0131lan de\u011ferlerle ekleyin.</p>"},{"location":"ornekler/custom-form-akisi/#flow-json","title":"Flow JSON","text":"<pre><code>[\n  {\n    \"id\": \"f2\",\n    \"type\": \"tab\",\n    \"label\": \"CustomFormOrnegi\"\n  },\n  {\n    \"id\": \"sub1\",\n    \"type\": \"trex Subscriber\",\n    \"z\": \"f2\",\n    \"name\": \"\",\n    \"method\": \"get\",\n    \"event\": \"/GetSubscribed\",\n    \"x\": 200,\n    \"y\": 80,\n    \"wires\": [[]]\n  },\n  {\n    \"id\": \"ev1\",\n    \"type\": \"Business Events\",\n    \"z\": \"f2\",\n    \"name\": \"OrderStart\",\n    \"event\": \"/OrderStartEvent\",\n    \"ishandled\": false,\n    \"x\": 180,\n    \"y\": 180,\n    \"wires\": [[\"form1\"]]\n  },\n  {\n    \"id\": \"form1\",\n    \"type\": \"Custom Form\",\n    \"z\": \"f2\",\n    \"name\": \"OrderForm\",\n    \"formname\": \"OrderEntryForm\",\n    \"customformxml\": \"&lt;form name='OrderEntryForm'&gt;...&lt;/form&gt;\",\n    \"isstyled\": true,\n    \"formainform\": false,\n    \"designformname\": \"\",\n    \"x\": 360,\n    \"y\": 180,\n    \"wires\": [[\"bind1\"]]\n  },\n  {\n    \"id\": \"bind1\",\n    \"type\": \"Form Bind Controls\",\n    \"z\": \"f2\",\n    \"name\": \"BindOrder\",\n    \"formname\": \"OrderEntryForm\",\n    \"formainform\": false,\n    \"props\": [\n      { \"p\": \"txtOrderNo\",  \"v\": \"orderNo\" },\n      { \"p\": \"txtCustomer\", \"v\": \"customer\" },\n      { \"p\": \"txtQty\",      \"v\": \"qty\" }\n    ],\n    \"data\": \"payload\",\n    \"dataType\": \"msg\",\n    \"x\": 560,\n    \"y\": 180,\n    \"wires\": [[\"props1\"]]\n  },\n  {\n    \"id\": \"props1\",\n    \"type\": \"Control Properties\",\n    \"z\": \"f2\",\n    \"name\": \"SetProperties\",\n    \"formname\": \"OrderEntryForm\",\n    \"formainform\": false,\n    \"props\": [\n      { \"p\": \"btnSave\",    \"v\": \"Enabled\", \"d\": \"true\",  \"dt\": \"bool\" },\n      { \"p\": \"lblWarning\", \"v\": \"Visible\", \"d\": \"false\", \"dt\": \"bool\" }\n    ],\n    \"x\": 760,\n    \"y\": 180,\n    \"wires\": [[\"resp1\"]]\n  },\n  {\n    \"id\": \"resp1\",\n    \"type\": \"Responser\",\n    \"z\": \"f2\",\n    \"name\": \"\",\n    \"statusCode\": \"\",\n    \"headers\": {},\n    \"x\": 950,\n    \"y\": 180,\n    \"wires\": []\n  }\n]\n</code></pre>"},{"location":"ornekler/custom-form-akisi/#beklenen-davrans","title":"Beklenen Davran\u0131\u015f","text":"<p>Panel'de <code>OrderStartEvent</code> tetiklendi\u011finde:</p> <ol> <li><code>OrderEntryForm</code> adl\u0131 modal pencere panel \u00fczerinde a\u00e7\u0131l\u0131r.</li> <li>Form i\u00e7indeki textbox'lar gelen sipari\u015f verisiyle doldurulur:<ul> <li><code>txtOrderNo</code>: <code>ORD-2026-0042</code></li> <li><code>txtCustomer</code>: <code>ACME Ltd.</code></li> <li><code>txtQty</code>: <code>50</code></li> </ul> </li> <li><code>btnSave</code> butonu aktiftir, <code>lblWarning</code> etiketi gizlidir.</li> <li>Operat\u00f6r formu g\u00f6r\u00fcr ve onaylayabilir.</li> </ol>"},{"location":"ornekler/custom-form-akisi/#msgpayload-incelemesi","title":"msg.payload \u0130ncelemesi","text":"<p><code>Responser</code>'a ula\u015ft\u0131\u011f\u0131nda <code>msg.payload</code> array'i \u015funa benzer:</p> <pre><code>[\n  {\n    \"operationtype\": \"CustomDialog\",\n    \"receiveddata\": { \"orderNo\": \"ORD-001\", \"customer\": \"ACME\", \"qty\": 50 },\n    \"name\": \"OrderEntryForm\",\n    \"continueevent\": \"Continue\",\n    \"customformxml\": \"&lt;form ...&gt;...&lt;/form&gt;\",\n    \"isstyled\": true\n  },\n  {\n    \"operationtype\": \"BindControl\",\n    \"receiveddata\": { ... },\n    \"name\": \"OrderEntryForm\",\n    \"bindcontrols\": [\n      { \"Name\": \"txtOrderNo\",  \"FieldName\": \"orderNo\" },\n      { \"Name\": \"txtCustomer\", \"FieldName\": \"customer\" },\n      { \"Name\": \"txtQty\",      \"FieldName\": \"qty\" }\n    ],\n    \"value\": { \"orderNo\": \"ORD-001\", \"customer\": \"ACME\", \"qty\": 50 }\n  },\n  {\n    \"operationtype\": \"ControlProperties\",\n    \"receiveddata\": { ... },\n    \"name\": \"OrderEntryForm\",\n    \"value\": [\n      { \"ControlName\": \"btnSave\",    \"PropertyName\": \"Enabled\", \"Value\": true  },\n      { \"ControlName\": \"lblWarning\", \"PropertyName\": \"Visible\", \"Value\": false }\n    ]\n  }\n]\n</code></pre> <p><code>Responser</code> bu array'i tek HTTP cevab\u0131nda panele g\u00f6nderir, panel s\u0131rayla her operasyonu uygular.</p>"},{"location":"ornekler/custom-form-akisi/#yaygn-sorunlar","title":"Yayg\u0131n Sorunlar","text":"<p>Form a\u00e7\u0131l\u0131yor ama alanlar bo\u015f</p> <ul> <li><code>Form Bind Controls</code>'taki <code>data</code> ve <code>dataType</code> do\u011fru mu?</li> <li><code>props</code> listesindeki <code>p</code> de\u011ferleri XML'deki kontrol isimleriyle birebir mi e\u015fle\u015fiyor? (b\u00fcy\u00fck/k\u00fc\u00e7\u00fck harf!)</li> </ul> <p>Form hi\u00e7 a\u00e7\u0131lm\u0131yor</p> <ul> <li><code>customformxml</code> ge\u00e7erli XML m\u0131? (A\u00e7\u0131kta kalm\u0131\u015f tag, eksik attribute)</li> <li><code>formname</code> do\u011fru?</li> </ul> <p>btnSave hala disabled</p> <p><code>Control Properties</code>'te <code>dt</code> \"bool\", <code>d</code> ise d\u00fcz <code>\"true\"</code> string olmal\u0131.</p>"},{"location":"ornekler/custom-form-akisi/#sonraki-adm","title":"Sonraki Ad\u0131m","text":"<p>Buton Konfig\u00fcrasyonu \u00f6rne\u011finde butonlar\u0131 yap\u0131land\u0131r\u0131p t\u0131klamalar\u0131 yakalayaca\u011f\u0131z.</p>"},{"location":"ornekler/temel-akis/","title":"\u00d6rnek: Temel Ak\u0131\u015f","text":"<p>Bu \u00f6rnekte trexMes paneliniz ile Node-RED aras\u0131ndaki ba\u011flant\u0131y\u0131 do\u011frulayan minimum \u00e7al\u0131\u015fan ak\u0131\u015f\u0131 kuraca\u011f\u0131z.</p>"},{"location":"ornekler/temel-akis/#hedef","title":"Hedef","text":"<p>Panel taraf\u0131nda <code>OrderStartEvent</code> ad\u0131nda bir Business Event tetiklendi\u011finde, gelen veriyi Node-RED debug panelinde g\u00f6r\u00fcnt\u00fclemek.</p>"},{"location":"ornekler/temel-akis/#onkosullar","title":"\u00d6nko\u015fullar","text":"<ul> <li><code>node-red-trexmes-service</code> paketi kurulu</li> <li>trexMes Edge'de Node-RED Connector eklentisi etkin</li> <li>Panelden Node-RED'e ba\u011flant\u0131 kuruluyor</li> </ul>"},{"location":"ornekler/temel-akis/#aks-semas","title":"Ak\u0131\u015f \u015eemas\u0131","text":"<p><code>trex Subscriber</code> ba\u011f\u0131ms\u0131z bir kay\u0131t node'udur; olay ak\u0131\u015f\u0131yla ba\u011flant\u0131s\u0131 yoktur.</p> <pre><code>flowchart LR\n    subgraph Kayit[\"Kay\u0131t (ba\u011f\u0131ms\u0131z)\"]\n        A[trex Subscriber]\n    end\n\n    subgraph Akis[\"Olay Ak\u0131\u015f\u0131\"]\n        B[Business Events&lt;br/&gt;OrderStartEvent] --&gt; D[debug&lt;br/&gt;complete msg]\n    end\n\n    style A fill:#58d68d,color:#000\n    style B fill:#ccffcc,color:#000\n    style D fill:#87ceeb,color:#000</code></pre>"},{"location":"ornekler/temel-akis/#adm-adm-yaplandrma","title":"Ad\u0131m Ad\u0131m Yap\u0131land\u0131rma","text":""},{"location":"ornekler/temel-akis/#1-trex-subscriber-ekleyin","title":"1. <code>trex Subscriber</code> Ekleyin","text":"<p>Paletten <code>trex Subscriber</code> node'unu canvas'a s\u00fcr\u00fckleyin. Yap\u0131land\u0131rma gerektirmez; t\u00fcm de\u011ferleri varsay\u0131lan b\u0131rak\u0131n.</p> Alan De\u011fer Name (bo\u015f) Method <code>get</code> Event <code>/GetSubscribed</code>"},{"location":"ornekler/temel-akis/#2-business-events-ekleyin","title":"2. <code>Business Events</code> Ekleyin","text":"<p>Paletten <code>Business Events</code> node'unu canvas'a s\u00fcr\u00fckleyin ve yap\u0131land\u0131r\u0131n:</p> Alan De\u011fer Name <code>OrderStart</code> (opsiyonel etiket) Method <code>get</code> Event <code>/OrderStartEvent</code> Is Handled <code>false</code> Suffix (bo\u015f)"},{"location":"ornekler/temel-akis/#3-debug-nodeu-ekleyin","title":"3. <code>debug</code> Node'u Ekleyin","text":"<p>Standart Node-RED <code>debug</code> node'unu canvas'a s\u00fcr\u00fckleyin:</p> Alan De\u011fer Output <code>complete msg object</code> To <code>debug window</code>"},{"location":"ornekler/temel-akis/#4-baglantlar-kurun","title":"4. Ba\u011flant\u0131lar\u0131 Kurun","text":"<p><code>Business Events</code> \u00e7\u0131k\u0131\u015f\u0131n\u0131 <code>debug</code> giri\u015fine ba\u011flay\u0131n.</p> <p><code>trex Subscriber</code> olay ak\u0131\u015f\u0131na ba\u011flanmaz; canvas'ta ba\u011f\u0131ms\u0131z durur. \u0130sterseniz \u00e7\u0131k\u0131\u015f\u0131na <code>debug</code> node'u ekleyerek hangi trexEdge PC'lerin ba\u011fland\u0131\u011f\u0131n\u0131 ve event listesini izleyebilirsiniz.</p>"},{"location":"ornekler/temel-akis/#5-deploy","title":"5. Deploy","text":"<p>Sa\u011f \u00fcstteki k\u0131rm\u0131z\u0131 Deploy butonuna t\u0131klay\u0131n.</p>"},{"location":"ornekler/temel-akis/#flow-json","title":"Flow JSON","text":"<p>A\u015fa\u011f\u0131daki JSON'u Node-RED'e import ederek bu ak\u0131\u015f\u0131 do\u011frudan kurabilirsiniz:</p> <pre><code>[\n    {\n        \"id\": \"f1\",\n        \"type\": \"tab\",\n        \"label\": \"TemelAkis\",\n        \"disabled\": false\n    },\n    {\n        \"id\": \"sub1\",\n        \"type\": \"trex Subscriber\",\n        \"z\": \"f1\",\n        \"name\": \"\",\n        \"method\": \"get\",\n        \"event\": \"/GetSubscribed\",\n        \"x\": 200,\n        \"y\": 100,\n        \"wires\": [[]]\n    },\n    {\n        \"id\": \"ev1\",\n        \"type\": \"Business Events\",\n        \"z\": \"f1\",\n        \"name\": \"OrderStart\",\n        \"method\": \"get\",\n        \"event\": \"/OrderStartEvent\",\n        \"ishandled\": false,\n        \"suffix\": \"\",\n        \"x\": 200,\n        \"y\": 200,\n        \"wires\": [[\"dbg1\"]]\n    },\n    {\n        \"id\": \"dbg1\",\n        \"type\": \"debug\",\n        \"z\": \"f1\",\n        \"name\": \"OrderStart Debug\",\n        \"active\": true,\n        \"complete\": \"true\",\n        \"x\": 480,\n        \"y\": 200,\n        \"wires\": []\n    }\n]\n</code></pre>"},{"location":"ornekler/temel-akis/#beklenen-ckt","title":"Beklenen \u00c7\u0131kt\u0131","text":""},{"location":"ornekler/temel-akis/#deploy-annda","title":"Deploy An\u0131nda","text":"<p><code>trex Subscriber</code> node'unun alt\u0131nda k\u0131saca:</p> <pre><code>[sar\u0131 nokta] Triggered\n</code></pre> <p>g\u00f6r\u00fcn\u00fcr ve panel kay\u0131t listesini alm\u0131\u015ft\u0131r.</p>"},{"location":"ornekler/temel-akis/#panel-tarafnda-olay-tetiklendiginde","title":"Panel Taraf\u0131nda Olay Tetiklendi\u011finde","text":"<p>Sa\u011f paneldeki debug \u00e7\u0131kt\u0131s\u0131nda \u015funa benzer mesaj g\u00f6r\u00fcn\u00fcr:</p> <pre><code>{\n  \"_msgid\": \"8a3f5b1c.de4a7\",\n  \"payload\": {\n    \"orderNo\": \"ORD-2026-0042\",\n    \"operatorId\": \"OP-007\",\n    \"machineId\": \"M-12\",\n    \"productCode\": \"PRD-X100\",\n    \"qty\": 50,\n    \"startTime\": \"2026-05-11T08:30:15Z\"\n  },\n  \"req\": { /* ... */ },\n  \"res\": { /* ... */ }\n}\n</code></pre>"},{"location":"ornekler/temel-akis/#test-etmek","title":"Test Etmek","text":"<p>Panel taraf\u0131na eri\u015fiminiz yoksa Postman gibi bir HTTP istemcisi ile test edebilirsiniz. Event node'lar\u0131 <code>POST</code> metodunu kullan\u0131r; veri request body'den iletilir, adres sat\u0131r\u0131na parametre ge\u00e7ilemez.</p> <ul> <li>Method: <code>POST</code></li> <li>URL: <code>http://&lt;node-red-host&gt;:1880/OrderStartEvent</code></li> <li>Body: <code>raw / JSON</code></li> </ul> <pre><code>{\n  \"orderNo\": \"TEST-001\",\n  \"qty\": 10\n}\n</code></pre> <p>G\u00f6nderim sonras\u0131 <code>debug</code> panelinde mesaj\u0131 g\u00f6rmelisiniz.</p>"},{"location":"ornekler/temel-akis/#yaygn-sorunlar","title":"Yayg\u0131n Sorunlar","text":"<p>trex Subscriber Triggered \u00e7\u0131km\u0131yor</p> <ul> <li>trexMes Edge'de Node-RED Connector eklentisi etkin mi?</li> <li>Panel'in Node-RED IP/port ayar\u0131 do\u011fru mu?</li> </ul> <p>Business Events tetiklenmiyor</p> <ul> <li>Event ismi (<code>/OrderStartEvent</code>) panel taraf\u0131nda tan\u0131ml\u0131 olanla birebir mi e\u015fle\u015fiyor?</li> <li>B\u00fcy\u00fck/k\u00fc\u00e7\u00fck harf duyarl\u0131l\u0131\u011f\u0131 kontrol edildi mi?</li> </ul> <p>Cevap timeout</p> <p>Bu ak\u0131\u015fta <code>debug</code> sonras\u0131 <code>Responser</code> yok; panel cevap beklemeyebilir veya zaman a\u015f\u0131m\u0131 verebilir. Production i\u00e7in <code>Responser</code> ekleyin:</p> <pre><code>Business Events \u2192 debug \u2192 Responser\n</code></pre>"},{"location":"ornekler/temel-akis/#sonraki-adm","title":"Sonraki Ad\u0131m","text":"<p>Custom Form Ak\u0131\u015f\u0131 \u00f6rne\u011finde olay verisini g\u00f6rsel forma yans\u0131taca\u011f\u0131z.</p>"}]}