From f40b6c4998a2604105c306d9b7cec3d7fe5744ab Mon Sep 17 00:00:00 2001 From: seo Date: Sun, 12 Jul 2026 21:44:24 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20?= =?UTF-8?q?=ED=8A=B8=EB=A6=AC=EA=B1=B0=20=ED=91=9C=EC=8B=9C=EB=AA=85=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php/api.php | 130 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 119 insertions(+), 11 deletions(-) diff --git a/php/api.php b/php/api.php index e85a2aa..617ebc2 100644 --- a/php/api.php +++ b/php/api.php @@ -516,6 +516,60 @@ function mappedText($state, $lang, $map) { return $map[$lang][$state] ?? $map[$lang][strtolower((string)$state)] ?? $state; } +function findmydevice_starts_with(string $value, string $prefix): bool +{ + return strncmp($value, $prefix, strlen($prefix)) === 0; +} + +function readableTriggerCode(string $value, string $lang): string +{ + $text = trim(preg_replace('/\s+/', ' ', str_replace(['_', '.', '-'], ' ', $value))); + if ($text === '') { + return $value; + } + + return $lang === 'ko' ? $text : ucwords(strtolower($text)); +} + +function formatTriggerValue($state, string $lang, array $map): ?string +{ + if ($state === null) { + return null; + } + + $state = trim((string)$state); + if ($state === '' || $state === 'unknown' || $state === 'unavailable') { + return null; + } + + $language = isset($map[$lang]) ? $lang : 'ko'; + if (isset($map[$language][$state])) { + return $map[$language][$state]; + } + + $prefixes = [ + 'android.intent.action.' => $language === 'ko' ? 'Android 동작' : 'Android action', + 'android.bluetooth.device.action.' => $language === 'ko' ? '블루투스 기기' : 'Bluetooth device', + 'android.bluetooth.adapter.action.' => $language === 'ko' ? '블루투스' : 'Bluetooth', + 'android.media.' => $language === 'ko' ? '미디어' : 'Media', + 'android.net.wifi.' => $language === 'ko' ? 'Wi-Fi' : 'Wi-Fi', + 'android.net.' => $language === 'ko' ? '네트워크' : 'Network', + 'android.nfc.action.' => $language === 'ko' ? 'NFC' : 'NFC', + 'android.os.action.' => $language === 'ko' ? 'Android 시스템' : 'Android system', + 'android.app.action.' => $language === 'ko' ? 'Android 앱' : 'Android app', + 'io.homeassistant.companion.android.' => $language === 'ko' ? 'Home Assistant 앱' : 'Home Assistant app', + 'com.google.android.gms.location.' => $language === 'ko' ? 'Google 위치' : 'Google location', + ]; + + foreach ($prefixes as $prefix => $label) { + if (findmydevice_starts_with($state, $prefix)) { + return $label . ': ' . readableTriggerCode(substr($state, strlen($prefix)), $language); + } + } + + return readableTriggerCode($state, $language); +} + function durationText(int $seconds, string $lang): ?string { if ($seconds <= 0) return null; @@ -815,19 +869,46 @@ $triggerMap = [ 'ko' => [ "Launch" => "앱 실행", "Background Fetch" => "백그라운드 갱신", - "Push Notification" => "푸시", - "Periodic" => "주기적", - "Significant Location Change" => "중요한 위치 변화", - "Manual" => "수동", - "Signaled" => "시그널 됨", + "Push Notification" => "푸시 알림", + "Periodic" => "주기 갱신", + "Significant Location Change" => "큰 위치 변화", + "Manual" => "수동 갱신", + "Signaled" => "외부 신호", "Siri" => "Siri 실행", "Watch Context" => "워치 상태 전송", "Geographic Region Entered" => "지정 지역에 들어옴", "Geographic Region Exited" => "지정 지역을 벗어남", - "android.intent.action.TIME_TICK" => "Android 시간 틱", + "SensorWorker" => "센서 자동 갱신", + "android.app.action.NEXT_ALARM_CLOCK_CHANGED" => "다음 알람 변경", + "android.bluetooth.device.action.ACL_CONNECTED" => "블루투스 기기 연결", + "android.bluetooth.device.action.ACL_DISCONNECTED" => "블루투스 기기 연결 해제", + "android.intent.action.ACTION_POWER_CONNECTED" => "충전기 연결", + "android.intent.action.ACTION_POWER_DISCONNECTED" => "충전기 분리", + "android.intent.action.BATTERY_CHANGED" => "배터리 상태 변경", + "android.intent.action.CONFIGURATION_CHANGED" => "기기 설정 변경", + "android.intent.action.HEADSET_PLUG" => "헤드셋 연결 변경", + "android.intent.action.PHONE_STATE" => "전화 상태 변경", + "android.intent.action.TIME_TICK" => "1분 주기 갱신", "android.intent.action.SCREEN_ON" => "화면 켜짐", "android.intent.action.SCREEN_OFF" => "화면 꺼짐", - "io.homeassistant.companion.android.UPDATE_SENSORS" => "센서 업데이트", + "android.intent.action.USER_PRESENT" => "잠금 해제", + "android.intent.action.BOOT_COMPLETED" => "부팅 완료", + "android.intent.action.MY_PACKAGE_REPLACED" => "Home Assistant 앱 업데이트", + "android.intent.action.PACKAGE_REPLACED" => "앱 패키지 업데이트", + "android.media.AUDIO_BECOMING_NOISY" => "오디오 출력 변경", + "android.media.RINGER_MODE_CHANGED" => "벨소리 모드 변경", + "android.media.VOLUME_CHANGED_ACTION" => "볼륨 변경", + "android.net.conn.CONNECTIVITY_CHANGE" => "네트워크 연결 변경", + "android.net.wifi.STATE_CHANGE" => "Wi-Fi 연결 변경", + "android.net.wifi.WIFI_AP_STATE_CHANGED" => "핫스팟 상태 변경", + "android.net.wifi.WIFI_STATE_CHANGED" => "Wi-Fi 상태 변경", + "android.nfc.action.ADAPTER_STATE_CHANGED" => "NFC 상태 변경", + "android.os.action.DEVICE_IDLE_MODE_CHANGED" => "절전 대기 상태 변경", + "android.bluetooth.adapter.action.STATE_CHANGED" => "블루투스 상태 변경", + "android.location.PROVIDERS_CHANGED" => "위치 제공자 변경", + "android.location.MODE_CHANGED" => "위치 모드 변경", + "com.google.android.gms.location.LOCATION_UPDATE" => "Google 위치 갱신", + "io.homeassistant.companion.android.UPDATE_SENSORS" => "센서 갱신 명령", ], 'en' => [ "Launch" => "Launch", @@ -841,10 +922,37 @@ $triggerMap = [ "Watch Context" => "Watch Context", "Geographic Region Entered" => "Geographic Region Entered", "Geographic Region Exited" => "Geographic Region Exited", - "android.intent.action.TIME_TICK" => "Android Time Tick", + "SensorWorker" => "Sensor Worker", + "android.app.action.NEXT_ALARM_CLOCK_CHANGED" => "Next Alarm Changed", + "android.bluetooth.device.action.ACL_CONNECTED" => "Bluetooth Device Connected", + "android.bluetooth.device.action.ACL_DISCONNECTED" => "Bluetooth Device Disconnected", + "android.intent.action.ACTION_POWER_CONNECTED" => "Power Connected", + "android.intent.action.ACTION_POWER_DISCONNECTED" => "Power Disconnected", + "android.intent.action.BATTERY_CHANGED" => "Battery Changed", + "android.intent.action.CONFIGURATION_CHANGED" => "Configuration Changed", + "android.intent.action.HEADSET_PLUG" => "Headset Changed", + "android.intent.action.PHONE_STATE" => "Phone State Changed", + "android.intent.action.TIME_TICK" => "Minute Tick", "android.intent.action.SCREEN_ON" => "Screen On", "android.intent.action.SCREEN_OFF" => "Screen Off", - "io.homeassistant.companion.android.UPDATE_SENSORS" => "Sensor Update", + "android.intent.action.USER_PRESENT" => "User Unlocked", + "android.intent.action.BOOT_COMPLETED" => "Boot Completed", + "android.intent.action.MY_PACKAGE_REPLACED" => "Home Assistant App Updated", + "android.intent.action.PACKAGE_REPLACED" => "App Package Updated", + "android.media.AUDIO_BECOMING_NOISY" => "Audio Output Changed", + "android.media.RINGER_MODE_CHANGED" => "Ringer Mode Changed", + "android.media.VOLUME_CHANGED_ACTION" => "Volume Changed", + "android.net.conn.CONNECTIVITY_CHANGE" => "Network Changed", + "android.net.wifi.STATE_CHANGE" => "Wi-Fi Connection Changed", + "android.net.wifi.WIFI_AP_STATE_CHANGED" => "Hotspot State Changed", + "android.net.wifi.WIFI_STATE_CHANGED" => "Wi-Fi State Changed", + "android.nfc.action.ADAPTER_STATE_CHANGED" => "NFC State Changed", + "android.os.action.DEVICE_IDLE_MODE_CHANGED" => "Device Idle Mode Changed", + "android.bluetooth.adapter.action.STATE_CHANGED" => "Bluetooth State Changed", + "android.location.PROVIDERS_CHANGED" => "Location Provider Changed", + "android.location.MODE_CHANGED" => "Location Mode Changed", + "com.google.android.gms.location.LOCATION_UPDATE" => "Google Location Update", + "io.homeassistant.companion.android.UPDATE_SENSORS" => "Sensor Update Command", ] ]; @@ -899,7 +1007,7 @@ if (isset($_GET['hashonly']) && $_GET['hashonly'] == '1') { 'longitude' => $deviceData['attributes']['longitude'] ?? null, 'accuracy' => $deviceData['attributes']['gps_accuracy'] ?? null, 'updated' => $deviceData['last_changed'] ?? null, - 'trigger' => $triggerMap[$lang][$triggerData['state']] ?? $triggerData['state'] ?? null, + 'trigger' => formatTriggerValue($triggerData['state'] ?? null, $lang, $triggerMap), 'address' => $address, 'state' => $batteryStateMap[$lang][$batteryState] ?? $batteryState ?? null, 'level' => $batteryLevelData['state'] ?? null, @@ -925,7 +1033,7 @@ echo json_encode([ 'longitude' => $deviceData['attributes']['longitude'] ?? null, 'accuracy' => $deviceData['attributes']['gps_accuracy'] ?? null, 'updated' => $deviceData['last_changed'] ?? null, - 'trigger' => $triggerMap[$lang][$triggerData['state']] ?? $triggerData['state'] ?? null, + 'trigger' => formatTriggerValue($triggerData['state'] ?? null, $lang, $triggerMap), 'address' => $address, 'state' => $batteryStateMap[$lang][$batteryState] ?? $batteryState ?? null, 'level' => $batteryLevelData['state'] ?? null,