לא לשבור את החוק, להיות נחמד לילדים שלך, ואל תשכח שאתה אחראי על מה שאתה עושה עם המכשירים שלך.
→לא לשבור את החוק, להיות נחמד לילדים שלך, ואל תשכח שאתה אחראי על מה שאתה עושה עם המכשירים שלך.
הבעיה שאף אחד לא מדבר עליה
פרדוקס השינה הדיגיטלית בעידן שבו המסכים שולטים על שגרת השינה, מיליוני אנשים נרדמים כעת מול קטעי וידאו, פודקאסטים או אפליקציות סטרימינג.
עם זאת, להרגל זה יש עלות מוסתרת: חשיפה בלתי נשלטת לקול, במיוחד עבור ילדים.כהורים ומפתחים, התמודדתי עם בעיה זו בידיים ראשונות - שיחות YouTube מאוחרות של הילד שלי הובילו לשינה חסרת מנוחה ועצבנות בבוקר.
אפליקציות בחינם בחנות Google Play, כגון:מגבלות נפח,בקרת נפחייתכן שאפליקציות מסחריות היו טובות יותר, אבל לא בדקתי את זה כי הם עולה כסף, לעתים קרובות קצת.
The Hack (לא חוקי לחלוטין...ish)
יצרתי סקריפט שמתחבר למכשיר אנדרואיד שלך באופן אלחוטי ושומרת מבט על נפחו.אם הוא הופך לקול רם מדי – הוא מוריד אותו בעדינות.אין וידאו עוצר, אין צלצול מסך, אין אינטראקציה משתמש.
כן, מבחינה טכנית, הוא משתמש ב- ADB (אנדרואיד Debug Bridge) מעל Wi-Fi, שהוא כלי מפתחים ולא מיועד להורים לפני השינה.
Setting Up Your Development Environment
הגדרת סביבת פיתוח וחיבור היא קריטית לפני צלילה לתוך הקוד.זה יבטיח שיש לך את כל הכלים והספריות הדרושים, להקל על תהליך הפיתוח.
אני משתמש ב- macOS, כך שכל הדוגמאות בסיפור יהיו עם מערכת זו, אבל שימוש ב- Windows לא הופך את התהליך הרבה יותר קשה בהשוואה ל- macOS.ההבדל היחיד הוא כי במערכת ההפעלה MacOS, Python כבר מותקן, וב- Windows, תצטרך להתקין את Python בעצמך מכאן:תגית: windows python
הנה הפרדה מפורטת יותר:
- →
- הורד ומחלץ כלי פלטפורמה: עבור אל אתר האינטרנט הרשמי של Android Developers: 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). →
- הוסף כלי פלטפורמה למסלול המערכת שלך: Windows: פתח את הגדרות "משתנים סביבתיים" (חיפוש עבור "משתנים סביבתיים" בתפריט התחל). לחץ על "הערוך משתנים סביבתיים". לחץ על "משתנים סביבתיים". בסעיף "משתנים סביבתיים", מצא את "מסלול" המשתנה, בחר אותו, ולחץ על "הערוך". לחץ על "חדש" והוסיף את המסלול למדריך כלים פלטפורמה (למשל, C:\adb). macOS/Linux: פתח את המושב. הוסף את המסלול למדריך כלים פלטפורמה לקובץ ההגדרה של הצלחת שלך (למשל, ~/.bashrc, ~/.zshrc). לדוגמה: →
- בדוק את ההתקנה של ADB: פתח את ממשק שורת הפקודה (CLI): באמצעות Windows Search Bar (Windows OS): לחץ על הכפתור התחל או על סמל הזכוכית הגדילה בשורת המשימות. הקלד "cmd" (ללא ציטוטים) בשורת החיפוש. לחץ על התוצאה של "Command Prompt". כדי להפעיל כמנהל, לחץ על "Command Prompt" בתוצאות החיפוש ובחר "Run as administrator". באמצעות Spotlight Search (macOS): לחץ על סמל הזכוכית הגדילה בשורת התפריט (או לחץ על Cmd+Space). הקלד "Terminal" ולחץ פעמיים על זה כדי לפתוח. הקלד adb ולחץ Enter. adb אם adb מותקן כראוי, עליך לראות את הודעת העזרה →
- הפעל USB Debugging במכשיר האנדרואיד שלך: עבור אל "הגדרות" במכשיר האנדרואיד שלך. לחצו למטה ובחרו "על הטלפון". מצא את "בנה מספר" ולחץ על זה 7 פעמים או יותר כדי לפתוח אפשרויות מפתחים. לחזור לדף "הגדרות" הראשי, ועכשיו תראו "אפשרויות מפתחים". בחר "אפשרויות מפתחים". →
מעתה ואילך, אנחנו עובדים רק בשורת הפקודה.במקרה שלי, זה יהיה הטרמינל.
ליצור את החיבור שלך
הצעד הבא יהיה לחבר את המכשיר הנייד שלך למחשב שלך.זה צעד פשוט יחסית המורכב משני חלקים:
- →
- חיבור חשמלי; →
- חיבור אלחוטי →
חיבור Wire:
אתה צריך לחבר את המכשיר הנייד שלך למחשב באמצעות הכבל (USB A / USB C או USB A / micro USB, וכו ').
לאחר מכן, פתחו את הטרמינל והזינו את הפקודה הבאה:
adb devices
בינתיים, אנחנו מוכנים להפעיל את מצב TCP/IP עם הפקודה הבאה:
adb tcpip 5555
אם אנחנו כבר בטרמינל, אז אנחנו יכולים לבדוק את כתובת ה- IP של המכשיר הנייד ברשת ה- Wi-Fi שלנו מבלי להסתכל על המכשיר הנייד.
adb -d shell "ip route | awk '/wlan0/ {print \$9}'"
חיבור אלחוטי:
עכשיו שיש לך את כתובת ה-IP של המכשיר שלך, הגיע הזמן להתחבר באופן אלחוטי.לא צריך עוד חיבור אלחוטי.adb tcpip 5555
, אתה יכול לפתוח בבטחה את כבל USB.שאר הקסם יקרה דרך Wi-Fi.
ודא כי הטלפון החכם והמחשב שלך נמצאים באותו רשת Wi-Fi ולאחר מכן, בטרמינל שלך, הקלד את הפקודה הבאה:
adb connect <DEVICE_IP>:5555
לדוגמה, אם IP המכשיר שלך הוא10.0.0.108
אתה צריך להיכנס:
adb connect 10.0.0.108:5555
אם הכל הולך כמו שצריך, תראו הודעה כמו:
בואו נדבר שוב על הבעיה
בואו נעשה צעד אחורה ונזכור את מה שאנחנו פותרים. הילד שלך נרדם בשקט לצפייה בסרטון שקט - אולי סיפור שינה או כמה צלילים מרגיעים. אבל שעתיים מאוחר יותר? המשחק האוטומטי של YouTube נכנס, בלייזר פרסומת חזק, או כמה רצועת קול קומיקס אנרגיה גבוהה מתעוררת אותם. הם גוגגיים. אתה גוגגי. כולם מתחילים את היום שלהם כבר מיובש. מה שהיינו צריכים היה שומר שקט - משהו בלתי נראה ואמין. מערכת שתוריד בעדינות את נפח הרקע מבלי להפסיק את ההפקה, מבלי להדליק פופ-אפ, מבלי להתעורר את המשתמש.
ארכיטקטורה במבט
הנה תרשים מהיר שמראה איך הכל מחובר:
המחשב שלך (מפעיל את התסריט Python) מתחבר למכשיר Android באמצעות ADB דרך Wi-Fi, מפקח על הקול מעת לעת ומפחית אותו במידת הצורך.
→
המחשב שלך (מפעיל את התסריט Python) מתחבר למכשיר Android באמצעות ADB דרך Wi-Fi, מפקח על הקול מעת לעת ומפחית אותו במידת הצורך.
התסריט שעושה את הקסם
ליבה של הפתרון הוא סקריפט Python שמתקשר עם המכשיר Android שלך באמצעות ADB דרך Wi-Fi.
כל 30 שניות, הוא בודק את נפח זרימת המוסיקה הנוכחית.אם נפח הוא מעל 5 (אנדרואיד בדרך כלל משתמש בסולם של 15 נקודות), התסריט מוריד אותו בעדינות - צעד אחד בכל פעם, עם הפסקות קצרות.
החלק הטוב ביותר? הוא מכבד שינויים ידניים. אם מישהו מפחית את הקול עצמו, התסריט מזהה ולא מפריע. הוא שקט. הוא מתאים. הוא בלתי נראה - בדיוק כמו עוזר שינה טוב צריך להיות.
התפתחות התסריט: מ-Tiny Hack ל-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 שלך מ"להגדיר את הקשר שלך"→
הפעלת התסריט: שתי אפשרויות קלות כמו Cron
יש לך שתי דרכים עיקריות להפעיל את התסריט:
- →
- ישירות עם Python →
אם יש לך Python 3 מותקן, אתה יכול פשוט להפעיל:
python3 reduce_volume.py
הוא יתחיל מיד ויעשה את עבודתו בשקט ברקע.
- →
- כאמצעי יישום עצמאי →
רוצים לשתף אותו עם מישהו שאין לו Python מותקן?
אתה יכול להמיר את התסריט לתוך standalone.app
עבור macOS או.exe
עבור Windows, השתמשפינגווין• :
pyinstaller --onefile reduce_volume.py
זה יצר אפליקציה ניידת שיכולה להתחיל בלחיצה כפולה - אין צורך ב- Python.
- →
- אפילו לתכנן את זה עם עבודה cron או לוח זמנים של משימות אם אתה פנטסי. →
דבר נוסף: הגבלות ADB מרחוק
חשוב לציין כי ADB על Wi-Fi יכול להיות חלש.
החיבור הרחוק שלך ייפסק אם:
- →
- הטלפון מחדש →
- רשת ה-Wi-Fi משתנה →
- מצב developer או USB Debugging מופעל. →
- המכשיר עובד זמן רב מדי ללא פעילות ADB (יש מערכות שמפעילות באופן אוטומטי חיבורים לא פעילים). →
- ועוד רבים אחרים... →
אז אם התסריט מפסיק לעבוד, פשוט חזור על השלבים מ"להגדיר את הקשר שלך"• :
- →
- חיבור המכשיר הנייד באמצעות כבל למחשב האישי שלך.
- פקודה adb tcpip 5555 adb tcpip 5555 →
- להורדה של Adb Connect <DEVICE_IP>: 5555 →
adb connect 10.0.0.108:5555
אתה תחזור לעסקים.
מחשבות סופיות
זה לא על להדחיק את הכיף של הילד שלך.זה על להגן על השינה שלהם - ואת החוכמה שלך - מפתיעות טכנולוגיות בלתי צפויות.
זה עשוי להיות תסריט קטן, אבל עבור המשפחה שלי ואני, זה היה שינוי חיים. לא יותר 2 AM התעוררות YouTube. לא יותר בוקר כועס. רק לילות שלווים קצת אוטומציה עדין של ההורים.
- →
- האם זה קצת hacking? →
- האם זה עובד בצורה אמינה? →
- מבחינה טכנית כן, אבל הוא פועל באזור אפור (גישה ADB ושליטה אוטומטית אינם נתמכים רשמית על ידי Google למשתמשים סופיים). →
- כל עוד זה עוזר להורים עייפים (או אפילו לעצמם) לישון טוב יותר - זה שווה את זה. →
- זה מתוחכם →
- זה בלתי נראה. →
- וזה עובד →
תן לי לדעת אם אתה רוצה את קוד המקור, התקנה בלחיצה אחת, או גרסה משופרת.
שינה טובה, אתה מרוויח את זה
P.S. פתרון זה ניתן לשפר ולהרחיב - למשל, להגדיר לוח זמנים, להתאים פרופילים שונים, לעקוב אחר פעילות המכשיר, וכו 'אבל גם בצורתו הבסיסית, זה כבר פותר את הבעיה העיקרית: זה עוזר לך להירדם - וללכת לישון בשלום.
→P.S. פתרון זה ניתן לשפר ולהרחיב - למשל, להגדיר לוח זמנים, להתאים פרופילים שונים, לעקוב אחר פעילות המכשיר, וכו 'אבל גם בצורתו הבסיסית, זה כבר פותר את הבעיה העיקרית: זה עוזר לך להירדם - וללכת לישון בשלום.