[{"data":1,"prerenderedAt":5809},["ShallowReactive",2],{"tech-openclaw-smart-hotel":3},{"id":4,"title":5,"author":6,"body":7,"category":5792,"date":5793,"description":5794,"extension":5795,"image":5796,"meta":5797,"navigation":138,"path":5798,"readingTime":5799,"seo":5800,"stem":5801,"tags":5802,"__hash__":5808},"tech\u002Ftech\u002Fopenclaw-smart-hotel.md","OpenClaw × Smart Hotel — Integrasi BAS, AI Concierge, dan Green Rewards","Zainul Fanani",{"type":8,"value":9,"toc":5714},"minimark",[10,22,25,30,33,56,67,70,75,78,82,85,344,349,364,366,370,373,386,393,398,401,406,409,481,486,489,494,497,502,505,509,516,521,524,529,537,540,554,560,565,585,591,595,598,686,689,692,876,878,882,889,987,991,996,1100,1107,1111,1119,1122,1124,1128,1131,1136,1214,1219,1438,1444,1446,1450,1453,1457,1460,1465,1491,1495,1675,1679,1907,1911,1917,1921,1928,1933,1940,2012,2017,2101,2106,2109,2112,2118,2124,2126,2130,2133,2144,2258,2263,2453,2455,2459,2462,2466,2579,2583,2589,2592,2595,2606,2608,2612,2615,2619,2726,2730,2736,2740,3019,3023,3026,3194,3196,3200,3203,3207,3210,3224,3228,3242,3246,3260,3264,3278,3282,3296,3298,3302,3305,3432,3437,3439,3443,3446,3450,3453,3464,3467,3471,3474,3531,3535,3538,3544,3548,3551,3565,3569,3572,3586,3589,3591,3595,3602,3747,3752,3754,3758,3761,3765,3837,3841,3907,3911,3976,3980,4044,4046,4050,4053,4057,4060,4140,4144,4318,4322,4325,4726,4730,4733,4804,4807,4930,4936,4938,4942,4945,4949,5097,5101,5104,5320,5324,5327,5333,5340,5342,5346,5349,5353,5385,5389,5394,5414,5419,5439,5444,5460,5464,5470,5473,5475,5479,5482,5486,5492,5498,5501,5505,5516,5520,5523,5534,5538,5541,5545,5548,5559,5561,5565,5568,5579,5582,5614,5617,5624,5627,5629,5641,5643,5648,5691,5696,5710],[11,12,13,14,21],"p",{},"Sebelum masuk ke tutorial, quick disclosure: setup OpenClaw butuh VPS yang solid. Gue pake ",[15,16,20],"a",{"href":17,"rel":18},"https:\u002F\u002Fblog.fanani.co\u002Fsumopod",[19],"nofollow","Sumopod"," — VPS KVM dengan harga bersahabat dan performa yang nge-gas. Cek link di atas kalau butuh rekomendasi VPS.",[23,24],"hr",{},[26,27,29],"h2",{"id":28},"masalah-nyata-di-industri-hotel","🔥 Masalah Nyata di Industri Hotel",[11,31,32],{},"Mari gue gambaran scenario yang sering banget terjadi di hotel-hotel Indonesia:",[34,35,36,44,47,53],"ul",{},[37,38,39,40],"li",{},"Tamu check-in jam 14:00, AC dinyalakan penuh. Tamu keluar jalan-jalan sampai jam 22:00. ",[41,42,43],"strong",{},"8 jam AC nyala buat nganginin kamar kosong.",[37,45,46],{},"Satu hotel 200 kamar, rata-rata occupancy 70%. Bayangin berapa kWh yang terbuang cuma buat nganginin kamar yang nggak ada orang-nya.",[37,48,49,50],{},"Tamu baru di kota, pengen cari makan enak dekat hotel. Tanya resepsionis → dapat jawaban generik \"Ada mall di sebelah sana\". ",[41,51,52],{},"Zero personalization.",[37,54,55],{},"Housekeeping schedule tetap, nggak peduli tamu lagi tidur atau nggak.",[11,57,58,59,62,63,66],{},"Menurut data dari Schneider Electric's Building Performance Index, ",[41,60,61],{},"HVAC (AC) mengonsumsi 40-60% total energi hotel",". Ini bukan angka kecil. Dan sebagian besar pemborosan terjadi karena ",[41,64,65],{},"manual control"," yang nggak adaptif.",[11,68,69],{},"Di sisi lain, guest experience juga kurang. Tamu modern pengen instant, personalized, dan seamless. Nggak mau tanya-tanya manual. Mau ketik di WhatsApp, langsung dapet jawaban.",[11,71,72],{},[41,73,74],{},"Nah, di titik inilah OpenClaw masuk sebagai game changer.",[11,76,77],{},"━━━━━━━━━━━━",[26,79,81],{"id":80},"️-arsitektur-besar-gimana-caranya-kerja","🏗️ Arsitektur Besar — Gimana Caranya Kerja?",[11,83,84],{},"Sebelum masuk ke kode, gue mau jelasin big picture-nya dulu. Jadi nggak nyebur ke technical tanpa paham konsep.",[86,87,92],"pre",{"className":88,"code":89,"language":90,"meta":91,"style":91},"language-mermaid shiki shiki-themes github-light github-dark","flowchart TD\n    subgraph Guest[\"🏨 Guest Layer\"]\n        WA[\"WhatsApp \u002F Telegram\"]\n        APP[\"Hotel App\"]\n        WIFI[\"WiFi Login Portal\"]\n    end\n\n    subgraph OpenClaw[\"🤖 OpenClaw AI Engine\"]\n        ENGINE[\"NLP Engine\u003Cbr\u002F>Intent Detection\"]\n        TOOLS[\"Tool Registry\u003Cbr\u002F>Skills & Functions\"]\n        SCHEDULER[\"Scheduler\u003Cbr\u002F>Automation Rules\"]\n        MEMORY[\"Context Memory\u003Cbr\u002F>Guest Profile & History\"]\n    end\n\n    subgraph BAS[\"⚡ Building Automation System\"]\n        HVAC[\"HVAC Controller\u003Cbr\u002F>Schneider \u002F Honeywell\"]\n        LIGHT[\"Lighting System\"]\n        SMARTM[\"Smart Meters\u003Cbr\u002F>Energy Monitoring\"]\n    end\n\n    subgraph Hotel[\"🏢 Hotel Systems\"]\n        PMS[\"PMS\u003Cbr\u002F>Property Management\"]\n        BOOKING[\"Booking Engine\"]\n        WIFI_DB[\"WiFi Auth DB\"]\n        CRM[\"Guest CRM\"]\n    end\n\n    WA --> ENGINE\n    APP --> ENGINE\n    WIFI --> WIFI_DB\n    WIFI_DB -->|Guest Check-in Event| ENGINE\n    ENGINE --> TOOLS\n    TOOLS --> HVAC\n    TOOLS --> LIGHT\n    TOOLS --> SMARTM\n    HVAC -->|Energy Data| SMARTM\n    ENGINE -->|Recommendations| PMS\n    ENGINE -->|Guest Data| CRM\n    PMS -->|Room Status| ENGINE\n    BOOKING -->|Booking Dates| ENGINE\n    SCHEDULER -->|Auto Rules| TOOLS\n    MEMORY -->|Context| ENGINE\n","mermaid","",[93,94,95,103,109,115,121,127,133,140,146,152,158,164,170,175,180,186,192,198,204,209,214,220,226,232,238,244,249,254,260,266,272,278,284,290,296,302,308,314,320,326,332,338],"code",{"__ignoreMap":91},[96,97,100],"span",{"class":98,"line":99},"line",1,[96,101,102],{},"flowchart TD\n",[96,104,106],{"class":98,"line":105},2,[96,107,108],{},"    subgraph Guest[\"🏨 Guest Layer\"]\n",[96,110,112],{"class":98,"line":111},3,[96,113,114],{},"        WA[\"WhatsApp \u002F Telegram\"]\n",[96,116,118],{"class":98,"line":117},4,[96,119,120],{},"        APP[\"Hotel App\"]\n",[96,122,124],{"class":98,"line":123},5,[96,125,126],{},"        WIFI[\"WiFi Login Portal\"]\n",[96,128,130],{"class":98,"line":129},6,[96,131,132],{},"    end\n",[96,134,136],{"class":98,"line":135},7,[96,137,139],{"emptyLinePlaceholder":138},true,"\n",[96,141,143],{"class":98,"line":142},8,[96,144,145],{},"    subgraph OpenClaw[\"🤖 OpenClaw AI Engine\"]\n",[96,147,149],{"class":98,"line":148},9,[96,150,151],{},"        ENGINE[\"NLP Engine\u003Cbr\u002F>Intent Detection\"]\n",[96,153,155],{"class":98,"line":154},10,[96,156,157],{},"        TOOLS[\"Tool Registry\u003Cbr\u002F>Skills & Functions\"]\n",[96,159,161],{"class":98,"line":160},11,[96,162,163],{},"        SCHEDULER[\"Scheduler\u003Cbr\u002F>Automation Rules\"]\n",[96,165,167],{"class":98,"line":166},12,[96,168,169],{},"        MEMORY[\"Context Memory\u003Cbr\u002F>Guest Profile & History\"]\n",[96,171,173],{"class":98,"line":172},13,[96,174,132],{},[96,176,178],{"class":98,"line":177},14,[96,179,139],{"emptyLinePlaceholder":138},[96,181,183],{"class":98,"line":182},15,[96,184,185],{},"    subgraph BAS[\"⚡ Building Automation System\"]\n",[96,187,189],{"class":98,"line":188},16,[96,190,191],{},"        HVAC[\"HVAC Controller\u003Cbr\u002F>Schneider \u002F Honeywell\"]\n",[96,193,195],{"class":98,"line":194},17,[96,196,197],{},"        LIGHT[\"Lighting System\"]\n",[96,199,201],{"class":98,"line":200},18,[96,202,203],{},"        SMARTM[\"Smart Meters\u003Cbr\u002F>Energy Monitoring\"]\n",[96,205,207],{"class":98,"line":206},19,[96,208,132],{},[96,210,212],{"class":98,"line":211},20,[96,213,139],{"emptyLinePlaceholder":138},[96,215,217],{"class":98,"line":216},21,[96,218,219],{},"    subgraph Hotel[\"🏢 Hotel Systems\"]\n",[96,221,223],{"class":98,"line":222},22,[96,224,225],{},"        PMS[\"PMS\u003Cbr\u002F>Property Management\"]\n",[96,227,229],{"class":98,"line":228},23,[96,230,231],{},"        BOOKING[\"Booking Engine\"]\n",[96,233,235],{"class":98,"line":234},24,[96,236,237],{},"        WIFI_DB[\"WiFi Auth DB\"]\n",[96,239,241],{"class":98,"line":240},25,[96,242,243],{},"        CRM[\"Guest CRM\"]\n",[96,245,247],{"class":98,"line":246},26,[96,248,132],{},[96,250,252],{"class":98,"line":251},27,[96,253,139],{"emptyLinePlaceholder":138},[96,255,257],{"class":98,"line":256},28,[96,258,259],{},"    WA --> ENGINE\n",[96,261,263],{"class":98,"line":262},29,[96,264,265],{},"    APP --> ENGINE\n",[96,267,269],{"class":98,"line":268},30,[96,270,271],{},"    WIFI --> WIFI_DB\n",[96,273,275],{"class":98,"line":274},31,[96,276,277],{},"    WIFI_DB -->|Guest Check-in Event| ENGINE\n",[96,279,281],{"class":98,"line":280},32,[96,282,283],{},"    ENGINE --> TOOLS\n",[96,285,287],{"class":98,"line":286},33,[96,288,289],{},"    TOOLS --> HVAC\n",[96,291,293],{"class":98,"line":292},34,[96,294,295],{},"    TOOLS --> LIGHT\n",[96,297,299],{"class":98,"line":298},35,[96,300,301],{},"    TOOLS --> SMARTM\n",[96,303,305],{"class":98,"line":304},36,[96,306,307],{},"    HVAC -->|Energy Data| SMARTM\n",[96,309,311],{"class":98,"line":310},37,[96,312,313],{},"    ENGINE -->|Recommendations| PMS\n",[96,315,317],{"class":98,"line":316},38,[96,318,319],{},"    ENGINE -->|Guest Data| CRM\n",[96,321,323],{"class":98,"line":322},39,[96,324,325],{},"    PMS -->|Room Status| ENGINE\n",[96,327,329],{"class":98,"line":328},40,[96,330,331],{},"    BOOKING -->|Booking Dates| ENGINE\n",[96,333,335],{"class":98,"line":334},41,[96,336,337],{},"    SCHEDULER -->|Auto Rules| TOOLS\n",[96,339,341],{"class":98,"line":340},42,[96,342,343],{},"    MEMORY -->|Context| ENGINE\n",[11,345,346],{},[41,347,348],{},"Alur kerja sederhananya:",[350,351,352,355,358,361],"ol",{},[37,353,354],{},"Tamu connect WiFi → email tercatat → match booking → kirim WhatsApp welcome",[37,356,357],{},"Tamu chat di WhatsApp → OpenClaw tangkap intent → eksekusi action",[37,359,360],{},"BAS kirim data energi ke OpenClaw → OpenClaw analisis → trigger otomasi",[37,362,363],{},"Semua interaksi tercatat di memory → personalization makin akurat",[11,365,77],{},[26,367,369],{"id":368},"bas-integration-jangan-ganggu-tamu-otomasi-di-balik-layar","⚡ BAS Integration — Jangan Ganggu Tamu, Otomasi di Balik Layar",[11,371,372],{},"Ini point paling penting dari diskusi tadi, dan gue mau highlight banget:",[374,375,376],"blockquote",{},[11,377,378,381,382,385],{},[41,379,380],{},"❌ SALAH:"," Ngirim WhatsApp ke tamu \"Matikan AC Anda untuk hemat energi\"\n",[41,383,384],{},"✅ BENAR:"," BAS otomatis turunkan AC saat tamu keluar kamar, naikkan lagi saat tamu mendekati hotel",[11,387,388,389,392],{},"Jangan pernah ganggu tamu dengan urusan listrik. Mereka udah bayar. Mereka pengen nyaman. ",[41,390,391],{},"Otomasi energi harus invisible"," — bekerja di background tanpa tamu sadari.",[394,395,397],"h3",{"id":396},"gimana-cara-deteksi-tamu-keluarmasuk-kamar","Gimana cara deteksi tamu keluar\u002Fmasuk kamar?",[11,399,400],{},"Ada beberapa pendekatan:",[11,402,403],{},[41,404,405],{},"▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░ 60% — Smart Door Lock",[11,407,408],{},"Door lock dengan sensor occupancy. Setiap kali pintu dibuka\u002Ftutup, event dikirim ke BAS. Logika sederhana:",[86,410,414],{"className":411,"code":412,"language":413,"meta":91,"style":91},"language-python shiki shiki-themes github-light github-dark","# BAS Rule: Door lock event handler\nasync def handle_door_event(room_id: str, event: str):\n    if event == \"door_opened\":\n        # Guest entered room → restore comfort settings\n        await bas.set_hvac_mode(room_id, \"comfort\")\n        await bas.set_lighting(room_id, \"welcome_scene\")\n        \n    elif event == \"all_guests_left\":\n        # Wait 15 minutes, then switch to eco mode\n        await asyncio.sleep(900)\n        if not await bas.is_room_occupied(room_id):\n            await bas.set_hvac_mode(room_id, \"eco\")\n            await bas.set_lighting(room_id, \"off\")\n","python",[93,415,416,421,426,431,436,441,446,451,456,461,466,471,476],{"__ignoreMap":91},[96,417,418],{"class":98,"line":99},[96,419,420],{},"# BAS Rule: Door lock event handler\n",[96,422,423],{"class":98,"line":105},[96,424,425],{},"async def handle_door_event(room_id: str, event: str):\n",[96,427,428],{"class":98,"line":111},[96,429,430],{},"    if event == \"door_opened\":\n",[96,432,433],{"class":98,"line":117},[96,434,435],{},"        # Guest entered room → restore comfort settings\n",[96,437,438],{"class":98,"line":123},[96,439,440],{},"        await bas.set_hvac_mode(room_id, \"comfort\")\n",[96,442,443],{"class":98,"line":129},[96,444,445],{},"        await bas.set_lighting(room_id, \"welcome_scene\")\n",[96,447,448],{"class":98,"line":135},[96,449,450],{},"        \n",[96,452,453],{"class":98,"line":142},[96,454,455],{},"    elif event == \"all_guests_left\":\n",[96,457,458],{"class":98,"line":148},[96,459,460],{},"        # Wait 15 minutes, then switch to eco mode\n",[96,462,463],{"class":98,"line":154},[96,464,465],{},"        await asyncio.sleep(900)\n",[96,467,468],{"class":98,"line":160},[96,469,470],{},"        if not await bas.is_room_occupied(room_id):\n",[96,472,473],{"class":98,"line":166},[96,474,475],{},"            await bas.set_hvac_mode(room_id, \"eco\")\n",[96,477,478],{"class":98,"line":172},[96,479,480],{},"            await bas.set_lighting(room_id, \"off\")\n",[11,482,483],{},[41,484,485],{},"▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░ 70% — PIR Motion Sensor",[11,487,488],{},"Sensor gerak di dalam kamar. Nggak ada gerakan selama X menit → kamar dianggap kosong.",[11,490,491],{},[41,492,493],{},"▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░ 80% — BLE\u002FWiFi Presence",[11,495,496],{},"Track HP tamu yang konek ke WiFi hotel. Signal strength dari access point bisa tentukan tamu masih di kamar atau nggak.",[11,498,499],{},[41,500,501],{},"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░ 90% — Hybrid (Recommended)",[11,503,504],{},"Gabungkan semua di atas. Door lock + PIR + WiFi presence = akurasi tinggi dengan false positive minimal.",[394,506,508],{"id":507},"wifi-csi-advanced-presence-detection","📡 WiFi CSI — Advanced Presence Detection",[11,510,511,512,515],{},"Di diskusi komunitas, ada yang suggest ",[41,513,514],{},"WiFi CSI (Channel State Information)"," sebagai metode sensing occupancy. Ini teknologi yang menarik secara teknis, tapi gue punya pendapat kuat soal ini.",[11,517,518],{},[41,519,520],{},"Apa itu WiFi CSI?",[11,522,523],{},"WiFi CSI memanfaatkan perubahan kecil pada sinyal WiFi (amplitudo dan fase) untuk mendeteksi posisi, pergerakan, dan aktivitas manusia — bahkan menembus dinding. Bedanya dengan RSSI yang cuma ukur kekuatan sinyal, CSI ngasih data detail level subcarrier. Jadi secara teori bisa jadi \"sensor lingkungan ramah privasi\".",[11,525,526],{},[41,527,528],{},"Tapi gue WARNING berat soal ini:",[374,530,531],{},[11,532,533,534],{},"⚠️ ",[41,535,536],{},"Jangan pake WiFi buat sensing penghuni di kamar hotel.",[11,538,539],{},"Kenapa? Karena CSI itu TERLALU sensitif. Ini yang bakal terjadi:",[34,541,542,545,548,551],{},[37,543,544],{},"1 orang masuk kamar → terdeteksi ✅",[37,546,547],{},"2 orang di kamar → terdeteksi ✅ (tapi ini PRIVACY INVASION)",[37,549,550],{},"Tamu gerak di dalam kamar → pattern movement terekam ✅ (lagi-lagi PRIVACY)",[37,552,553],{},"Tamu di toilet → tetap terdeteksi ✅ (INI SUDAH CREEPY)",[11,555,556,559],{},[41,557,558],{},"Masalah besar:"," Kalau tamu tahu WiFi mereka dipake buat track gerakan di dalam kamar, lawsuit datang. No question. Di banyak yurisdiksi, ini masuk kategori illegal surveillance.",[11,561,562],{},[41,563,564],{},"Kapan CSI boleh dipake?",[34,566,567,570,573,576,579,582],{},[37,568,569],{},"✅ Lobby area (public space)",[37,571,572],{},"✅ Meeting room (bisa track occupancy buat scheduling)",[37,574,575],{},"✅ Corridor (traffic flow optimization)",[37,577,578],{},"❌ Kamar tamu (ABSOLUTELY NOT)",[37,580,581],{},"❌ Kamar mandi (HELL NO)",[37,583,584],{},"❌ Spa\u002Fgym locker room (NOPE)",[11,586,587,590],{},[41,588,589],{},"Bottom line:"," CSI itu teknologi keren buat smart building. Tapi di konteks hotel, batasi ke area public saja. Buat kamar, stick dengan door lock + PIR — itu sudah cukup dan respectful.",[394,592,594],{"id":593},"konek-openclaw-ke-bas","Konek OpenClaw ke BAS",[11,596,597],{},"Ini bagian yang seru. OpenClaw bisa konek ke BAS lewat beberapa protocol:",[599,600,601,617],"table",{},[602,603,604],"thead",{},[605,606,607,611,614],"tr",{},[608,609,610],"th",{},"Protocol",[608,612,613],{},"Use Case",[608,615,616],{},"Konek via",[618,619,620,634,647,660,673],"tbody",{},[605,621,622,628,631],{},[623,624,625],"td",{},[41,626,627],{},"Modbus TCP",[623,629,630],{},"Schneider, Honeywell, Siemens",[623,632,633],{},"OpenClaw Skill → TCP socket",[605,635,636,641,644],{},[623,637,638],{},[41,639,640],{},"BACnet\u002FIP",[623,642,643],{},"Standar industri gedung",[623,645,646],{},"OpenClaw Skill → BACnet lib",[605,648,649,654,657],{},[623,650,651],{},[41,652,653],{},"MQTT",[623,655,656],{},"IoT sensor modern",[623,658,659],{},"OpenClaw Skill → MQTT broker",[605,661,662,667,670],{},[623,663,664],{},[41,665,666],{},"REST API",[623,668,669],{},"Cloud-based BAS",[623,671,672],{},"OpenClaw Skill → HTTP calls",[605,674,675,680,683],{},[623,676,677],{},[41,678,679],{},"KNX",[623,681,682],{},"Smart building standard",[623,684,685],{},"OpenClaw Skill → KNX gateway",[11,687,688],{},"Gue sendiri lagi plan konek Schneider BAS dengan OpenClaw. Awalnya plan lewat n8n sebagai middleware, tapi OpenClaw sendiri udah cukup powerful sebagai orchestrator.",[11,690,691],{},"Contoh skill OpenClaw untuk BAS control:",[86,693,697],{"className":694,"code":695,"language":696,"meta":91,"style":91},"language-yaml shiki shiki-themes github-light github-dark","# skills\u002Fbas-control\u002FSKILL.md\nname: bas-control\ndescription: Control Building Automation System via Modbus\u002FMQTT\nversion: 1.0.0\n\ntriggers:\n  - pattern: \"matikan ac kamar {room}\"\n    action: bas.set_hvac(room, \"off\")\n  \n  - pattern: \"status kamar {room}\"\n    action: bas.get_room_status(room)\n  \n  - pattern: \"laporan energi hari ini\"\n    action: bas.get_daily_energy_report()\n\nendpoints:\n  - name: schneider-bas\n    protocol: modbus-tcp\n    host: 192.168.1.100\n    port: 502\n","yaml",[93,698,699,705,719,729,740,744,752,765,775,780,791,800,804,815,824,828,835,846,856,866],{"__ignoreMap":91},[96,700,701],{"class":98,"line":99},[96,702,704],{"class":703},"sJ8bj","# skills\u002Fbas-control\u002FSKILL.md\n",[96,706,707,711,715],{"class":98,"line":105},[96,708,710],{"class":709},"s9eBZ","name",[96,712,714],{"class":713},"sVt8B",": ",[96,716,718],{"class":717},"sZZnC","bas-control\n",[96,720,721,724,726],{"class":98,"line":111},[96,722,723],{"class":709},"description",[96,725,714],{"class":713},[96,727,728],{"class":717},"Control Building Automation System via Modbus\u002FMQTT\n",[96,730,731,734,736],{"class":98,"line":117},[96,732,733],{"class":709},"version",[96,735,714],{"class":713},[96,737,739],{"class":738},"sj4cs","1.0.0\n",[96,741,742],{"class":98,"line":123},[96,743,139],{"emptyLinePlaceholder":138},[96,745,746,749],{"class":98,"line":129},[96,747,748],{"class":709},"triggers",[96,750,751],{"class":713},":\n",[96,753,754,757,760,762],{"class":98,"line":135},[96,755,756],{"class":713},"  - ",[96,758,759],{"class":709},"pattern",[96,761,714],{"class":713},[96,763,764],{"class":717},"\"matikan ac kamar {room}\"\n",[96,766,767,770,772],{"class":98,"line":142},[96,768,769],{"class":709},"    action",[96,771,714],{"class":713},[96,773,774],{"class":717},"bas.set_hvac(room, \"off\")\n",[96,776,777],{"class":98,"line":148},[96,778,779],{"class":713},"  \n",[96,781,782,784,786,788],{"class":98,"line":154},[96,783,756],{"class":713},[96,785,759],{"class":709},[96,787,714],{"class":713},[96,789,790],{"class":717},"\"status kamar {room}\"\n",[96,792,793,795,797],{"class":98,"line":160},[96,794,769],{"class":709},[96,796,714],{"class":713},[96,798,799],{"class":717},"bas.get_room_status(room)\n",[96,801,802],{"class":98,"line":166},[96,803,779],{"class":713},[96,805,806,808,810,812],{"class":98,"line":172},[96,807,756],{"class":713},[96,809,759],{"class":709},[96,811,714],{"class":713},[96,813,814],{"class":717},"\"laporan energi hari ini\"\n",[96,816,817,819,821],{"class":98,"line":177},[96,818,769],{"class":709},[96,820,714],{"class":713},[96,822,823],{"class":717},"bas.get_daily_energy_report()\n",[96,825,826],{"class":98,"line":182},[96,827,139],{"emptyLinePlaceholder":138},[96,829,830,833],{"class":98,"line":188},[96,831,832],{"class":709},"endpoints",[96,834,751],{"class":713},[96,836,837,839,841,843],{"class":98,"line":194},[96,838,756],{"class":713},[96,840,710],{"class":709},[96,842,714],{"class":713},[96,844,845],{"class":717},"schneider-bas\n",[96,847,848,851,853],{"class":98,"line":200},[96,849,850],{"class":709},"    protocol",[96,852,714],{"class":713},[96,854,855],{"class":717},"modbus-tcp\n",[96,857,858,861,863],{"class":98,"line":206},[96,859,860],{"class":709},"    host",[96,862,714],{"class":713},[96,864,865],{"class":738},"192.168.1.100\n",[96,867,868,871,873],{"class":98,"line":211},[96,869,870],{"class":709},"    port",[96,872,714],{"class":713},[96,874,875],{"class":738},"502\n",[11,877,77],{},[26,879,881],{"id":880},"layer-tamu-ai-concierge-via-whatsapp","📱 Layer Tamu — AI Concierge via WhatsApp",[11,883,884,885,888],{},"Nah, sekarang ke bagian yang tamu rasain. Ini ",[41,886,887],{},"front-facing"," — interaksi langsung antara tamu dan AI assistant.",[86,890,892],{"className":88,"code":891,"language":90,"meta":91,"style":91},"flowchart LR\n    GUEST[\"🏨 Tamu\"] -->|\"Ketik pesan\"| WA[\"WhatsApp\"]\n    WA -->|\"Webhook\"| OC[\"OpenClaw\"]\n    \n    OC --> INTENT{\"NLP Intent Detection\"}\n    \n    INTENT -->|\"makan_recommend\"| FOOD[\"🍽️ Rekomendasi Restoran\"]\n    INTENT -->|\"attraction_recommend\"| TOUR[\"🗺️ Wisata & Attractions\"]\n    INTENT -->|\"room_service\"| RS[\"🛎️ Room Service\"]\n    INTENT -->|\"transport\"| TAXI[\"🚗 Transportasi\"]\n    INTENT -->|\"info\"| INFO[\"ℹ️ Info Hotel\"]\n    INTENT -->|\"complaint\"| CS[\"🎯 Customer Service\"]\n    \n    FOOD --> GUEST\n    TOUR --> GUEST\n    RS --> GUEST\n    TAXI --> GUEST\n    INFO --> GUEST\n    CS --> GUEST\n",[93,893,894,899,904,909,914,919,923,928,933,938,943,948,953,957,962,967,972,977,982],{"__ignoreMap":91},[96,895,896],{"class":98,"line":99},[96,897,898],{},"flowchart LR\n",[96,900,901],{"class":98,"line":105},[96,902,903],{},"    GUEST[\"🏨 Tamu\"] -->|\"Ketik pesan\"| WA[\"WhatsApp\"]\n",[96,905,906],{"class":98,"line":111},[96,907,908],{},"    WA -->|\"Webhook\"| OC[\"OpenClaw\"]\n",[96,910,911],{"class":98,"line":117},[96,912,913],{},"    \n",[96,915,916],{"class":98,"line":123},[96,917,918],{},"    OC --> INTENT{\"NLP Intent Detection\"}\n",[96,920,921],{"class":98,"line":129},[96,922,913],{},[96,924,925],{"class":98,"line":135},[96,926,927],{},"    INTENT -->|\"makan_recommend\"| FOOD[\"🍽️ Rekomendasi Restoran\"]\n",[96,929,930],{"class":98,"line":142},[96,931,932],{},"    INTENT -->|\"attraction_recommend\"| TOUR[\"🗺️ Wisata & Attractions\"]\n",[96,934,935],{"class":98,"line":148},[96,936,937],{},"    INTENT -->|\"room_service\"| RS[\"🛎️ Room Service\"]\n",[96,939,940],{"class":98,"line":154},[96,941,942],{},"    INTENT -->|\"transport\"| TAXI[\"🚗 Transportasi\"]\n",[96,944,945],{"class":98,"line":160},[96,946,947],{},"    INTENT -->|\"info\"| INFO[\"ℹ️ Info Hotel\"]\n",[96,949,950],{"class":98,"line":166},[96,951,952],{},"    INTENT -->|\"complaint\"| CS[\"🎯 Customer Service\"]\n",[96,954,955],{"class":98,"line":172},[96,956,913],{},[96,958,959],{"class":98,"line":177},[96,960,961],{},"    FOOD --> GUEST\n",[96,963,964],{"class":98,"line":182},[96,965,966],{},"    TOUR --> GUEST\n",[96,968,969],{"class":98,"line":188},[96,970,971],{},"    RS --> GUEST\n",[96,973,974],{"class":98,"line":194},[96,975,976],{},"    TAXI --> GUEST\n",[96,978,979],{"class":98,"line":200},[96,980,981],{},"    INFO --> GUEST\n",[96,983,984],{"class":98,"line":206},[96,985,986],{},"    CS --> GUEST\n",[394,988,990],{"id":989},"apa-aja-yang-bisa-dilakukan-ai-concierge","Apa aja yang bisa dilakukan AI Concierge?",[11,992,993],{},[41,994,995],{},"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░ 80% — Fitur Utama:",[599,997,998,1011],{},[602,999,1000],{},[605,1001,1002,1005,1008],{},[608,1003,1004],{},"Kategori",[608,1006,1007],{},"Contoh Query",[608,1009,1010],{},"Response",[618,1012,1013,1024,1035,1046,1057,1068,1078,1089],{},[605,1014,1015,1018,1021],{},[623,1016,1017],{},"🍽️ Kuliner",[623,1019,1020],{},"\"Makan enak dekat sini dong\"",[623,1022,1023],{},"Daftar restoran + rating + jarak + rekomendasi berdasarkan preferensi",[605,1025,1026,1029,1032],{},[623,1027,1028],{},"🗺️ Wisata",[623,1030,1031],{},"\"Tempat wisata yang wajib dikunjungi\"",[623,1033,1034],{},"Itinerary + transport + estimasi waktu",[605,1036,1037,1040,1043],{},[623,1038,1039],{},"🛎️ Room Service",[623,1041,1042],{},"\"Minta extra towel\"",[623,1044,1045],{},"Forward ke housekeeping + tracking",[605,1047,1048,1051,1054],{},[623,1049,1050],{},"🚗 Transport",[623,1052,1053],{},"\"Cari grab ke airport\"",[623,1055,1056],{},"Link booking + estimasi harga + jadwal",[605,1058,1059,1062,1065],{},[623,1060,1061],{},"📋 Info Hotel",[623,1063,1064],{},"\"Jam breakfast berapa?\"",[623,1066,1067],{},"FAQ instant dari knowledge base",[605,1069,1070,1073,1076],{},[623,1071,1072],{},"🎯 Komplain",[623,1074,1075],{},"\"AC kamar saya rusak\" → Forward ke maintenance + real-time tracking",[623,1077],{},[605,1079,1080,1083,1086],{},[623,1081,1082],{},"🧖 Spa & Wellness",[623,1084,1085],{},"\"Ada pijat dekat hotel?\"",[623,1087,1088],{},"Rekomendasi + booking link",[605,1090,1091,1094,1097],{},[623,1092,1093],{},"🏪 Shopping",[623,1095,1096],{},"\"Mau beli oleh-oleh khas\"",[623,1098,1099],{},"Rekomendasi toko + peta",[11,1101,1102,1103,1106],{},"Yang menarik dari OpenClaw: ",[41,1104,1105],{},"bisa pake RAG (Retrieval Augmented Generation)",". Hotel upload semua info mereka (menu restoran, brosur spa, peta lokal), dan OpenClaw bisa jawab berdasarkan data real, bukan halusinasi.",[394,1108,1110],{"id":1109},"contoh-conversational-flow","Contoh Conversational Flow",[86,1112,1117],{"className":1113,"code":1115,"language":1116},[1114],"language-text","Tamu: Selamat malam, ada tempat makan seafood yang enak dekat hotel?\n\nAI Concierge: Selamat malam! 🌊 Ada beberapa rekomendasi seafood dekat hotel:\n\n1. 🦐 Rumah Makan Pantai Indah (800m, 10 min jalan kaki)\n   Rating: 4.6⭐ | Harga: 50-150rb\u002Fpax | Signature: Ikan Bakar Rica-rica\n   \n2. 🦀 Seafood 88 (1.2km, 5 min naik grab)\n   Rating: 4.4⭐ | Harga: 80-200rb\u002Fpax | Signature: Kepiting Saus Padang\n   \n3. 🐟 Dapur Laut (1.5km, 7 min naik grab)\n   Rating: 4.8⭐ | Harga: 100-250rb\u002Fpax | Signature: Cumi Goreng Tepung\n   \nMau gue bantu reservasi atau pesan grab ke salah satunya?\n\nTamu: Yang pertama dong, mau reservasi untuk 2 orang jam 8\n\nAI Concierge: Siap! 🎉 Gue reservasikan di Rumah Makan Pantai Indah:\n- 👥 2 orang\n- 🕗 Jam 20:00 WITA\n- 📅 Hari ini, 4 April 2026\n\nMau pesan dulu juga atau bayar di tempat?\n\nTamu: Bayar di tempenya aja\n\nAI Concierge: Done! ✅ Konfirmasi reservasi udah dikirim ke WA restoran. \nKalo mau cancel, bilang aja sebelum jam 19:00 ya. Selamat makan! 🦐\n","text",[93,1118,1115],{"__ignoreMap":91},[11,1120,1121],{},"Liat bagaimana natural-nya? Nggak kayak bot generik. Ini karena OpenClaw bisa di-set persona dan tone-nya.",[11,1123,77],{},[26,1125,1127],{"id":1126},"wifi-login-welcome-automation","📶 WiFi Login → Welcome Automation",[11,1129,1130],{},"Ini salah satu fitur yang paling impactful tapi sering terlewat.",[11,1132,1133],{},[41,1134,1135],{},"Alurnya:",[86,1137,1139],{"className":88,"code":1138,"language":90,"meta":91,"style":91},"flowchart TD\n    A[\"Tamu Connect WiFi Hotel\"] --> B[\"WiFi Captive Portal\u003Cbr\u002F>Login dengan Email\"]\n    B --> C[\"Email Terdaftar di System\"]\n    C --> D{\"Match dengan\u003Cbr\u002F>Booking PMS?\"}\n    D -->|\"Ya\"| E[\"✅ Verified Guest\"]\n    D -->|\"Tidak\"| F[\"📱 Tanya Nama & Booking ID\"]\n    F --> G{\"Valid?\"}\n    G -->|\"Ya\"| E\n    G -->|\"Tidak\"| H[\"❌ Akses Terbatas\u003Cbr\u002F>Basic WiFi Only\"]\n    \n    E --> I[\"Kirim WhatsApp Welcome\"]\n    I --> J[\"Room Number Info\"]\n    I --> K[\"Hotel Facilities Guide\"]\n    I --> L[\"Promo & Special Offers\"]\n    I --> M[\"Emergency Contact\"]\n",[93,1140,1141,1145,1150,1155,1160,1165,1170,1175,1180,1185,1189,1194,1199,1204,1209],{"__ignoreMap":91},[96,1142,1143],{"class":98,"line":99},[96,1144,102],{},[96,1146,1147],{"class":98,"line":105},[96,1148,1149],{},"    A[\"Tamu Connect WiFi Hotel\"] --> B[\"WiFi Captive Portal\u003Cbr\u002F>Login dengan Email\"]\n",[96,1151,1152],{"class":98,"line":111},[96,1153,1154],{},"    B --> C[\"Email Terdaftar di System\"]\n",[96,1156,1157],{"class":98,"line":117},[96,1158,1159],{},"    C --> D{\"Match dengan\u003Cbr\u002F>Booking PMS?\"}\n",[96,1161,1162],{"class":98,"line":123},[96,1163,1164],{},"    D -->|\"Ya\"| E[\"✅ Verified Guest\"]\n",[96,1166,1167],{"class":98,"line":129},[96,1168,1169],{},"    D -->|\"Tidak\"| F[\"📱 Tanya Nama & Booking ID\"]\n",[96,1171,1172],{"class":98,"line":135},[96,1173,1174],{},"    F --> G{\"Valid?\"}\n",[96,1176,1177],{"class":98,"line":142},[96,1178,1179],{},"    G -->|\"Ya\"| E\n",[96,1181,1182],{"class":98,"line":148},[96,1183,1184],{},"    G -->|\"Tidak\"| H[\"❌ Akses Terbatas\u003Cbr\u002F>Basic WiFi Only\"]\n",[96,1186,1187],{"class":98,"line":154},[96,1188,913],{},[96,1190,1191],{"class":98,"line":160},[96,1192,1193],{},"    E --> I[\"Kirim WhatsApp Welcome\"]\n",[96,1195,1196],{"class":98,"line":166},[96,1197,1198],{},"    I --> J[\"Room Number Info\"]\n",[96,1200,1201],{"class":98,"line":172},[96,1202,1203],{},"    I --> K[\"Hotel Facilities Guide\"]\n",[96,1205,1206],{"class":98,"line":177},[96,1207,1208],{},"    I --> L[\"Promo & Special Offers\"]\n",[96,1210,1211],{"class":98,"line":182},[96,1212,1213],{},"    I --> M[\"Emergency Contact\"]\n",[11,1215,1216],{},[41,1217,1218],{},"Teknis implementasi:",[86,1220,1222],{"className":411,"code":1221,"language":413,"meta":91,"style":91},"# WiFi portal handler - ketika tamu login via email\nasync def handle_wifi_login(email: str, mac_address: str):\n    # 1. Query PMS untuk match booking\n    booking = await pms.find_booking_by_email(email)\n    \n    if not booking:\n        return {\"status\": \"guest_not_found\", \"wifi\": \"basic_access\"}\n    \n    # 2. Set full WiFi access\n    await wifi_controller.set_access(mac_address, \"full\", duration=booking.duration)\n    \n    # 3. Get guest phone number from booking\n    phone = booking.guest_phone\n    \n    # 4. Create OpenClaw session for this guest\n    session = await openclaw.create_session(\n        chat_id=phone,\n        channel=\"whatsapp\",\n        metadata={\n            \"room_number\": booking.room_number,\n            \"check_in\": booking.check_in,\n            \"check_out\": booking.check_out,\n            \"guest_name\": booking.guest_name,\n            \"booking_id\": booking.id\n        }\n    )\n    \n    # 5. Send welcome message\n    await openclaw.send_message(session, {\n        \"template\": \"hotel_welcome\",\n        \"params\": {\n            \"name\": booking.guest_name,\n            \"room\": booking.room_number,\n            \"wifi_password\": \"premium_access_enabled\",\n            \"breakfast_time\": \"06:30 - 10:00\",\n            \"pool_hours\": \"07:00 - 21:00\",\n            \"gym_hours\": \"24 hours\"\n        }\n    })\n    \n    # 6. Schedule eco-mode activation for this room\n    await bas.schedule_eco_mode(booking.room_number, booking.check_out)\n    \n    return {\"status\": \"verified\", \"session\": session.id}\n",[93,1223,1224,1229,1234,1239,1244,1248,1253,1258,1262,1267,1272,1276,1281,1286,1290,1295,1300,1305,1310,1315,1320,1325,1330,1335,1340,1345,1350,1354,1359,1364,1369,1374,1379,1384,1389,1394,1399,1404,1408,1413,1417,1422,1427,1432],{"__ignoreMap":91},[96,1225,1226],{"class":98,"line":99},[96,1227,1228],{},"# WiFi portal handler - ketika tamu login via email\n",[96,1230,1231],{"class":98,"line":105},[96,1232,1233],{},"async def handle_wifi_login(email: str, mac_address: str):\n",[96,1235,1236],{"class":98,"line":111},[96,1237,1238],{},"    # 1. Query PMS untuk match booking\n",[96,1240,1241],{"class":98,"line":117},[96,1242,1243],{},"    booking = await pms.find_booking_by_email(email)\n",[96,1245,1246],{"class":98,"line":123},[96,1247,913],{},[96,1249,1250],{"class":98,"line":129},[96,1251,1252],{},"    if not booking:\n",[96,1254,1255],{"class":98,"line":135},[96,1256,1257],{},"        return {\"status\": \"guest_not_found\", \"wifi\": \"basic_access\"}\n",[96,1259,1260],{"class":98,"line":142},[96,1261,913],{},[96,1263,1264],{"class":98,"line":148},[96,1265,1266],{},"    # 2. Set full WiFi access\n",[96,1268,1269],{"class":98,"line":154},[96,1270,1271],{},"    await wifi_controller.set_access(mac_address, \"full\", duration=booking.duration)\n",[96,1273,1274],{"class":98,"line":160},[96,1275,913],{},[96,1277,1278],{"class":98,"line":166},[96,1279,1280],{},"    # 3. Get guest phone number from booking\n",[96,1282,1283],{"class":98,"line":172},[96,1284,1285],{},"    phone = booking.guest_phone\n",[96,1287,1288],{"class":98,"line":177},[96,1289,913],{},[96,1291,1292],{"class":98,"line":182},[96,1293,1294],{},"    # 4. Create OpenClaw session for this guest\n",[96,1296,1297],{"class":98,"line":188},[96,1298,1299],{},"    session = await openclaw.create_session(\n",[96,1301,1302],{"class":98,"line":194},[96,1303,1304],{},"        chat_id=phone,\n",[96,1306,1307],{"class":98,"line":200},[96,1308,1309],{},"        channel=\"whatsapp\",\n",[96,1311,1312],{"class":98,"line":206},[96,1313,1314],{},"        metadata={\n",[96,1316,1317],{"class":98,"line":211},[96,1318,1319],{},"            \"room_number\": booking.room_number,\n",[96,1321,1322],{"class":98,"line":216},[96,1323,1324],{},"            \"check_in\": booking.check_in,\n",[96,1326,1327],{"class":98,"line":222},[96,1328,1329],{},"            \"check_out\": booking.check_out,\n",[96,1331,1332],{"class":98,"line":228},[96,1333,1334],{},"            \"guest_name\": booking.guest_name,\n",[96,1336,1337],{"class":98,"line":234},[96,1338,1339],{},"            \"booking_id\": booking.id\n",[96,1341,1342],{"class":98,"line":240},[96,1343,1344],{},"        }\n",[96,1346,1347],{"class":98,"line":246},[96,1348,1349],{},"    )\n",[96,1351,1352],{"class":98,"line":251},[96,1353,913],{},[96,1355,1356],{"class":98,"line":256},[96,1357,1358],{},"    # 5. Send welcome message\n",[96,1360,1361],{"class":98,"line":262},[96,1362,1363],{},"    await openclaw.send_message(session, {\n",[96,1365,1366],{"class":98,"line":268},[96,1367,1368],{},"        \"template\": \"hotel_welcome\",\n",[96,1370,1371],{"class":98,"line":274},[96,1372,1373],{},"        \"params\": {\n",[96,1375,1376],{"class":98,"line":280},[96,1377,1378],{},"            \"name\": booking.guest_name,\n",[96,1380,1381],{"class":98,"line":286},[96,1382,1383],{},"            \"room\": booking.room_number,\n",[96,1385,1386],{"class":98,"line":292},[96,1387,1388],{},"            \"wifi_password\": \"premium_access_enabled\",\n",[96,1390,1391],{"class":98,"line":298},[96,1392,1393],{},"            \"breakfast_time\": \"06:30 - 10:00\",\n",[96,1395,1396],{"class":98,"line":304},[96,1397,1398],{},"            \"pool_hours\": \"07:00 - 21:00\",\n",[96,1400,1401],{"class":98,"line":310},[96,1402,1403],{},"            \"gym_hours\": \"24 hours\"\n",[96,1405,1406],{"class":98,"line":316},[96,1407,1344],{},[96,1409,1410],{"class":98,"line":322},[96,1411,1412],{},"    })\n",[96,1414,1415],{"class":98,"line":328},[96,1416,913],{},[96,1418,1419],{"class":98,"line":334},[96,1420,1421],{},"    # 6. Schedule eco-mode activation for this room\n",[96,1423,1424],{"class":98,"line":340},[96,1425,1426],{},"    await bas.schedule_eco_mode(booking.room_number, booking.check_out)\n",[96,1428,1430],{"class":98,"line":1429},43,[96,1431,913],{},[96,1433,1435],{"class":98,"line":1434},44,[96,1436,1437],{},"    return {\"status\": \"verified\", \"session\": session.id}\n",[11,1439,1440,1443],{},[41,1441,1442],{},"Hasilnya:"," Tamu baru aja connect WiFi, langsung dapet WhatsApp welcome lengkap. Nggak perlu repot tanya resepsionis. Seamless. Modern.",[11,1445,77],{},[26,1447,1449],{"id":1448},"green-hotel-reward-system","🌿 Green Hotel Reward System",[11,1451,1452],{},"Ini ide yang menarik dari diskusi: reward tamu yang hemat energi. Tapi gue mau bikin pendekatan yang lebih realistis.",[394,1454,1456],{"id":1455},"kenapa-reward-system-itu-tricky","Kenapa Reward System Itu Tricky?",[11,1458,1459],{},"Jujur aja, kalau tamu udah bayar full, nanya mereka buat hemat energi itu... challenging. Tapi bisa di-framing secara positif:",[11,1461,1462],{},[41,1463,1464],{},"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░ 80% — Pendekatan yang Realistis:",[350,1466,1467,1473,1479,1485],{},[37,1468,1469,1472],{},[41,1470,1471],{},"Eco Mode Opt-In"," — Tamu PILIH sendiri mau ikut program green hotel",[37,1474,1475,1478],{},[41,1476,1477],{},"Transparent Energy Dashboard"," — Tamu bisa lihat berapa energi yang dihemat",[37,1480,1481,1484],{},[41,1482,1483],{},"Gamification"," — Poin, badge, level",[37,1486,1487,1490],{},[41,1488,1489],{},"Tangible Rewards"," — Voucher F&B, late check-out, spa discount, loyalty points",[394,1492,1494],{"id":1493},"arsitektur-reward-system","Arsitektur Reward System",[86,1496,1498],{"className":88,"code":1497,"language":90,"meta":91,"style":91},"flowchart TD\n    subgraph Data[\"📊 Energy Data\"]\n        SMART[\"Smart Meter\u003Cbr\u002F>per Room\"]\n        OCC[\"Occupancy Sensor\u003Cbr\u002F>per Room\"]\n    end\n    \n    subgraph Calc[\"🧮 Calculation Engine\"]\n        BASELINE[\"Baseline\u003Cbr\u002F>(kWh per occupied hour)\"]\n        ACTUAL[\"Actual\u003Cbr\u002F>(kWh measured)\"]\n        SAVE[\"Saved = Baseline - Actual\"]\n        POINTS[\"Points = Saved × Rate\"]\n    end\n    \n    subgraph Reward[\"🎁 Reward Engine\"]\n        TIER[\"Tier System\u003Cbr\u002F>Bronze\u002FSilver\u002FGold\u002FPlatinum\"]\n        REDEEM[\"Redeem Catalog\"]\n        LEADER[\"Leaderboard\u003Cbr\u002F>(Opt-in only)\"]\n    end\n    \n    subgraph Guest[\"👤 Guest Experience\"]\n        DASH[\"Energy Dashboard\u003Cbr\u002F>in App\u002FWA\"]\n        NOTIFY[\"Daily Summary\u003Cbr\u002F>via WhatsApp\"]\n        VOUCHER[\"Digital Voucher\u003Cbr\u002F>QR Code\"]\n    end\n    \n    SMART --> ACTUAL\n    OCC --> BASELINE\n    BASELINE --> SAVE\n    ACTUAL --> SAVE\n    SAVE --> POINTS\n    POINTS --> TIER\n    TIER --> REDEEM\n    POINTS --> LEADER\n    \n    ACTUAL --> DASH\n    SAVE --> NOTIFY\n    REDEEM --> VOUCHER\n",[93,1499,1500,1504,1509,1514,1519,1523,1527,1532,1537,1542,1547,1552,1556,1560,1565,1570,1575,1580,1584,1588,1593,1598,1603,1608,1612,1616,1621,1626,1631,1636,1641,1646,1651,1656,1660,1665,1670],{"__ignoreMap":91},[96,1501,1502],{"class":98,"line":99},[96,1503,102],{},[96,1505,1506],{"class":98,"line":105},[96,1507,1508],{},"    subgraph Data[\"📊 Energy Data\"]\n",[96,1510,1511],{"class":98,"line":111},[96,1512,1513],{},"        SMART[\"Smart Meter\u003Cbr\u002F>per Room\"]\n",[96,1515,1516],{"class":98,"line":117},[96,1517,1518],{},"        OCC[\"Occupancy Sensor\u003Cbr\u002F>per Room\"]\n",[96,1520,1521],{"class":98,"line":123},[96,1522,132],{},[96,1524,1525],{"class":98,"line":129},[96,1526,913],{},[96,1528,1529],{"class":98,"line":135},[96,1530,1531],{},"    subgraph Calc[\"🧮 Calculation Engine\"]\n",[96,1533,1534],{"class":98,"line":142},[96,1535,1536],{},"        BASELINE[\"Baseline\u003Cbr\u002F>(kWh per occupied hour)\"]\n",[96,1538,1539],{"class":98,"line":148},[96,1540,1541],{},"        ACTUAL[\"Actual\u003Cbr\u002F>(kWh measured)\"]\n",[96,1543,1544],{"class":98,"line":154},[96,1545,1546],{},"        SAVE[\"Saved = Baseline - Actual\"]\n",[96,1548,1549],{"class":98,"line":160},[96,1550,1551],{},"        POINTS[\"Points = Saved × Rate\"]\n",[96,1553,1554],{"class":98,"line":166},[96,1555,132],{},[96,1557,1558],{"class":98,"line":172},[96,1559,913],{},[96,1561,1562],{"class":98,"line":177},[96,1563,1564],{},"    subgraph Reward[\"🎁 Reward Engine\"]\n",[96,1566,1567],{"class":98,"line":182},[96,1568,1569],{},"        TIER[\"Tier System\u003Cbr\u002F>Bronze\u002FSilver\u002FGold\u002FPlatinum\"]\n",[96,1571,1572],{"class":98,"line":188},[96,1573,1574],{},"        REDEEM[\"Redeem Catalog\"]\n",[96,1576,1577],{"class":98,"line":194},[96,1578,1579],{},"        LEADER[\"Leaderboard\u003Cbr\u002F>(Opt-in only)\"]\n",[96,1581,1582],{"class":98,"line":200},[96,1583,132],{},[96,1585,1586],{"class":98,"line":206},[96,1587,913],{},[96,1589,1590],{"class":98,"line":211},[96,1591,1592],{},"    subgraph Guest[\"👤 Guest Experience\"]\n",[96,1594,1595],{"class":98,"line":216},[96,1596,1597],{},"        DASH[\"Energy Dashboard\u003Cbr\u002F>in App\u002FWA\"]\n",[96,1599,1600],{"class":98,"line":222},[96,1601,1602],{},"        NOTIFY[\"Daily Summary\u003Cbr\u002F>via WhatsApp\"]\n",[96,1604,1605],{"class":98,"line":228},[96,1606,1607],{},"        VOUCHER[\"Digital Voucher\u003Cbr\u002F>QR Code\"]\n",[96,1609,1610],{"class":98,"line":234},[96,1611,132],{},[96,1613,1614],{"class":98,"line":240},[96,1615,913],{},[96,1617,1618],{"class":98,"line":246},[96,1619,1620],{},"    SMART --> ACTUAL\n",[96,1622,1623],{"class":98,"line":251},[96,1624,1625],{},"    OCC --> BASELINE\n",[96,1627,1628],{"class":98,"line":256},[96,1629,1630],{},"    BASELINE --> SAVE\n",[96,1632,1633],{"class":98,"line":262},[96,1634,1635],{},"    ACTUAL --> SAVE\n",[96,1637,1638],{"class":98,"line":268},[96,1639,1640],{},"    SAVE --> POINTS\n",[96,1642,1643],{"class":98,"line":274},[96,1644,1645],{},"    POINTS --> TIER\n",[96,1647,1648],{"class":98,"line":280},[96,1649,1650],{},"    TIER --> REDEEM\n",[96,1652,1653],{"class":98,"line":286},[96,1654,1655],{},"    POINTS --> LEADER\n",[96,1657,1658],{"class":98,"line":292},[96,1659,913],{},[96,1661,1662],{"class":98,"line":298},[96,1663,1664],{},"    ACTUAL --> DASH\n",[96,1666,1667],{"class":98,"line":304},[96,1668,1669],{},"    SAVE --> NOTIFY\n",[96,1671,1672],{"class":98,"line":310},[96,1673,1674],{},"    REDEEM --> VOUCHER\n",[394,1676,1678],{"id":1677},"contoh-implementasi","Contoh Implementasi",[86,1680,1682],{"className":411,"code":1681,"language":413,"meta":91,"style":91},"# Green Hotel Reward Calculator\nclass GreenRewardEngine:\n    BASELINE_KWH_PER_HOUR = {\n        \"standard\": 2.5,    # AC, lights, TV\n        \"deluxe\": 3.5,      # Bigger room, more fixtures\n        \"suite\": 5.0        # Multiple rooms\n    }\n    \n    POINT_RATE = 10  # points per kWh saved\n    \n    TIERS = {\n        \"bronze\": 0,\n        \"silver\": 100,\n        \"gold\": 500,\n        \"platinum\": 1500\n    }\n    \n    def calculate_stay_rewards(self, room_type: str, hours_occupied: int, \n                                actual_kwh: float) -> dict:\n        baseline = self.BASELINE_KWH_PER_HOUR[room_type] * hours_occupied\n        saved = max(0, baseline - actual_kwh)\n        points = int(saved * self.POINT_RATE)\n        \n        # Determine tier\n        tier = \"bronze\"\n        for name, threshold in self.TIERS.items():\n            if points >= threshold:\n                tier = name\n        \n        # Calculate monetary value\n        point_value = {\n            \"bronze\": 50,    # Rp 50 per point\n            \"silver\": 75,\n            \"gold\": 100,\n            \"platinum\": 150\n        }\n        \n        return {\n            \"baseline_kwh\": baseline,\n            \"actual_kwh\": actual_kwh,\n            \"saved_kwh\": saved,\n            \"savings_percent\": (saved \u002F baseline * 100) if baseline > 0 else 0,\n            \"points_earned\": points,\n            \"tier\": tier,\n            \"voucher_value_rp\": points * point_value[tier]\n        }\n",[93,1683,1684,1689,1694,1699,1704,1709,1714,1719,1723,1728,1732,1737,1742,1747,1752,1757,1761,1765,1770,1775,1780,1785,1790,1794,1799,1804,1809,1814,1819,1823,1828,1833,1838,1843,1848,1853,1857,1861,1866,1871,1876,1881,1886,1891,1896,1902],{"__ignoreMap":91},[96,1685,1686],{"class":98,"line":99},[96,1687,1688],{},"# Green Hotel Reward Calculator\n",[96,1690,1691],{"class":98,"line":105},[96,1692,1693],{},"class GreenRewardEngine:\n",[96,1695,1696],{"class":98,"line":111},[96,1697,1698],{},"    BASELINE_KWH_PER_HOUR = {\n",[96,1700,1701],{"class":98,"line":117},[96,1702,1703],{},"        \"standard\": 2.5,    # AC, lights, TV\n",[96,1705,1706],{"class":98,"line":123},[96,1707,1708],{},"        \"deluxe\": 3.5,      # Bigger room, more fixtures\n",[96,1710,1711],{"class":98,"line":129},[96,1712,1713],{},"        \"suite\": 5.0        # Multiple rooms\n",[96,1715,1716],{"class":98,"line":135},[96,1717,1718],{},"    }\n",[96,1720,1721],{"class":98,"line":142},[96,1722,913],{},[96,1724,1725],{"class":98,"line":148},[96,1726,1727],{},"    POINT_RATE = 10  # points per kWh saved\n",[96,1729,1730],{"class":98,"line":154},[96,1731,913],{},[96,1733,1734],{"class":98,"line":160},[96,1735,1736],{},"    TIERS = {\n",[96,1738,1739],{"class":98,"line":166},[96,1740,1741],{},"        \"bronze\": 0,\n",[96,1743,1744],{"class":98,"line":172},[96,1745,1746],{},"        \"silver\": 100,\n",[96,1748,1749],{"class":98,"line":177},[96,1750,1751],{},"        \"gold\": 500,\n",[96,1753,1754],{"class":98,"line":182},[96,1755,1756],{},"        \"platinum\": 1500\n",[96,1758,1759],{"class":98,"line":188},[96,1760,1718],{},[96,1762,1763],{"class":98,"line":194},[96,1764,913],{},[96,1766,1767],{"class":98,"line":200},[96,1768,1769],{},"    def calculate_stay_rewards(self, room_type: str, hours_occupied: int, \n",[96,1771,1772],{"class":98,"line":206},[96,1773,1774],{},"                                actual_kwh: float) -> dict:\n",[96,1776,1777],{"class":98,"line":211},[96,1778,1779],{},"        baseline = self.BASELINE_KWH_PER_HOUR[room_type] * hours_occupied\n",[96,1781,1782],{"class":98,"line":216},[96,1783,1784],{},"        saved = max(0, baseline - actual_kwh)\n",[96,1786,1787],{"class":98,"line":222},[96,1788,1789],{},"        points = int(saved * self.POINT_RATE)\n",[96,1791,1792],{"class":98,"line":228},[96,1793,450],{},[96,1795,1796],{"class":98,"line":234},[96,1797,1798],{},"        # Determine tier\n",[96,1800,1801],{"class":98,"line":240},[96,1802,1803],{},"        tier = \"bronze\"\n",[96,1805,1806],{"class":98,"line":246},[96,1807,1808],{},"        for name, threshold in self.TIERS.items():\n",[96,1810,1811],{"class":98,"line":251},[96,1812,1813],{},"            if points >= threshold:\n",[96,1815,1816],{"class":98,"line":256},[96,1817,1818],{},"                tier = name\n",[96,1820,1821],{"class":98,"line":262},[96,1822,450],{},[96,1824,1825],{"class":98,"line":268},[96,1826,1827],{},"        # Calculate monetary value\n",[96,1829,1830],{"class":98,"line":274},[96,1831,1832],{},"        point_value = {\n",[96,1834,1835],{"class":98,"line":280},[96,1836,1837],{},"            \"bronze\": 50,    # Rp 50 per point\n",[96,1839,1840],{"class":98,"line":286},[96,1841,1842],{},"            \"silver\": 75,\n",[96,1844,1845],{"class":98,"line":292},[96,1846,1847],{},"            \"gold\": 100,\n",[96,1849,1850],{"class":98,"line":298},[96,1851,1852],{},"            \"platinum\": 150\n",[96,1854,1855],{"class":98,"line":304},[96,1856,1344],{},[96,1858,1859],{"class":98,"line":310},[96,1860,450],{},[96,1862,1863],{"class":98,"line":316},[96,1864,1865],{},"        return {\n",[96,1867,1868],{"class":98,"line":322},[96,1869,1870],{},"            \"baseline_kwh\": baseline,\n",[96,1872,1873],{"class":98,"line":328},[96,1874,1875],{},"            \"actual_kwh\": actual_kwh,\n",[96,1877,1878],{"class":98,"line":334},[96,1879,1880],{},"            \"saved_kwh\": saved,\n",[96,1882,1883],{"class":98,"line":340},[96,1884,1885],{},"            \"savings_percent\": (saved \u002F baseline * 100) if baseline > 0 else 0,\n",[96,1887,1888],{"class":98,"line":1429},[96,1889,1890],{},"            \"points_earned\": points,\n",[96,1892,1893],{"class":98,"line":1434},[96,1894,1895],{},"            \"tier\": tier,\n",[96,1897,1899],{"class":98,"line":1898},45,[96,1900,1901],{},"            \"voucher_value_rp\": points * point_value[tier]\n",[96,1903,1905],{"class":98,"line":1904},46,[96,1906,1344],{},[394,1908,1910],{"id":1909},"whatsapp-daily-summary","WhatsApp Daily Summary",[86,1912,1915],{"className":1913,"code":1914,"language":1116},[1114],"🌿 Green Hotel Report — Kamar 204\n\nKemarin kamu hemat 3.2 kWh listrik! 🎉\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░ 80% lebih hemat dari rata-rata\n\n📊 Energy Summary:\n⚡ Total: 5.1 kWh\n🌿 Baseline: 8.3 kWh\n✅ Hemat: 3.2 kWh\n💰 Setara: Rp 4.800\n\n🏆 Green Points: +32 poin\n📊 Total: 156 poin (Silver Tier 🥈)\n\n🎁 Rewards yang bisa kamu redeem:\n• Late check-out sampai jam 14:00 (50 poin)\n• Diskon 20% spa treatment (80 poin)\n• Gratis 1 minuman di lobby bar (30 poin)\n\nKetik \"redeem [nomor]\" untuk klaim reward!\n",[93,1916,1914],{"__ignoreMap":91},[394,1918,1920],{"id":1919},"token-economy-lebih-dari-sekadar-poin","Token Economy — Lebih dari Sekadar Poin",[11,1922,1923,1924,1927],{},"Di diskusi, ada ide yang menarik: bukan cuma poin biasa, tapi ",[41,1925,1926],{},"token system"," yang punya nilai ekonomi. Dan ini bisa diimplementasikan tanpa blockchain (nggak perlu rug-pull 🤣).",[11,1929,1930],{},[41,1931,1932],{},"Konsep Token Hotel:",[11,1934,1935,1936,1939],{},"Token itu pada dasarnya ",[41,1937,1938],{},"loyalty currency yang di-issued oleh hotel",". Bukan crypto, bukan blockchain — cuma digital token yang dikelola hotel. Tapi dengan twist: nilainya bisa naik seiring demand.",[86,1941,1943],{"className":88,"code":1942,"language":90,"meta":91,"style":91},"flowchart LR\n    SAVE[\"🌿 Tamu Hemat Energi\"] --> EARN[\"+Token\"]\n    EARN --> WALLET[\"💰 Token Wallet\"]\n    \n    WALLET --> R1[\"🍽️ Makan di F&B Hotel\"]\n    WALLET --> R2[\"🛍️ Beli Souvenir\"]\n    WALLET --> R3[\"🏨 Diskon Next Stay\"]\n    WALLET --> R4[\"👕 Merchandise Hotel\"]\n    WALLET --> R5[\"🧖 Spa & Wellness\"]\n    WALLET --> R6[\"💳 Top-up Sendiri\"]\n    \n    R1 -->|Revenue ke Hotel| REV[\"💰 Hotel Revenue\"]\n    R3 -->|Repeat Booking| REV\n    R6 -->|Cash Flow| REV\n",[93,1944,1945,1949,1954,1959,1963,1968,1973,1978,1983,1988,1993,1997,2002,2007],{"__ignoreMap":91},[96,1946,1947],{"class":98,"line":99},[96,1948,898],{},[96,1950,1951],{"class":98,"line":105},[96,1952,1953],{},"    SAVE[\"🌿 Tamu Hemat Energi\"] --> EARN[\"+Token\"]\n",[96,1955,1956],{"class":98,"line":111},[96,1957,1958],{},"    EARN --> WALLET[\"💰 Token Wallet\"]\n",[96,1960,1961],{"class":98,"line":117},[96,1962,913],{},[96,1964,1965],{"class":98,"line":123},[96,1966,1967],{},"    WALLET --> R1[\"🍽️ Makan di F&B Hotel\"]\n",[96,1969,1970],{"class":98,"line":129},[96,1971,1972],{},"    WALLET --> R2[\"🛍️ Beli Souvenir\"]\n",[96,1974,1975],{"class":98,"line":135},[96,1976,1977],{},"    WALLET --> R3[\"🏨 Diskon Next Stay\"]\n",[96,1979,1980],{"class":98,"line":142},[96,1981,1982],{},"    WALLET --> R4[\"👕 Merchandise Hotel\"]\n",[96,1984,1985],{"class":98,"line":148},[96,1986,1987],{},"    WALLET --> R5[\"🧖 Spa & Wellness\"]\n",[96,1989,1990],{"class":98,"line":154},[96,1991,1992],{},"    WALLET --> R6[\"💳 Top-up Sendiri\"]\n",[96,1994,1995],{"class":98,"line":160},[96,1996,913],{},[96,1998,1999],{"class":98,"line":166},[96,2000,2001],{},"    R1 -->|Revenue ke Hotel| REV[\"💰 Hotel Revenue\"]\n",[96,2003,2004],{"class":98,"line":172},[96,2005,2006],{},"    R3 -->|Repeat Booking| REV\n",[96,2008,2009],{"class":98,"line":177},[96,2010,2011],{},"    R6 -->|Cash Flow| REV\n",[11,2013,2014],{},[41,2015,2016],{},"Mekanisme Token:",[599,2018,2019,2029],{},[602,2020,2021],{},[605,2022,2023,2026],{},[608,2024,2025],{},"Aspek",[608,2027,2028],{},"Detail",[618,2030,2031,2041,2051,2061,2071,2081,2091],{},[605,2032,2033,2038],{},[623,2034,2035],{},[41,2036,2037],{},"Cara dapet",[623,2039,2040],{},"Hemat energi, opt-in eco mode, review positif, referral",[605,2042,2043,2048],{},[623,2044,2045],{},[41,2046,2047],{},"Cara pakai",[623,2049,2050],{},"F&B, souvenir, merchandise, diskon kamar, spa",[605,2052,2053,2058],{},[623,2054,2055],{},[41,2056,2057],{},"Nilai dasar",[623,2059,2060],{},"1 token = Rp 1,000 (dapat ditentukan hotel)",[605,2062,2063,2068],{},[623,2064,2065],{},[41,2066,2067],{},"Appreciation",[623,2069,2070],{},"Harga token bisa naik saat high season (demand tinggi)",[605,2072,2073,2078],{},[623,2074,2075],{},[41,2076,2077],{},"Top-up",[623,2079,2080],{},"Tamu bisa beli tambahan token (opsional)",[605,2082,2083,2088],{},[623,2084,2085],{},[41,2086,2087],{},"Transfer",[623,2089,2090],{},"Bisa dikirim ke tamu lain di hotel yang sama",[605,2092,2093,2098],{},[623,2094,2095],{},[41,2096,2097],{},"Expiry",[623,2099,2100],{},"Berlaku 1 tahun dari diterbitkan",[11,2102,2103],{},[41,2104,2105],{},"Kenapa ini lebih dari sekadar poin biasa?",[11,2107,2108],{},"Poin loyalty konvensional itu membosankan. \"Kumpulkan 1000 poin, dapet free drink.\" Tamu nggak excited. Tapi kalau sistem-nya kayak game — ada token, ada wallet, bisa di-top-up, nilainya naik turun — itu beda. Tamu jadi aktif participate.",[11,2110,2111],{},"Contoh conversational flow:",[86,2113,2116],{"className":2114,"code":2115,"language":1116},[1114],"Tamu: Gue mau tuker token buat makan di restoran hotel\n\nAI Concierge: 💰 Token Wallet kamu:\n   Balance: 245 tokens\n   Value: Rp 245,000\n\nRestoran Hotel tersedia:\n1. Nasi Goreng Spesial — 35 tokens (Rp 35,000)\n2. Sate Ayam Madura — 45 tokens (Rp 45,000)\n3. Grilled Salmon — 120 tokens (Rp 120,000)\n4. Seafood Platter — 200 tokens (Rp 200,000)\n\nPilih menu yang mau dituker?\n\nTamu: Nomor 3 dong\n\nAI Concierge: ✅ 120 tokens dituker untuk Grilled Salmon\nSisa balance: 125 tokens\n\nPesanan udah dikirim ke kitchen. Estimasi 15-20 menit.\nMau dine-in atau room service?\n\nTamu: Room service\n\nAI Concierge: 🛎️ Done! Grilled Salmon menuju kamar 204.\nBon pembayaran: 120 tokens (fully paid, no cash needed).\nSelamat menikmati! 🐟\n",[93,2117,2115],{"__ignoreMap":91},[11,2119,2120,2123],{},[41,2121,2122],{},"Revenue Impact:"," Tamu yang punya token cenderung spending di hotel (bukan di luar). Token本质上 bikin captive economy di dalam hotel. F&B revenue naik, souvenir laku, repeat booking meningkat.",[11,2125,77],{},[26,2127,2129],{"id":2128},"security-isolasi-kamar-validasi-tamu","🔒 Security — Isolasi Kamar & Validasi Tamu",[11,2131,2132],{},"Ini CRITICAL. Hotel harus memastikan:",[350,2134,2135,2138,2141],{},[37,2136,2137],{},"Tamu cuma bisa kontrol kamar sendiri",[37,2139,2140],{},"Tamu cuma akses data selama masa booking",[37,2142,2143],{},"Cross-room access mustahil",[86,2145,2147],{"className":88,"code":2146,"language":90,"meta":91,"style":91},"flowchart TD\n    MSG[\"Incoming Message\"] --> AUTH{\"Authentication\"}\n    \n    subgraph AuthCheck[\"🔐 Auth Layer\"]\n        PHONE[\"Phone Number\u003Cbr\u002F>Match Booking?\"]\n        ROOM[\"Room Number\u003Cbr\u002F>from Booking\"]\n        DATE[\"Current Date\u003Cbr\u002F>within Booking?\"]\n        SESSION[\"Active Session\u003Cbr\u002F>exists?\"]\n    end\n    \n    AUTH --> PHONE\n    PHONE -->|Match| ROOM\n    PHONE -->|No Match| DENY1[\"❌ Unknown Guest\u003Cbr\u002F>Basic FAQ Only\"]\n    ROOM --> DATE\n    DATE -->|Valid| SESSION\n    DATE -->|Expired| DENY2[\"❌ Booking Expired\u003Cbr\u002F>Thank You Message\"]\n    SESSION -->|Yes| ALLOW[\"✅ Full Access\"]\n    SESSION -->|No| NEW[\"🔄 Create New Session\"]\n    NEW --> ALLOW\n    \n    ALLOW --> TOOLS[\"BAS Control\u003Cbr\u002F>Room Service\u003Cbr\u002F>Recommendations\"]\n    \n    DENY1 --> LIMIT[\"Limit to:\u003Cbr\u002F>• Hotel FAQ\u003Cbr\u002F>• Booking inquiry\u003Cbr\u002F>• General info\"]\n",[93,2148,2149,2153,2158,2162,2167,2172,2177,2182,2187,2191,2195,2200,2205,2210,2215,2220,2225,2230,2235,2240,2244,2249,2253],{"__ignoreMap":91},[96,2150,2151],{"class":98,"line":99},[96,2152,102],{},[96,2154,2155],{"class":98,"line":105},[96,2156,2157],{},"    MSG[\"Incoming Message\"] --> AUTH{\"Authentication\"}\n",[96,2159,2160],{"class":98,"line":111},[96,2161,913],{},[96,2163,2164],{"class":98,"line":117},[96,2165,2166],{},"    subgraph AuthCheck[\"🔐 Auth Layer\"]\n",[96,2168,2169],{"class":98,"line":123},[96,2170,2171],{},"        PHONE[\"Phone Number\u003Cbr\u002F>Match Booking?\"]\n",[96,2173,2174],{"class":98,"line":129},[96,2175,2176],{},"        ROOM[\"Room Number\u003Cbr\u002F>from Booking\"]\n",[96,2178,2179],{"class":98,"line":135},[96,2180,2181],{},"        DATE[\"Current Date\u003Cbr\u002F>within Booking?\"]\n",[96,2183,2184],{"class":98,"line":142},[96,2185,2186],{},"        SESSION[\"Active Session\u003Cbr\u002F>exists?\"]\n",[96,2188,2189],{"class":98,"line":148},[96,2190,132],{},[96,2192,2193],{"class":98,"line":154},[96,2194,913],{},[96,2196,2197],{"class":98,"line":160},[96,2198,2199],{},"    AUTH --> PHONE\n",[96,2201,2202],{"class":98,"line":166},[96,2203,2204],{},"    PHONE -->|Match| ROOM\n",[96,2206,2207],{"class":98,"line":172},[96,2208,2209],{},"    PHONE -->|No Match| DENY1[\"❌ Unknown Guest\u003Cbr\u002F>Basic FAQ Only\"]\n",[96,2211,2212],{"class":98,"line":177},[96,2213,2214],{},"    ROOM --> DATE\n",[96,2216,2217],{"class":98,"line":182},[96,2218,2219],{},"    DATE -->|Valid| SESSION\n",[96,2221,2222],{"class":98,"line":188},[96,2223,2224],{},"    DATE -->|Expired| DENY2[\"❌ Booking Expired\u003Cbr\u002F>Thank You Message\"]\n",[96,2226,2227],{"class":98,"line":194},[96,2228,2229],{},"    SESSION -->|Yes| ALLOW[\"✅ Full Access\"]\n",[96,2231,2232],{"class":98,"line":200},[96,2233,2234],{},"    SESSION -->|No| NEW[\"🔄 Create New Session\"]\n",[96,2236,2237],{"class":98,"line":206},[96,2238,2239],{},"    NEW --> ALLOW\n",[96,2241,2242],{"class":98,"line":211},[96,2243,913],{},[96,2245,2246],{"class":98,"line":216},[96,2247,2248],{},"    ALLOW --> TOOLS[\"BAS Control\u003Cbr\u002F>Room Service\u003Cbr\u002F>Recommendations\"]\n",[96,2250,2251],{"class":98,"line":222},[96,2252,913],{},[96,2254,2255],{"class":98,"line":228},[96,2256,2257],{},"    DENY1 --> LIMIT[\"Limit to:\u003Cbr\u002F>• Hotel FAQ\u003Cbr\u002F>• Booking inquiry\u003Cbr\u002F>• General info\"]\n",[11,2259,2260],{},[41,2261,2262],{},"Implementasi middleware OpenClaw:",[86,2264,2266],{"className":411,"code":2265,"language":413,"meta":91,"style":91},"# Middleware: Hotel guest authentication\nasync def authenticate_hotel_guest(message, context):\n    phone = message.sender\n    now = datetime.now()\n    \n    # 1. Check if phone matches any active booking\n    booking = await pms.get_active_booking(phone, now)\n    \n    if not booking:\n        # Unknown guest — limit access\n        return {\n            \"authenticated\": False,\n            \"access_level\": \"public\",\n            \"allowed_tools\": [\"hotel_faq\", \"booking_inquiry\", \"contact_info\"]\n        }\n    \n    # 2. Check if booking is still valid\n    if now \u003C booking.check_in or now > booking.check_out + timedelta(hours=12):\n        return {\n            \"authenticated\": False,\n            \"access_level\": \"expired\",\n            \"allowed_tools\": [\"hotel_faq\", \"contact_info\"],\n            \"message\": \"Terima kasih telah menginap! Semoga perjalanan menyenangkan 🙏\"\n        }\n    \n    # 3. Full authentication\n    return {\n        \"authenticated\": True,\n        \"access_level\": \"full\",\n        \"guest_data\": {\n            \"name\": booking.guest_name,\n            \"room\": booking.room_number,\n            \"room_type\": booking.room_type,\n            \"check_in\": booking.check_in,\n            \"check_out\": booking.check_out,\n            \"vip\": booking.is_vip\n        },\n        \"allowed_tools\": [\"bas_control\", \"room_service\", \"recommendations\", \n                         \"transport\", \"complaints\", \"green_rewards\"]\n    }\n",[93,2267,2268,2273,2278,2283,2288,2292,2297,2302,2306,2310,2315,2319,2324,2329,2334,2338,2342,2347,2352,2356,2360,2365,2370,2375,2379,2383,2388,2393,2398,2403,2408,2412,2416,2421,2425,2429,2434,2439,2444,2449],{"__ignoreMap":91},[96,2269,2270],{"class":98,"line":99},[96,2271,2272],{},"# Middleware: Hotel guest authentication\n",[96,2274,2275],{"class":98,"line":105},[96,2276,2277],{},"async def authenticate_hotel_guest(message, context):\n",[96,2279,2280],{"class":98,"line":111},[96,2281,2282],{},"    phone = message.sender\n",[96,2284,2285],{"class":98,"line":117},[96,2286,2287],{},"    now = datetime.now()\n",[96,2289,2290],{"class":98,"line":123},[96,2291,913],{},[96,2293,2294],{"class":98,"line":129},[96,2295,2296],{},"    # 1. Check if phone matches any active booking\n",[96,2298,2299],{"class":98,"line":135},[96,2300,2301],{},"    booking = await pms.get_active_booking(phone, now)\n",[96,2303,2304],{"class":98,"line":142},[96,2305,913],{},[96,2307,2308],{"class":98,"line":148},[96,2309,1252],{},[96,2311,2312],{"class":98,"line":154},[96,2313,2314],{},"        # Unknown guest — limit access\n",[96,2316,2317],{"class":98,"line":160},[96,2318,1865],{},[96,2320,2321],{"class":98,"line":166},[96,2322,2323],{},"            \"authenticated\": False,\n",[96,2325,2326],{"class":98,"line":172},[96,2327,2328],{},"            \"access_level\": \"public\",\n",[96,2330,2331],{"class":98,"line":177},[96,2332,2333],{},"            \"allowed_tools\": [\"hotel_faq\", \"booking_inquiry\", \"contact_info\"]\n",[96,2335,2336],{"class":98,"line":182},[96,2337,1344],{},[96,2339,2340],{"class":98,"line":188},[96,2341,913],{},[96,2343,2344],{"class":98,"line":194},[96,2345,2346],{},"    # 2. Check if booking is still valid\n",[96,2348,2349],{"class":98,"line":200},[96,2350,2351],{},"    if now \u003C booking.check_in or now > booking.check_out + timedelta(hours=12):\n",[96,2353,2354],{"class":98,"line":206},[96,2355,1865],{},[96,2357,2358],{"class":98,"line":211},[96,2359,2323],{},[96,2361,2362],{"class":98,"line":216},[96,2363,2364],{},"            \"access_level\": \"expired\",\n",[96,2366,2367],{"class":98,"line":222},[96,2368,2369],{},"            \"allowed_tools\": [\"hotel_faq\", \"contact_info\"],\n",[96,2371,2372],{"class":98,"line":228},[96,2373,2374],{},"            \"message\": \"Terima kasih telah menginap! Semoga perjalanan menyenangkan 🙏\"\n",[96,2376,2377],{"class":98,"line":234},[96,2378,1344],{},[96,2380,2381],{"class":98,"line":240},[96,2382,913],{},[96,2384,2385],{"class":98,"line":246},[96,2386,2387],{},"    # 3. Full authentication\n",[96,2389,2390],{"class":98,"line":251},[96,2391,2392],{},"    return {\n",[96,2394,2395],{"class":98,"line":256},[96,2396,2397],{},"        \"authenticated\": True,\n",[96,2399,2400],{"class":98,"line":262},[96,2401,2402],{},"        \"access_level\": \"full\",\n",[96,2404,2405],{"class":98,"line":268},[96,2406,2407],{},"        \"guest_data\": {\n",[96,2409,2410],{"class":98,"line":274},[96,2411,1378],{},[96,2413,2414],{"class":98,"line":280},[96,2415,1383],{},[96,2417,2418],{"class":98,"line":286},[96,2419,2420],{},"            \"room_type\": booking.room_type,\n",[96,2422,2423],{"class":98,"line":292},[96,2424,1324],{},[96,2426,2427],{"class":98,"line":298},[96,2428,1329],{},[96,2430,2431],{"class":98,"line":304},[96,2432,2433],{},"            \"vip\": booking.is_vip\n",[96,2435,2436],{"class":98,"line":310},[96,2437,2438],{},"        },\n",[96,2440,2441],{"class":98,"line":316},[96,2442,2443],{},"        \"allowed_tools\": [\"bas_control\", \"room_service\", \"recommendations\", \n",[96,2445,2446],{"class":98,"line":322},[96,2447,2448],{},"                         \"transport\", \"complaints\", \"green_rewards\"]\n",[96,2450,2451],{"class":98,"line":328},[96,2452,1718],{},[11,2454,77],{},[26,2456,2458],{"id":2457},"analisis-biaya-roi","💰 Analisis Biaya & ROI",[11,2460,2461],{},"Sebagai orang engineering, gue suka ngitung-ngitung. Ini analisis kasar untuk hotel 200 kamar:",[394,2463,2465],{"id":2464},"biaya-implementasi","Biaya Implementasi",[599,2467,2468,2481],{},[602,2469,2470],{},[605,2471,2472,2475,2478],{},[608,2473,2474],{},"Komponen",[608,2476,2477],{},"Estimasi Biaya",[608,2479,2480],{},"Keterangan",[618,2482,2483,2494,2505,2516,2527,2538,2549,2564],{},[605,2484,2485,2488,2491],{},[623,2486,2487],{},"OpenClaw Setup (VPS)",[623,2489,2490],{},"Rp 500rb-1jt\u002Fbulan",[623,2492,2493],{},"VPS + OpenClaw license",[605,2495,2496,2499,2502],{},[623,2497,2498],{},"BAS Integration",[623,2500,2501],{},"Rp 20-50jt (one-time)",[623,2503,2504],{},"Tergantung brand & scope",[605,2506,2507,2510,2513],{},[623,2508,2509],{},"WhatsApp Business API",[623,2511,2512],{},"Rp 500rb-2jt\u002Fbulan",[623,2514,2515],{},"Tergantung volume",[605,2517,2518,2521,2524],{},[623,2519,2520],{},"WiFi Portal Modifikasi",[623,2522,2523],{},"Rp 5-10jt (one-time)",[623,2525,2526],{},"Email capture + API",[605,2528,2529,2532,2535],{},[623,2530,2531],{},"Smart Sensors",[623,2533,2534],{},"Rp 500rb-2jt\u002Fkamar",[623,2536,2537],{},"Motion + door + power",[605,2539,2540,2543,2546],{},[623,2541,2542],{},"Custom Development",[623,2544,2545],{},"Rp 15-30jt",[623,2547,2548],{},"Skill development, API, UI",[605,2550,2551,2556,2561],{},[623,2552,2553],{},[41,2554,2555],{},"Total Setup",[623,2557,2558],{},[41,2559,2560],{},"Rp 40-90jt",[623,2562,2563],{},"One-time",[605,2565,2566,2571,2576],{},[623,2567,2568],{},[41,2569,2570],{},"Monthly Ops",[623,2572,2573],{},[41,2574,2575],{},"Rp 1-3.5jt",[623,2577,2578],{},"Recurring",[394,2580,2582],{"id":2581},"potensi-penghematan-energi","Potensi Penghematan Energi",[86,2584,2587],{"className":2585,"code":2586,"language":1116},[1114],"📊 Skenario Hotel 200 Kamar, 70% Occupancy\n\nBaseline Energy (tanpa automasi):\n  AC: 200 × 70% × 24h × 2.5kWh = 8,400 kWh\u002Fhari\n  Lighting: 200 × 70% × 12h × 0.5kWh = 840 kWh\u002Fhari\n  Total: ~9,240 kWh\u002Fhari\n\nDengan BAS + OpenClaw:\n  Eco mode saat kamar kosong (est. 8 jam\u002Fhari):\n  - AC: 200 × 70% × (16h comfort + 8h eco) × avg 1.8kWh = 6,048 kWh\u002Fhari\n  - Lighting: Auto-off saat kosong → 600 kWh\u002Fhari\n  Total: ~6,648 kWh\u002Fhari\n\nPenghematan: 2,592 kWh\u002Fhari (28%)\nBiaya listrik: Rp 1,500\u002FkWh\nHemat per hari: Rp 3,888,000\nHemat per bulan: ~Rp 116,640,000\n",[93,2588,2586],{"__ignoreMap":91},[11,2590,2591],{},"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░ 80% ROI dalam 1-2 bulan dari sisi energi saja!",[11,2593,2594],{},"Belum termasuk:",[34,2596,2597,2600,2603],{},[37,2598,2599],{},"Revenue increase dari better guest experience",[37,2601,2602],{},"Operational efficiency (less manual work)",[37,2604,2605],{},"Brand value (green hotel certification)",[11,2607,77],{},[26,2609,2611],{"id":2610},"️-setup-openclaw-untuk-smart-hotel","🛠️ Setup OpenClaw untuk Smart Hotel",[11,2613,2614],{},"Sekarang masuk ke bagian teknis — gimana cara setup OpenClaw untuk use case ini.",[394,2616,2618],{"id":2617},"step-1-install-konfigurasi-openclaw","Step 1: Install & Konfigurasi OpenClaw",[86,2620,2624],{"className":2621,"code":2622,"language":2623,"meta":91,"style":91},"language-bash shiki shiki-themes github-light github-dark","# Di VPS khusus hotel (atau shared)\nnpm install -g openclaw\nopenclaw init hotel-assistant\ncd hotel-assistant\n\n# Setup environment\ncat > .env \u003C\u003C 'EOF'\nOPENCLAW_MODEL=anthropic\u002Fclaude-sonnet-4-20250514\nOPENCLAW_CHANNEL=whatsapp\nWHATSAPP_WEBHOOK_URL=https:\u002F\u002Fyour-hotel.com\u002Fapi\u002Fwhatsapp\nBAS_API_URL=http:\u002F\u002F192.168.1.100:502\nPMS_API_URL=https:\u002F\u002Fyour-pms.com\u002Fapi\nGREEN_REWARD_ENABLED=true\nEOF\n","bash",[93,2625,2626,2631,2646,2657,2664,2668,2673,2691,2696,2701,2706,2711,2716,2721],{"__ignoreMap":91},[96,2627,2628],{"class":98,"line":99},[96,2629,2630],{"class":703},"# Di VPS khusus hotel (atau shared)\n",[96,2632,2633,2637,2640,2643],{"class":98,"line":105},[96,2634,2636],{"class":2635},"sScJk","npm",[96,2638,2639],{"class":717}," install",[96,2641,2642],{"class":738}," -g",[96,2644,2645],{"class":717}," openclaw\n",[96,2647,2648,2651,2654],{"class":98,"line":111},[96,2649,2650],{"class":2635},"openclaw",[96,2652,2653],{"class":717}," init",[96,2655,2656],{"class":717}," hotel-assistant\n",[96,2658,2659,2662],{"class":98,"line":117},[96,2660,2661],{"class":738},"cd",[96,2663,2656],{"class":717},[96,2665,2666],{"class":98,"line":123},[96,2667,139],{"emptyLinePlaceholder":138},[96,2669,2670],{"class":98,"line":129},[96,2671,2672],{"class":703},"# Setup environment\n",[96,2674,2675,2678,2682,2685,2688],{"class":98,"line":135},[96,2676,2677],{"class":2635},"cat",[96,2679,2681],{"class":2680},"szBVR"," >",[96,2683,2684],{"class":717}," .env",[96,2686,2687],{"class":2680}," \u003C\u003C",[96,2689,2690],{"class":717}," 'EOF'\n",[96,2692,2693],{"class":98,"line":142},[96,2694,2695],{"class":717},"OPENCLAW_MODEL=anthropic\u002Fclaude-sonnet-4-20250514\n",[96,2697,2698],{"class":98,"line":148},[96,2699,2700],{"class":717},"OPENCLAW_CHANNEL=whatsapp\n",[96,2702,2703],{"class":98,"line":154},[96,2704,2705],{"class":717},"WHATSAPP_WEBHOOK_URL=https:\u002F\u002Fyour-hotel.com\u002Fapi\u002Fwhatsapp\n",[96,2707,2708],{"class":98,"line":160},[96,2709,2710],{"class":717},"BAS_API_URL=http:\u002F\u002F192.168.1.100:502\n",[96,2712,2713],{"class":98,"line":166},[96,2714,2715],{"class":717},"PMS_API_URL=https:\u002F\u002Fyour-pms.com\u002Fapi\n",[96,2717,2718],{"class":98,"line":172},[96,2719,2720],{"class":717},"GREEN_REWARD_ENABLED=true\n",[96,2722,2723],{"class":98,"line":177},[96,2724,2725],{"class":717},"EOF\n",[394,2727,2729],{"id":2728},"step-2-buat-hotel-specific-skills","Step 2: Buat Hotel-Specific Skills",[86,2731,2734],{"className":2732,"code":2733,"language":1116},[1114],"skills\u002F\n├── bas-control\u002F\n│   ├── SKILL.md\n│   └── scripts\u002F\n│       ├── hvac-control.py      # AC on\u002Foff\u002Feco\n│       ├── lighting-control.py  # Lights on\u002Foff\u002Fdim\n│       └── energy-report.py     # Energy usage report\n├── hotel-concierge\u002F\n│   ├── SKILL.md\n│   └── scripts\u002F\n│       ├── restaurant-search.py # Local restaurant DB\n│       ├── attraction-guide.py  # Tourist attractions\n│       ├── transport-booking.py # Grab\u002FGojek integration\n│       └── hotel-faq.py         # FAQ knowledge base\n├── green-rewards\u002F\n│   ├── SKILL.md\n│   └── scripts\u002F\n│       ├── reward-calculator.py # Points calculation\n│       ├── tier-checker.py      # Tier determination\n│       └── daily-report.py      # WhatsApp summary\n└── guest-auth\u002F\n    ├── SKILL.md\n    └── scripts\u002F\n        ├── auth-middleware.py    # Guest authentication\n        ├── booking-validator.py  # Booking date check\n        └── session-manager.py    # Session management\n",[93,2735,2733],{"__ignoreMap":91},[394,2737,2739],{"id":2738},"step-3-konfigurasi-channel-routing","Step 3: Konfigurasi Channel Routing",[86,2741,2743],{"className":694,"code":2742,"language":696,"meta":91,"style":91},"# openclaw.config.yaml\nchannels:\n  whatsapp:\n    provider: whatsapp-business-api\n    webhook: \u002Fapi\u002Fwhatsapp\n    \nrouting:\n  # Public: anyone can access\n  - match: \".*\"\n    condition: \"!authenticated\"\n    tools:\n      - hotel_faq\n      - booking_inquiry\n      - emergency_contact\n      \n  # Guest-only: authenticated hotel guests\n  - match: \".*\"\n    condition: \"authenticated\"\n    tools:\n      - bas_control\n      - room_service\n      - recommendations\n      - green_rewards\n      - complaint\n      - transport\n      \n  # Admin-only: hotel staff\n  - match: \".*\"\n    condition: \"admin\"\n    tools:\n      - bas_control\n      - room_service\n      - recommendations\n      - green_rewards\n      - complaint\n      - transport\n      - energy_dashboard\n      - guest_management\n      - staff_notifications\n",[93,2744,2745,2750,2757,2764,2774,2784,2788,2795,2800,2812,2822,2829,2837,2844,2851,2856,2861,2871,2880,2886,2893,2900,2907,2914,2921,2928,2932,2937,2947,2956,2962,2968,2974,2980,2986,2992,2998,3005,3012],{"__ignoreMap":91},[96,2746,2747],{"class":98,"line":99},[96,2748,2749],{"class":703},"# openclaw.config.yaml\n",[96,2751,2752,2755],{"class":98,"line":105},[96,2753,2754],{"class":709},"channels",[96,2756,751],{"class":713},[96,2758,2759,2762],{"class":98,"line":111},[96,2760,2761],{"class":709},"  whatsapp",[96,2763,751],{"class":713},[96,2765,2766,2769,2771],{"class":98,"line":117},[96,2767,2768],{"class":709},"    provider",[96,2770,714],{"class":713},[96,2772,2773],{"class":717},"whatsapp-business-api\n",[96,2775,2776,2779,2781],{"class":98,"line":123},[96,2777,2778],{"class":709},"    webhook",[96,2780,714],{"class":713},[96,2782,2783],{"class":717},"\u002Fapi\u002Fwhatsapp\n",[96,2785,2786],{"class":98,"line":129},[96,2787,913],{"class":713},[96,2789,2790,2793],{"class":98,"line":135},[96,2791,2792],{"class":709},"routing",[96,2794,751],{"class":713},[96,2796,2797],{"class":98,"line":142},[96,2798,2799],{"class":703},"  # Public: anyone can access\n",[96,2801,2802,2804,2807,2809],{"class":98,"line":148},[96,2803,756],{"class":713},[96,2805,2806],{"class":709},"match",[96,2808,714],{"class":713},[96,2810,2811],{"class":717},"\".*\"\n",[96,2813,2814,2817,2819],{"class":98,"line":154},[96,2815,2816],{"class":709},"    condition",[96,2818,714],{"class":713},[96,2820,2821],{"class":717},"\"!authenticated\"\n",[96,2823,2824,2827],{"class":98,"line":160},[96,2825,2826],{"class":709},"    tools",[96,2828,751],{"class":713},[96,2830,2831,2834],{"class":98,"line":166},[96,2832,2833],{"class":713},"      - ",[96,2835,2836],{"class":717},"hotel_faq\n",[96,2838,2839,2841],{"class":98,"line":172},[96,2840,2833],{"class":713},[96,2842,2843],{"class":717},"booking_inquiry\n",[96,2845,2846,2848],{"class":98,"line":177},[96,2847,2833],{"class":713},[96,2849,2850],{"class":717},"emergency_contact\n",[96,2852,2853],{"class":98,"line":182},[96,2854,2855],{"class":713},"      \n",[96,2857,2858],{"class":98,"line":188},[96,2859,2860],{"class":703},"  # Guest-only: authenticated hotel guests\n",[96,2862,2863,2865,2867,2869],{"class":98,"line":194},[96,2864,756],{"class":713},[96,2866,2806],{"class":709},[96,2868,714],{"class":713},[96,2870,2811],{"class":717},[96,2872,2873,2875,2877],{"class":98,"line":200},[96,2874,2816],{"class":709},[96,2876,714],{"class":713},[96,2878,2879],{"class":717},"\"authenticated\"\n",[96,2881,2882,2884],{"class":98,"line":206},[96,2883,2826],{"class":709},[96,2885,751],{"class":713},[96,2887,2888,2890],{"class":98,"line":211},[96,2889,2833],{"class":713},[96,2891,2892],{"class":717},"bas_control\n",[96,2894,2895,2897],{"class":98,"line":216},[96,2896,2833],{"class":713},[96,2898,2899],{"class":717},"room_service\n",[96,2901,2902,2904],{"class":98,"line":222},[96,2903,2833],{"class":713},[96,2905,2906],{"class":717},"recommendations\n",[96,2908,2909,2911],{"class":98,"line":228},[96,2910,2833],{"class":713},[96,2912,2913],{"class":717},"green_rewards\n",[96,2915,2916,2918],{"class":98,"line":234},[96,2917,2833],{"class":713},[96,2919,2920],{"class":717},"complaint\n",[96,2922,2923,2925],{"class":98,"line":240},[96,2924,2833],{"class":713},[96,2926,2927],{"class":717},"transport\n",[96,2929,2930],{"class":98,"line":246},[96,2931,2855],{"class":713},[96,2933,2934],{"class":98,"line":251},[96,2935,2936],{"class":703},"  # Admin-only: hotel staff\n",[96,2938,2939,2941,2943,2945],{"class":98,"line":256},[96,2940,756],{"class":713},[96,2942,2806],{"class":709},[96,2944,714],{"class":713},[96,2946,2811],{"class":717},[96,2948,2949,2951,2953],{"class":98,"line":262},[96,2950,2816],{"class":709},[96,2952,714],{"class":713},[96,2954,2955],{"class":717},"\"admin\"\n",[96,2957,2958,2960],{"class":98,"line":268},[96,2959,2826],{"class":709},[96,2961,751],{"class":713},[96,2963,2964,2966],{"class":98,"line":274},[96,2965,2833],{"class":713},[96,2967,2892],{"class":717},[96,2969,2970,2972],{"class":98,"line":280},[96,2971,2833],{"class":713},[96,2973,2899],{"class":717},[96,2975,2976,2978],{"class":98,"line":286},[96,2977,2833],{"class":713},[96,2979,2906],{"class":717},[96,2981,2982,2984],{"class":98,"line":292},[96,2983,2833],{"class":713},[96,2985,2913],{"class":717},[96,2987,2988,2990],{"class":98,"line":298},[96,2989,2833],{"class":713},[96,2991,2920],{"class":717},[96,2993,2994,2996],{"class":98,"line":304},[96,2995,2833],{"class":713},[96,2997,2927],{"class":717},[96,2999,3000,3002],{"class":98,"line":310},[96,3001,2833],{"class":713},[96,3003,3004],{"class":717},"energy_dashboard\n",[96,3006,3007,3009],{"class":98,"line":316},[96,3008,2833],{"class":713},[96,3010,3011],{"class":717},"guest_management\n",[96,3013,3014,3016],{"class":98,"line":322},[96,3015,2833],{"class":713},[96,3017,3018],{"class":717},"staff_notifications\n",[394,3020,3022],{"id":3021},"step-4-heartbeat-automation","Step 4: Heartbeat Automation",[11,3024,3025],{},"OpenClaw heartbeat bisa digunakan untuk monitoring otomatis:",[86,3027,3029],{"className":694,"code":3028,"language":696,"meta":91,"style":91},"# HEARTBEAT.md\n## Smart Hotel Daily Checks\n\n### Energy Monitoring (Every 2 hours)\n- Run: `python3 skills\u002Fbas-control\u002Fscripts\u002Fenergy-report.py --summary`\n- Alert if: Any room using >150% baseline\n- Alert if: Total hotel energy > 110% of budget\n\n### Guest Welcome (Real-time)\n- Trigger: WiFi login event\n- Run: `python3 skills\u002Fguest-auth\u002Fscripts\u002Fsession-manager.py --welcome`\n- Send welcome message + create session\n\n### Room Status Sync (Every 30 min)\n- Run: `python3 skills\u002Fguest-auth\u002Fscripts\u002Fbooking-validator.py --sync`\n- Auto-expire sessions for checked-out guests\n- Prepare welcome for expected check-ins\n\n### Green Rewards Summary (Daily 09:00)\n- Run: `python3 skills\u002Fgreen-rewards\u002Fscripts\u002Fdaily-report.py --all`\n- Send individual summary to participating guests\n- Update hotel energy dashboard\n",[93,3030,3031,3036,3041,3045,3050,3064,3076,3087,3091,3096,3108,3119,3126,3130,3135,3146,3153,3160,3164,3169,3180,3187],{"__ignoreMap":91},[96,3032,3033],{"class":98,"line":99},[96,3034,3035],{"class":703},"# HEARTBEAT.md\n",[96,3037,3038],{"class":98,"line":105},[96,3039,3040],{"class":703},"## Smart Hotel Daily Checks\n",[96,3042,3043],{"class":98,"line":111},[96,3044,139],{"emptyLinePlaceholder":138},[96,3046,3047],{"class":98,"line":117},[96,3048,3049],{"class":703},"### Energy Monitoring (Every 2 hours)\n",[96,3051,3052,3055,3058,3061],{"class":98,"line":123},[96,3053,3054],{"class":713},"- ",[96,3056,3057],{"class":709},"Run",[96,3059,3060],{"class":713},": `",[96,3062,3063],{"class":717},"python3 skills\u002Fbas-control\u002Fscripts\u002Fenergy-report.py --summary`\n",[96,3065,3066,3068,3071,3073],{"class":98,"line":129},[96,3067,3054],{"class":713},[96,3069,3070],{"class":709},"Alert if",[96,3072,714],{"class":713},[96,3074,3075],{"class":717},"Any room using >150% baseline\n",[96,3077,3078,3080,3082,3084],{"class":98,"line":135},[96,3079,3054],{"class":713},[96,3081,3070],{"class":709},[96,3083,714],{"class":713},[96,3085,3086],{"class":717},"Total hotel energy > 110% of budget\n",[96,3088,3089],{"class":98,"line":142},[96,3090,139],{"emptyLinePlaceholder":138},[96,3092,3093],{"class":98,"line":148},[96,3094,3095],{"class":703},"### Guest Welcome (Real-time)\n",[96,3097,3098,3100,3103,3105],{"class":98,"line":154},[96,3099,3054],{"class":713},[96,3101,3102],{"class":709},"Trigger",[96,3104,714],{"class":713},[96,3106,3107],{"class":717},"WiFi login event\n",[96,3109,3110,3112,3114,3116],{"class":98,"line":160},[96,3111,3054],{"class":713},[96,3113,3057],{"class":709},[96,3115,3060],{"class":713},[96,3117,3118],{"class":717},"python3 skills\u002Fguest-auth\u002Fscripts\u002Fsession-manager.py --welcome`\n",[96,3120,3121,3123],{"class":98,"line":166},[96,3122,3054],{"class":713},[96,3124,3125],{"class":717},"Send welcome message + create session\n",[96,3127,3128],{"class":98,"line":172},[96,3129,139],{"emptyLinePlaceholder":138},[96,3131,3132],{"class":98,"line":177},[96,3133,3134],{"class":703},"### Room Status Sync (Every 30 min)\n",[96,3136,3137,3139,3141,3143],{"class":98,"line":182},[96,3138,3054],{"class":713},[96,3140,3057],{"class":709},[96,3142,3060],{"class":713},[96,3144,3145],{"class":717},"python3 skills\u002Fguest-auth\u002Fscripts\u002Fbooking-validator.py --sync`\n",[96,3147,3148,3150],{"class":98,"line":188},[96,3149,3054],{"class":713},[96,3151,3152],{"class":717},"Auto-expire sessions for checked-out guests\n",[96,3154,3155,3157],{"class":98,"line":194},[96,3156,3054],{"class":713},[96,3158,3159],{"class":717},"Prepare welcome for expected check-ins\n",[96,3161,3162],{"class":98,"line":200},[96,3163,139],{"emptyLinePlaceholder":138},[96,3165,3166],{"class":98,"line":206},[96,3167,3168],{"class":703},"### Green Rewards Summary (Daily 09:00)\n",[96,3170,3171,3173,3175,3177],{"class":98,"line":211},[96,3172,3054],{"class":713},[96,3174,3057],{"class":709},[96,3176,3060],{"class":713},[96,3178,3179],{"class":717},"python3 skills\u002Fgreen-rewards\u002Fscripts\u002Fdaily-report.py --all`\n",[96,3181,3182,3184],{"class":98,"line":216},[96,3183,3054],{"class":713},[96,3185,3186],{"class":717},"Send individual summary to participating guests\n",[96,3188,3189,3191],{"class":98,"line":222},[96,3190,3054],{"class":713},[96,3192,3193],{"class":717},"Update hotel energy dashboard\n",[11,3195,77],{},[26,3197,3199],{"id":3198},"use-cases-di-luar-hotel","🏭 Use Cases di Luar Hotel",[11,3201,3202],{},"Konsep ini nggak cuma buat hotel lho. Bisa diterapkan ke banyak vertical:",[394,3204,3206],{"id":3205},"serviced-apartments-co-living","🏢 Serviced Apartments & Co-Living",[11,3208,3209],{},"Sama kayak hotel tapi longer stay. Guest bisa:",[34,3211,3212,3215,3218,3221],{},[37,3213,3214],{},"Kontrol apartemen via WhatsApp",[37,3216,3217],{},"Report maintenance",[37,3219,3220],{},"Terima notifikasi paket",[37,3222,3223],{},"Booking fasilitas (gym, meeting room)",[394,3225,3227],{"id":3226},"rumah-sakit","🏥 Rumah Sakit",[34,3229,3230,3233,3236,3239],{},[37,3231,3232],{},"Pasien kontrol kamar (AC, lampu, TV) tanpa bergerak",[37,3234,3235],{},"Notifikasi jadwal obat",[37,3237,3238],{},"Request makanan diet khusus",[37,3240,3241],{},"Info dokter jaga",[394,3243,3245],{"id":3244},"office-building","🏭 Office Building",[34,3247,3248,3251,3254,3257],{},[37,3249,3250],{},"Tenant kontrol kantor area",[37,3252,3253],{},"Meeting room booking via chat",[37,3255,3256],{},"Energy monitoring per tenant",[37,3258,3259],{},"Facility request & tracking",[394,3261,3263],{"id":3262},"kampus-university","🎓 Kampus \u002F University",[34,3265,3266,3269,3272,3275],{},[37,3267,3268],{},"Mahasiswa kontrol asrama",[37,3270,3271],{},"Info jadwal kelas",[37,3273,3274],{},"Pemesanan makanan kantin",[37,3276,3277],{},"Library & facility booking",[394,3279,3281],{"id":3280},"️-smart-residential","🏘️ Smart Residential",[34,3283,3284,3287,3290,3293],{},[37,3285,3286],{},"Penghuni kontrol rumah",[37,3288,3289],{},"Integrasi dengan smart home",[37,3291,3292],{},"Community announcements",[37,3294,3295],{},"Maintenance request",[11,3297,77],{},[26,3299,3301],{"id":3300},"roadmap-implementasi","📋 Roadmap Implementasi",[11,3303,3304],{},"Kalau gue jadi project manager untuk implementasi ini, gue bagi jadi fase:",[86,3306,3308],{"className":88,"code":3307,"language":90,"meta":91,"style":91},"gantt\n    title Smart Hotel Implementation Roadmap\n    dateFormat  YYYY-MM-DD\n    section Phase 1 - Foundation (Bulan 1-2)\n    OpenClaw Setup & Config           :a1, 2026-04-01, 14d\n    BAS API Integration               :a2, after a1, 14d\n    WhatsApp Business API Setup       :a3, after a1, 7d\n    Guest Auth Middleware              :a4, after a2, 10d\n    \n    section Phase 2 - Features (Bulan 3-4)\n    AI Concierge - FAQ & Info          :b1, 2026-05-01, 14d\n    Restaurant Recommendations          :b2, after b1, 10d\n    Room Service Integration            :b3, after b1, 14d\n    WiFi Login Automation               :b4, after a4, 7d\n    \n    section Phase 3 - Advanced (Bulan 5-6)\n    Green Rewards System                :c1, 2026-06-01, 21d\n    Energy Dashboard                    :c2, after c1, 14d\n    Advanced BAS Rules                  :c3, after b3, 14d\n    Analytics & Reporting               :c4, after c2, 14d\n    \n    section Phase 4 - Optimization (Bulan 7+)\n    Machine Learning for Energy         :d1, 2026-07-01, 30d\n    Multi-language Support              :d2, 2026-07-15, 14d\n    Loyalty Integration                 :d3, 2026-08-01, 14d\n",[93,3309,3310,3315,3320,3325,3330,3335,3340,3345,3350,3354,3359,3364,3369,3374,3379,3383,3388,3393,3398,3403,3408,3412,3417,3422,3427],{"__ignoreMap":91},[96,3311,3312],{"class":98,"line":99},[96,3313,3314],{},"gantt\n",[96,3316,3317],{"class":98,"line":105},[96,3318,3319],{},"    title Smart Hotel Implementation Roadmap\n",[96,3321,3322],{"class":98,"line":111},[96,3323,3324],{},"    dateFormat  YYYY-MM-DD\n",[96,3326,3327],{"class":98,"line":117},[96,3328,3329],{},"    section Phase 1 - Foundation (Bulan 1-2)\n",[96,3331,3332],{"class":98,"line":123},[96,3333,3334],{},"    OpenClaw Setup & Config           :a1, 2026-04-01, 14d\n",[96,3336,3337],{"class":98,"line":129},[96,3338,3339],{},"    BAS API Integration               :a2, after a1, 14d\n",[96,3341,3342],{"class":98,"line":135},[96,3343,3344],{},"    WhatsApp Business API Setup       :a3, after a1, 7d\n",[96,3346,3347],{"class":98,"line":142},[96,3348,3349],{},"    Guest Auth Middleware              :a4, after a2, 10d\n",[96,3351,3352],{"class":98,"line":148},[96,3353,913],{},[96,3355,3356],{"class":98,"line":154},[96,3357,3358],{},"    section Phase 2 - Features (Bulan 3-4)\n",[96,3360,3361],{"class":98,"line":160},[96,3362,3363],{},"    AI Concierge - FAQ & Info          :b1, 2026-05-01, 14d\n",[96,3365,3366],{"class":98,"line":166},[96,3367,3368],{},"    Restaurant Recommendations          :b2, after b1, 10d\n",[96,3370,3371],{"class":98,"line":172},[96,3372,3373],{},"    Room Service Integration            :b3, after b1, 14d\n",[96,3375,3376],{"class":98,"line":177},[96,3377,3378],{},"    WiFi Login Automation               :b4, after a4, 7d\n",[96,3380,3381],{"class":98,"line":182},[96,3382,913],{},[96,3384,3385],{"class":98,"line":188},[96,3386,3387],{},"    section Phase 3 - Advanced (Bulan 5-6)\n",[96,3389,3390],{"class":98,"line":194},[96,3391,3392],{},"    Green Rewards System                :c1, 2026-06-01, 21d\n",[96,3394,3395],{"class":98,"line":200},[96,3396,3397],{},"    Energy Dashboard                    :c2, after c1, 14d\n",[96,3399,3400],{"class":98,"line":206},[96,3401,3402],{},"    Advanced BAS Rules                  :c3, after b3, 14d\n",[96,3404,3405],{"class":98,"line":211},[96,3406,3407],{},"    Analytics & Reporting               :c4, after c2, 14d\n",[96,3409,3410],{"class":98,"line":216},[96,3411,913],{},[96,3413,3414],{"class":98,"line":222},[96,3415,3416],{},"    section Phase 4 - Optimization (Bulan 7+)\n",[96,3418,3419],{"class":98,"line":228},[96,3420,3421],{},"    Machine Learning for Energy         :d1, 2026-07-01, 30d\n",[96,3423,3424],{"class":98,"line":234},[96,3425,3426],{},"    Multi-language Support              :d2, 2026-07-15, 14d\n",[96,3428,3429],{"class":98,"line":240},[96,3430,3431],{},"    Loyalty Integration                 :d3, 2026-08-01, 14d\n",[11,3433,3434],{},[41,3435,3436],{},"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░ 80% Estimasi Total: 5-7 bulan sampai full production.",[11,3438,77],{},[26,3440,3442],{"id":3441},"tips-dari-pengalaman","🔥 Tips dari Pengalaman",[11,3444,3445],{},"Gue udah main-main dengan OpenClaw untuk beberapa use case, dan ini tips yang bisa gue kasih:",[394,3447,3449],{"id":3448},"_1-mulai-dari-simple","1. Mulai dari Simple",[11,3451,3452],{},"Jangan langsung ke BAS integration. Mulai dari:",[34,3454,3455,3458,3461],{},[37,3456,3457],{},"✅ FAQ bot dulu (paling gampang)",[37,3459,3460],{},"✅ WiFi → welcome message (quick win, impact besar)",[37,3462,3463],{},"✅ Room service request",[11,3465,3466],{},"Setelah basic layer jalan, baru tambah BAS integration dan green rewards.",[394,3468,3470],{"id":3469},"_2-persona-matters","2. Persona Matters",[11,3472,3473],{},"Set AI persona sesuai brand hotel. Luxury hotel beda tone-nya dengan budget hotel:",[86,3475,3477],{"className":694,"code":3476,"language":696,"meta":91,"style":91},"# Luxury hotel persona\npersona: |\n  Kamu concierge premium di [Hotel Name]. Bahasa formal tapi warm.\n  Selalu gunakan \"Bapak\u002FIbu\". Rekomendasi harus curated dan eksklusif.\n  \n# Budget hotel persona  \npersona: |\n  Kamu asisten seru di [Hotel Name]. Santai, casual, friendly.\n  Bisa pake \"mas\u002Fmbak\". Rekomendasi fokus value for money.\n",[93,3478,3479,3484,3494,3499,3504,3508,3513,3521,3526],{"__ignoreMap":91},[96,3480,3481],{"class":98,"line":99},[96,3482,3483],{"class":703},"# Luxury hotel persona\n",[96,3485,3486,3489,3491],{"class":98,"line":105},[96,3487,3488],{"class":709},"persona",[96,3490,714],{"class":713},[96,3492,3493],{"class":2680},"|\n",[96,3495,3496],{"class":98,"line":111},[96,3497,3498],{"class":717},"  Kamu concierge premium di [Hotel Name]. Bahasa formal tapi warm.\n",[96,3500,3501],{"class":98,"line":117},[96,3502,3503],{"class":717},"  Selalu gunakan \"Bapak\u002FIbu\". Rekomendasi harus curated dan eksklusif.\n",[96,3505,3506],{"class":98,"line":123},[96,3507,779],{"class":717},[96,3509,3510],{"class":98,"line":129},[96,3511,3512],{"class":703},"# Budget hotel persona  \n",[96,3514,3515,3517,3519],{"class":98,"line":135},[96,3516,3488],{"class":709},[96,3518,714],{"class":713},[96,3520,3493],{"class":2680},[96,3522,3523],{"class":98,"line":142},[96,3524,3525],{"class":717},"  Kamu asisten seru di [Hotel Name]. Santai, casual, friendly.\n",[96,3527,3528],{"class":98,"line":148},[96,3529,3530],{"class":717},"  Bisa pake \"mas\u002Fmbak\". Rekomendasi fokus value for money.\n",[394,3532,3534],{"id":3533},"_3-human-handoff","3. Human Handoff",[11,3536,3537],{},"AI nggak bisa handle semua. Pastikan ada escalation path:",[86,3539,3542],{"className":3540,"code":3541,"language":1116},[1114],"Tamu: \"AC kamar saya bocor!\"\n\nAI: Maaf atas ketidaknyamanannya 🙏 Gue langsung forward ke tim maintenance.\n     Estimasi mereka datang dalam 10-15 menit. \n     Ada yang lain bisa gue bantu?\n     \n     [Auto-forward ke maintenance group dengan room number + issue]\n",[93,3543,3541],{"__ignoreMap":91},[394,3545,3547],{"id":3546},"_4-data-privacy","4. Data Privacy",[11,3549,3550],{},"Ini penting banget:",[34,3552,3553,3556,3559,3562],{},[37,3554,3555],{},"Jangan simpan chat history tamu setelah check-out",[37,3557,3558],{},"Clear semua session data setelah 24 jam post check-out",[37,3560,3561],{},"Comply dengan data protection regulations",[37,3563,3564],{},"Guest harus opt-in untuk green reward data tracking",[394,3566,3568],{"id":3567},"_5-multi-language","5. Multi-Language",[11,3570,3571],{},"Indonesia itu turis mancanegara. Minimal support:",[34,3573,3574,3577,3580,3583],{},[37,3575,3576],{},"Bahasa Indonesia (default)",[37,3578,3579],{},"English",[37,3581,3582],{},"Japanese (optional, tergantung market)",[37,3584,3585],{},"Mandarin (optional, banyak turis Tiongkok)",[11,3587,3588],{},"OpenClaw bisa auto-detect language dan switch response accordingly.",[11,3590,77],{},[26,3592,3594],{"id":3593},"openclaw-vs-alternatif","📊 OpenClaw vs Alternatif",[11,3596,3597,3598,3601],{},"Gue yakin ada yang nanya \"kenapa nggak pake ",[96,3599,3600],{},"tool lain","?\" Jadi gue bikin perbandingan:",[599,3603,3604,3623],{},[602,3605,3606],{},[605,3607,3608,3611,3614,3617,3620],{},[608,3609,3610],{},"Fitur",[608,3612,3613],{},"OpenClaw",[608,3615,3616],{},"Dialogflow CX",[608,3618,3619],{},"Rasa",[608,3621,3622],{},"Custom Bot",[618,3624,3625,3640,3655,3671,3687,3700,3715,3731],{},[605,3626,3627,3629,3632,3635,3637],{},[623,3628,2498],{},[623,3630,3631],{},"✅ Native via Skills",[623,3633,3634],{},"⚠️ Perlu custom",[623,3636,3634],{},[623,3638,3639],{},"✅ Full control",[605,3641,3642,3645,3648,3650,3652],{},[623,3643,3644],{},"WhatsApp Integration",[623,3646,3647],{},"✅ Native",[623,3649,3647],{},[623,3651,3647],{},[623,3653,3654],{},"⚠️ Manual",[605,3656,3657,3660,3663,3666,3668],{},[623,3658,3659],{},"Multi-Channel",[623,3661,3662],{},"✅ WA, TG, Discord, Signal",[623,3664,3665],{},"✅ WA, TG",[623,3667,3665],{},[623,3669,3670],{},"⚠️ Custom",[605,3672,3673,3676,3679,3682,3684],{},[623,3674,3675],{},"Heartbeat\u002FAutomation",[623,3677,3678],{},"✅ Built-in",[623,3680,3681],{},"❌ Perlu external",[623,3683,3681],{},[623,3685,3686],{},"❌ Custom",[605,3688,3689,3692,3694,3696,3698],{},[623,3690,3691],{},"RAG\u002FKnowledge Base",[623,3693,3678],{},[623,3695,3647],{},[623,3697,3647],{},[623,3699,3670],{},[605,3701,3702,3705,3708,3711,3713],{},[623,3703,3704],{},"Self-Evolving",[623,3706,3707],{},"✅ Auto-improve",[623,3709,3710],{},"❌ Manual",[623,3712,3710],{},[623,3714,3710],{},[605,3716,3717,3720,3723,3726,3728],{},[623,3718,3719],{},"Cost",[623,3721,3722],{},"💰 Medium",[623,3724,3725],{},"💸 Expensive",[623,3727,3722],{},[623,3729,3730],{},"💸 Dev time",[605,3732,3733,3736,3739,3742,3744],{},[623,3734,3735],{},"Flexibility",[623,3737,3738],{},"✅✅✅ Maximum",[623,3740,3741],{},"⚠️ Limited",[623,3743,3741],{},[623,3745,3746],{},"✅✅ Full",[11,3748,3749,3751],{},[41,3750,589],{}," OpenClaw menang di flexibility dan automation capability. Untuk hotel yang butuh BAS integration + AI concierge + automation dalam satu platform, OpenClaw jawabannya.",[11,3753,77],{},[26,3755,3757],{"id":3756},"saran-penggunaan-openclaw-untuk-hotel","🎯 Saran Penggunaan OpenClaw untuk Hotel",[11,3759,3760],{},"Berdasarkan diskusi dan analisis gue, ini rekomendasi use case OpenClaw untuk hotel:",[394,3762,3764],{"id":3763},"tier-1-quick-wins-1-2-minggu-setup","Tier 1: Quick Wins (1-2 minggu setup)",[599,3766,3767,3782],{},[602,3768,3769],{},[605,3770,3771,3774,3776,3779],{},[608,3772,3773],{},"#",[608,3775,613],{},[608,3777,3778],{},"Impact",[608,3780,3781],{},"Effort",[618,3783,3784,3798,3811,3824],{},[605,3785,3786,3789,3792,3795],{},[623,3787,3788],{},"1",[623,3790,3791],{},"FAQ Bot via WhatsApp",[623,3793,3794],{},"🔥🔥🔥",[623,3796,3797],{},"💚 Low",[605,3799,3800,3803,3806,3809],{},[623,3801,3802],{},"2",[623,3804,3805],{},"WiFi → Welcome Message",[623,3807,3808],{},"🔥🔥🔥🔥",[623,3810,3797],{},[605,3812,3813,3816,3819,3821],{},[623,3814,3815],{},"3",[623,3817,3818],{},"Room Service Request",[623,3820,3794],{},[623,3822,3823],{},"💛 Medium",[605,3825,3826,3829,3832,3835],{},[623,3827,3828],{},"4",[623,3830,3831],{},"Hotel Info & Directions",[623,3833,3834],{},"🔥🔥",[623,3836,3797],{},[394,3838,3840],{"id":3839},"tier-2-core-features-1-2-bulan-setup","Tier 2: Core Features (1-2 bulan setup)",[599,3842,3843,3855],{},[602,3844,3845],{},[605,3846,3847,3849,3851,3853],{},[608,3848,3773],{},[608,3850,613],{},[608,3852,3778],{},[608,3854,3781],{},[618,3856,3857,3871,3883,3895],{},[605,3858,3859,3862,3865,3868],{},[623,3860,3861],{},"5",[623,3863,3864],{},"BAS Integration (AC\u002FLight)",[623,3866,3867],{},"🔥🔥🔥🔥🔥",[623,3869,3870],{},"❤️ High",[605,3872,3873,3876,3879,3881],{},[623,3874,3875],{},"6",[623,3877,3878],{},"Restaurant Recommendations",[623,3880,3808],{},[623,3882,3823],{},[605,3884,3885,3888,3891,3893],{},[623,3886,3887],{},"7",[623,3889,3890],{},"Transport Booking (Grab\u002FGojek)",[623,3892,3794],{},[623,3894,3823],{},[605,3896,3897,3900,3903,3905],{},[623,3898,3899],{},"8",[623,3901,3902],{},"Guest Auth & Session Management",[623,3904,3808],{},[623,3906,3823],{},[394,3908,3910],{"id":3909},"tier-3-advanced-3-6-bulan-setup","Tier 3: Advanced (3-6 bulan setup)",[599,3912,3913,3925],{},[602,3914,3915],{},[605,3916,3917,3919,3921,3923],{},[608,3918,3773],{},[608,3920,613],{},[608,3922,3778],{},[608,3924,3781],{},[618,3926,3927,3939,3951,3964],{},[605,3928,3929,3932,3935,3937],{},[623,3930,3931],{},"9",[623,3933,3934],{},"Green Rewards System",[623,3936,3808],{},[623,3938,3870],{},[605,3940,3941,3944,3947,3949],{},[623,3942,3943],{},"10",[623,3945,3946],{},"Energy Dashboard",[623,3948,3808],{},[623,3950,3870],{},[605,3952,3953,3956,3959,3961],{},[623,3954,3955],{},"11",[623,3957,3958],{},"Predictive HVAC (ML)",[623,3960,3867],{},[623,3962,3963],{},"❤️❤️ Very High",[605,3965,3966,3969,3972,3974],{},[623,3967,3968],{},"12",[623,3970,3971],{},"Multi-language Support",[623,3973,3794],{},[623,3975,3823],{},[394,3977,3979],{"id":3978},"tier-4-nice-to-have","Tier 4: Nice to Have",[599,3981,3982,3994],{},[602,3983,3984],{},[605,3985,3986,3988,3990,3992],{},[608,3987,3773],{},[608,3989,613],{},[608,3991,3778],{},[608,3993,3781],{},[618,3995,3996,4008,4020,4032],{},[605,3997,3998,4001,4004,4006],{},[623,3999,4000],{},"13",[623,4002,4003],{},"Loyalty Program Integration",[623,4005,3794],{},[623,4007,3823],{},[605,4009,4010,4013,4016,4018],{},[623,4011,4012],{},"14",[623,4014,4015],{},"Voice Assistant (Room)",[623,4017,3808],{},[623,4019,3870],{},[605,4021,4022,4025,4028,4030],{},[623,4023,4024],{},"15",[623,4026,4027],{},"AR Navigation in Hotel",[623,4029,3834],{},[623,4031,3963],{},[605,4033,4034,4037,4040,4042],{},[623,4035,4036],{},"16",[623,4038,4039],{},"Predictive Maintenance",[623,4041,3808],{},[623,4043,3963],{},[11,4045,77],{},[26,4047,4049],{"id":4048},"schneider-bas-integration-deep-dive","🔌 Schneider BAS Integration — Deep Dive",[11,4051,4052],{},"Gue personally familiar sama Schneider Electric BAS karena background gue di bidang engineering. Di diskusi tadi, gue mention kalau lagi plan konek Schneider software dengan OpenClaw — dan ini bukan hype, ini rencana yang udah gue riset.",[394,4054,4056],{"id":4055},"kenapa-schneider","Kenapa Schneider?",[11,4058,4059],{},"Schneider itu pemain besar di BAS dunia. Di Indonesia, mayoritas hotel bintang 4-5 pake Schneider untuk HVAC, lighting control, dan energy management. Product line mereka yang relevan:",[599,4061,4062,4074],{},[602,4063,4064],{},[605,4065,4066,4069,4072],{},[608,4067,4068],{},"Product",[608,4070,4071],{},"Fungsi",[608,4073,616],{},[618,4075,4076,4089,4102,4114,4127],{},[605,4077,4078,4083,4086],{},[623,4079,4080],{},[41,4081,4082],{},"EcoStruxure Building Operation",[623,4084,4085],{},"Central management platform",[623,4087,4088],{},"REST API \u002F Web Services",[605,4090,4091,4096,4099],{},[623,4092,4093],{},[41,4094,4095],{},"SmartStruxure",[623,4097,4098],{},"Cloud-based building management",[623,4100,4101],{},"MQTT \u002F REST",[605,4103,4104,4109,4112],{},[623,4105,4106],{},[41,4107,4108],{},"Modicon PLC",[623,4110,4111],{},"Field-level controller",[623,4113,627],{},[605,4115,4116,4121,4124],{},[623,4117,4118],{},[41,4119,4120],{},"KNX Actuators",[623,4122,4123],{},"Lighting & shade control",[623,4125,4126],{},"KNX \u002F IP",[605,4128,4129,4134,4137],{},[623,4130,4131],{},[41,4132,4133],{},"PowerLogic",[623,4135,4136],{},"Energy metering & monitoring",[623,4138,4139],{},"Modbus TCP \u002F REST",[394,4141,4143],{"id":4142},"arsitektur-integrasi-schneider-openclaw","Arsitektur Integrasi Schneider × OpenClaw",[86,4145,4147],{"className":88,"code":4146,"language":90,"meta":91,"style":91},"flowchart LR\n    subgraph Field[\"⚡ Field Level\"]\n        PLC1[\"Modicon PLC\u003Cbr\u002F>Lantai 1-5\"]\n        PLC2[\"Modicon PLC\u003Cbr\u002F>Lantai 6-10\"]\n        KNX[\"KNX Actuators\u003Cbr\u002F>Per Room\"]\n        PM[\"PowerLogic Meters\u003Cbr\u002F>Per Floor\"]\n    end\n    \n    subgraph Server[\"🖥️ Building Server\"]\n        EBO[\"EcoStruxure\u003Cbr\u002F>Building Op\"]\n        API[\"REST API\u003Cbr\u002F>Gateway\"]\n        MQTT[\"MQTT Broker\"]\n    end\n    \n    subgraph Cloud[\"☁️ Cloud\"]\n        OC[\"OpenClaw\u003Cbr\u002F>AI Engine\"]\n        WA[\"WhatsApp\u003Cbr\u002F>Guest Channel\"]\n        DASH[\"Energy Dashboard\"]\n    end\n    \n    PLC1 -->|Modbus TCP| EBO\n    PLC2 -->|Modbus TCP| EBO\n    KNX -->|KNX\u002FIP| EBO\n    PM -->|Modbus TCP| EBO\n    \n    EBO --> API\n    EBO --> MQTT\n    \n    API --> OC\n    MQTT --> OC\n    \n    OC --> WA\n    OC --> DASH\n    \n    OC -->|Control Commands| API\n    API -->|Write to PLC| EBO\n",[93,4148,4149,4153,4158,4163,4168,4173,4178,4182,4186,4191,4196,4201,4206,4210,4214,4219,4224,4229,4234,4238,4242,4247,4252,4257,4262,4266,4271,4276,4280,4285,4290,4294,4299,4304,4308,4313],{"__ignoreMap":91},[96,4150,4151],{"class":98,"line":99},[96,4152,898],{},[96,4154,4155],{"class":98,"line":105},[96,4156,4157],{},"    subgraph Field[\"⚡ Field Level\"]\n",[96,4159,4160],{"class":98,"line":111},[96,4161,4162],{},"        PLC1[\"Modicon PLC\u003Cbr\u002F>Lantai 1-5\"]\n",[96,4164,4165],{"class":98,"line":117},[96,4166,4167],{},"        PLC2[\"Modicon PLC\u003Cbr\u002F>Lantai 6-10\"]\n",[96,4169,4170],{"class":98,"line":123},[96,4171,4172],{},"        KNX[\"KNX Actuators\u003Cbr\u002F>Per Room\"]\n",[96,4174,4175],{"class":98,"line":129},[96,4176,4177],{},"        PM[\"PowerLogic Meters\u003Cbr\u002F>Per Floor\"]\n",[96,4179,4180],{"class":98,"line":135},[96,4181,132],{},[96,4183,4184],{"class":98,"line":142},[96,4185,913],{},[96,4187,4188],{"class":98,"line":148},[96,4189,4190],{},"    subgraph Server[\"🖥️ Building Server\"]\n",[96,4192,4193],{"class":98,"line":154},[96,4194,4195],{},"        EBO[\"EcoStruxure\u003Cbr\u002F>Building Op\"]\n",[96,4197,4198],{"class":98,"line":160},[96,4199,4200],{},"        API[\"REST API\u003Cbr\u002F>Gateway\"]\n",[96,4202,4203],{"class":98,"line":166},[96,4204,4205],{},"        MQTT[\"MQTT Broker\"]\n",[96,4207,4208],{"class":98,"line":172},[96,4209,132],{},[96,4211,4212],{"class":98,"line":177},[96,4213,913],{},[96,4215,4216],{"class":98,"line":182},[96,4217,4218],{},"    subgraph Cloud[\"☁️ Cloud\"]\n",[96,4220,4221],{"class":98,"line":188},[96,4222,4223],{},"        OC[\"OpenClaw\u003Cbr\u002F>AI Engine\"]\n",[96,4225,4226],{"class":98,"line":194},[96,4227,4228],{},"        WA[\"WhatsApp\u003Cbr\u002F>Guest Channel\"]\n",[96,4230,4231],{"class":98,"line":200},[96,4232,4233],{},"        DASH[\"Energy Dashboard\"]\n",[96,4235,4236],{"class":98,"line":206},[96,4237,132],{},[96,4239,4240],{"class":98,"line":211},[96,4241,913],{},[96,4243,4244],{"class":98,"line":216},[96,4245,4246],{},"    PLC1 -->|Modbus TCP| EBO\n",[96,4248,4249],{"class":98,"line":222},[96,4250,4251],{},"    PLC2 -->|Modbus TCP| EBO\n",[96,4253,4254],{"class":98,"line":228},[96,4255,4256],{},"    KNX -->|KNX\u002FIP| EBO\n",[96,4258,4259],{"class":98,"line":234},[96,4260,4261],{},"    PM -->|Modbus TCP| EBO\n",[96,4263,4264],{"class":98,"line":240},[96,4265,913],{},[96,4267,4268],{"class":98,"line":246},[96,4269,4270],{},"    EBO --> API\n",[96,4272,4273],{"class":98,"line":251},[96,4274,4275],{},"    EBO --> MQTT\n",[96,4277,4278],{"class":98,"line":256},[96,4279,913],{},[96,4281,4282],{"class":98,"line":262},[96,4283,4284],{},"    API --> OC\n",[96,4286,4287],{"class":98,"line":268},[96,4288,4289],{},"    MQTT --> OC\n",[96,4291,4292],{"class":98,"line":274},[96,4293,913],{},[96,4295,4296],{"class":98,"line":280},[96,4297,4298],{},"    OC --> WA\n",[96,4300,4301],{"class":98,"line":286},[96,4302,4303],{},"    OC --> DASH\n",[96,4305,4306],{"class":98,"line":292},[96,4307,913],{},[96,4309,4310],{"class":98,"line":298},[96,4311,4312],{},"    OC -->|Control Commands| API\n",[96,4314,4315],{"class":98,"line":304},[96,4316,4317],{},"    API -->|Write to PLC| EBO\n",[394,4319,4321],{"id":4320},"contoh-modbus-tcp-communication-dari-openclaw","Contoh: Modbus TCP Communication dari OpenClaw",[11,4323,4324],{},"OpenClaw skill bisa baca\u002Ftulis register Modbus langsung ke PLC. Ini contoh read temperature dari room sensor:",[86,4326,4328],{"className":411,"code":4327,"language":413,"meta":91,"style":91},"# skills\u002Fbas-control\u002Fscripts\u002Fmodbus_client.py\nfrom pymodbus.client import ModbusTcpClient\nimport asyncio\n\nclass SchneiderBASClient:\n    def __init__(self, host: str = \"192.168.1.100\", port: int = 502):\n        self.client = ModbusTcpClient(host, port)\n        \n    # Register mapping (sesuaikan dengan project)\n    REGISTERS = {\n        \"room_temp\": 1000,        # Holding register\n        \"room_humidity\": 1001,\n        \"ac_mode\": 1010,           # 0=off, 1=cool, 2=heat, 3=auto\n        \"ac_setpoint\": 1011,       # °C\n        \"ac_fan_speed\": 1012,      # 0-3\n        \"light_level\": 1020,       # 0-100%\n        \"light_scene\": 1021,       # 0=off, 1=welcome, 2=sleep\n        \"occupancy\": 1030,         # 0\u002F1\n        \"door_status\": 1031,       # 0=closed, 1=open\n        \"energy_kwh\": 1040,        # Accumulated kWh\n        \"power_watts\": 1041,       # Real-time Watts\n    }\n    \n    async def get_room_status(self, room_number: int) -> dict:\n        \"\"\"Read all sensor values for a specific room\"\"\"\n        base = (room_number - 1) * 50  # 50 registers per room\n        \n        self.client.connect()\n        result = self.client.read_holding_registers(\n            address=base, count=50, slave=1\n        )\n        self.client.close()\n        \n        if result.isError():\n            raise Exception(f\"Modbus error: {result}\")\n        \n        regs = result.registers\n        return {\n            \"room\": room_number,\n            \"temperature\": regs[0] \u002F 10,       # 1 decimal\n            \"humidity\": regs[1] \u002F 10,\n            \"ac_mode\": regs[10],\n            \"ac_setpoint\": regs[11] \u002F 10,\n            \"light_level\": regs[20],\n            \"occupancy\": bool(regs[30]),\n            \"door_open\": bool(regs[31]),\n            \"energy_kwh\": regs[40] \u002F 100,\n            \"power_watts\": regs[41],\n        }\n    \n    async def set_eco_mode(self, room_number: int):\n        \"\"\"Switch room to eco mode — AC off, lights off\"\"\"\n        base = (room_number - 1) * 50\n        \n        self.client.connect()\n        # AC off\n        self.client.write_register(address=base + 10, value=0, slave=1)\n        # Lights off\n        self.client.write_register(address=base + 20, value=0, slave=1)\n        self.client.close()\n        \n        return {\"status\": \"eco_mode\", \"room\": room_number}\n    \n    async def set_comfort_mode(self, room_number: int, setpoint: float = 24.0):\n        \"\"\"Switch room to comfort mode — AC on, welcome lights\"\"\"\n        base = (room_number - 1) * 50\n        \n        self.client.connect()\n        # AC cool mode\n        self.client.write_register(address=base + 10, value=1, slave=1)\n        # Setpoint 24°C\n        self.client.write_register(address=base + 11, value=int(setpoint * 10), slave=1)\n        # Welcome light scene\n        self.client.write_register(address=base + 21, value=1, slave=1)\n        self.client.close()\n        \n        return {\"status\": \"comfort_mode\", \"room\": room_number, \"setpoint\": setpoint}\n",[93,4329,4330,4335,4340,4345,4349,4354,4359,4364,4368,4373,4378,4383,4388,4393,4398,4403,4408,4413,4418,4423,4428,4433,4437,4441,4446,4451,4456,4460,4465,4470,4475,4480,4485,4489,4494,4499,4503,4508,4512,4517,4522,4527,4532,4537,4542,4547,4552,4558,4564,4569,4574,4580,4586,4592,4597,4602,4608,4614,4620,4626,4631,4636,4642,4647,4653,4659,4664,4669,4674,4680,4686,4692,4698,4704,4710,4715,4720],{"__ignoreMap":91},[96,4331,4332],{"class":98,"line":99},[96,4333,4334],{},"# skills\u002Fbas-control\u002Fscripts\u002Fmodbus_client.py\n",[96,4336,4337],{"class":98,"line":105},[96,4338,4339],{},"from pymodbus.client import ModbusTcpClient\n",[96,4341,4342],{"class":98,"line":111},[96,4343,4344],{},"import asyncio\n",[96,4346,4347],{"class":98,"line":117},[96,4348,139],{"emptyLinePlaceholder":138},[96,4350,4351],{"class":98,"line":123},[96,4352,4353],{},"class SchneiderBASClient:\n",[96,4355,4356],{"class":98,"line":129},[96,4357,4358],{},"    def __init__(self, host: str = \"192.168.1.100\", port: int = 502):\n",[96,4360,4361],{"class":98,"line":135},[96,4362,4363],{},"        self.client = ModbusTcpClient(host, port)\n",[96,4365,4366],{"class":98,"line":142},[96,4367,450],{},[96,4369,4370],{"class":98,"line":148},[96,4371,4372],{},"    # Register mapping (sesuaikan dengan project)\n",[96,4374,4375],{"class":98,"line":154},[96,4376,4377],{},"    REGISTERS = {\n",[96,4379,4380],{"class":98,"line":160},[96,4381,4382],{},"        \"room_temp\": 1000,        # Holding register\n",[96,4384,4385],{"class":98,"line":166},[96,4386,4387],{},"        \"room_humidity\": 1001,\n",[96,4389,4390],{"class":98,"line":172},[96,4391,4392],{},"        \"ac_mode\": 1010,           # 0=off, 1=cool, 2=heat, 3=auto\n",[96,4394,4395],{"class":98,"line":177},[96,4396,4397],{},"        \"ac_setpoint\": 1011,       # °C\n",[96,4399,4400],{"class":98,"line":182},[96,4401,4402],{},"        \"ac_fan_speed\": 1012,      # 0-3\n",[96,4404,4405],{"class":98,"line":188},[96,4406,4407],{},"        \"light_level\": 1020,       # 0-100%\n",[96,4409,4410],{"class":98,"line":194},[96,4411,4412],{},"        \"light_scene\": 1021,       # 0=off, 1=welcome, 2=sleep\n",[96,4414,4415],{"class":98,"line":200},[96,4416,4417],{},"        \"occupancy\": 1030,         # 0\u002F1\n",[96,4419,4420],{"class":98,"line":206},[96,4421,4422],{},"        \"door_status\": 1031,       # 0=closed, 1=open\n",[96,4424,4425],{"class":98,"line":211},[96,4426,4427],{},"        \"energy_kwh\": 1040,        # Accumulated kWh\n",[96,4429,4430],{"class":98,"line":216},[96,4431,4432],{},"        \"power_watts\": 1041,       # Real-time Watts\n",[96,4434,4435],{"class":98,"line":222},[96,4436,1718],{},[96,4438,4439],{"class":98,"line":228},[96,4440,913],{},[96,4442,4443],{"class":98,"line":234},[96,4444,4445],{},"    async def get_room_status(self, room_number: int) -> dict:\n",[96,4447,4448],{"class":98,"line":240},[96,4449,4450],{},"        \"\"\"Read all sensor values for a specific room\"\"\"\n",[96,4452,4453],{"class":98,"line":246},[96,4454,4455],{},"        base = (room_number - 1) * 50  # 50 registers per room\n",[96,4457,4458],{"class":98,"line":251},[96,4459,450],{},[96,4461,4462],{"class":98,"line":256},[96,4463,4464],{},"        self.client.connect()\n",[96,4466,4467],{"class":98,"line":262},[96,4468,4469],{},"        result = self.client.read_holding_registers(\n",[96,4471,4472],{"class":98,"line":268},[96,4473,4474],{},"            address=base, count=50, slave=1\n",[96,4476,4477],{"class":98,"line":274},[96,4478,4479],{},"        )\n",[96,4481,4482],{"class":98,"line":280},[96,4483,4484],{},"        self.client.close()\n",[96,4486,4487],{"class":98,"line":286},[96,4488,450],{},[96,4490,4491],{"class":98,"line":292},[96,4492,4493],{},"        if result.isError():\n",[96,4495,4496],{"class":98,"line":298},[96,4497,4498],{},"            raise Exception(f\"Modbus error: {result}\")\n",[96,4500,4501],{"class":98,"line":304},[96,4502,450],{},[96,4504,4505],{"class":98,"line":310},[96,4506,4507],{},"        regs = result.registers\n",[96,4509,4510],{"class":98,"line":316},[96,4511,1865],{},[96,4513,4514],{"class":98,"line":322},[96,4515,4516],{},"            \"room\": room_number,\n",[96,4518,4519],{"class":98,"line":328},[96,4520,4521],{},"            \"temperature\": regs[0] \u002F 10,       # 1 decimal\n",[96,4523,4524],{"class":98,"line":334},[96,4525,4526],{},"            \"humidity\": regs[1] \u002F 10,\n",[96,4528,4529],{"class":98,"line":340},[96,4530,4531],{},"            \"ac_mode\": regs[10],\n",[96,4533,4534],{"class":98,"line":1429},[96,4535,4536],{},"            \"ac_setpoint\": regs[11] \u002F 10,\n",[96,4538,4539],{"class":98,"line":1434},[96,4540,4541],{},"            \"light_level\": regs[20],\n",[96,4543,4544],{"class":98,"line":1898},[96,4545,4546],{},"            \"occupancy\": bool(regs[30]),\n",[96,4548,4549],{"class":98,"line":1904},[96,4550,4551],{},"            \"door_open\": bool(regs[31]),\n",[96,4553,4555],{"class":98,"line":4554},47,[96,4556,4557],{},"            \"energy_kwh\": regs[40] \u002F 100,\n",[96,4559,4561],{"class":98,"line":4560},48,[96,4562,4563],{},"            \"power_watts\": regs[41],\n",[96,4565,4567],{"class":98,"line":4566},49,[96,4568,1344],{},[96,4570,4572],{"class":98,"line":4571},50,[96,4573,913],{},[96,4575,4577],{"class":98,"line":4576},51,[96,4578,4579],{},"    async def set_eco_mode(self, room_number: int):\n",[96,4581,4583],{"class":98,"line":4582},52,[96,4584,4585],{},"        \"\"\"Switch room to eco mode — AC off, lights off\"\"\"\n",[96,4587,4589],{"class":98,"line":4588},53,[96,4590,4591],{},"        base = (room_number - 1) * 50\n",[96,4593,4595],{"class":98,"line":4594},54,[96,4596,450],{},[96,4598,4600],{"class":98,"line":4599},55,[96,4601,4464],{},[96,4603,4605],{"class":98,"line":4604},56,[96,4606,4607],{},"        # AC off\n",[96,4609,4611],{"class":98,"line":4610},57,[96,4612,4613],{},"        self.client.write_register(address=base + 10, value=0, slave=1)\n",[96,4615,4617],{"class":98,"line":4616},58,[96,4618,4619],{},"        # Lights off\n",[96,4621,4623],{"class":98,"line":4622},59,[96,4624,4625],{},"        self.client.write_register(address=base + 20, value=0, slave=1)\n",[96,4627,4629],{"class":98,"line":4628},60,[96,4630,4484],{},[96,4632,4634],{"class":98,"line":4633},61,[96,4635,450],{},[96,4637,4639],{"class":98,"line":4638},62,[96,4640,4641],{},"        return {\"status\": \"eco_mode\", \"room\": room_number}\n",[96,4643,4645],{"class":98,"line":4644},63,[96,4646,913],{},[96,4648,4650],{"class":98,"line":4649},64,[96,4651,4652],{},"    async def set_comfort_mode(self, room_number: int, setpoint: float = 24.0):\n",[96,4654,4656],{"class":98,"line":4655},65,[96,4657,4658],{},"        \"\"\"Switch room to comfort mode — AC on, welcome lights\"\"\"\n",[96,4660,4662],{"class":98,"line":4661},66,[96,4663,4591],{},[96,4665,4667],{"class":98,"line":4666},67,[96,4668,450],{},[96,4670,4672],{"class":98,"line":4671},68,[96,4673,4464],{},[96,4675,4677],{"class":98,"line":4676},69,[96,4678,4679],{},"        # AC cool mode\n",[96,4681,4683],{"class":98,"line":4682},70,[96,4684,4685],{},"        self.client.write_register(address=base + 10, value=1, slave=1)\n",[96,4687,4689],{"class":98,"line":4688},71,[96,4690,4691],{},"        # Setpoint 24°C\n",[96,4693,4695],{"class":98,"line":4694},72,[96,4696,4697],{},"        self.client.write_register(address=base + 11, value=int(setpoint * 10), slave=1)\n",[96,4699,4701],{"class":98,"line":4700},73,[96,4702,4703],{},"        # Welcome light scene\n",[96,4705,4707],{"class":98,"line":4706},74,[96,4708,4709],{},"        self.client.write_register(address=base + 21, value=1, slave=1)\n",[96,4711,4713],{"class":98,"line":4712},75,[96,4714,4484],{},[96,4716,4718],{"class":98,"line":4717},76,[96,4719,450],{},[96,4721,4723],{"class":98,"line":4722},77,[96,4724,4725],{},"        return {\"status\": \"comfort_mode\", \"room\": room_number, \"setpoint\": setpoint}\n",[394,4727,4729],{"id":4728},"iot-alternatif-mqtt-based-smart-sensors","IoT Alternatif: MQTT-Based Smart Sensors",[11,4731,4732],{},"Kalau hotel-nya belum punya BAS (misalnya hotel bintang 2-3), bisa mulai dari IoT sensors yang lebih murah:",[599,4734,4735,4747],{},[602,4736,4737],{},[605,4738,4739,4742,4745],{},[608,4740,4741],{},"Sensor",[608,4743,4744],{},"Harga\u002FUnit",[608,4746,4071],{},[618,4748,4749,4760,4771,4782,4793],{},[605,4750,4751,4754,4757],{},[623,4752,4753],{},"DHT22 + ESP32",[623,4755,4756],{},"Rp 75rb",[623,4758,4759],{},"Temperature & humidity",[605,4761,4762,4765,4768],{},[623,4763,4764],{},"PIR HC-SR501 + ESP32",[623,4766,4767],{},"Rp 50rb",[623,4769,4770],{},"Motion detection",[605,4772,4773,4776,4779],{},[623,4774,4775],{},"ACS712 + ESP32",[623,4777,4778],{},"Rp 80rb",[623,4780,4781],{},"Current measurement",[605,4783,4784,4787,4790],{},[623,4785,4786],{},"Sonoff TH Elite",[623,4788,4789],{},"Rp 150rb",[623,4791,4792],{},"Smart thermostat with relay",[605,4794,4795,4798,4801],{},[623,4796,4797],{},"Shelly Plus 1PM",[623,4799,4800],{},"Rp 200rb",[623,4802,4803],{},"Smart switch with power metering",[11,4805,4806],{},"**Setup MQTT:\"",[86,4808,4810],{"className":694,"code":4809,"language":696,"meta":91,"style":91},"# skills\u002Fbas-control\u002Fscripts\u002Fmqtt_config.yaml\nbroker: mqtt:\u002F\u002F192.168.1.200:1883\n\nrooms:\n  101:\n    temperature: hotel\u002Froom\u002F101\u002Ftemp\n    humidity: hotel\u002Froom\u002F101\u002Fhumidity\n    motion: hotel\u002Froom\u002F101\u002Fmotion\n    ac_power: hotel\u002Froom\u002F101\u002Fac\u002Fwatts\n    light_power: hotel\u002Froom\u002F101\u002Flight\u002Fwatts\n    door: hotel\u002Froom\u002F101\u002Fdoor\n    \n  102:\n    temperature: hotel\u002Froom\u002F102\u002Ftemp\n    # ... etc\n",[93,4811,4812,4817,4827,4831,4838,4845,4855,4865,4875,4885,4895,4905,4909,4916,4925],{"__ignoreMap":91},[96,4813,4814],{"class":98,"line":99},[96,4815,4816],{"class":703},"# skills\u002Fbas-control\u002Fscripts\u002Fmqtt_config.yaml\n",[96,4818,4819,4822,4824],{"class":98,"line":105},[96,4820,4821],{"class":709},"broker",[96,4823,714],{"class":713},[96,4825,4826],{"class":717},"mqtt:\u002F\u002F192.168.1.200:1883\n",[96,4828,4829],{"class":98,"line":111},[96,4830,139],{"emptyLinePlaceholder":138},[96,4832,4833,4836],{"class":98,"line":117},[96,4834,4835],{"class":709},"rooms",[96,4837,751],{"class":713},[96,4839,4840,4843],{"class":98,"line":123},[96,4841,4842],{"class":738},"  101",[96,4844,751],{"class":713},[96,4846,4847,4850,4852],{"class":98,"line":129},[96,4848,4849],{"class":709},"    temperature",[96,4851,714],{"class":713},[96,4853,4854],{"class":717},"hotel\u002Froom\u002F101\u002Ftemp\n",[96,4856,4857,4860,4862],{"class":98,"line":135},[96,4858,4859],{"class":709},"    humidity",[96,4861,714],{"class":713},[96,4863,4864],{"class":717},"hotel\u002Froom\u002F101\u002Fhumidity\n",[96,4866,4867,4870,4872],{"class":98,"line":142},[96,4868,4869],{"class":709},"    motion",[96,4871,714],{"class":713},[96,4873,4874],{"class":717},"hotel\u002Froom\u002F101\u002Fmotion\n",[96,4876,4877,4880,4882],{"class":98,"line":148},[96,4878,4879],{"class":709},"    ac_power",[96,4881,714],{"class":713},[96,4883,4884],{"class":717},"hotel\u002Froom\u002F101\u002Fac\u002Fwatts\n",[96,4886,4887,4890,4892],{"class":98,"line":154},[96,4888,4889],{"class":709},"    light_power",[96,4891,714],{"class":713},[96,4893,4894],{"class":717},"hotel\u002Froom\u002F101\u002Flight\u002Fwatts\n",[96,4896,4897,4900,4902],{"class":98,"line":160},[96,4898,4899],{"class":709},"    door",[96,4901,714],{"class":713},[96,4903,4904],{"class":717},"hotel\u002Froom\u002F101\u002Fdoor\n",[96,4906,4907],{"class":98,"line":166},[96,4908,913],{"class":713},[96,4910,4911,4914],{"class":98,"line":172},[96,4912,4913],{"class":738},"  102",[96,4915,751],{"class":713},[96,4917,4918,4920,4922],{"class":98,"line":177},[96,4919,4849],{"class":709},[96,4921,714],{"class":713},[96,4923,4924],{"class":717},"hotel\u002Froom\u002F102\u002Ftemp\n",[96,4926,4927],{"class":98,"line":182},[96,4928,4929],{"class":703},"    # ... etc\n",[11,4931,4932,4935],{},[41,4933,4934],{},"Point penting:"," Mulai dari IoT sederhana ini, hotel bisa upgrade ke Schneider BAS secara bertahap. OpenClaw nggak peduli backend-nya apa — yang penting ada data dan ada kontrol. Migrasi tinggal ganti skill, nggak perlu rebuild sistem.",[11,4937,77],{},[26,4939,4941],{"id":4940},"monitoring-analytics-dashboard","📡 Monitoring & Analytics Dashboard",[11,4943,4944],{},"Data tanpa visualisasi itu useless. Hotel management butuh dashboard yang ngasih insight real-time.",[394,4946,4948],{"id":4947},"metrik-yang-perlu-dimonitor","Metrik yang Perlu Dimonitor",[86,4950,4952],{"className":88,"code":4951,"language":90,"meta":91,"style":91},"flowchart TD\n    subgraph Realtime[\"⚡ Real-time Dashboard\"]\n        E1[\"Total Energy\u003Cbr\u002F>kWh & Cost\"]\n        E2[\"Per-Floor Energy\u003Cbr\u002F>Breakdown\"]\n        E3[\"Per-Room Status\u003Cbr\u002F>Occupied\u002FVacant\u002FEco\"]\n        E4[\"HVAC Load\u003Cbr\u002F\"\"]\n        E5[\"Guest Activity\u003Cbr\u002F>Check-in\u002Fout\"]\n        E6[\"AI Interactions\u003Cbr\u002F>Volume & Type\"]\n    end\n    \n    subgraph Historical[\"📊 Historical Analytics\"]\n        H1[\"Daily\u002FWeekly\u002FMonthly\u003Cbr\u002F>Energy Trend\"]\n        H2[\"Occupancy vs Energy\u003Cbr\u002F>Correlation\"]\n        H3[\"Green Rewards\u003Cbr\u002F>Participation Rate\"]\n        H4[\"Guest Satisfaction\u003Cbr\u002F>Score Trend\"]\n        H5[\"Popular AI Requests\u003Cbr\u002F>Top Categories\"]\n        H6[\"Cost Savings\u003Cbr\u002F>vs Baseline\"]\n    end\n    \n    subgraph Alerts[\"🔔 Smart Alerts\"]\n        A1[\"Room Energy Spike\u003Cbr\u002F>> 150% Baseline\"]\n        A2[\"HVAC Fault\u003Cbr\u002F>Sensor Offline\"]\n        A3[\"Guest Complaint\u003Cbr\u002F>Urgent\"]\n        A4[\"Check-out Today\u003Cbr\u002F>Prepare Welcome\"]\n        A5[\"Eco Mode Failed\u003Cbr\u002F>Manual Override\"]\n    end\n    \n    Realtime --> DASH[\"Hotel Management Dashboard\"]\n    Historical --> DASH\n    Alerts --> DASH\n",[93,4953,4954,4958,4963,4968,4973,4978,4983,4988,4993,4997,5001,5006,5011,5016,5021,5026,5031,5036,5040,5044,5049,5054,5059,5064,5069,5074,5078,5082,5087,5092],{"__ignoreMap":91},[96,4955,4956],{"class":98,"line":99},[96,4957,102],{},[96,4959,4960],{"class":98,"line":105},[96,4961,4962],{},"    subgraph Realtime[\"⚡ Real-time Dashboard\"]\n",[96,4964,4965],{"class":98,"line":111},[96,4966,4967],{},"        E1[\"Total Energy\u003Cbr\u002F>kWh & Cost\"]\n",[96,4969,4970],{"class":98,"line":117},[96,4971,4972],{},"        E2[\"Per-Floor Energy\u003Cbr\u002F>Breakdown\"]\n",[96,4974,4975],{"class":98,"line":123},[96,4976,4977],{},"        E3[\"Per-Room Status\u003Cbr\u002F>Occupied\u002FVacant\u002FEco\"]\n",[96,4979,4980],{"class":98,"line":129},[96,4981,4982],{},"        E4[\"HVAC Load\u003Cbr\u002F\"\"]\n",[96,4984,4985],{"class":98,"line":135},[96,4986,4987],{},"        E5[\"Guest Activity\u003Cbr\u002F>Check-in\u002Fout\"]\n",[96,4989,4990],{"class":98,"line":142},[96,4991,4992],{},"        E6[\"AI Interactions\u003Cbr\u002F>Volume & Type\"]\n",[96,4994,4995],{"class":98,"line":148},[96,4996,132],{},[96,4998,4999],{"class":98,"line":154},[96,5000,913],{},[96,5002,5003],{"class":98,"line":160},[96,5004,5005],{},"    subgraph Historical[\"📊 Historical Analytics\"]\n",[96,5007,5008],{"class":98,"line":166},[96,5009,5010],{},"        H1[\"Daily\u002FWeekly\u002FMonthly\u003Cbr\u002F>Energy Trend\"]\n",[96,5012,5013],{"class":98,"line":172},[96,5014,5015],{},"        H2[\"Occupancy vs Energy\u003Cbr\u002F>Correlation\"]\n",[96,5017,5018],{"class":98,"line":177},[96,5019,5020],{},"        H3[\"Green Rewards\u003Cbr\u002F>Participation Rate\"]\n",[96,5022,5023],{"class":98,"line":182},[96,5024,5025],{},"        H4[\"Guest Satisfaction\u003Cbr\u002F>Score Trend\"]\n",[96,5027,5028],{"class":98,"line":188},[96,5029,5030],{},"        H5[\"Popular AI Requests\u003Cbr\u002F>Top Categories\"]\n",[96,5032,5033],{"class":98,"line":194},[96,5034,5035],{},"        H6[\"Cost Savings\u003Cbr\u002F>vs Baseline\"]\n",[96,5037,5038],{"class":98,"line":200},[96,5039,132],{},[96,5041,5042],{"class":98,"line":206},[96,5043,913],{},[96,5045,5046],{"class":98,"line":211},[96,5047,5048],{},"    subgraph Alerts[\"🔔 Smart Alerts\"]\n",[96,5050,5051],{"class":98,"line":216},[96,5052,5053],{},"        A1[\"Room Energy Spike\u003Cbr\u002F>> 150% Baseline\"]\n",[96,5055,5056],{"class":98,"line":222},[96,5057,5058],{},"        A2[\"HVAC Fault\u003Cbr\u002F>Sensor Offline\"]\n",[96,5060,5061],{"class":98,"line":228},[96,5062,5063],{},"        A3[\"Guest Complaint\u003Cbr\u002F>Urgent\"]\n",[96,5065,5066],{"class":98,"line":234},[96,5067,5068],{},"        A4[\"Check-out Today\u003Cbr\u002F>Prepare Welcome\"]\n",[96,5070,5071],{"class":98,"line":240},[96,5072,5073],{},"        A5[\"Eco Mode Failed\u003Cbr\u002F>Manual Override\"]\n",[96,5075,5076],{"class":98,"line":246},[96,5077,132],{},[96,5079,5080],{"class":98,"line":251},[96,5081,913],{},[96,5083,5084],{"class":98,"line":256},[96,5085,5086],{},"    Realtime --> DASH[\"Hotel Management Dashboard\"]\n",[96,5088,5089],{"class":98,"line":262},[96,5090,5091],{},"    Historical --> DASH\n",[96,5093,5094],{"class":98,"line":268},[96,5095,5096],{},"    Alerts --> DASH\n",[394,5098,5100],{"id":5099},"contoh-dashboard-data-flow","Contoh Dashboard Data Flow",[11,5102,5103],{},"OpenClaw heartbeat bisa push data ke dashboard setiap interval:",[86,5105,5107],{"className":411,"code":5106,"language":413,"meta":91,"style":91},"# skills\u002Fbas-control\u002Fscripts\u002Fdashboard-updater.py\nimport requests\nimport json\nfrom datetime import datetime\n\nclass DashboardUpdater:\n    def __init__(self, dashboard_api: str):\n        self.api = dashboard_api\n        \n    async def push_realtime_data(self, bas_client, hotel_rooms: int):\n        \"\"\"Collect and push real-time data to dashboard\"\"\"\n        snapshot = {\n            \"timestamp\": datetime.now().isoformat(),\n            \"total_rooms\": hotel_rooms,\n            \"rooms\": []\n        }\n        \n        total_power = 0\n        occupied = 0\n        eco_mode = 0\n        \n        for room in range(1, hotel_rooms + 1):\n            status = await bas_client.get_room_status(room)\n            total_power += status[\"power_watts\"]\n            \n            if status[\"occupancy\"]:\n                occupied += 1\n            if status[\"ac_mode\"] == 0 and not status[\"occupancy\"]:\n                eco_mode += 1\n                \n            snapshot[\"rooms\"].append(status)\n        \n        snapshot[\"summary\"] = {\n            \"total_power_kw\": round(total_power \u002F 1000, 2),\n            \"occupied_rooms\": occupied,\n            \"vacant_eco_rooms\": eco_mode,\n            \"occupancy_rate\": round(occupied \u002F hotel_rooms * 100, 1),\n            \"estimated_daily_cost_rp\": round(total_power \u002F 1000 * 24 * 1500),\n        }\n        \n        # Push to Supabase \u002F API\n        requests.post(f\"{self.api}\u002Fenergy-snapshot\", json=snapshot)\n        \n        return snapshot[\"summary\"]\n",[93,5108,5109,5114,5119,5124,5129,5133,5138,5143,5148,5152,5157,5162,5167,5172,5177,5182,5186,5190,5195,5200,5205,5209,5214,5219,5224,5229,5234,5239,5244,5249,5254,5259,5263,5268,5273,5278,5283,5288,5293,5297,5301,5306,5311,5315],{"__ignoreMap":91},[96,5110,5111],{"class":98,"line":99},[96,5112,5113],{},"# skills\u002Fbas-control\u002Fscripts\u002Fdashboard-updater.py\n",[96,5115,5116],{"class":98,"line":105},[96,5117,5118],{},"import requests\n",[96,5120,5121],{"class":98,"line":111},[96,5122,5123],{},"import json\n",[96,5125,5126],{"class":98,"line":117},[96,5127,5128],{},"from datetime import datetime\n",[96,5130,5131],{"class":98,"line":123},[96,5132,139],{"emptyLinePlaceholder":138},[96,5134,5135],{"class":98,"line":129},[96,5136,5137],{},"class DashboardUpdater:\n",[96,5139,5140],{"class":98,"line":135},[96,5141,5142],{},"    def __init__(self, dashboard_api: str):\n",[96,5144,5145],{"class":98,"line":142},[96,5146,5147],{},"        self.api = dashboard_api\n",[96,5149,5150],{"class":98,"line":148},[96,5151,450],{},[96,5153,5154],{"class":98,"line":154},[96,5155,5156],{},"    async def push_realtime_data(self, bas_client, hotel_rooms: int):\n",[96,5158,5159],{"class":98,"line":160},[96,5160,5161],{},"        \"\"\"Collect and push real-time data to dashboard\"\"\"\n",[96,5163,5164],{"class":98,"line":166},[96,5165,5166],{},"        snapshot = {\n",[96,5168,5169],{"class":98,"line":172},[96,5170,5171],{},"            \"timestamp\": datetime.now().isoformat(),\n",[96,5173,5174],{"class":98,"line":177},[96,5175,5176],{},"            \"total_rooms\": hotel_rooms,\n",[96,5178,5179],{"class":98,"line":182},[96,5180,5181],{},"            \"rooms\": []\n",[96,5183,5184],{"class":98,"line":188},[96,5185,1344],{},[96,5187,5188],{"class":98,"line":194},[96,5189,450],{},[96,5191,5192],{"class":98,"line":200},[96,5193,5194],{},"        total_power = 0\n",[96,5196,5197],{"class":98,"line":206},[96,5198,5199],{},"        occupied = 0\n",[96,5201,5202],{"class":98,"line":211},[96,5203,5204],{},"        eco_mode = 0\n",[96,5206,5207],{"class":98,"line":216},[96,5208,450],{},[96,5210,5211],{"class":98,"line":222},[96,5212,5213],{},"        for room in range(1, hotel_rooms + 1):\n",[96,5215,5216],{"class":98,"line":228},[96,5217,5218],{},"            status = await bas_client.get_room_status(room)\n",[96,5220,5221],{"class":98,"line":234},[96,5222,5223],{},"            total_power += status[\"power_watts\"]\n",[96,5225,5226],{"class":98,"line":240},[96,5227,5228],{},"            \n",[96,5230,5231],{"class":98,"line":246},[96,5232,5233],{},"            if status[\"occupancy\"]:\n",[96,5235,5236],{"class":98,"line":251},[96,5237,5238],{},"                occupied += 1\n",[96,5240,5241],{"class":98,"line":256},[96,5242,5243],{},"            if status[\"ac_mode\"] == 0 and not status[\"occupancy\"]:\n",[96,5245,5246],{"class":98,"line":262},[96,5247,5248],{},"                eco_mode += 1\n",[96,5250,5251],{"class":98,"line":268},[96,5252,5253],{},"                \n",[96,5255,5256],{"class":98,"line":274},[96,5257,5258],{},"            snapshot[\"rooms\"].append(status)\n",[96,5260,5261],{"class":98,"line":280},[96,5262,450],{},[96,5264,5265],{"class":98,"line":286},[96,5266,5267],{},"        snapshot[\"summary\"] = {\n",[96,5269,5270],{"class":98,"line":292},[96,5271,5272],{},"            \"total_power_kw\": round(total_power \u002F 1000, 2),\n",[96,5274,5275],{"class":98,"line":298},[96,5276,5277],{},"            \"occupied_rooms\": occupied,\n",[96,5279,5280],{"class":98,"line":304},[96,5281,5282],{},"            \"vacant_eco_rooms\": eco_mode,\n",[96,5284,5285],{"class":98,"line":310},[96,5286,5287],{},"            \"occupancy_rate\": round(occupied \u002F hotel_rooms * 100, 1),\n",[96,5289,5290],{"class":98,"line":316},[96,5291,5292],{},"            \"estimated_daily_cost_rp\": round(total_power \u002F 1000 * 24 * 1500),\n",[96,5294,5295],{"class":98,"line":322},[96,5296,1344],{},[96,5298,5299],{"class":98,"line":328},[96,5300,450],{},[96,5302,5303],{"class":98,"line":334},[96,5304,5305],{},"        # Push to Supabase \u002F API\n",[96,5307,5308],{"class":98,"line":340},[96,5309,5310],{},"        requests.post(f\"{self.api}\u002Fenergy-snapshot\", json=snapshot)\n",[96,5312,5313],{"class":98,"line":1429},[96,5314,450],{},[96,5316,5317],{"class":98,"line":1434},[96,5318,5319],{},"        return snapshot[\"summary\"]\n",[394,5321,5323],{"id":5322},"laporan-harian-untuk-management","Laporan Harian untuk Management",[11,5325,5326],{},"Setiap pagi, OpenClaw bisa generate laporan otomatis dan kirim ke group WhatsApp manajemen hotel:",[86,5328,5331],{"className":5329,"code":5330,"language":1116},[1114],"📊 Hotel Energy Report — 4 April 2026\n\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░ 80% Performance Score\n\n⚡ Energy Summary:\n• Total: 4,521 kWh (vs baseline 6,280 kWh)\n• Hemat: 1,759 kWh (28%)\n• Estimasi hemat: Rp 2,638,500 💰\n\n🏨 Room Status:\n• Occupied: 142 \u002F 200 (71%)\n• Eco mode: 38 kamar\n• Maintenance: 3 kamar\n• Vacant: 17 kamar\n\n🤖 AI Concierge Stats:\n• Total interactions: 847\n• Paling populer: Restaurant recommendations (234)\n• Rata-rata response time: 1.2 detik\n• Satisfaction rating: 4.7\u002F5 ⭐\n\n🌿 Green Rewards:\n• Peserta aktif: 89 tamu (63%)\n• Total poin diberikan: 12,450\n• Estimasi penghematan tamu: 892 kWh\n\n⚠️ Alerts:\n• Room 305: AC fault — perlu teknisi\n• Room 712: Energy spike 180% — check tamu\n• 8 tamu check-out hari ini — prepare rooms\n",[93,5332,5330],{"__ignoreMap":91},[11,5334,5335,5336,5339],{},"Laporan kayak gini ini biasanya butuh orang khusus bikin tiap hari. Dengan OpenClaw, ",[41,5337,5338],{},"otomatis dan gratis",". Value-nya gede banget buat manajemen.",[11,5341,77],{},[26,5343,5345],{"id":5344},"studi-kasus-implementasi-di-hotel-bintang-4","🏢 Studi Kasus: Implementasi di Hotel Bintang 4",[11,5347,5348],{},"Supaya lebih gamblang, gue gambar skenario implementasi nyata.",[394,5350,5352],{"id":5351},"profil-hotel","Profil Hotel",[34,5354,5355,5361,5367,5373,5379],{},[37,5356,5357,5360],{},[41,5358,5359],{},"Tipe:"," Hotel bintang 4, kota tier 2 (misal Balikpapan, Makassar, Surabaya)",[37,5362,5363,5366],{},[41,5364,5365],{},"Kamar:"," 150 kamar",[37,5368,5369,5372],{},[41,5370,5371],{},"Occupancy rata-rata:"," 65-75%",[37,5374,5375,5378],{},[41,5376,5377],{},"F&B Revenue:"," 35% total revenue",[37,5380,5381,5384],{},[41,5382,5383],{},"Problem:"," Energy cost naik 15% YoY, guest complaint rating 3.2\u002F5",[394,5386,5388],{"id":5387},"fase-implementasi","Fase Implementasi",[11,5390,5391],{},[41,5392,5393],{},"Bulan 1-2: Foundation",[34,5395,5396,5399,5402,5405,5408],{},[37,5397,5398],{},"Setup OpenClaw di VPS (1 hari)",[37,5400,5401],{},"Integration WhatsApp Business API (3 hari)",[37,5403,5404],{},"FAQ bot dari existing knowledge base (1 minggu)",[37,5406,5407],{},"WiFi login → welcome message automation (3 hari)",[37,5409,5410,5413],{},[41,5411,5412],{},"Quick win:"," Guest bisa tanya info hotel via WhatsApp 24\u002F7",[11,5415,5416],{},[41,5417,5418],{},"Bulan 3-4: BAS + Concierge",[34,5420,5421,5424,5427,5430,5433],{},[37,5422,5423],{},"Install IoT sensors di 50 kamar (pilot) — 2 minggu",[37,5425,5426],{},"BAS integration via MQTT — 2 minggu",[37,5428,5429],{},"Restaurant & attraction recommendation engine — 1 minggu",[37,5431,5432],{},"Room service request system — 1 minggu",[37,5434,5435,5438],{},[41,5436,5437],{},"Hasil:"," Energy turun 15% di 50 kamar pilot, guest satisfaction naik ke 4.0\u002F5",[11,5440,5441],{},[41,5442,5443],{},"Bulan 5-6: Scale + Green Rewards",[34,5445,5446,5449,5452,5455],{},[37,5447,5448],{},"Rollout sensors ke semua 150 kamar — 3 minggu",[37,5450,5451],{},"Launch green rewards program — 2 minggu",[37,5453,5454],{},"Energy dashboard untuk management — 1 minggu",[37,5456,5457,5459],{},[41,5458,5437],{}," Total energy turun 25%, 40% tamu ikut green rewards, F&B revenue naik 10% (karena recommendation engine)",[394,5461,5463],{"id":5462},"roi-projection","ROI Projection",[86,5465,5468],{"className":5466,"code":5467,"language":1116},[1114],"💰 ROI Analysis — Hotel Bintang 4, 150 Kamar\n\nInvestasi:\n  • VPS OpenClaw (1 tahun):       Rp 12.000.000\n  • IoT Sensors (150 kamar):      Rp 22.500.000\n  • Development & Integration:    Rp 35.000.000\n  • WhatsApp Business API (1thn):  Rp 18.000.000\n  • Training & Change Management:  Rp 10.000.000\n  ─────────────────────────────────────────────\n  Total Investasi:                Rp 97.500.000\n\nPenghematan per Tahun:\n  • Energy savings (25%):         Rp 380.000.000\n  • Staff efficiency (2 FTE):      Rp 144.000.000\n  • F&B upsell (10%):             Rp 250.000.000\n  ─────────────────────────────────────────────\n  Total Benefit per Tahun:        Rp 774.000.000\n\nPayback Period: 1.5 bulan 🤯\nROI Year 1: 693%\n",[93,5469,5467],{"__ignoreMap":91},[11,5471,5472],{},"Angka-angka ini realistis berdasarkan benchmark industri. Energy savings 20-30% itu achievable dengan proper BAS integration. Dan F&B upsell dari AI recommendation itu bonus yang nggak expected banyak hotel.",[11,5474,77],{},[26,5476,5478],{"id":5477},"pitfall-lesson-learned","🚨 Pitfall & Lesson Learned",[11,5480,5481],{},"Gue udah lihat banyak IoT\u002Fsmart building project gagal. Ini common pitfalls yang harus dihindari:",[394,5483,5485],{"id":5484},"_1-over-engineering","1. Over-Engineering",[11,5487,5488,5491],{},[41,5489,5490],{},"❌ Salah:"," Langsung implementasi ML-based predictive HVAC, blockchain rewards, AR navigation.",[11,5493,5494,5497],{},[41,5495,5496],{},"✅ Benar:"," Mulai dari FAQ bot, WiFi welcome, basic BAS control. Iterate from there.",[11,5499,5500],{},"Hotel bukan tech company. Mereka butuh reliability, bukan cutting edge. Simple yang reliable beats complex yang buggy.",[394,5502,5504],{"id":5503},"_2-ignoring-existing-infrastructure","2. Ignoring Existing Infrastructure",[11,5506,5507,5508,5511,5512,5515],{},"Banyak vendor datang ke hotel dan minta replace semua system BAS yang udah ada. ",[41,5509,5510],{},"Huge mistake."," Existing BAS (Schneider, Honeywell, Siemens) itu reliable dan udah terinvestasi. OpenClaw harus ",[41,5513,5514],{},"integrate",", bukan replace.",[394,5517,5519],{"id":5518},"_3-no-staff-buy-in","3. No Staff Buy-In",[11,5521,5522],{},"Kalau staf resepsionis nggak percaya sama AI, mereka bakal override semua. Training dan change management itu critical. Pastikan staf:",[34,5524,5525,5528,5531],{},[37,5526,5527],{},"Paham kenapa system ini dibuat",[37,5529,5530],{},"Tahu cara escalate ke human",[37,5532,5533],{},"Merasa empowered, bukan threatened",[394,5535,5537],{"id":5536},"_4-privacy-overreach","4. Privacy Overreach",[11,5539,5540],{},"Jangan track tamu lebih dari yang perlu. Energy tracking per room? OK. Track tamu ke mana aja di hotel? NOPE. Pastikan ada consent dan transparency.",[394,5542,5544],{"id":5543},"_5-single-point-of-failure","5. Single Point of Failure",[11,5546,5547],{},"OpenClaw down → semua tamu nggak bisa chat? That's unacceptable. Pastikan ada:",[34,5549,5550,5553,5556],{},[37,5551,5552],{},"Fallback: Basic FAQ tanpa AI",[37,5554,5555],{},"Redundancy: Multi-VPS atau failover",[37,5557,5558],{},"Manual override: Tamu bisa tetap call resepsionis",[11,5560,77],{},[26,5562,5564],{"id":5563},"kesimpulan","🧠 Kesimpulan",[11,5566,5567],{},"Smart hotel bukan konsep baru. Tapi implementasinya sering terhambat oleh:",[34,5569,5570,5573,5576],{},[37,5571,5572],{},"Biaya integrasi yang tinggi",[37,5574,5575],{},"Fragmented systems (BAS, PMS, CRM, Communication)",[37,5577,5578],{},"Kurangnya AI yang bisa handle multi-domain",[11,5580,5581],{},"OpenClaw mengubah equation ini. Dengan kemampuan:",[34,5583,5584,5590,5596,5602,5608],{},[37,5585,5586,5589],{},[41,5587,5588],{},"Multi-channel"," (WhatsApp, Telegram, Discord)",[37,5591,5592,5595],{},[41,5593,5594],{},"Skill-based architecture"," (mudah tambah fitur baru)",[37,5597,5598,5601],{},[41,5599,5600],{},"Heartbeat automation"," (proactive monitoring)",[37,5603,5604,5607],{},[41,5605,5606],{},"Self-evolving"," (makin pintar seiring waktu)",[37,5609,5610,5613],{},[41,5611,5612],{},"BAS integration"," via custom skills",[11,5615,5616],{},"Satu platform bisa handle semuanya: dari energy optimization sampai guest experience, dari maintenance tracking sampai revenue optimization.",[11,5618,5619,5620,5623],{},"Yang paling penting: ",[41,5621,5622],{},"mulai dari simple, iterate fast."," Nggak perlu implementasi semuanya sekaligus. FAQ bot aja udah bisa deliver value. WiFi welcome aja udah bikin tamu wow.",[11,5625,5626],{},"Hotel yang pertama adopt AI concierge di Indonesia akan punya competitive advantage yang signifikan. Dan OpenClaw siap jadi engine-nya.",[11,5628,77],{},[374,5630,5631],{},[11,5632,5633,5636,5637,5640],{},[41,5634,5635],{},"Heads up:"," Artikel ini ditulis berdasarkan diskusi di komunitas OpenClaw Indonesia tentang smart hotel use case. Setup OpenClaw butuh VPS — gue rekomendasiin ",[15,5638,20],{"href":17,"rel":5639},[19]," untuk hosting yang reliable dan harga bersahabat.",[23,5642],{},[11,5644,5645],{},[41,5646,5647],{},"Referensi & Resources:",[34,5649,5650,5657,5664,5671,5677,5684],{},[37,5651,5652],{},[15,5653,5656],{"href":5654,"rel":5655},"https:\u002F\u002Fdocs.openclaw.ai",[19],"OpenClaw Documentation",[37,5658,5659],{},[15,5660,5663],{"href":5661,"rel":5662},"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw",[19],"OpenClaw GitHub",[37,5665,5666],{},[15,5667,5670],{"href":5668,"rel":5669},"https:\u002F\u002Fwww.se.com\u002Fww\u002Fen\u002Fwork\u002Fproducts-services\u002Fbuilding-automation\u002F",[19],"Schneider Electric Building Automation",[37,5672,5673],{},[15,5674,2509],{"href":5675,"rel":5676},"https:\u002F\u002Fbusiness.whatsapp.com\u002Fdevelopers\u002Fdeveloper-hub",[19],[37,5678,5679],{},[15,5680,5683],{"href":5681,"rel":5682},"https:\u002F\u002Fwww.bacnet.org\u002F",[19],"BACnet Protocol",[37,5685,5686],{},[15,5687,5690],{"href":5688,"rel":5689},"https:\u002F\u002Fwww.greenhotels.com\u002F",[19],"Green Hotel Association",[11,5692,5693],{},[41,5694,5695],{},"Artikel terkait:",[34,5697,5698,5704],{},[37,5699,5700],{},[15,5701,5703],{"href":5702},"\u002Ftech\u002Fopenclaw-llm-provider-guide\u002F","Panduan Lengkap Pilih LLM Provider untuk OpenClaw",[37,5705,5706],{},[15,5707,5709],{"href":5708},"\u002Ftech\u002Fopenclaw-2026-4-2\u002F","OpenClaw 2026.4.2 — Update Terbaru",[5711,5712,5713],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":91,"searchDepth":105,"depth":105,"links":5715},[5716,5717,5718,5723,5727,5728,5735,5736,5740,5746,5753,5754,5761,5762,5768,5774,5779,5784,5791],{"id":28,"depth":105,"text":29},{"id":80,"depth":105,"text":81},{"id":368,"depth":105,"text":369,"children":5719},[5720,5721,5722],{"id":396,"depth":111,"text":397},{"id":507,"depth":111,"text":508},{"id":593,"depth":111,"text":594},{"id":880,"depth":105,"text":881,"children":5724},[5725,5726],{"id":989,"depth":111,"text":990},{"id":1109,"depth":111,"text":1110},{"id":1126,"depth":105,"text":1127},{"id":1448,"depth":105,"text":1449,"children":5729},[5730,5731,5732,5733,5734],{"id":1455,"depth":111,"text":1456},{"id":1493,"depth":111,"text":1494},{"id":1677,"depth":111,"text":1678},{"id":1909,"depth":111,"text":1910},{"id":1919,"depth":111,"text":1920},{"id":2128,"depth":105,"text":2129},{"id":2457,"depth":105,"text":2458,"children":5737},[5738,5739],{"id":2464,"depth":111,"text":2465},{"id":2581,"depth":111,"text":2582},{"id":2610,"depth":105,"text":2611,"children":5741},[5742,5743,5744,5745],{"id":2617,"depth":111,"text":2618},{"id":2728,"depth":111,"text":2729},{"id":2738,"depth":111,"text":2739},{"id":3021,"depth":111,"text":3022},{"id":3198,"depth":105,"text":3199,"children":5747},[5748,5749,5750,5751,5752],{"id":3205,"depth":111,"text":3206},{"id":3226,"depth":111,"text":3227},{"id":3244,"depth":111,"text":3245},{"id":3262,"depth":111,"text":3263},{"id":3280,"depth":111,"text":3281},{"id":3300,"depth":105,"text":3301},{"id":3441,"depth":105,"text":3442,"children":5755},[5756,5757,5758,5759,5760],{"id":3448,"depth":111,"text":3449},{"id":3469,"depth":111,"text":3470},{"id":3533,"depth":111,"text":3534},{"id":3546,"depth":111,"text":3547},{"id":3567,"depth":111,"text":3568},{"id":3593,"depth":105,"text":3594},{"id":3756,"depth":105,"text":3757,"children":5763},[5764,5765,5766,5767],{"id":3763,"depth":111,"text":3764},{"id":3839,"depth":111,"text":3840},{"id":3909,"depth":111,"text":3910},{"id":3978,"depth":111,"text":3979},{"id":4048,"depth":105,"text":4049,"children":5769},[5770,5771,5772,5773],{"id":4055,"depth":111,"text":4056},{"id":4142,"depth":111,"text":4143},{"id":4320,"depth":111,"text":4321},{"id":4728,"depth":111,"text":4729},{"id":4940,"depth":105,"text":4941,"children":5775},[5776,5777,5778],{"id":4947,"depth":111,"text":4948},{"id":5099,"depth":111,"text":5100},{"id":5322,"depth":111,"text":5323},{"id":5344,"depth":105,"text":5345,"children":5780},[5781,5782,5783],{"id":5351,"depth":111,"text":5352},{"id":5387,"depth":111,"text":5388},{"id":5462,"depth":111,"text":5463},{"id":5477,"depth":105,"text":5478,"children":5785},[5786,5787,5788,5789,5790],{"id":5484,"depth":111,"text":5485},{"id":5503,"depth":111,"text":5504},{"id":5518,"depth":111,"text":5519},{"id":5536,"depth":111,"text":5537},{"id":5543,"depth":111,"text":5544},{"id":5563,"depth":105,"text":5564},"tech","2026-04-04 14:13:00","Tutorial lengkap implementasi OpenClaw sebagai smart hotel assistant: integrasi BAS (Building Automation System), AI concierge via WhatsApp, WiFi login automation, dan green hotel reward system. Dari arsitektur sampai kode.","md","\u002Fimages\u002Fposts\u002Fsmart-hotel-header-og.jpg",{},"\u002Ftech\u002Fopenclaw-smart-hotel","18",{"title":5,"description":5794},"tech\u002Fopenclaw-smart-hotel",[2650,5803,5804,5805,5806,5807],"smart-hotel","bas","iot","ai-concierge","building-automation","M0seMtsBNJTmkoXCtlVbirU0TJYaqVbxQBEfhs0Q5L4",1775317692655]