Mirobody
The canonical registry of human health — roughly two thousand standardized indicators, clinical and lifestyle, resolved into one language.
Monitor flood levels and health impacts in Bangkok
Translation pending
AI summary · website content
HealthHTML · JavaScriptGitHub @wisanusrOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗เว็บแสดงสถานการณ์น้ำท่วมจาก Google Sheets สาธารณะ รันทั้งหมดผ่าน GitHub (ไม่ต้อง deploy Apps Script)
.github/workflows/pages.yml) ทำงานทุก 30 นาทีและเมื่อ pushfetch_data.cjs อ่านชีตเป็น CSV (ชีตต้องเปิดแบบ "ทุกคนที่มีลิงก์อ่านได้") แล้วแปลงด้วยตรรกะเดียวกับ Code.gs → docs/data.jsonbuild_pages.py รวมหน้าเว็บเป็น docs/index.htmlSettings → Pages → Source: GitHub Actions (Pages บน repo private ต้องใช้แพ็กเกจเสียเงิน)
node test.cjs
node fetch_data.cjs
python build_pages.py
python -m http.server 8000 --directory docs
ย้ายมาจากโปรเจกต์ SAT_flood: พาดหัวข่าวน้ำท่วม, Word Cloud (TF-IDF) และ Google Trends
news/news_scraper.py อ่าน RSS (Google News, มติชน, Thai PBS, ไทยรัฐ) ย้อนหลัง 30 ชม. → docs/news_data/news.json (เก็บเฉพาะพาดหัว/แหล่ง/ลิงก์/เวลา ไม่เก็บเนื้อหาข่าว)news/trends_scraper.py อ่าน Google Trends → docs/news_data/trends.json ถ้าอ่านไม่ได้ (pytrends ไม่เป็นทางการ อาจถูกจำกัดบน GitHub runner) จะแสดงสถานะ "ไม่พร้อมใช้งาน" ไม่ใช้ข้อมูลสมมติparts ใน trends.json) เส้นแนวโน้มลองใหม่ 1 ครั้งเมื่อเจอ 429flood_web/data-model.js (lifecycle) และพิมพ์สูตรไว้บนหน้า คำของแต่ละระยะกำหนดใน news/trends_scraper.py (PHASES) ไม่ใช่จำนวนการค้นหาจริงหรือจำนวนผู้ประสบภัยpages.yml ก่อน build และ continue-on-error จึงไม่ทำให้ deploy แดชบอร์ดล้ม ไฟล์ JSON ไม่ถูก commit (อยู่ใน docs/)news.json/trends.json ใหม่), ชิปคำค้นหาที่พุ่ง และอันดับจังหวัด ทุกตัวเลขมาจากสองไฟล์นี้เท่านั้น ไม่มีค่าประมาณflood_web/news-view.js (บล็อก <!--@pages-only-begin--> ใน template.html ถูกตัดออกจากแพ็กเกจ Apps Script โดย build.py และใส่กลับใน build_pages.py)python news/test_news.py · รันในเครื่อง: pip install -r news/requirements.txt && python news/news_scraper.py && python news/trends_scraper.py ก่อน python build_pages.pyแสดงตำบลที่ pipeline น้ำขัง (repo geeks_project_google) ประเมินว่าพบน้ำจากภาพดาวเทียมร่วมกับรายงานระดับอำเภอของ ปภ. อ่านอย่างเดียว ไม่เขียนกลับ Sheet
flood_waterlogged (1 แถว/ตำบล 21 คอลัมน์) และ flood_waterlogged_amphoe (1 แถว/อำเภอ 22 คอลัมน์ รวมระดับ 2P2R ของอำเภอและของจังหวัด แทนชีตเดิม flood_waterlogged_district และ flood_2p2r_province) หัวคอลัมน์ต้องครบ ไม่ครบ = ชีตนั้นเป็น error. ทุกค่าในชีตเป็นข้อความ ค่าว่างเป็น null (ไม่ใช่ 0) เวลาเป็นเวลาไทยOPTIONAL): fetch_data.cjs อ่านซ้ำ 1 ครั้งแล้วข้าม ไม่ทำให้ deploy ล้ม ชีตที่อ่านไม่ได้/ว่างทำให้แท็บแสดง "ยังไม่มีข้อมูลรอบนี้" แท็บอื่นทำงานปกติserver.py อ่านสองชีตนี้ด้วยชื่อแท็บ (gviz) เพราะไม่มี gid (SHEETS[...] = None); Code.gs (transform_) และ fetch_data.cjs ให้ผลเหมือนกันflood_web/waterlogged-view.js อ่าน window.dashboardData และวาดใหม่เมื่อมี event dashboard:data; ตรรกะบริสุทธิ์ (จัดกลุ่มสถานะ นับ เรียง กรอง ความสด) อยู่ใน data-model.js (waterRows, waterSummary, waterFilter, waterFreshness ...) มีเทสต์ใน test_model.cjs. ตารางใช้ window.DashboardTables (table()/paginateTables ของ dashboard.js)DashboardModel.WATERLOGGED_SOURCES ไม่ใส่ใน SOURCES (เหมือน RISK_SOURCES)basis (แท็บอำเภอ): ภาพดาวเทียม + ปภ. หรือ ปภ. (ไม่มีภาพดาวเทียม) (จังหวัดที่ไม่มีภาพดาวเทียมพบน้ำ แต่ ปภ. รายงานอำเภอต่อเนื่อง ≥ 3 วัน) แถวกลุ่มหลังไม่มีตำบลในแท็บตำบล คอลัมน์จำนวนตำบล/พื้นที่/max_run_days เป็นค่าว่าง (null) หน้าเว็บแสดง "–" ไม่แสดง 0 เรียงไว้ท้ายตาราง มีป้ายเด่น ตัวกรองที่มา การ์ดแยก และคลิกแล้วแจ้งว่าไม่มีรายการตำบลstatus และ reasonsstatus มี 5 ค่า (น้ำขัง, เฝ้าระวัง, พบน้ำใหม่, ข้อมูลไม่พอ, พบน้ำล่าสุด (ไม่มีภาพใหม่)) ไม่มีสถานะ "รอยืนยัน" แยก: น้ำขัง เป็นป้ายเดียวกันทุกตำบล ระดับหลักฐานอยู่ที่ confidence (สูง = "ยืนยันด้วยภาพ", กลาง = "ตาม ปภ.") หน้าเว็บแสดงป้ายเล็กในตาราง/รายละเอียด การ์ดน้ำขังแสดงยอดแยกใต้ตัวเลข ตารางเรียง confidence สูงก่อนกลาง และแผนที่ใช้ขอบประสำหรับระดับกลาง (สีเดียวกัน)สรุปความเสี่ยงรายจังหวัดที่เฝ้าระวัง จากข้อมูลที่ pipeline flood_prep_pipeline (repo geeks_project_google, วันละ 2 รอบ 09:00 และ 13:00 น.) เขียนลง Google Sheet เดียวกับแดชบอร์ด
flood_risk (รายจังหวัด: ระดับความเสี่ยง ฝนจริง/ฝนพยากรณ์ สถานีน้ำระดับ 5/4 ประกาศเตือน เหตุผล) และ flood_wl_critical (สถานีน้ำระดับ 4-5 พร้อมพิกัดและแนวโน้ม)OPTIONAL ใน flood_web/server.py → optional ใน Config.gs): ถ้าอ่านไม่ได้ fetch_data.cjs ข้ามชีตนั้นแทนที่จะทำให้ deploy ล้ม และแท็บนี้แสดงข้อความแจ้ง แท็บอื่นไม่ได้รับผลกระทบflood_web/risk-view.js อ่านข้อมูลจาก window.dashboardData (ที่ dashboard.js เผยแพร่) และวาดใหม่เมื่อมี event dashboard:data; กฎคำนวณล้วน (จัดเรียง สรุป แนวโน้มระดับน้ำ ความสดของข้อมูล) อยู่ใน data-model.js และมีทดสอบใน test_model.cjsDashboardModel.RISK_SOURCES ไม่ใส่ใน SOURCES โดยตั้งใจ เพื่อไม่ให้ไปปรากฏในแถบแจ้งเตือน ฟุตเตอร์ หรือปุ่มรีเฟรชของแท็บหลักflood_risk: forecast_start, forecast_fetched_at, forecast_daily_mm (ฝนรายวันคั่นด้วย | ช่องว่าง = ไม่มีข้อมูลวันนั้น), cap_headlines, tmd_warning_title, tmd_warning_text; ใน flood_wl_critical: amphoe, basin_nameVulnerable_group ที่แดชบอร์ดอ่านอยู่แล้ว (จับคู่ด้วยชื่อจังหวัด) ไม่ต้องมีข้อมูลเพิ่มResizeObserver และไม่ fit ขณะคอนเทนเนอร์ขนาด 0 (แท็บถูกซ่อน/กริดยังไม่จัด)REQUIRED/NUMERIC/DATES และ transform() ใน flood_web/server.py กับ transform_ ใน Code.gs ให้ตรงกัน แล้วรัน python build.pyแสดงผลประเมินสุขาภิบาลสิ่งแวดล้อมของศูนย์พักพิงชั่วคราวจากแท็บ doh_shelter ในชีตเดียวกัน (ชีตต้องเปิดแบบ "ทุกคนที่มีลิงก์อ่านได้")
doh_shelter/build_doh_shelter.py อ่าน CSV ของแท็บ → docs/doh_shelter.json (แปลงวันที่ พ.ศ./ค.ศ., เลือกการประเมินล่าสุดต่อศูนย์ is_latest, คำนวณร้อยละผ่านเกณฑ์ score, ตรวจว่าคอลัมน์ที่ต้องใช้ครบ ถ้าไม่ครบจะล้มพร้อมข้อความ) รันใน pages.yml แบบ continue-on-errorflood_web/shelter-doh-view.js (บล็อก pages-only ใน template.html เหมือนแท็บข่าว)python doh_shelter/test_doh_shelter.py · รันในเครื่อง: python doh_shelter/build_doh_shelter.py && python build_pages.pySTALE_DAYS ใน build_doh_shelter.py)Water_Level_Trend, เฉพาะแถว "กำลังประสบภัย", เลือกวันรายงานได้; เพิ่มขึ้น/ทรงตัว/ลดลง ใช้สีเดียวกับป้ายในตารางหลัก, ถ้าจังหวัดมีหลายแถวใช้แนวโน้มที่แย่สุด) จังหวัดที่ไม่อยู่ในรายงานไม่ได้แปลว่าไม่ท่วมITEMS ใน build_doh_shelter.py) แต่ละข้อได้ ดี / พอใช้ / ต้องปรับปรุง ตามคำตอบ (ต้นทางเรียก ผ่าน / ติดตาม) (ข้อ "พบปัญหา..." กลับขั้ว; Q09 และผลคลอรีน ตัดสินจากข้อความคำตอบ) ระดับมิติ = ข้อที่แย่สุดในมิติ ระดับศูนย์ = มิติที่แย่สุด ไม่นับข้อที่ไม่ได้ตอบ ข้อ Q16/Q18 ใช้ตามต้นทาง (ไม่ใช่ = ต้องปรับปรุง) ซึ่งต่างจากตารางใน แนวทางจัดระดับศพพ.docx (พอใช้) ข้อ 3.2, 4, 12, 19.1, 19.2 (รวมผลคลอรีน) และ 21 ยังประเมินและแสดงรายข้อ แต่ไม่ถูกนับในระดับมิติ (อนุมานจากตัวเลขของต้นทาง ควรยืนยันกับเจ้าของแดชบอร์ด) ตัวเลขรายมิติตรงกับต้นทาง; ช่องข้อความ/ตัวเลข (จำนวนห้องส้วม ฯลฯ) เก็บเป็นข้อมูลประกอบ (SUPPLEMENTARY) ไม่นำมาคำนวณflood_web/ (template.html, dashboard.js, data-model.js, dashboard.css, GeoJSON, server.py สำหรับทดสอบในเครื่อง)Index.html, Dashboard.html, DataModel.html, RiskView.html, WaterloggedView.html, Styles.html, *GeoJSON.html, Config.gs, schema.json, appsscript.json สร้างด้วย python build.py แล้ว commitCode.gs (อ่านชีต แปลงข้อมูล แคช 5 นาทีเมื่อรันบน Apps Script), fetch_data.cjs, build_pages.py, test.cjsลำดับหลังแก้หน้าเว็บ:
node flood_web/test_model.cjs
python flood_web/test_server.py
python build.py # สร้างไฟล์ Apps Script จาก flood_web/
node test.cjs
ทดสอบหน้าจริงกับชีต: python flood_web/server.py แล้วเปิด http://127.0.0.1:8765/
Code.gs และไฟล์ที่สร้างอัตโนมัติยังใช้เป็น Apps Script ได้เหมือนเดิม (Deploy แยกได้) ส่วนเวอร์ชัน Pages ใช้ Code.gs ชุดเดียวกันผ่าน fetch_data.cjsdata.json ที่ Actions สร้างไว้ก่อน (เร็ว แต่ GitHub รัน schedule ไม่ตรงเวลา อาจเก่าหลายชั่วโมง) แล้วอ่านชีตสดจากเบราว์เซอร์ทันทีด้วย flood_web/live-sheets.js ซึ่งรัน Config.gs + Code.gs ชุดเดียวกับที่สร้าง data.json (ผลเหมือนกันทุกฟิลด์) แล้วเปลี่ยนเป็นข้อมูลสด ปุ่ม "รีเฟรชข้อมูล" และ "ลองใหม่" อ่านชีตสดเช่นกัน ถ้าแท็บไหนอ่านไม่ได้จะคงข้อมูลเดิมของแท็บนั้น ถ้าอ่านไม่ได้ทั้งหมดใช้ data.json และป้ายอายุข้อมูลจะบอก ใช้ได้เพราะชีตเปิดแบบ "ทุกคนที่มีลิงก์อ่านได้" และ Google ยอมรับ origin ของหน้า (CSV ทั้ง 5 แท็บรวมราว 3 MB ก่อนบีบอัด ต่อผู้เข้าชม 1 คนต่อครั้งที่อ่าน) แคช 5 นาทีมีผลเฉพาะบน Apps Scriptflood_web/ (python3 build.py แล้ว git diff --exit-code) หากไม่ตรงให้รัน python build.py แล้ว commitแท็บ กทม. แสดง “เพิ่ม–คงตัว–ลด” ในตารางสถานีและการ์ดนับเขตตามพื้นที่ที่เลือก โดยอ่าน water_status_vs_24h_avg จาก BKK_water_DB ซึ่งเป็นผลเปรียบเทียบกับค่าเฉลี่ย 24 ชั่วโมงของสถานีนั้นตามเกณฑ์ต้นทาง ไม่ใช่รายงานแนวโน้มจาก ปภ. และไม่เปลี่ยนสถานะเตือนภัยเดิม ข้อมูลเกิน 24 ชั่วโมง เวลาไม่ถูกต้อง ระดับน้ำว่าง/-99 หรือไม่มีผลเทียบที่รู้จัก จะไม่ถูกนับในการ์ดและแสดง “ข้อมูลไม่เพียงพอ” ในตาราง คอลัมน์นี้เป็น optional เพื่อให้ชีตรุ่นเก่ายังอ่านได้
พรีวิวแผนที่ กทม.: สีพื้นและการ์ด เพิ่ม–คงตัว–ลด ใช้หน่วย เขต แต่ละเขตนับครั้งเดียวตามกลุ่มสถานีที่มีจำนวนมากที่สุดในเขตนั้น หากจำนวนสูงสุดเท่ากันใช้ “แนวโน้มผสม” และหากไม่มีผลที่ใช้ได้ใช้ “ข้อมูลไม่เพียงพอ” (แสดงจำนวนสองกลุ่มนี้แยกจากสามการ์ดหลัก) ตารางข้างแผนที่แสดงหนึ่งรายการต่อเขต ผลรวมทุกกลุ่มเท่ากับ 50 เขตเมื่อไม่กรอง หรือ 1 เขตเมื่อเลือกเขต รายสถานียังคงดูได้ใน popup และตารางรายละเอียดสถานี
flood_waterlogged_amphoeDATA.floodWaterloggedAmphoedistrict_codeamp_codeamphoe.geojsonprovince_level_codeprovince_reasons#E24B4A#EF9F27#F2D43D#4CAF50level_codephaseplanlevel_codeWATER_2P2Rstatus, confidence, reasons ตามที่ pipeline เขียน. ไม่ใช่ประกาศทางการ; "ไม่เห็นน้ำ ≠ น้ำลด"; ปภ. ระบุแค่ระดับอำเภอ; พบน้ำล่าสุด (ไม่มีภาพใหม่) ไม่ใช่น้ำขังdata-external ที่ปุ่มแท็บใน template.html เพื่อไม่ให้ตัวจับคลิกแท็บของ dashboard.js เปลี่ยน state.tabWaterloggedView ด้วย (สร้างโดย build.py)