android icon indicating copy to clipboard operation
android copied to clipboard

Pixel Watch 1 & 2 Power Save sensor is always False

Open uniquePWD opened this issue 1 year ago • 6 comments

Home Assistant Android app version(s): 2021.1.2-full

Android version(s): 14

Device model(s): Pixel Watch 2

Home Assistant version: 2024.1.5

Last working Home Assistant release (if known):

Description of problem, include YAML if issue is related to notifications: There's a diagnostic entity named Power Save that corresponds to the Pixel Watch Battery Save that is always False, whether or not Battery Save is on. I suspect Home Assistant is looking for Power Save rather than Battery Save, hence not updating the entity value.

Companion App Logs:

--------- beginning of main
01-24 15:31:11.124 25681 11458 W cr_ChildProcessConn: onServiceDisconnected (crash or killed by oom): pid=9804 bindings:W  S
01-24 15:31:11.145 25681 25681 E chromium: [ERROR:aw_browser_terminator.cc(154)] Renderer process (9804) crash detected (code -1).
01-24 15:31:11.152 25681 25681 E WebviewActivity: onRenderProcessGone: webView crashed
01-24 15:31:11.196 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.app.Activity$$ExternalSyntheticLambda0@ee3f98
01-24 15:31:11.227 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.260 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.261 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 0, currentMillis: 1706110271261)
01-24 15:31:11.266 25681 25681 D WebviewActivity: Current webview package com.google.android.webview and version 121.0.6167.101
01-24 15:31:11.268 25681 25681 D WebviewActivity: Matter/Thread step changed to NOT_STARTED
01-24 15:31:11.269 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.269 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.269 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 0, currentMillis: 1706110271269)
01-24 15:31:11.307 25681 25681 D SensorReceiver: Received intent: android.intent.action.SCREEN_OFF
01-24 15:31:11.311 25681 25681 D SensorReceiver: Sensor is_interactive corresponding to received event android.intent.action.SCREEN_OFF is disabled, skipping sensors update
01-24 15:31:11.311 25681 25681 D ButtonWidget: Broadcast received: 
01-24 15:31:11.311 25681 25681 D ButtonWidget: Broadcast action: android.intent.action.SCREEN_OFF
01-24 15:31:11.311 25681 25681 D ButtonWidget: AppWidgetId: -1
01-24 15:31:11.312 25681 25681 D MediaPlayCtrlsWidget: Broadcast received: 
01-24 15:31:11.312 25681 25681 D MediaPlayCtrlsWidget: Broadcast action: android.intent.action.SCREEN_OFF
01-24 15:31:11.312 25681 25681 D MediaPlayCtrlsWidget: AppWidgetId: -1
01-24 15:31:11.312 25681 25681 D SensorReceiver: Received intent: android.os.action.POWER_SAVE_MODE_CHANGED
01-24 15:31:11.312 25681 25681 D SensorReceiver: Sensor power_save corresponding to received event android.os.action.POWER_SAVE_MODE_CHANGED is disabled, skipping sensors update
01-24 15:31:11.312 25681 25681 D SensorReceiver: Received intent: android.intent.action.SCREEN_ON
01-24 15:31:11.312 25681 25681 D SensorReceiver: Sensor is_interactive corresponding to received event android.intent.action.SCREEN_ON is disabled, skipping sensors update
01-24 15:31:11.312 25681 25681 D ButtonWidget: Broadcast received: 
01-24 15:31:11.312 25681 25681 D ButtonWidget: Broadcast action: android.intent.action.SCREEN_ON
01-24 15:31:11.312 25681 25681 D ButtonWidget: AppWidgetId: -1
01-24 15:31:11.313 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.313 25681 25681 D MediaPlayCtrlsWidget: Broadcast received: 
01-24 15:31:11.313 25681 25681 D MediaPlayCtrlsWidget: Broadcast action: android.intent.action.SCREEN_ON
01-24 15:31:11.313 25681 25681 D MediaPlayCtrlsWidget: AppWidgetId: -1
01-24 15:31:11.313 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.313 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.314 25681 25681 D LocBroadcastReceiver: Received location update.
01-24 15:31:11.315 25681 25681 D ForegrndServiceLauncher: Check if service HighAccuracyLocationService is running. Service running = false
01-24 15:31:11.315 25681 25716 D LocBroadcastReceiver: Last Location: 
01-24 15:31:11.315 25681 25716 D LocBroadcastReceiver: Coords:(51.4790399, 0.0855746)
01-24 15:31:11.315 25681 25716 D LocBroadcastReceiver: Accuracy: 100.0
01-24 15:31:11.315 25681 25716 D LocBroadcastReceiver: Bearing: 0.0
01-24 15:31:11.316 25681 25716 D LocBroadcastReceiver: Begin evaluating if location update should be skipped
01-24 15:31:11.316 25681 25716 D LocBroadcastReceiver: Received location that is 182 milliseconds old, 1706110271134 compared to 1706110271316 with source fused
01-24 15:31:11.316 25681 25716 D LocBroadcastReceiver: Duplicate location received, not sending to HA
01-24 15:31:11.387 25681 11500 W chromium: [WARNING:display_webview.cc(32)] WebView overlays are enabled!
01-24 15:31:11.405 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.405 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 0, currentMillis: 1706110271405)
01-24 15:31:11.425 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.427 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.427 25681 25681 D ServerConnectionInfo: Using external URL
01-24 15:31:11.427 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.427 25681 25681 D ServerConnectionInfo: Using external URL
01-24 15:31:11.428 25681 25736 I WM-Processor: Moving WorkSpec (b271f5ea-d200-4932-80e0-674b6679385f) to the foreground
01-24 15:31:11.433 25681 25736 I WM-WorkerWrapper: Worker result SUCCESS for Work [ id=08fda947-56f0-4728-be68-9de6b2ead0d9, tags={ io.homeassistant.companion.android.websocket.WebsocketManager } ]
01-24 15:31:11.433 25681 25716 D SensorWorker: Updating all Sensors in foreground.
01-24 15:31:11.437 25681 25681 I WM-SystemFgDispatcher: Started foreground service Intent { act=ACTION_START_FOREGROUND cmp=io.homeassistant.companion.android/androidx.work.impl.foreground.SystemForegroundService (has extras) }
01-24 15:31:11.437 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.500 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.500 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.510 25681 26986 D TrafficStats: tagSocket(112) with statsTag=0xffffffff, statsUid=-1
01-24 15:31:11.567 25681 11517 D WebviewActivity: External bus {"type":"config/get","id":1}
01-24 15:31:11.584 25681 11517 D WebviewActivity: External bus {"type":"config/get","id":1}
01-24 15:31:11.585 25681 25681 D WebviewActivity: externalBus({"id":1,"type":"result","success":true,"result":{"hasSettingsScreen":true,"canWriteTag":true,"hasExoPlayer":true,"canCommissionMatter":true,"canImportThreadCredentials":true,"hasAssist":true}});
01-24 15:31:11.600 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.600 25681 25681 D ServerConnectionInfo: Using external URL
01-24 15:31:11.601 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.601 25681 25681 D ServerConnectionInfo: Using external URL
01-24 15:31:11.603 25681 25681 D WebviewActivity: Callback null
01-24 15:31:11.605 25681 25681 E WebviewActivity: Cannot set status bar color. Skipping coloring...
01-24 15:31:11.605 25681 25681 E WebviewActivity: Cannot set navigation bar color. Skipping coloring...
01-24 15:31:11.607 25681 26987 D TrafficStats: tagSocket(281) with statsTag=0xffffffff, statsUid=-1
01-24 15:31:11.616 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.632 25681 25716 I SensorReceiver: Sensor updates and sync completed
01-24 15:31:11.632 25681 25736 I WM-WorkerWrapper: Worker result SUCCESS for Work [ id=b271f5ea-d200-4932-80e0-674b6679385f, tags={ io.homeassistant.companion.android.sensors.SensorWorker } ]
01-24 15:31:11.641 25681 25681 I WM-SystemFgDispatcher: Stopping foreground service
01-24 15:31:11.937 25681 11517 D WebviewActivity: External bus {"type":"connection-status","payload":{"event":"connected"},"id":2}
01-24 15:31:11.939 25681 25681 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:11.975 25681 11517 D WebviewActivity: External bus {"type":"theme-update","id":3}
01-24 15:31:12.023 25681 25681 D WebviewActivity: Color from webview is "#03a9f4-SPACER-#fafafa"
01-24 15:31:12.023 25681 25681 D WebviewActivity: Color from webview is "#03a9f4-SPACER-#fafafa"
01-24 15:31:12.023 25681 25716 D WebViewPresenterImpl: Try getting color from webview color "#03a9f4".
01-24 15:31:12.024 25681 25716 I WebViewPresenterImpl: Found color -16537100.
01-24 15:31:12.024 25681 25716 D WebViewPresenterImpl: Try getting color from webview color "#fafafa".
01-24 15:31:12.024 25681 25716 I WebViewPresenterImpl: Found color -328966.
01-24 15:31:29.585 25681 11517 D WebviewActivity: External bus {"type":"config_screen/show","id":4}
01-24 15:31:29.609 25681 25681 D IntegrationRepository: setAppActive(): false
01-24 15:31:29.610 25681 25681 D IntegrationRepository: setAppActive(): false
01-24 15:31:29.613 25681 25681 D SensorReceiver: Received intent: io.homeassistant.companion.android.UPDATE_SENSORS
01-24 15:31:29.614 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:29.656 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:29.656 25681 25716 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:29.697 25681 25716 D SensorReceiver: Nothing to update for server 2 (Home)
01-24 15:31:29.697 25681 25716 I SensorReceiver: Sensor updates and sync completed
01-24 15:31:29.705 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 0, currentMillis: 1706110289705)
01-24 15:31:29.765 25681 25715 D ServerConnectionInfo: localUrl is: false, usesInternalSsid is: false, usesWifi is: true
01-24 15:31:29.897 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 0, currentMillis: 1706110289896)
01-24 15:31:29.897 25681 25681 D IntegrationRepository: setAppActive(): true
01-24 15:31:30.284 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=androidx.activity.OnBackPressedDispatcher$Api34Impl$createOnBackAnimationCallback$1@80aef25
01-24 15:31:30.314 25681 26986 D TrafficStats: tagSocket(132) with statsTag=0xffffffff, statsUid=-1
01-24 15:31:50.294 25681 25715 D LogcatReader: Read logcat for pid 25681

