#使用中のPCのシステムハードウェア関連情報の取得
#出典 https://chantastu.hatenablog.com/entry/2023/07/15/114657
#20240312 kabayonが上記出典から引用。出典元に感謝!

#■使用ライブラリの設定

import psutil
import datetime

#■CPU実装

# 物理コア数
n_core_ph = psutil.cpu_count(logical=False)
# 論理コア数(スレッド)
n_core_lg = psutil.cpu_count()
print("This PC has CPU with ",n_core_ph,"コア",n_core_lg,"スレッド")

#■CPU使用状況

#CPU使用率(intervalはCPU時間)
print("CPU使用率",psutil.cpu_percent(interval=1))

#個別CPUの使用率
print("個別CPUの使用率",psutil.cpu_percent(interval=1, percpu=True))

#CPU周波数(現在の周波数、最小周波数、最大周波数をMHzで表示)
print("CPU動作周波数/現在/min/max = ",psutil.cpu_freq())

#CPUの現在の周波数を取得
#print(psutil.cpu_freq().current)

#CPUの待ちタスク数
print("待ちタスク数",psutil.getloadavg())


#■メモリ情報

#システムメモリ使用統計値
print("システムメモリ使用統計値",psutil.virtual_memory())

#即使用可能メモリ
print("即使用可能メモリ",psutil.virtual_memory().available)

#total    物理メモリの合計
#available    システムがスワップすることなく、プロセスに即座に与えることができるメモリ
#percent    (total - available) / total * 100で計算された使用率
#used    使用されているメモリ
#free    全く利用されていない、すぐ利用できるメモリ
#active    現在使用中またはごく最近使用されたメモリ
#inactive    未使用としてマークされているメモリ
#buffers    ファイル システムのメタデータなどのキャッシュ
#cached    さまざまなもののためのキャッシュ
#shared    複数のプロセスが同時にアクセスできるメモリ
#lab    カーネル内のデータ構造キャッシュ

#スワップメモリ使用統計値
print("スワップメモリ使用統計値",psutil.swap_memory())

#total    バイト単位の合計スワップメモリ
#used    使用されたスワップメモリ (バイト単位)
#free    空きスワップメモリ​​ (バイト単位)
#percent    (total - available) / total * 100で計算された使用率
#sin    システムがディスクからスワップインしたバイト数 (累積)
#sout    システムがディスクからスワップアウトしたバイト数 (累積)

#■ディスク・パーティション情報

#マウント済パーティション
print("マウント済パーティション",psutil.disk_partitions())

#device    デバイスのパス
#mountpoint    マウント ポイントのパス
#free    空きスワップメモリ​​ (バイト単位)
#fstype    パーティションのファイルシステム
#opts    ドライブ/パーティションのさまざまなマウントオプションを示すカンマ区切りの文字列
#maxfile    ファイル名に指定できる最大長
#maxpath    パス名 (ディレクトリ名 + ベースファイル名) の最大長

#指定パスを含むパーティションディスク使用統計値
print("ディスク使用統計値",psutil.disk_usage('/'))

#ディスク使用率
disk = psutil.disk_usage('/')
print("ディスク使用率",disk.percent)

#システム全体ディスクI/O統計値
print("ディスクI/O統計値",psutil.disk_io_counters())

#read_count    読み取り数
#write_count    書き込み回数
#read_bytes    読み取られたバイト数
#write_bytes    書き込まれたバイト数
#read_time    ディスクからの読み取りに費やした時間 (ミリ秒単位)
#write_time    ディスクへの書き込みにかかった時間 (ミリ秒単位)
#read_merged_count    マージされた読み取りの数
#write_merged_count    マージされた書き込みの数
#busy_time    実際の I/O に費やした時間 (ミリ秒単位)

#全物理ディスクI/O統計値
print("全物理ディスクI/O統計値",psutil.disk_io_counters(perdisk=True))

#■ネットワーク関連情報

#システム全体ソケット接続情報
print("ソケット接続情報",psutil.net_connections())

#fd    ソケットファイル記述子
#family    アドレスファミリ、AF_INET、AF_INET6またはAF_UNIXのいずれか。
#type    アドレスのタイプ ( SOCK_STREAM、SOCK_DGRAM、または SOCK_SEQPACKET )。
#packets_recv    受信したパケット数
#laddr    ローカルアドレス(ip, port)
#raddr    リモートエンドポイントのアドレス(ip, port)
#status    TCP接続のステータス。UDPおよびUNIXソケットの場合、NONE
#pid    ソケットを開いたプロセスの PID

#システムインストールNICアドレス、キー
print("NICアドレス、キー",psutil.net_if_addrs())

#family    MACアドレスを参照するアドレスファミリ (AF_INET、AF_INET6、psutil.AF_LINK) 。
#address    NIC アドレス
#netmask    サブネットマスク
#broadcast    ブロードキャストアドレス
#ptp    ポイントツーポイントを表す。VPN上の宛先アドレス。


#システム全体ネットワークI/O統計値
print("ネットワークI/O統計値",psutil.net_io_counters())

#bytes_sent    送信されたバイト数
#bytes_recv    受信したバイト数
#packets_sent    送信されたパケットの数
#packets_recv    受信したパケット数
#errin    受信中のエラーの総数
#errout    送信中のエラーの総数
#dropin    ドロップされた受信パケットの総数
#dropout    ドロップされた送信パケットの総数


#■システム接続ユーザー情報

#システム接続ユーザー
print("接続ユーザー",psutil.users())

#name    ユーザーの名前
#terminal    ユーザーに関連付けられたttyまたは疑似tty
#host    エントリに関連付けられたホスト名
#starting    UNIXエポックからの経過ミリ秒数での作成時刻
#pid    ログインプロセスの PID

#■ハードウェア温度・ファン速度情報 not available on windows10

#ハードウェア温度(今回raspberry piで実施)
#print(psutil.sensors_temperatures())
# ファンの速度(RPM)
#print(psutil.sensors_fans())


#■システム起動日時

#システム起動日時
#print(psutil.boot_time()) # UNIX エポックからの経過ミリ秒数
print("システム起動日時",datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")) # 日時変換後