♪ ♪ この記事は教育目的のみです。法律を破らないで、子供たちに優しくし、自分のデバイスで何をしているかをあなたが責任を持っていることを忘れないでください。 この記事は教育目的のみです。法律を破らないで、子供たちに優しくし、自分のデバイスで何をしているかをあなたが責任を持っていることを忘れないでください。 誰も話さない問題 デジタル睡眠のパラドックス スクリーンが睡眠時間のルーチンを支配する時代に、今や何百万人もの人々がYouTubeのビデオ、ポッドキャスト、またはストリーミングアプリに眠りにつく。 しかし、この習慣には隠されたコストがあります:特に子供にとってコントロールされないボリューム曝露です。親と開発者として、私はこの問題に直面しました - 私の子供の深夜のYouTubeのビンギングは不安定な睡眠と朝のイライラを引き起こしました。 Google Play Storeの無料アプリ、例えば、 で、 彼らは失敗した、設定がなかった、またはあまりにも侵入的だったかもしれない商用アプリはより良いかもしれないが、私はこれをテストしなかったので、彼らはお金がかかる、しばしばかなり。 ボリューム制限 Volume Control The Hack (Totally Illegal...ish) 私はあなたのAndroidデバイスにワイヤレスに接続し、そのボリュームを監視するスクリプトを構築しました. それがあまりにも大きな場合 - それは穏やかにそれを低下させます. 停止ビデオなし, スクリーンフラッシュなし, ユーザーの相互作用なし. 静かな魔法だけ. はい、技術的には、開発者のツールであるWi-Fi上のADB(Android Debug Bridge)を使用しており、ベッドタイムの親のためのものではありません。 あなたの開発環境を構築 開発環境とコネクティビティを構築することは、コードに潜入する前に極めて重要です. This will ensure you have all the necessary tools and libraries, streamlining the development process. 私はmacOSを使用していますので、ストーリーのすべての例はこのシステムで行われるでしょうが、Windowsを使用すると、MacOSと比較してプロセスをより困難にしません。唯一の違いは、MacOSオペレーティングシステムでは、Pythonがすでにインストールされ、Windowsでは、ここからPythonをインストールする必要があります。 ウィンドウズ Python 以下は、より詳細な分解です。 ♪ ♪ ♪ ♪ ♪ Download and Extract Platform Tools: Go to the official Android Developers website: Navigate to Android SDK Platform-Tools. Download the SDK Platform Tools: Download the latest version for your operating system (Windows, macOS, or Linux). Extract the ZIP file: Extract the downloaded ZIP file to a location of your choice (e.g., C:\adb on Windows). C:\adb システムのPATHにプラットフォームツールを追加する: Windows:「環境変数」設定を開く(スタートメニューで「環境変数」を検索)。「システム環境変数を編集」をクリックします。「システム変数」セクションで「システム変数」の「Path」変数を見つけ、それを選択して「Edit」をクリックします。例えば「New」をクリックしてプラットフォームツールディレクトリにパスを追加します(例えば、C:\adb)。 macOS/Linux:あなたのターミナルを開きます。プラットフォームツールディレクトリにパスを追加してください(例えば、 ~/.bashrc、 ~/.zshrc をクリックします)。 例えば、Export PATH=$PATH:/path/to/platform-tools export. PATH=PATH: ADB インストールの確認: コマンドライン インターフェイス (CLI) を開く: Windows 検索バー (Windows OS) を使用して: タスクバーのスタートボタンまたは拡大ガラスアイコンをクリックします。 検索バーに "cmd" (引用なし) を入力します。 "Command Prompt" の結果をクリックします。 管理者として実行するには、検索結果で "Command Prompt" を右クリックして "Run as administrator" を選択します。 Spotlight Search (macOS) を使用して: メニューバーの拡大ガラスアイコンをクリックします(または Cmd+Space を押します)。 あなたのAndroidデバイスでUSBデバッグを有効にする:あなたのAndroidデバイスの「設定」に移動してください。ダウンロードして「携帯電話について」を選択してください。「構築番号」を見つけて「USBデバッグ」に7回以上タップしてください。メインの「設定」ページに戻り、「開発者オプション」が表示されます。「開発者オプション」を選択してください。「USBデバッグ」にダウンロードして切り替えましょう。 今後、私たちはコマンドラインでのみ作業します。私の場合、それはターミナルになります。 あなたの接続を確立する 次のステップは、あなたのモバイルデバイスをPCに接続することです これは、2つの部分から構成される比較的簡単なステップです。 ♪ ♪ ♪ ワイヤー接続 Wireless 接続 ワイヤー接続: ケーブル(USB A/USB C または USB A/micro USB など)を使用してモバイルデバイスをPCに接続する必要があります。 その後、ターミナルを開き、次のコマンドを入力します。 adb devices 今のところ、以下のコマンドでTCP/IPモードを有効にする準備ができています。 adb tcpip 5555 すでに端末にいる場合は、携帯端末のIPアドレスをWIFIネットワークで確認でき、携帯端末を見ることなく、次のようなコマンドを実行して、ワイヤレス接続を確立する際に必要なIPアドレスを確認しましょう。 adb -d shell "ip route | awk '/wlan0/ {print \$9}'" ワイヤレス接続: デバイスのIPアドレスを持っているので、ワイヤレスに接続する時が来ました。ワイヤレス接続はもう必要ありません。 , あなたは安全にUSBケーブルを解くことができます. 魔法の残りはWi-Fiで起こります。 adb tcpip 5555 スマートフォンとコンピュータの両方が同じ Wi-Fi ネットワークに接続されていることを確認します。 adb connect <DEVICE_IP>:5555 たとえば、デバイスのIPが あなたは入ります: 10.0.0.108 adb connect 10.0.0.108:5555 すべてがうまくいけば、以下のようなメッセージが表示されます。 問題についてもう一度話し合いましょう。 あなたの子供は静かなビデオを静かに見て眠りにつく - もしかしたら寝る時のストーリーやリラックスした音が聞こえるかもしれません。しかし、2時間後? YouTubeの自動プレイが鳴り響き、大きな広告が鳴り響き、あるいは高エネルギーの漫画のサウンドトラックが彼らを目覚めさせます。彼らはグロッグイです。あなたはグロッグイです。誰もが彼らの日をすでに排泄して始める。私たちが必要としていたのは静かな保護者だった - 見えざるものと信頼性のあるもの。 再生を停止せずに背景で音量を軽く下げるシステム、不快なポップアップを吹き飛ばすことなく、そしてユーザーを起こさずに。 それがこのスクリプト アーキテクチャ A Glance 以下は、すべてがどのように接続されているかを示す迅速な図面です。 ♪ ♪ あなたのコンピュータ(Python スクリプトを実行している)は、Wi-Fi 経由で ADB を介して Android デバイスに接続し、定期的に音量を監視し、必要に応じてそれを減らします。 あなたのコンピュータ(Python スクリプトを実行している)は、Wi-Fi 経由で ADB を介して Android デバイスに接続し、定期的に音量を監視し、必要に応じてそれを減らします。 The Script That Does the Magic (マジック) ソリューションのコアは、Wi-Fi経由でADBを介してAndroidデバイスと通信するPythonスクリプトです。 30秒ごとに、現在の音楽ストリームのボリュームをチェックします。ボリュームが5を超える場合は(Androidは通常15ポイントスケールを使用します)、スクリプトは、短い休憩で1歩ずつ、軽くそれを下げます。 最高の部分は? 手動の変更を尊重します。 誰かが音量を自分で下げると、スクリプトは気づき、干渉しません。 それは静かです。 それは適応性です。 それは目に見えない - 良いベッドタイムアシスタントがそうであるべきのように。 The Script’s Evolution: From Tiny Hack to Reliable Tool(スクリプトの進化:小さなハックから信頼できるツール) この脚本を最初に書いたとき、ほんのわずか数行だった。 こんなものに見えた: import subprocess import time import re def get_stream_volume(): cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'" result = subprocess.run(cmd, shell=True, capture_output=True, text=True) match = re.search(r'streamVolume:(\d+)', result.stdout) return int(match.group(1)) if match else None def set_volume(level): cmd = f"adb shell cmd media_session volume --stream 3 --set {level}" subprocess.run(cmd, shell=True) print(f"Volume set to {level}") def monitor_volume(): while True: volume = get_stream_volume() if volume is None: print("Failed to get volume level. Retrying...") time.sleep(5) continue print(f"Current volume: {volume}") if volume == 15: for vol in range(14, 4, -1): set_volume(vol) time.sleep(30) while get_stream_volume() == 5: print("Volume is at 5, monitoring every 60 seconds...") time.sleep(60) if __name__ == "__main__": monitor_volume() os.system("adb shell dumpsys audio | grep -i 'streamVolume'") 夜中にデバイスが切断されたらどうなる?ADBがタイムアウトしたらどうなる?携帯電話が並んでいないとどうなる?脚本が誰もが眠っている間に壊れたらどうなる? 脚本が進化した。 ♪ ♪ ♪ ♪ ♪ ♪ ♪ ♪ 時々、デバイスが接続されていなかったので、adb connect ip:port を追加しました。 時々ADBは真夜中に崩壊し、例外処理とリトリを追加しました。 ええ?これも加えました。 ファイルログとコンソールログ? もちろん。 睡眠中にボリュームが変化しますか? 今、脚本はそれも追跡します - 必要に応じてのみ介入します。 モニタリング周波数? 低音量レベルに対して異なる間隔。 そして、はい、グレイシーなシャットダウン Ctrl + C。 数行のスクリプトとして始まったものは、あなたの携帯電話をベビーシッターする小さな警備犬に変わりました - だからあなたはそれを必要としません。 import subprocess import time import re import logging from datetime import datetime logging.basicConfig( filename='volume_control.log', level=logging.INFO, format='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) ADB_DEVICE = "10.0.0.108:5555" def log(message): timestamp = get_timestamp() print(f'[{timestamp}] {message}') logging.info(message) def get_timestamp(): return datetime.now().strftime('%Y-%m-%d %H:%M:%S') def connect_adb(): subprocess.run(f"adb connect {ADB_DEVICE}", shell=True) log(f"Reconnected to ADB at {ADB_DEVICE}") def get_stream_volume(): cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'" result = subprocess.run(cmd, shell=True, capture_output=True, text=True) match = re.search(r'streamVolume:(\d+)', result.stdout) return int(match.group(1)) if match else None def safe_get_stream_volume(retries=3, delay=5): for attempt in range(retries): volume = get_stream_volume() if volume is not None: return volume log(f"Attempt {attempt + 1}: Failed to get volume. Retrying after reconnect...") connect_adb() time.sleep(delay) log("All attempts failed. Giving up temporarily.") return None def set_volume(level): cmd = f"adb shell cmd media_session volume --stream 3 --set {level}" subprocess.run(cmd, shell=True) log(f"Volume set to {level}, waiting 30 seconds...") def monitor_volume(): while True: volume = safe_get_stream_volume() if volume is None: log("Initial volume read failed. Retrying in 30 seconds...") time.sleep(30) continue log(f"Current volume: {volume}") while volume > 5: set_volume(volume - 1) time.sleep(30) volume = safe_get_stream_volume() if volume is None: log("Failed to read volume during decreasing.") break while True: volume = safe_get_stream_volume() if volume is None: log("Failed to read volume during monitoring.") time.sleep(30) break if volume > 5: log(f"Volume increased to {volume}, restarting decreasing") break log(f"Volume is at {volume}, monitoring every 60 seconds...") time.sleep(60) if __name__ == "__main__": try: monitor_volume() except KeyboardInterrupt: log("Script stopped by user (Ctrl+C)") except Exception as e: log(f"Unexpected error: {e}") finally: log("Script exited.") 今日、スクリプトは生産レベルの - オープンソースです。しかし、この行ADB_DEVICE = "10.0.0.108:5555"をあなたのIPアドレスからスクリプトに変更することを確認してください。 で。 「Setting Up Your Connection」 スクリプトを実行する: 2 つの簡単なオプションと Cron 脚本を実行する主な方法は2つあります。 ♪ ♪ Python で直接 Python 3 がインストールされている場合は、以下を実行できます。 python3 reduce_volume.py それはすぐに始まり、背景で静かに仕事をします。 ♪ ♪ Standalone Executableとして Python をインストールしていない人と共有したいですか? スクリプトを standalone に変換できます。 macOS または ウィンドウズの場合、使用 : : .app .exe ピアノ pyinstaller --onefile reduce_volume.py This will create a portable app that can be launched with a double-click — no Python required. ♪ ♪ また、Cronの仕事やタスクスケジュールでスケジュールすることもできます。 One More Thing: Remote ADB Restrictions(リモートADB制限) Wi-Fi上のADBは脆弱であることが重要です。 あなたのリモート接続が破損する場合: ♪ ♪ ♪ ♪ ♪ ♪ 電話がリブート。 Wi-Fiネットワークが変わります。 開発者モードまたはUSBデバッグが無効になります。 デバイスはADBアクティビティなしで長時間動作します(一部のシステムは自動的に非アクティブな接続を起動します)。 And many others … したがって、スクリプトが動作しない場合は、単にステップを繰り返します。 : : 「Setting Up Your Connection」 ♪ ♪ ♪ ♪ 携帯機器をワイヤーで個人コンピュータに接続します。 コマンド adb tcpip 5555 adb tcpip 5555 「Adb Connect <DEVICE_IP>5555」を実行します。 adb connect 10.0.0.108:5555 あなたはビジネスに戻ってきます。 最終思考 このハックは、あなたの子供の楽しみを沈黙させることではなく、予期せぬテクノロジーのサプライズから彼らの睡眠とあなたの良心を守ることです。 これは小さなシナリオかもしれないが、私の家族と私にとって、それは人生を変えるものでした。 もう2 AM YouTubeの目覚ましはありません。 もはや悲しい朝はありません。 平和な夜と親の自動化の微妙な部分だけです。 ♪ ♪ ♪ ♪ ♪ ♪ ♪ ♪ ちょっとしたハッキングでしょうか? 確実に効くのか?確実に効くのか? 技術的にはそうですが、グレーゾーンで動作します(ADBアクセスと自動制御は、Googleが公式にエンドユーザ向けにサポートしていません)。 疲れた親(あるいは自分自身)をよりよく眠らせるのに役立つ限り、それは価値があります。 それは微妙だ。 目に見えない。 そして機能する。 ソースコード、一クリック設定、または改善されたバージョンが必要かどうかを教えてください。 うまく眠れよ、稼いだよ。 ♪ ♪ P.S. このソリューションは改善され、拡張することができます - たとえば、スケジュールを設定し、異なるプロファイルに適応し、デバイスの活動を追跡するなど、しかし、その基本的な形でさえ、それはすでに主な問題を解決します:それはあなたが眠るのを助けます - 平和的に眠ります。 P.S. このソリューションは改善され、拡張することができます - たとえば、スケジュールを設定し、異なるプロファイルに適応し、デバイスの活動を追跡するなど、しかし、その基本的な形でさえ、それはすでに主な問題を解決します:それはあなたが眠るのを助けます - 平和的に眠ります。