More logs. I suspect these will show the issue better:

--------- beginning of main
01-24 15:32:33.815 25681 25681 D LogFragment: User want to share log
01-24 15:32:33.819 25681 25681 I LogFragment: Create log file to: /storage/emulated/0/Android/data/io.homeassistant.companion.android/cache/logs/homeassistant_companion_log_0-24-2024_15-32-33.txt
01-24 15:32:33.828 25681 25681 I LogFragment: Open share dialog with log file
01-24 15:32:33.842 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.app.Dialog$$ExternalSyntheticLambda2@5b31a5c
01-24 15:32:33.846 25681 11422 D OpenGLRenderer: endAllActiveAnimators on 0xb400007b1208d8e0 (RippleDrawable) with handle 0xb400007b81f58bd0
01-24 15:32:33.851 25681 25681 D IntegrationRepository: setAppActive(): false
01-24 15:32:33.851 25681 25681 D IntegrationRepository: setAppActive(): false
01-24 15:32:33.860 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 1706110354851, currentMillis: 1706110353860)
01-24 15:32:33.860 25681 25681 D IntegrationRepository: setAppActive(): true
01-24 15:32:38.964 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: true, expireMillis: 1706110354851, currentMillis: 1706110358964)
01-24 15:32:38.995 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: true, expireMillis: 1706110354851, currentMillis: 1706110358995)
01-24 15:32:38.995 25681 25681 D IntegrationRepository: setAppActive(): true
01-24 15:32:40.323 25681 25681 D androidtc: Initializing SystemTextClassifier, type = System
01-24 15:32:40.330 25681 25681 W androidtc: TextClassifier called on main thread
01-24 15:32:40.333 25681 25681 D androidtc: Initializing SystemTextClassifier, type = System
01-24 15:32:40.612 25681 25681 W androidtc: TextClassifier called on main thread
01-24 15:32:41.336 25681 25681 W androidtc: TextClassifier called on main thread
01-24 15:32:41.339 25681 25681 D androidtc: Initializing SystemTextClassifier, type = System
01-24 15:32:41.351 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.widget.PopupWindow$PopupDecorView$$ExternalSyntheticLambda0@e56892b
01-24 15:32:41.443 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.widget.PopupWindow$PopupDecorView$$ExternalSyntheticLambda0@4fd65d4
01-24 15:32:41.445 25681 11422 D OpenGLRenderer: endAllActiveAnimators on 0xb400007b120b8340 (RippleDrawable) with handle 0xb400007b81f5f470
01-24 15:32:41.546 25681 25681 D SelectActionModeHelper: Timeout in TextClassificationAsyncTask
01-24 15:32:41.555 25681 25681 W androidtc: TextClassifier called on main thread
01-24 15:32:41.556 25681 27336 D androidtc: Interrupted during ResponseReceiver.get(): textclassification (InterruptedException)
01-24 15:32:42.748 25681 25681 W androidtc: TextClassifier called on main thread
01-24 15:32:42.754 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.widget.Editor$$ExternalSyntheticLambda2@e8ceb3c
01-24 15:32:42.759 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.widget.PopupWindow$PopupDecorView$$ExternalSyntheticLambda0@9328d07
01-24 15:32:43.018 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.widget.PopupWindow$PopupDecorView$$ExternalSyntheticLambda0@e43ca93
01-24 15:32:43.021 25681 11422 D OpenGLRenderer: endAllActiveAnimators on 0xb400007b120c2aa0 (RippleDrawable) with handle 0xb400007b81fb9020
01-24 15:32:44.231 25681 25681 D IntegrationRepository: setAppActive(): false
01-24 15:32:44.232 25681 25681 D IntegrationRepository: setAppActive(): false
01-24 15:32:44.315 25681 25681 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=androidx.activity.OnBackPressedDispatcher$Api34Impl$createOnBackAnimationCallback$1@9ec03c8
01-24 15:32:44.736 25681 25693 W mpanion.android: Reducing the number of considered missed Gc histogram windows from 190 to 100
01-24 15:32:44.814 25681 25695 W mpanion.android: ApkAssets: Deleting an ApkAssets object '/data/resource-cache/com.android.systemui-neutral-2VB9.frro' with 4 weak references
01-24 15:32:44.814 25681 25695 W mpanion.android: ApkAssets: Deleting an ApkAssets object '/data/resource-cache/com.android.systemui-accent-ArDK.frro' with 4 weak references
01-24 15:32:44.814 25681 25695 W mpanion.android: ApkAssets: Deleting an ApkAssets object '/data/resource-cache/com.android.systemui-dynamic-R8NB.frro' with 4 weak references
01-24 15:32:44.823 25681 25695 W System  : A resource failed to call destroy. 
01-24 15:32:44.856 25681 25695 W mpanion.android: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~MeWxOPQGNC_U3tWGKY98pw==/com.google.android.marvin.talkback-BhuGIU1T6UBHWotrrnyoGw==/base.apk' with 1 weak references
01-24 15:32:44.858 25681 25695 W mpanion.android: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~MeWxOPQGNC_U3tWGKY98pw==/com.google.android.marvin.talkback-BhuGIU1T6UBHWotrrnyoGw==/split_config.arm64_v8a.apk' with 1 weak references
01-24 15:32:44.858 25681 25695 W mpanion.android: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~I-8ZZCS5xzMj5Tzb3edXRQ==/com.google.android.apps.translate-uhluwW7PnklnycHXTAMS1A==/base.apk' with 1 weak references
01-24 15:32:44.859 25681 25695 W mpanion.android: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~XdIR_mxgdXrg2UlgZCrYWA==/io.legado.app.release-ptJssAMfWGwyeKpe3ros9g==/base.apk' with 1 weak references
01-24 15:35:22.621 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 1706110365231, currentMillis: 1706110522621)
01-24 15:35:22.678 25681 11517 D WebviewActivity: External bus {"type":"connection-status","payload":{"event":"disconnected"},"id":5}
01-24 15:35:22.680 25681 25681 D LocBroadcastReceiver: Received location update.
01-24 15:35:22.685 25681 25681 D ForegrndServiceLauncher: Check if service HighAccuracyLocationService is running. Service running = false
01-24 15:35:22.685 25681 25715 D LocBroadcastReceiver: Last Location: 
01-24 15:35:22.685 25681 25715 D LocBroadcastReceiver: Coords:(51.4790399, 0.0855746)
01-24 15:35:22.685 25681 25715 D LocBroadcastReceiver: Accuracy: 100.0
01-24 15:35:22.685 25681 25715 D LocBroadcastReceiver: Bearing: 0.0
01-24 15:35:22.686 25681 25715 D LocBroadcastReceiver: Begin evaluating if location update should be skipped
01-24 15:35:22.686 25681 25715 D LocBroadcastReceiver: Received location that is 77 milliseconds old, 1706110522609 compared to 1706110522686 with source fused
01-24 15:35:22.686 25681 25715 D LocBroadcastReceiver: Duplicate location received, not sending to HA
01-24 15:35:22.691 25681 25681 D IntegrationRepository: isAppLocked(): false. (LockEnabled: false, appActive: false, expireMillis: 1706110365231, currentMillis: 1706110522691)
01-24 15:35:22.691 25681 25681 D IntegrationRepository: setAppActive(): true
01-24 15:35:24.433 25681 25681 I ImeTracker: io.homeassistant.companion.android:bdacc01d: onRequestHide at ORIGIN_CLIENT_HIDE_SOFT_INPUT reason HIDE_SOFT_INPUT
01-24 15:35:40.687 25681 25715 D LogcatReader: Read logcat for pid 25681

