Skip to main content

eldercare-visitor-log

Ghi nhận khách đến thăm bà từ cảm biến presence. Aqara FP2 có target_count — phát hiện nhiều người trong phòng. Khi có khách → log thời gian, gửi Zalo gia đình. Security: phát hiện người lạ ban đêm → alert cao. Hữu ích: gia đình biết ai đến thăm bà khi không có mặt.

Source facts

Repository
nclamvn/bom-cham
Last source activity
February 19, 2026 at 18:39
Detected SKILL.md language
Vietnamese
Stars
26
Forks
19

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
eldercare-visitor-log
description
Ghi nhận khách đến thăm bà từ cảm biến presence. Aqara FP2 có target_count — phát hiện nhiều người trong phòng. Khi có khách → log thời gian, gửi Zalo gia đình. Security: phát hiện người lạ ban đêm → alert cao. Hữu ích: gia đình biết ai đến thăm bà khi không có mặt.
metadata
{"openclaw":{"emoji":"🚪","requires":{"extensions":"[Truncated]"},"schedule":["[Truncated]"]}}
# Eldercare Visitor Log — Ghi nhận khách thăm Skill phát hiện và log khách đến thăm bà dựa trên sensor presence count. Cũng hoạt động như lớp security nhẹ. ## Nguyên lý Aqara FP2 mmWave sensor có thể detect số người trong phòng thông qua entity `sensor.grandma_room_target_count` (hoặc attribute target_count). - Bình thường: target_count = 0 (bà nằm yên) hoặc 1 (bà + motion nhẹ) - Khi có khách: target_count >= 2 (hoặc > resident_count nếu ông ở cùng) ## Cron handler (mỗi 10 phút) ### Bước 1: Query HA ``` action: get_state entity_id: sensor.grandma_room_target_count ``` Nếu entity KHÔNG tồn tại hoặc unavailable: - Ghi note vào log: "target_count entity not available" - Skill inactive — skip tất cả logic - KHÔNG báo lỗi, chỉ ghi note ### Bước 2: So sánh với resident_count Config: `resident_count: 1` (mặc định bà ở 1 mình) - Nếu target_count <= resident_count → không có khách → Bước 3a - Nếu target_count > resident_count → có khách → Bước 3b ### Bước 3a: Không có khách Check memory `eldercare_visitor_active`: - Nếu KHÔNG có → bình thường, skip - Nếu CÓ → khách đã về: 1. Tính duration: now - start_time 2. Lưu memory `eldercare_visitor_{date}_{HHmm}`: ```json { "start": "2026-02-20T14:00:00+07:00", "end": "2026-02-20T14:45:00+07:00", "duration_min": 45, "max_count": 2 } ``` 3. Xóa memory `eldercare_visitor_active` 4. Gửi Zalo (nếu alert_on_departure): "🚪 Khách đã về (ở {X} phút)" ### Bước 3b: Có khách Check memory `eldercare_visitor_active`: - Nếu CÓ → visit đang diễn ra, update max_count nếu cần - Nếu KHÔNG CÓ → visit MỚI: 1. Lưu memory `eldercare_visitor_active`: ```json { "start": "2026-02-20T14:00:00+07:00", "count": 2, "max_count": 2 } ``` 2. Check expected visits (xem bên dưới) 3. Check unusual hours (xem bên dưới) 4. Gửi Zalo (nếu alert_on_arrival): "🚪 Có khách ở phòng bà (phát hiện {count} người lúc {giờ})" ### Bước 4: Security — Unusual hours Nếu detect visitor trong khung giờ bất thường (default 23h-5h): 1. Check expected visits → nếu có → skip alert 2. Gửi Zalo HIGH priority: "⚠️ Phát hiện {count} người trong phòng bà lúc {giờ} — kiểm tra ngay!" 3. Lưu memory `eldercare_visitor_security_{date}_{time}` ## Kết hợp ông nội Nếu ông ở cùng bà → set `resident_count: 2` trong config. Threshold thay đổi: target_count > 2 → có khách. ## Gia đình báo trước Gia đình chat: - "hôm nay có khách đến thăm bà" → lưu `eldercare_visitor_expected_{date}` - "bác sĩ đến khám bà 14h" → lưu `eldercare_visitor_expected_{date}: { time: "14:00", who: "bác sĩ" }` Khi có expected visit → vẫn log nhưng KHÔNG gửi alert. Reply khi khách đến: "🚪 Khách đến (đã được báo trước)" ## Debounce - Không alert lại nếu visit đang diễn ra (eldercare_visitor_active tồn tại) - `debounce_minutes: 5` — target_count phải > resident_count liên tục 5 phút mới count (tránh false positive khi ai đi ngang qua) ## Tích hợp daily report ``` 🚪 Khách thăm: 1 lượt (14:00-14:45, 45 phút) ``` hoặc ``` 🚪 Khách thăm: 2 lượt — 10:30 (15 phút), 14:00 (45 phút) ``` hoặc ``` 🚪 Khách thăm: Không có hôm nay ``` ## Graceful degradation - Nếu FP2 không có target_count (firmware cũ) → skill inactive, không lỗi - Nếu chỉ có binary presence (on/off) → không thể phân biệt 1 vs nhiều người → skill inactive - Skill ghi rõ: cần FP2 với firmware hỗ trợ multi-target tracking ## Multi-Elder Support Skill này hỗ trợ nhiều người thân: 1. Đọc `eldercare_profiles` từ memory 2. Nếu không tồn tại → auto-migrate default profile "ba_noi" (xem skill eldercare-profiles) 3. Loop qua tất cả active elders 4. Với mỗi elder: - Dùng `elder.ha_entities.*` thay vì hardcoded entity names - Dùng `eldercare_{elder.id}_*` làm memory key prefix - Dùng `elder.name` trong messages/TTS - Dùng `elder.contacts` cho alert recipients (fallback global contacts) - Dùng `elder.tts.*` cho TTS settings ### Thay đổi cụ thể - `sensor.grandma_room_target_count` → `elder.ha_entities.target_count` - Memory: `eldercare_visitor_active` → `eldercare_{elder.id}_visitor_active` - Memory: `eldercare_visitor_{date}_*` → `eldercare_{elder.id}_visitor_{date}_*` - Memory: `eldercare_visitor_expected_{date}` → `eldercare_{elder.id}_visitor_expected_{date}` - Memory: `eldercare_visitor_security_*` → `eldercare_{elder.id}_visitor_security_*` - Messages: Include `elder.name` in visitor notifications
View on GitHub