Deprecated: Creation of dynamic property Typecho\Widget\Request::$feed is deprecated in /www/wwwroot/blog.iletter.top/var/Widget/Archive.php on line 246
白荼日记 https://blog.iletter.top/ 没有什么可以留住,除了死亡。 笔记本断电后自动关机python命令 https://blog.iletter.top/archives/503/ 2025-12-16T10:46:00+08:00 自己的笔记本被自己改成了win server服务器,外加来电自启+小爱同学控制开关机,可以说很好了,但是笔记本却没有断电自动关机这个东西,原本想把电池扣了,换上usp的,但是有一点成本在的,果断放弃。后来更改电源计划,99%的时候进行关机,但是盖上盖子,断开远程的时候,睡眠状态了就,不会进行关机操作。索性写了这个python代码import sys import win32api import win32gui import win32con import pythoncom import psutil import threading import time import subprocess SHUTDOWN_DELAY_SECONDS = 60 class PowerListenerWindow: def __init__(self): self.is_plugged_in = True # 初始假设为连接电源 self.shutdown_timer = None self.last_unplugged_time = None wc = win32gui.WNDCLASS() wc.lpfnWndProc = self.wnd_proc wc.lpszClassName = 'MyPowerListenerClass' wc.hInstance = win32api.GetModuleHandle(None) class_atom = win32gui.RegisterClass(wc) # Create a hidden window self.hwnd = win32gui.CreateWindow( class_atom, 'PowerListener', 0, 0, 0, 0, 0, 0, 0, wc.hInstance, None ) def wnd_proc(self, hwnd, msg, wparam, lparam): if msg == win32con.WM_POWERBROADCAST: if wparam == win32con.PBT_APMPOWERSTATUSCHANGE: # print("[WM_POWERBROADCAST] 电源状态可能已更改 (PBT_APMPOWERSTATUSCHANGE)") # 简化日志 self.check_and_print_status() # 调用更新后的检查函数 elif wparam == win32con.PBT_ACPIRESUMEAUTOMATIC or wparam == win32con.PBT_ACPIRESUMESUSPEND: # print(f"[WM_POWERBROADCAST] 系统从睡眠/休眠恢复 (wParam={wparam})") # 简化日志 pass # 可根据需要添加恢复逻辑 elif wparam == win32con.PBT_APMSUSPEND: # print("[WM_POWERBROADCAST] 系统即将进入睡眠/休眠 (PBT_APMSUSPEND)") # 简化日志 pass # 可根据需要添加休眠前逻辑 return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) def cancel_pending_shutdown(self): """取消任何待定的关机操作""" if self.shutdown_timer and self.shutdown_timer.is_alive(): self.shutdown_timer.cancel() self.shutdown_timer = None def schedule_shutdown(self): """在指定延迟后执行关机""" print(f"警告:设备未充电,将在 {SHUTDOWN_DELAY_SECONDS} 秒后关机!") self.execute_shutdown() def execute_shutdown(self): """实际执行关机操作""" # 再次确认是否仍然未充电,避免在检查间隙插上了电源 try: battery_check = psutil.sensors_battery() if battery_check and not battery_check.power_plugged: print("--- 执行关机 ---") # 使用 subprocess 调用 Windows 关机命令 # /s 关机, /t 5 延迟5秒, /c 添加消息 subprocess.run(["shutdown", "/s", "/t", "5", "/c", "Battery low and not charging. Shutting down in 5 seconds..."], check=True) # 等待一下,让关机命令生效 time.sleep(10) sys.exit(0) # 正常退出监听器 else: print("--- 电源状态已恢复,取消关机 ---") except psutil.Error as e: print(f"查询电源状态失败: {e}") # 查询失败,出于安全考虑,可以选择不关机或记录日志 except subprocess.CalledProcessError as e: print(f"执行关机命令失败: {e}") except Exception as e: print(f"执行关机时发生未知错误: {e}") def check_and_print_status(self): """Helper function to query and print current status and manage shutdown timer""" try: battery = psutil.sensors_battery() was_plugged_in = self.is_plugged_in # 记录之前的状态 if battery: self.is_plugged_in = battery.power_plugged # 简化状态打印,仅在状态变化时提示 # plugged_status_str = "已充电/接入电源" if self.is_plugged_in else "未在充电" # print(f"当前电源状态: {plugged_status_str}, 电量: {battery.percent}%") if not self.is_plugged_in: # 检测到未充电 if was_plugged_in or self.shutdown_timer is None: # 如果之前是充电的,或者是第一次检测到未充电且无定时器 print(f"提示:笔记本电脑当前未在充电! 电量: {battery.percent}%. 将在 {SHUTDOWN_DELAY_SECONDS} 秒后关机.") self.cancel_pending_shutdown() # 先取消旧的(理论上不应该有) # 启动新的 60 秒关机定时器 self.shutdown_timer = threading.Timer(SHUTDOWN_DELAY_SECONDS, self.schedule_shutdown) self.shutdown_timer.start() # else: 已经在倒计时中,无需重复启动 else: # 检测到已充电 if not was_plugged_in: # 如果之前是未充电的 print("提示:电源已连接,取消关机计划。") # 取消任何待定的关机 self.cancel_pending_shutdown() else: # print("无法获取电池信息,可能不是笔记本电脑或传感器不可用。") # 简化日志 self.is_plugged_in = True # 默认为连接(安全起见) self.cancel_pending_shutdown() # 取消关机 except Exception as e: print(f"查询电源状态时出错: {e}") # 出错时也应取消关机以防万一 self.cancel_pending_shutdown() def start_message_loop(self): print("Windows 电源监听器已启动...") print("请插拔电源测试功能。按 Ctrl+C 退出。") # 初始检查一次状态 self.check_and_print_status() try: while True: pythoncom.PumpWaitingMessages() win32api.Sleep(5000) # 每5秒处理一次消息队列 except KeyboardInterrupt: print("\n收到退出指令,正在关闭...") finally: self.cancel_pending_shutdown() # 确保退出时取消定时器 win32gui.DestroyWindow(self.hwnd) print("监听器已关闭。") # 编译 # pyinstaller --noconfirm --onefile --hidden-import=win32timezone powerOffShutDown.py if __name__ == "__main__": listener = PowerListenerWindow() listener.start_message_loop() 将bat脚本设置成windows服务 https://blog.iletter.top/archives/502/ 2025-12-02T13:46:29+08:00 步骤 1: 下载 NSSM访问 NSSM 官方网站:http://nssm.cc/download下载适用于你系统架构(通常是 64-bit x64)的最新版本。解压下载的 ZIP 文件。你会得到一个包含 nssm.exe 的文件夹(例如 win64 文件夹里有 nssm.exe)。步骤 2: 将 NSSM 添加到系统 PATH为了在任何地方都能使用 nssm 命令,建议将其路径添加到系统的环境变量 PATH 中。打开“控制面板” -> “系统和安全” -> “系统” -> “高级系统设置”。点击“环境变量”。在“系统变量”或“用户变量”中找到 Path,选中它并点击“编辑”。点击“新建”,然后粘贴你解压出来的 nssm.exe 所在的完整目录路径(例如 D:\tools\nssm-2.24\win64)。 请务必将路径修改为你实际解压的路径。点击“确定”保存所有更改。关闭并重新打开命令提示符窗口,以使 PATH 变更生效。步骤 3: 使用 NSSM 创建服务以管理员身份 打开命令提示符 (CMD) 或 PowerShell。输入以下命令来启动 NSSM 的图形安装界面:nssm install frp_client_service(frp_client_service 是你将要创建的服务名称,你可以根据需要修改,但不能包含空格)。在弹出的 NSSM 配置窗口中:Path: 浏览并选择你的 start.bat 文件路径:D:\appStable\frp-client\start.bat。Startup directory: 自动填充为 .bat 文件所在的目录,即 D:\appStable\frp-client。请确认此目录正确。这是程序运行时的工作目录。Arguments: 如果你的 start.bat 脚本需要额外的命令行参数,可以在这里填写。通常 .bat 文件不需要在此处添加参数。其他选项卡(如 Details, Log on, Dependencies, Process, Shutdown, Exit actions, I/O Priority)可以根据需要进行配置,但对于大多数情况,默认设置即可。Details: 可以给服务起个易读的显示名称(Display name),比如 "FRP Client",以及描述(Description)。Log on: 默认是使用本地系统账户,通常足够了。I/O Priority: 如果担心性能,可以将优先级设为 Normal。确认所有信息无误后,点击 Install service 按钮。步骤 4: 启动并测试服务可以通过 NSSM GUI 来管理服务:nssm edit frp_client_service # 编辑服务 nssm start frp_client_service # 启动服务 nssm stop frp_client_service # 停止服务 nssm remove frp_client_service # 删除服务或者使用 Windows 内置的 服务管理器:按 Win + R 键,输入 services.msc 并回车。在服务列表中找到你刚刚创建的服务(名称是你在 NSSM 中指定的 Display name 或服务名 frp_client_service)。右键单击该服务,选择“启动”。检查状态是否变为“正在运行”。步骤 5: 设置开机自启在 Windows 的 服务管理器 (services.msc) 中,找到你的 frp_client_service 服务。右键单击该服务,选择“属性”。在“常规”选项卡下,将“启动类型”设置为 自动。点击“应用”和“确定”。现在,这个 FRP 客户端就会作为 Windows 服务运行,并且在系统开机时自动启动了。 pycharm远程开发 https://blog.iletter.top/archives/501/ 2025-11-06T22:18:00+08:00 首先创建新的ssh项目填写相关参数这里需要上传linux的安装包,因为下载的话一直失败无法下载成功,我们选择上传和上传路径pycharm地址:https://www.jetbrains.com/zh-cn/pycharm/download/other.html破解文件下载地址:ja-netfilter-2025.3.0.zip弄完之后,会让你填写远程pycharm的验证,在这之前退出一下我们需要填写编辑一下文件vim pycharm64.vmoptions里面填写关于破解文件的相关信息-Xms256m -Xmx2048m -XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=50 -XX:CICompilerCount=2 -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -XX:+IgnoreUnrecognizedVMOptions -XX:CompileCommand=exclude,com/intellij/openapi/vfs/impl/FilePartNodeRoot,trieDescend -ea -Dsun.io.useCanonCaches=false -Dsun.java2d.metal=true -Djbr.catch.SIGABRT=true -Djdk.http.auth.tunneling.disabledSchemes="" -Djdk.attach.allowAttachSelf=true -Djdk.module.illegalAccess.silent=true -Dkotlinx.coroutines.debug=off -Dide.show.tips.on.startup.default.value=false -Dsun.tools.attach.tmp.only=true -Dawt.lock.fair=true -javaagent:/root/ja-netfilter/ja-netfilter.jar --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED 之后再次打开pycharm远程,填写激活码6ZLWI4KV9Y-eyJsaWNlbnNlSWQiOiI2WkxXSTRLVjlZIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IHd3d8K3YWppaHVvwrdjb20iLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSU0MiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSRCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTRiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEQlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNWIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQU0kiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUENXTVAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiQUlMIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUyIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiRFAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUERCIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9XSwibWV0YWRhdGEiOiIwNDIwMjUxMDI0UFBBTTAwMDAwNUEwMDAwMDBYQyIsImhhc2giOiI3NTkxODgyNy8wOjEzODU1MTE2NSIsImdyYWNlUGVyaW9kRGF5cyI6NywiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJ0cmlhbCI6ZmFsc2UsImFpQWxsb3dlZCI6dHJ1ZX0=-jEJB+XsDL603fDEvkpWiZmuv+g4j7nLQ2jwzghoDP8KuxfCXLPG6LFK4C00mUzUX23i+T9XB9hAp83icdF+YuVESTTbPPxLQVCzk2uIskO8s/g4BZacTQD5IsHVDjRmv5HWtuakqNVUzbatF+yc0ut58PfrPsnKMrp1yFBQEvw3Ch1gghbm85UsTQ4zW2C05QSQDrLSlQB4M/cZ6OTI22NtPSrfJxyfdUhVEnQQqO6uQqrqa7CX8ZuC+ZKsap4tnaXmHG4hfUlZdO7PTlZfV20n9mtJxZSftqZUgeJzreporG7C2bX1mIDlkAECzkMU5gmJzlUQ6499xz2O2Upx7Wg==-MIIETDCCAjSgAwIBAgIBETANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTI0MDkyMDEyMTEyN1oXDTI2MDkyMjEyMTEyN1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyNDA5MjAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7SH/XcUoMwkDi8JJPzXWWHWFdOZdrP2Dqkz2W8iUi650cwz2vdPEd0tMzosLAj7ifkFEHUyiuEcL//q9d9Op7ZsV23lpPXX8tFMLFwugoQ9D8jDLT/XP9pp/YukWkKF5jpNbaCvsVQkDdYkArBkYvhH3aN4v9BkEsXahfgLLOPe4IG2FDJNf9R4to9V1vt+m2UVJB0zV4a/sVMKUZLgqKmKKKOKoLrE3OjBlZlb+Q0z2N5dsW0hDEVRFGmBUAbHN/mp44MMMvEIFKfoLIGpgic92P2O6uFh75PI7mcultL6yuR48ajErx8CjjQEGOSnoq/8hD+yVE+6GW2gJa2CPvAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUb5NERj05GyNerQ/Mjm9XH8HXtLIwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBALq6VfVUjmPI3N/w0RYoPGFYUieCfRO0zVvD1VYHDWsN3F9buVsdudhxEsUb8t7qZPkDKTOB6DB+apgt2ZdKwok8S0pwifwLfjHAhO3b+LUQaz/VmKQW8gTOS5kTVcpM0BY7UPF8cRBqxMsdUfm5ejYk93lBRPBAqntznDY+DNc9aXOldFiACyutB1/AIh7ikUYPbpEIPZirPdAahroVvfp2tr4BHgCrk9z0dVi0tk8AHE5t7Vk4OOaQRJzy3lST4Vv6Mc0+0z8lNa+Sc3SVL8CrRtnTAs7YpD4fpI5AFDtchNrgFalX+BZ9GLu4FDsshVI4neqV5Jd5zwWPnwRuKLxsCO/PB6wiBKzdapQBG+P9z74dQ0junol+tqxd7vUV/MFsR3VwVMTndyapIS+fMoe+ZR5g+y44R8C7fXyVE/geg+JXQKvRwS0C5UpnS5FcGk+61b0e4U7pwO20RlwhEFHLSaP61p2TaVGo/TQtT/fWmrtV+HegAv9P3X3Se+xIVtJzQsk8QrB/w52IB3FKiAKl/KRn1egbMIs4uoNAkqNZ9Ih2P1NpiQnONFmkiAgeynJ+0FPykKdJQbV3Mx44jkaHIif4aFReTsYX1WUBNu/QerZRjn4FVSHRaZPSR5Oi82Wz0Nj7IY9ocTpLnXFrqkb/Kt3S6B9s2Kol3Lr1ElYA这一步可能会提示This license xxxx has been suspended可以设置一下代理就可以了 1+ACE2系统优化笔记 https://blog.iletter.top/archives/495/ 2025-11-01T21:01:00+08:00 记录一下系统的优化记录系统版本C13.1 (cn01)版本。机型1+ace2系统版本:冻结的应用:其中,发现我的system_server里面一直高负载,时不时跳到150%以上。于是采用adb抓包形式。抓包命令.\adb logcat -v time > D:\UserData\Desktop\logcat.log第一次日志抓取11-01 18:31:44.931 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found 11-01 18:31:44.931 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 11-01 18:31:44.932 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found 11-01 18:31:44.933 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 11-01 18:31:44.934 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found 11-01 18:31:44.935 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 11-01 18:31:44.936 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found 11-01 18:31:44.937 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 11-01 18:31:44.938 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found 11-01 18:31:44.938 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 11-01 18:31:44.939 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found 11-01 18:31:44.939 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 这里疯狂唤醒com.oplus.onet 服务,同时com.oplus.virtualcomm,这个虚拟通信也疯狂调用。于是只好解冻这net服务。第二次抓包11-01 18:48:53.927 E/AdbDebuggingManager( 3189): Caught an exception opening the socket: java.io.IOException: No such file or directory 11-01 18:48:53.956 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found 11-01 18:48:53.958 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found 11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found 11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found 11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found 11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found 11-01 18:48:53.962 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found 11-01 18:48:53.962 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found 11-01 18:48:53.963 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found 11-01 18:48:53.963 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found 11-01 18:48:53.964 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found 11-01 18:48:53.964 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found 11-01 18:48:53.965 W/ActivityManager( 3189): Receiver with filter android.content.IntentFilter@56b32fa already registered for pid 16357, callerPackage is com.oplus.onet 11-01 18:48:53.965 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found 11-01 18:48:53.966 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found 11-01 18:48:53.966 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found这里疯狂唤醒com.heytap.accessory,于是把这个解冻了。第三次抓包发现一直在唤醒com.nearme.statistics.rom这个玩意,但是频次不是很高。搜索发现这是哪个用户体验计划,索性就不管了。同时在阅读了https://www.coolapk.com/feed/66547164这个大佬的文章之后。也是选择性的禁用软件。删除了olc和反馈工具箱这俩应用。其实从18年入手的第一台小米8开始,就开始了我的root之路。到现在已经七年了。也从小米换到了一加。从一个无脑安装模块的脚本小子,到了开始解读源码写程序的程序员。自己蜕变了好多,心态也老了好多。沉下心来做事,安安静静的学习!加油吧! typecho添加附件功能如果是图片就可以预览 https://blog.iletter.top/archives/492/ 2025-10-28T19:29:00+08:00 定位文件file-upload.php和file-upload-js.php。修改之前记得备份文件。更改了一下排序顺序,刚上传的放在最前面。如果是图片就可以简单预览缩略图。更改file-upload.php<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?> <?php if (isset($post) || isset($page)) { $cid = isset($post) ? $post->cid : $page->cid; if ($cid) { \Widget\Contents\Attachment\Related::alloc(['parentId' => $cid])->to($attachment); } else { \Widget\Contents\Attachment\Unattached::alloc()->to($attachment); } } ?> <div id="upload-panel" class="p"> <div class="upload-area" draggable="true"><?php _e('拖放文件到这里<br>或者 %s选择文件上传%s', '<a href="###" class="upload-file">', '</a>'); ?></div> <ul id="file-list"> <?php while ($attachment->next()): ?> <li data-cid="<?php $attachment->cid(); ?>" data-url="<?php echo $attachment->attachment->url; ?>" data-image="<?php echo $attachment->attachment->isImage ? 1 : 0; ?>"> <input type="hidden" name="attachment[]" value="<?php $attachment->cid(); ?>" /> <a class="insert" title="<?php _e('点击插入文件'); ?>" href="###"><?php $attachment->title(); ?></a> <div class="info"> <?php echo number_format(ceil($attachment->attachment->size / 1024)); ?> Kb <a class="file" target="_blank" href="<?php $options->adminUrl('media.php?cid=' . $attachment->cid); ?>" title="<?php _e('编辑'); ?>"><i class="i-edit"></i>编辑</a> <a href="###" class="delete" title="<?php _e('删除'); ?>"><i class="i-delete"></i>删除</a> </div> <?php if ($attachment->attachment->isImage): ?> <div class="image-preview"> <img src="<?php echo $attachment->attachment->url; ?>" alt="<?php $attachment->title(); ?>" /> </div> <?php endif; ?> </li> <?php endwhile; ?> </ul> </div> <style> /* 为包含图片的列表项设置基础样式 */ #file-list li { margin-bottom: 10px; /* 列表项之间的间距 */ padding: 8px; /* 内边距 */ border: 1px solid #eee; /* 边框 */ border-radius: 4px; /* 圆角 */ background-color: #fafafa; /* 背景色 */ list-style: none; /* 去除默认列表符号 */ } /* 标题样式 */ #file-list li .insert { display: block; /* 使其独占一行 */ font-weight: bold; /* 标题加粗 */ margin-bottom: 4px; /* 与下方 .info 的间距 */ color: #333; /* 标题颜色 */ text-decoration: none; /* 去除下划线 */ } #file-list li .insert:hover { text-decoration: underline; /* 悬停时添加下划线 */ } /* 信息栏样式 */ #file-list li .info { font-size: 0.9em; /* 信息栏字体稍小 */ color: #666; /* 信息栏颜色 */ margin-bottom: 8px; /* 与下方图片的间距 */ line-height: 1.4; /* 行高 */ } /* 信息栏内的链接和图标 */ #file-list li .info a { margin-right: 8px; /* 链接之间的间距 */ color: #999; /* 图标颜色 */ text-decoration: none; } #file-list li .info a:hover { color: #007cba; /* 悬停时的颜色 */ } /* 图片预览容器 */ .image-preview { text-align: center; /* 图片居中 */ margin-top: 5px; /* 与上方 .info 的间距 */ clear: both; /* 清除浮动(如果有的话) */ } /* 图片样式 */ .image-preview img { max-width: 150px; /* 设置最大宽度 */ max-height: 150px; /* 设置最大高度 */ height: auto; /* 保持宽高比 */ border: 1px solid #ddd; /* 图片边框 */ border-radius: 4px; /* 图片圆角 */ padding: 2px; /* 图片内边距 */ background-color: #fff; /* 图片背景色,防止透明图有背景色干扰 */ box-shadow: 0 1px 3px rgba(0,0,0,0.1); /* 添加轻微阴影 */ } /* 加载状态样式 */ #file-list li.loading { color: #999; font-style: italic; } /* 删除按钮悬停效果 */ #file-list li a.delete:hover { color: #e74c3c !important; /* 删除按钮悬停时变为红色 */ } /* 编辑按钮悬停效果 */ #file-list li a.file:hover { color: #3498db !important; /* 编辑按钮悬停时变为蓝色 */ } </style>更改file-upload-js.php<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?> <?php if (isset($post) && $post instanceof \Typecho\Widget && $post->have()) { $fileParentContent = $post; } elseif (isset($page) && $page instanceof \Typecho\Widget && $page->have()) { $fileParentContent = $page; } $phpMaxFilesize = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : 0; if (preg_match("/^([0-9]+)([a-z]{1,2})$/i", $phpMaxFilesize, $matches)) { $phpMaxFilesize = strtolower($matches[1] . $matches[2] . (1 == strlen($matches[2]) ? 'b' : '')); } ?> <script src="<?php $options->adminStaticUrl('js', 'moxie.js'); ?>"></script> <script src="<?php $options->adminStaticUrl('js', 'plupload.js'); ?>"></script> <script> $(document).ready(function() { function updateAttacmentNumber () { var btn = $('#tab-files-btn'), balloon = $('.balloon', btn), count = $('#file-list li .insert').length; if (count > 0) { if (!balloon.length) { btn.html($.trim(btn.html()) + ' '); balloon = $('<span class="balloon"></span>').appendTo(btn); } balloon.html(count); } else if (0 == count && balloon.length > 0) { balloon.remove(); } } $('.upload-area').bind({ dragenter : function () { $(this).parent().addClass('drag'); }, dragover : function (e) { $(this).parent().addClass('drag'); }, drop : function () { $(this).parent().removeClass('drag'); }, dragend : function () { $(this).parent().removeClass('drag'); }, dragleave : function () { $(this).parent().removeClass('drag'); } }); updateAttacmentNumber(); function fileUploadStart (file) { $('<li id="' + file.id + '" class="loading">' + file.name + '</li>').appendTo('#file-list'); } function fileUploadError (error) { var file = error.file, code = error.code, word; switch (code) { case plupload.FILE_SIZE_ERROR: word = '<?php _e('文件大小超过限制'); ?>'; break; case plupload.FILE_EXTENSION_ERROR: word = '<?php _e('文件扩展名不被支持'); ?>'; break; case plupload.FILE_DUPLICATE_ERROR: word = '<?php _e('文件已经上传过'); ?>'; break; case plupload.HTTP_ERROR: default: word = '<?php _e('上传出现错误'); ?>'; break; } var fileError = '<?php _e('%s 上传失败'); ?>'.replace('%s', file.name), li, exist = $('#' + file.id); if (exist.length > 0) { li = exist.removeClass('loading').html(fileError); } else { li = $('<li>' + fileError + '<br />' + word + '</li>').appendTo('#file-list'); } li.effect('highlight', {color : '#FBC2C4'}, 2000, function () { $(this).remove(); }); // fix issue #341 this.removeFile(file); } var completeFile = null; function fileUploadComplete (id, url, data) { // 根据是否为图片来构建列表项内容 var itemContent = '<input type="hidden" name="attachment[]" value="' + data.cid + '" />'; // 添加标题和信息 itemContent += '<a class="insert" target="_blank" href="###" title="<?php _e('点击插入文件'); ?>">' + data.title + '</a>' + '<div class="info">' + data.bytes + ' <a class="file" target="_blank" href="<?php $options->adminUrl('media.php'); ?>?cid=' + data.cid + '" title="<?php _e('编辑'); ?>"><i class="i-edit"></i>编辑</a>' + ' <a class="delete" href="###" title="<?php _e('删除'); ?>"><i class="i-delete"></i>删除</a></div>'; // 如果是图片,添加预览图 (注意:这里图片放在 .info 之后,与PHP模板保持一致) if (data.isImage) { itemContent += '<div class="image-preview"><img src="' + data.url + '" alt="' + data.title + '" /></div>'; } // 创建 jQuery 对象 li var li = $('#' + id).removeClass('loading').data('cid', data.cid) .data('url', data.url) .data('image', data.isImage) .html(itemContent); // 先设置内容 // 关键修改:将新 li 插入到 #file-list 的最前面,而不是留在原地或追加到末尾 // 1. 先从当前位置移除(如果它在列表中的话,虽然通常在上传开始时是添加到列表末尾的空li) // 2. 然后插入到 #file-list 的开头 li.prependTo('#file-list'); // prependTo 将元素插入到目标元素的开头 // 绑定事件 attachInsertEvent(li); attachDeleteEvent(li); updateAttacmentNumber(); if (!completeFile) { completeFile = data; } } var uploader = null, tabFilesEl = $('#tab-files').bind('init', function () { uploader = new plupload.Uploader({ browse_button : $('.upload-file').get(0), url : '<?php $security->index('/action/upload' . (isset($fileParentContent) ? '?cid=' . $fileParentContent->cid : '')); ?>', runtimes : 'html5,flash,html4', flash_swf_url : '<?php $options->adminStaticUrl('js', 'Moxie.swf'); ?>', drop_element : $('.upload-area').get(0), filters : { max_file_size : '<?php echo $phpMaxFilesize ?>', mime_types : [{'title' : '<?php _e('允许上传的文件'); ?>', 'extensions' : '<?php echo implode(',', $options->allowedAttachmentTypes); ?>'}], prevent_duplicates : true }, init : { FilesAdded : function (up, files) { for (var i = 0; i < files.length; i ++) { fileUploadStart(files[i]); } completeFile = null; uploader.start(); }, UploadComplete : function () { if (completeFile) { Typecho.uploadComplete(completeFile); } }, FileUploaded : function (up, file, result) { if (200 == result.status) { var data = $.parseJSON(result.response); if (data) { fileUploadComplete(file.id, data[0], data[1]); uploader.removeFile(file); return; } } fileUploadError.call(uploader, { code : plupload.HTTP_ERROR, file : file }); }, Error : function (up, error) { fileUploadError.call(uploader, error); } } }); uploader.init(); }); Typecho.uploadFile = function (file, name) { if (!uploader) { $('#tab-files-btn').parent().trigger('click'); } var timer = setInterval(function () { if (!uploader) { return; } clearInterval(timer); timer = null; uploader.addFile(file, name); }, 50); }; // function attachInsertEvent (el) { // $('.insert', el).click(function () { // var t = $(this), p = t.parents('li'); // Typecho.insertFileToEditor(t.text(), p.data('url'), p.data('image')); // return false; // }); // } // 修改 attachInsertEvent 函数,使其能处理标题链接和图片 function attachInsertEvent (el) { // 为标题链接和图片(或其父容器 .image-preview)绑定点击事件 $('.insert, .image-preview img', el).click(function (e) { // 防止事件冒泡到父级 <a> 标签(如果图片被另一个链接包裹的话) e.stopPropagation(); var t = $(this); // 查找当前点击元素的父级 <li>,然后从中获取数据 var p = t.closest('li'); // 使用 closest 更可靠,可以找到最近的祖先 <li> // 确保找到了包含数据的 <li> 元素 if (p.length > 0) { // 从 <li> 元素获取数据 var url = p.data('url'); var isImage = p.data('image'); var title = p.find('.insert').first().text(); // 获取标题文本 // 调用 Typecho 提供的插入函数 Typecho.insertFileToEditor(title, url, isImage); } return false; // 阻止默认链接行为 }); } function attachDeleteEvent (el) { var file = $('a.insert', el).text(); $('.delete', el).click(function () { if (confirm('<?php _e('确认要删除文件 %s 吗?'); ?>'.replace('%s', file))) { var cid = $(this).parents('li').data('cid'); $.post('<?php $security->index('/action/contents-attachment-edit'); ?>', {'do' : 'delete', 'cid' : cid}, function () { $(el).fadeOut(function () { $(this).remove(); updateAttacmentNumber(); }); }); } return false; }); } $('#file-list li').each(function () { attachInsertEvent(this); attachDeleteEvent(this); }); }); </script> 服务器状态监控开发(设计+初步规划) https://blog.iletter.top/archives/472/ 2025-10-27T16:19:00+08:00 项目说明简述用于监控服务器状态。python客户端用于服务器状态上报,上报到admin里面的接口,通过token进行设备识别。目前仅实现了windows的系统上报实现方式:部署方式需安装lombok插件,不然会提示找不到entity的get set方法创建数据库mydatabase,数据库编码为UTF-8执行db/mydatabase.sql文件,初始化数据修改application-dev.yml文件,更新MySQL账号和密码IDEA运行AdminApplication.java,则可启动项目【admin】vscode运行前端项目npm install安装依赖vscode运行前端项目npm run dev 运行项目前端访问路径:http://localhost:8001/admin接口文档路径:http://localhost:8080/admin/doc.html账号密码:admin 密码应该是123456或者admin我也忘记了设计规划双端admin为服务端后台为java编写作为后台接口信息,sys_monitor_FrontEnd为服务器端前台项目client客户端为python编写,实时上报客户端状态功能规划 client作为数据主动推送,每隔2s(自定义时间)进行信息状态推送。api传输地址标识比如 传入服务器名称和识别token。 在线ssh功能/在线终端 frp穿透功能 允许远程执行客户端脚本 点击服务器查看服务器详情信息,即查看该服务器的当前心跳信息及其基本信息 admin后端日志筛选方式:昨天/今天/最近七天/自定义事件服务器资源压力指数计算RPI = w_cpu × (CPU_usage / CPU_max) + w_mem × (Mem_usage / Mem_total) + N(w_disk x (Disk_usage / Disk_total))CPU_usage:当前 CPU 使用率(例如 45 表示 45%)CPU_max:通常为 100 × 核心数(但更推荐使用 整体使用率百分比,即 0~100% 范围,避免多核复杂化)Mem_usage:已用内存(单位 MB 或 GB)Mem_total:总物理内存N代表有几块磁盘,根据实际情况进行计算Disk_usage:已用磁盘空间(单位 MB 或 GB)Disk_total:总磁盘空间w_cpu 、w_mem 、w_disk :权重,满足 w_cpu + w_mem + w_disk = 1未涉及到使用swap和使用率超90%的阈值惩罚的功能。客户端上报监控端心跳数据格式(windows){ 'clientName': 'windows11', 'clientToken': 'windows11-dellevin-19990902', 'timestamp': 1761876974.3407657, 'data': { 'sysBaseInfo': { 'system': { 'osType': 'Windows', 'rawOsName': 'Windows-11-10.0.26100-SP0', 'osVersion': '10.0.26100', 'osArch': 'AMD64', 'systemRuntime': 7957, 'osStartTime': '2025-10-31 08:03:37', 'systemLanguage': 'zh-CN', 'systemCountry': 'CN' }, 'cpu': { 'cpu_name': 'AMD Ryzen 5 7500F 6-Core Processor', 'logical_cores': 12, 'physical_cores': 6, 'cpu_max_clock_mhz': 3701, 'cpu_usage_percent': 0.0, 'process_count': 202, 'thread_count': 3338, 'system_uptime_seconds': 7959 }, 'gpu': [ { 'name': 'Microsoft Remote Display Adapter', 'vendor': 'Unknown', 'driver_version': '10.0.26100.6725', 'total_memory_bytes': 0 }, { 'name': 'NVIDIA GeForce RTX 4070', 'vendor': 'NVIDIA', 'driver_version': '32.0.15.7680', 'total_memory_bytes': 0 }], 'network': [ { 'interface_name': '以太网', 'mac_address': '04-7C-16-C8-78-E3', 'ip_address': '192.168.31.48', 'bytes_sent': 165698545, 'bytes_recv': 581040639, 'is_up': True }, { 'interface_name': 'VMware Network Adapter VMnet1', 'mac_address': '00-50-56-C0-00-01', 'ip_address': '192.168.184.1', 'bytes_sent': 2554, 'bytes_recv': 18, 'is_up': True }, { 'interface_name': 'VMware Network Adapter VMnet8', 'mac_address': '00-50-56-C0-00-08', 'ip_address': '10.0.0.2', 'bytes_sent': 4990, 'bytes_recv': 0, 'is_up': True }, { 'interface_name': 'ZeroTier One [af78bf9436e11b49]', 'mac_address': '4A-98-68-C5-57-04', 'ip_address': '192.168.196.81', 'bytes_sent': 318241, 'bytes_recv': 61915, 'is_up': True }, { 'interface_name': 'HOME-4070', 'mac_address': '', 'ip_address': '10.8.0.3', 'bytes_sent': 143426176, 'bytes_recv': 14426536, 'is_up': True }], 'memory': { 'total_bytes': 34090856448, 'used_bytes': 11354742784, 'free_bytes': 22736113664, 'memory_percent': 33.3 }, 'disk': [ { 'drive_letter': 'C:', 'total_bytes': 182131965952, 'used_bytes': 165342781440, 'free_bytes': 16789184512 }, { 'drive_letter': 'D:', 'total_bytes': 841953484800, 'used_bytes': 536226193408, 'free_bytes': 305727291392 }] }, 'sysHardWareInfo': [ { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CPU Fan', 'sensor_type': 'Control', 'value': 34.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'Pump Fan', 'sensor_type': 'Control', 'value': 100.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #1', 'sensor_type': 'Control', 'value': 60.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #2', 'sensor_type': 'Control', 'value': 60.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #3', 'sensor_type': 'Control', 'value': 100.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #4', 'sensor_type': 'Control', 'value': 100.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #5', 'sensor_type': 'Control', 'value': 100.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #6', 'sensor_type': 'Control', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': '+12V', 'sensor_type': 'Voltage', 'value': 11.97599983215332 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': '+5V', 'sensor_type': 'Voltage', 'value': 4.900000095367432 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'Vcore', 'sensor_type': 'Voltage', 'value': 1.0240000486373901 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'Voltage #1', 'sensor_type': 'Voltage', 'value': 0.550000011920929 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'DIMM', 'sensor_type': 'Voltage', 'value': 2.5 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CPU I/O', 'sensor_type': 'Voltage', 'value': 0.8940000534057617 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CPU System Agent', 'sensor_type': 'Voltage', 'value': 1.1060000658035278 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'Voltage #2', 'sensor_type': 'Voltage', 'value': 1.534000039100647 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'AVCC3', 'sensor_type': 'Voltage', 'value': 3.376000165939331 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CPU Termination', 'sensor_type': 'Voltage', 'value': 2.0460000038146973 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'VRef', 'sensor_type': 'Voltage', 'value': 1.8360000848770142 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'VSB', 'sensor_type': 'Voltage', 'value': 3.3560001850128174 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'AVSB', 'sensor_type': 'Voltage', 'value': 3.3560001850128174 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CMOS Battery', 'sensor_type': 'Voltage', 'value': 3.1680002212524414 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CPU', 'sensor_type': 'Temperature', 'value': 41.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System', 'sensor_type': 'Temperature', 'value': 33.5 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'VRM MOS', 'sensor_type': 'Temperature', 'value': 44.5 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'PCH', 'sensor_type': 'Temperature', 'value': 20.5 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CPU Socket', 'sensor_type': 'Temperature', 'value': 34.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'PCIe x1', 'sensor_type': 'Temperature', 'value': 32.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'M2_1', 'sensor_type': 'Temperature', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'CPU Fan', 'sensor_type': 'Fan', 'value': 1152.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'Pump Fan', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #1', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #2', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #3', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #4', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #5', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D', 'hardware_type': 'SuperIO', 'sensor_name': 'System Fan #6', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #1', 'sensor_type': 'Load', 'value': 1.0465800762176514 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #2', 'sensor_type': 'Load', 'value': 1.3650298118591309 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #3', 'sensor_type': 'Load', 'value': 3.404635190963745 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #4', 'sensor_type': 'Load', 'value': 5.146729946136475 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #5', 'sensor_type': 'Load', 'value': 3.217226266860962 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #6', 'sensor_type': 'Load', 'value': 4.625016212463379 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #7', 'sensor_type': 'Load', 'value': 3.052729368209839 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #8', 'sensor_type': 'Load', 'value': 1.5176832675933838 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #9', 'sensor_type': 'Load', 'value': 0.5498290061950684 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #10', 'sensor_type': 'Load', 'value': 0.6076335906982422 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #11', 'sensor_type': 'Load', 'value': 0.9741425514221191 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core #12', 'sensor_type': 'Load', 'value': 0.9807765483856201 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Total', 'sensor_type': 'Load', 'value': 2.2073328495025635 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CPU Core Max', 'sensor_type': 'Load', 'value': 5.146729946136475 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Package', 'sensor_type': 'Power', 'value': 25.28716468811035 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #1', 'sensor_type': 'Clock', 'value': 3233.38525390625 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #1', 'sensor_type': 'Factor', 'value': 32.33333206176758 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #1 (SMU)', 'sensor_type': 'Power', 'value': 0.23090383410453796 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #1 VID', 'sensor_type': 'Voltage', 'value': 0.3187499940395355 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #2', 'sensor_type': 'Clock', 'value': 3233.38525390625 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #2', 'sensor_type': 'Factor', 'value': 32.33333206176758 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #2 (SMU)', 'sensor_type': 'Power', 'value': 0.6404263973236084 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #2 VID', 'sensor_type': 'Voltage', 'value': 0.3187499940395355 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #3', 'sensor_type': 'Clock', 'value': 4850.07763671875 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #3', 'sensor_type': 'Factor', 'value': 48.5 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #3 (SMU)', 'sensor_type': 'Power', 'value': 1.0164790153503418 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #3 VID', 'sensor_type': 'Voltage', 'value': 0.3187499940395355 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #4', 'sensor_type': 'Clock', 'value': 4850.07763671875 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #4', 'sensor_type': 'Factor', 'value': 48.5 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #4 (SMU)', 'sensor_type': 'Power', 'value': 0.3363816440105438 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #4 VID', 'sensor_type': 'Voltage', 'value': 0.3187499940395355 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #5', 'sensor_type': 'Clock', 'value': 3233.38525390625 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #5', 'sensor_type': 'Factor', 'value': 32.33333206176758 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #5 (SMU)', 'sensor_type': 'Power', 'value': 0.10547586530447006 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #5 VID', 'sensor_type': 'Voltage', 'value': 0.3187499940395355 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #6', 'sensor_type': 'Clock', 'value': 3233.38525390625 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #6', 'sensor_type': 'Factor', 'value': 32.33333206176758 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #6 (SMU)', 'sensor_type': 'Power', 'value': 0.15878205001354218 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core #6 VID', 'sensor_type': 'Voltage', 'value': 0.3187499940395355 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Core (Tctl/Tdie)', 'sensor_type': 'Temperature', 'value': 41.75000762939453 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'CCD1 (Tdie)', 'sensor_type': 'Temperature', 'value': 37.375 }, { 'hardware_path': 'AMD Ryzen 5 7500F', 'hardware_type': 'Cpu', 'sensor_name': 'Bus Speed', 'sensor_type': 'Clock', 'value': 100.00160217285156 }, { 'hardware_path': 'Generic Memory', 'hardware_type': 'Memory', 'sensor_name': 'Memory Used', 'sensor_type': 'Data', 'value': 10.574928283691406 }, { 'hardware_path': 'Generic Memory', 'hardware_type': 'Memory', 'sensor_name': 'Memory Available', 'sensor_type': 'Data', 'value': 21.17465591430664 }, { 'hardware_path': 'Generic Memory', 'hardware_type': 'Memory', 'sensor_name': 'Memory', 'sensor_type': 'Load', 'value': 33.30729675292969 }, { 'hardware_path': 'Generic Memory', 'hardware_type': 'Memory', 'sensor_name': 'Virtual Memory Used', 'sensor_type': 'Data', 'value': 11.593002319335938 }, { 'hardware_path': 'Generic Memory', 'hardware_type': 'Memory', 'sensor_name': 'Virtual Memory Available', 'sensor_type': 'Data', 'value': 25.15658187866211 }, { 'hardware_path': 'Generic Memory', 'hardware_type': 'Memory', 'sensor_name': 'Virtual Memory', 'sensor_type': 'Load', 'value': 31.545944213867188 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Core', 'sensor_type': 'Temperature', 'value': 36.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Core', 'sensor_type': 'Clock', 'value': 2475.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Memory', 'sensor_type': 'Clock', 'value': 10501.984375 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Fan 1', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Fan 2', 'sensor_type': 'Fan', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Fan 1', 'sensor_type': 'Control', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Fan 2', 'sensor_type': 'Control', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Core', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Memory Controller', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Video Engine', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Bus', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Power', 'sensor_type': 'Load', 'value': 13.553999900817871 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Board Power', 'sensor_type': 'Load', 'value': 16.159000396728516 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Dedicated Memory Used', 'sensor_type': 'SmallData', 'value': 817.703125 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Shared Memory Used', 'sensor_type': 'SmallData', 'value': 70.703125 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D 3D', 'sensor_type': 'Load', 'value': 0.20605340600013733 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Compute_0', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Overlay', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Video Decode', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Copy', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Copy', 'sensor_type': 'Load', 'value': 0.0029525277204811573 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Security', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Video Encode', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Video Encode', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Video Processing', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Graphics_1', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Cuda', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Compute_1', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D VR', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Copy', 'sensor_type': 'Load', 'value': 0.0015937299467623234 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Copy', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Copy', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'D3D Copy', 'sensor_type': 'Load', 'value': 0.0025690165348351 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Hot Spot', 'sensor_type': 'Temperature', 'value': 40.46875 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Memory Total', 'sensor_type': 'SmallData', 'value': 12282.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Memory Free', 'sensor_type': 'SmallData', 'value': 11200.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Memory Used', 'sensor_type': 'SmallData', 'value': 1081.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Memory', 'sensor_type': 'Load', 'value': 8.804615020751953 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU Package', 'sensor_type': 'Power', 'value': 27.187999725341797 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU PCIe Rx', 'sensor_type': 'Throughput', 'value': 102400.0 }, { 'hardware_path': 'NVIDIA GeForce RTX 4070', 'hardware_type': 'GpuNvidia', 'sensor_name': 'GPU PCIe Tx', 'sensor_type': 'Throughput', 'value': 921600.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Temperature', 'sensor_type': 'Temperature', 'value': 40.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Available Spare', 'sensor_type': 'Level', 'value': 100.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Available Spare Threshold', 'sensor_type': 'Level', 'value': 1.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Percentage Used', 'sensor_type': 'Level', 'value': 3.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Data Read', 'sensor_type': 'Data', 'value': 37448.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Data Written', 'sensor_type': 'Data', 'value': 25698.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Temperature 1', 'sensor_type': 'Temperature', 'value': 40.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Temperature 2', 'sensor_type': 'Temperature', 'value': 33.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Used Space', 'sensor_type': 'Load', 'value': 68.50688171386719 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Read Activity', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Write Activity', 'sensor_type': 'Load', 'value': 0.056402258574962616 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Total Activity', 'sensor_type': 'Load', 'value': 0.20758971571922302 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Read Rate', 'sensor_type': 'Throughput', 'value': 0.0 }, { 'hardware_path': 'Acer SSD N3500 1TB', 'hardware_type': 'Storage', 'sensor_name': 'Write Rate', 'sensor_type': 'Throughput', 'value': 39383.9140625 }, { 'hardware_path': 'HOME-4070', 'hardware_type': 'Network', 'sensor_name': 'Data Uploaded', 'sensor_type': 'Data', 'value': 0.13357633352279663 }, { 'hardware_path': 'HOME-4070', 'hardware_type': 'Network', 'sensor_name': 'Data Downloaded', 'sensor_type': 'Data', 'value': 0.01343630999326706 }, { 'hardware_path': 'HOME-4070', 'hardware_type': 'Network', 'sensor_name': 'Upload Speed', 'sensor_type': 'Throughput', 'value': 1898.752685546875 }, { 'hardware_path': 'HOME-4070', 'hardware_type': 'Network', 'sensor_name': 'Download Speed', 'sensor_type': 'Throughput', 'value': 768.71142578125 }, { 'hardware_path': 'HOME-4070', 'hardware_type': 'Network', 'sensor_name': 'Network Utilization', 'sensor_type': 'Load', 'value': 2.133971247531008e-05 }, { 'hardware_path': 'VMware Network Adapter VMnet1', 'hardware_type': 'Network', 'sensor_name': 'Data Uploaded', 'sensor_type': 'Data', 'value': 2.378597855567932e-06 }, { 'hardware_path': 'VMware Network Adapter VMnet1', 'hardware_type': 'Network', 'sensor_name': 'Data Downloaded', 'sensor_type': 'Data', 'value': 1.6763806343078613e-08 }, { 'hardware_path': 'VMware Network Adapter VMnet1', 'hardware_type': 'Network', 'sensor_name': 'Upload Speed', 'sensor_type': 'Throughput', 'value': 0.0 }, { 'hardware_path': 'VMware Network Adapter VMnet1', 'hardware_type': 'Network', 'sensor_name': 'Download Speed', 'sensor_type': 'Throughput', 'value': 0.0 }, { 'hardware_path': 'VMware Network Adapter VMnet1', 'hardware_type': 'Network', 'sensor_name': 'Network Utilization', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'VMware Network Adapter VMnet8', 'hardware_type': 'Network', 'sensor_name': 'Data Uploaded', 'sensor_type': 'Data', 'value': 4.647299647331238e-06 }, { 'hardware_path': 'VMware Network Adapter VMnet8', 'hardware_type': 'Network', 'sensor_name': 'Data Downloaded', 'sensor_type': 'Data', 'value': 0.0 }, { 'hardware_path': 'VMware Network Adapter VMnet8', 'hardware_type': 'Network', 'sensor_name': 'Upload Speed', 'sensor_type': 'Throughput', 'value': 0.0 }, { 'hardware_path': 'VMware Network Adapter VMnet8', 'hardware_type': 'Network', 'sensor_name': 'Download Speed', 'sensor_type': 'Throughput', 'value': 0.0 }, { 'hardware_path': 'VMware Network Adapter VMnet8', 'hardware_type': 'Network', 'sensor_name': 'Network Utilization', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': 'ZeroTier One [af78bf9436e11b49]', 'hardware_type': 'Network', 'sensor_name': 'Data Uploaded', 'sensor_type': 'Data', 'value': 0.0002963850274682045 }, { 'hardware_path': 'ZeroTier One [af78bf9436e11b49]', 'hardware_type': 'Network', 'sensor_name': 'Data Downloaded', 'sensor_type': 'Data', 'value': 5.766283720731735e-05 }, { 'hardware_path': 'ZeroTier One [af78bf9436e11b49]', 'hardware_type': 'Network', 'sensor_name': 'Upload Speed', 'sensor_type': 'Throughput', 'value': 0.0 }, { 'hardware_path': 'ZeroTier One [af78bf9436e11b49]', 'hardware_type': 'Network', 'sensor_name': 'Download Speed', 'sensor_type': 'Throughput', 'value': 0.0 }, { 'hardware_path': 'ZeroTier One [af78bf9436e11b49]', 'hardware_type': 'Network', 'sensor_name': 'Network Utilization', 'sensor_type': 'Load', 'value': 0.0 }, { 'hardware_path': '以太网', 'hardware_type': 'Network', 'sensor_name': 'Data Uploaded', 'sensor_type': 'Data', 'value': 0.15431921184062958 }, { 'hardware_path': '以太网', 'hardware_type': 'Network', 'sensor_name': 'Data Downloaded', 'sensor_type': 'Data', 'value': 0.5411369800567627 }, { 'hardware_path': '以太网', 'hardware_type': 'Network', 'sensor_name': 'Upload Speed', 'sensor_type': 'Throughput', 'value': 2478.11279296875 }, { 'hardware_path': '以太网', 'hardware_type': 'Network', 'sensor_name': 'Download Speed', 'sensor_type': 'Throughput', 'value': 1231.908203125 }, { 'hardware_path': '以太网', 'hardware_type': 'Network', 'sensor_name': 'Network Utilization', 'sensor_type': 'Load', 'value': 0.002968016779050231 }] } }关键数据库结构server_menu - 服务器信息存储表字段名称类型注释idbigintid编号server_namevarchar服务器名称server_tokenvarchar与客户端一致的token(唯一性)可以自动生成isEmailvarchar是否启用邮件告警(1开启 0关闭)ip_addrvarcharip地址(map存储,公网ip和局域网ip,手动设置)server_pwdvarchar服务密码(map存储,ssh密码,桌面密码,mysql密码等保存方式)service_providervarchar提供厂商(阿里云/腾讯云/家用服务器)remarklongtext备注信息create_timedatetime创建时间create_uservarchar创建人update_timedatetime更新时间update_uservarchar更新人server_heart_beat - 接收客户端心跳信息表字段名称类型注释id id编号(雪花算法)server_name 主机名称server_token 主机tokensys_base_info 服务器基础信息heart_beat_info 心跳状态信息server_type (1 windows 2 linux 3 mac)server_up_time 心跳上传时间create_time 创建时间仓库地址:https://gitee.com/wonder19991209/sys-monitor wireguard组网搭建windows远程桌面可用但是无法ssh https://blog.iletter.top/archives/471/ 2025-10-22T15:33:00+08:00 因为wireguard搭建的组网是public的。所以但是open ssh允许的是私有网络的。所以在此需要改一下网络类型。Set-NetConnectionProfile -InterfaceAlias "winServer2025" -NetworkCategory PrivatewinServer2025为我的配置文件名称,你可以根据你的去变更变更完毕之后通过 Get-NetConnectionProfile 进行查看。此时在进行ssh链接即可成功。其实还有一种方式就是直接关闭防火墙简单暴力。。。 开机显示windows无法完成安装,解决方法 https://blog.iletter.top/archives/470/ 2025-10-21T21:41:00+08:00 1.等待报错出现2.按住shift+F10 进入cmd界面3.输入regedit编辑注册表4.找到路径 计算机\HKEY_LOCAL_MACHINE\SYSTEM\Setup5.编辑内部数据OOBEInProgress 设置为 0CmdLine 设置为空,即删除里面的数据SetupPhase 设置为 0SetupType 设置为 0SystemSetupInProgress 设置为 06.再次打开 cmd 窗口 输入以下命令行net user administrator /active:yes然后重启系统即可正常进入系统。 再聚 · 共饮 https://blog.iletter.top/archives/469/ 2025-10-03T08:54:00+08:00 构建AI个人知识库的一些思考 https://blog.iletter.top/archives/468/ 2025-09-25T21:51:00+08:00 最近在使用obsidian+Copilot虽然使用确实不错,但是总感觉差点味道。今天试了试python搞得rag向量数据库+ai模型,跑起来还是不错,但感觉和obsidian+Copilot大差不差。但至于差在哪里,却一眼难尽。单篇文章分析,都是可以的。多文章分析就报废了。所以有个思路针对md文档必须有严格的限制,在此使用markdown文章的yaml标签案例。例如--- 标题: git拆分分支和合并分支 日期: 2025-09-24 作者: Del Levin 分类: - 技术笔记 - 其他 tags: - 技术笔记 - git - 运维 - windows --- 构建数据库->检索 结构化检索方式:指定统计方式,分析方式非结构化检索方式:ai分析检索方式:分类词:{classification[分类词1,分类词2]}标签 :{tags[标签1,标签2]}指定文章:{title[文章名称1,文章名称2]}提问方式为:1.根据{classification[分类词1,分类词2]}分类总结一下我这个人2.根据{tags[标签1,标签2]}标签总结一下我的技术栈3.{title[文章名称1,文章名称2]}总结一下这两篇文章4.{title[文章名称1]}总结一下这一篇文章理想很美好,现实很骨感,知识库的容量参考文件不支持那么多。要想真正实现,只能拿自己的笔记进行模型训练。可是模型数据基数不足,成为一个问题。我也不知道该怎么做了。。。。