Screenshot or video of problem:

Additional information:

uniquePWD avatar Jan 24 '24 15:01 uniquePWD

these logs are from your phone and not the watch so they are not correct.

and no its called power saving mode according to the API.

https://developer.android.com/reference/android/os/PowerManager#isPowerSaveMode()

Please make sure to grab the logs when the issue occurs from the watch itself.

I do not think this correlates to Battery Saver on the watch as the API is not updating, this might be a Wear OS issue or they may just not have implemented it.

dshokouhi avatar Jan 24 '24 15:01 dshokouhi

How do I grab the logs from the watch? I don't see an option

uniquePWD avatar Jan 24 '24 15:01 uniquePWD

How do I grab the logs from the watch? I don't see an option

you need to use logcat, either from android studio or the command line, no easy way with a watch.

dshokouhi avatar Jan 24 '24 15:01 dshokouhi

some observations I am seeing on my end.

  • on my pixel 8 pro turning on battery saver in settings directly impacts the power save sensor from the app
  • on my pixel watch turning on battery saver does not result in a change, even if I force a sensor update
  • Samsung galaxy watches can turn on battery saver and the power save sensor will reflect it

may need to look at the logs and see if there is an error but I am afraid this may be an issue of the OS not translating the API correctly as it should be no different but we have seen in Wear OS that certain things from the phone just dont work the same on the watch. A lot of things in the watch have been removed.

dshokouhi avatar Jan 24 '24 17:01 dshokouhi

Im glad you were able to reproduce the issue as I haven't had to get a logcat in a long time and can't remember how 😅

uniquePWD avatar Jan 25 '24 00:01 uniquePWD

Looked at logcat and unfortunately no errors are shown and the intent that we expect to get fired does not get sent. This appears to be a device specific issue. I think we may need to submit a bug for the watch to let Google know the API and intent are not working like it does on the phone. This is probably related to some of the battery saving techniques Google has added to the watch. We have already seen an issue where no updates are sent when Do Not Disturb mode is enabled on the watches.

dshokouhi avatar Jan 26 '24 04:01 dshokouhi

Logged an issue with Google, please feel free to give a +1

https://issuetracker.google.com/issues/333511561

hopefully they will correct this issue, unfortunately the android app cannot fix it so I will close this issue now

dshokouhi avatar Apr 09 '24 18:04 dshokouhi