wellnpm 2.0.9 → 2.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/aicond/R134a_pro.py +105 -0
- package/aicond/Refrigerant_Master.py +287 -0
- package/aicond/Refrigerant_Master_Car.py +184 -0
- package/aicond/ac_kereta.py +105 -0
- package/guard/README.md +9 -0
- package/guard/intai_ping.py +27 -0
- package/guard/inteligen_ancaman_siber.py +53 -0
- package/guard/inteligen_ancaman_siber1.py +89 -0
- package/guard/jaga_router.py +48 -0
- package/guard/laporan_keselamatan.txt +5 -0
- package/guard/log_multigas.txt +0 -0
- package/guard/log_router.txt +44 -0
- package/guard/pantau_log.py +98 -0
- package/guard/perangkap.py +54 -0
- package/guard/perangkap_keselamatan.log +0 -0
- package/guard/pertahan.py +47 -0
- package/guard/requirements.txt +2 -0
- package/guard/scan_apk.py +82 -0
- package/guard/senarai_url.txt +3 -0
- package/guard/server.py +67 -0
- package/guard/server1.py +74 -0
- package/guard/texlive.profile +29 -0
- package/loan/hutang.py +175 -0
- package/package.json +3 -3
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
|
|
4
|
+
# Pemalar Antoine R134a
|
|
5
|
+
A = 9.936
|
|
6
|
+
B = 2147.9
|
|
7
|
+
C_suhu = -30.85
|
|
8
|
+
|
|
9
|
+
# Kod Warna ANSI untuk Terminal Termux
|
|
10
|
+
HIJAU = "\033[92m"
|
|
11
|
+
MERAH = "\033[91m"
|
|
12
|
+
KUNING = "\033[93m"
|
|
13
|
+
BIRU = "\033[94m"
|
|
14
|
+
RESET = "\033[0m"
|
|
15
|
+
TEBAL = "\033[1m"
|
|
16
|
+
|
|
17
|
+
def kira_suhu_didih_r134a(tekanan_psi):
|
|
18
|
+
tekanan_mutlak_bar = (tekanan_psi + 14.7) / 14.5
|
|
19
|
+
suhu_kelvin = B / (A - math.log(tekanan_mutlak_bar)) - C_suhu
|
|
20
|
+
return suhu_kelvin - 273.15
|
|
21
|
+
|
|
22
|
+
def cari_tekanan_dari_suhu(suhu_celsius):
|
|
23
|
+
suhu_kelvin = suhu_celsius + 273.15
|
|
24
|
+
tekanan_bar_mutlak = math.exp(A - (B / (suhu_kelvin + C_suhu)))
|
|
25
|
+
tekanan_psi_tolok = (tekanan_bar_mutlak * 14.5) - 14.7
|
|
26
|
+
return tekanan_psi_tolok
|
|
27
|
+
|
|
28
|
+
def simpan_log(mesej):
|
|
29
|
+
# Menyimpan nota ke dalam fail log_ac.txt secara automatik
|
|
30
|
+
masa_sekarang = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
31
|
+
with open("log_ac.txt", "a") as f:
|
|
32
|
+
f.write(f"[{masa_sekarang}] {mesej}\n")
|
|
33
|
+
|
|
34
|
+
print(f"{TEBAL}{BIRU}======================================={RESET}")
|
|
35
|
+
print(f"{TEBAL} SISTEM ANALISIS R134a PRO + LOG {RESET}")
|
|
36
|
+
print(f"{TEBAL}{BIRU}======================================={RESET}")
|
|
37
|
+
print(" [1] Masukkan Tekanan (psi) -> Cari Suhu Didih & Diagnosis")
|
|
38
|
+
print(" [2] Masukkan Suhu (°C) -> Cari Tekanan (psi) yang Diperlukan")
|
|
39
|
+
print(f"{BIRU}======================================={RESET}")
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
pilihan = input("Pilih menu (1/2): ")
|
|
43
|
+
|
|
44
|
+
if pilihan == "1":
|
|
45
|
+
bacaan_low = float(input("\nMasukkan bacaan Low Pressure (psi): "))
|
|
46
|
+
bacaan_high = float(input("Masukkan bacaan High Pressure (psi): "))
|
|
47
|
+
|
|
48
|
+
suhu_low = kira_suhu_didih_r134a(bacaan_low)
|
|
49
|
+
suhu_high = kira_suhu_didih_r134a(bacaan_high)
|
|
50
|
+
|
|
51
|
+
print(f"\n{TEBAL}--- KEPUTUSAN ANALISIS ---{RESET}")
|
|
52
|
+
print(f"Tekanan Low {bacaan_low:.1f} psi -> Suhu Didih: {suhu_low:.2f}°C")
|
|
53
|
+
print(f"Tekanan High {bacaan_high:.1f} psi -> Suhu Kondensasi: {suhu_high:.2f}°C")
|
|
54
|
+
|
|
55
|
+
print(f"\n{TEBAL}--- STATUS & DIAGNOSIS SISTEM ---{RESET}")
|
|
56
|
+
|
|
57
|
+
txt_low = ""
|
|
58
|
+
txt_high = ""
|
|
59
|
+
|
|
60
|
+
if bacaan_low < 20:
|
|
61
|
+
txt_low = "AMARAN (LOW): Tekanan terlalu rendah! Evaporator boleh membeku/ais."
|
|
62
|
+
print(f"{MERAH}[-] {txt_low}{RESET}")
|
|
63
|
+
elif 20 <= bacaan_low <= 35:
|
|
64
|
+
txt_low = "STATUS (LOW): Normal & Ideal untuk penyejukan kabin."
|
|
65
|
+
print(f"{HIJAU}[+] {txt_low}{RESET}")
|
|
66
|
+
else:
|
|
67
|
+
txt_low = "AMARAN (LOW): Tekanan tinggi! Gas terlebih isi atau expansion valve rosak."
|
|
68
|
+
print(f"{KUNING}[-] {txt_low}{RESET}")
|
|
69
|
+
|
|
70
|
+
if bacaan_high < 130:
|
|
71
|
+
txt_high = "AMARAN (HIGH): Tekanan terlalu rendah! Kompresor lemah (low compression)."
|
|
72
|
+
print(f"{MERAH}[-] {txt_high}{RESET}")
|
|
73
|
+
elif 130 <= bacaan_high <= 210:
|
|
74
|
+
txt_high = "STATUS (HIGH): Normal & Ideal untuk cuaca Malaysia."
|
|
75
|
+
print(f"{HIJAU}[+] {txt_high}{RESET}")
|
|
76
|
+
else:
|
|
77
|
+
txt_high = "AMARAN (HIGH): Tekanan terlampau tinggi! Kipas kondenser rosak atau tersumbat."
|
|
78
|
+
print(f"{MERAH}[-] {txt_high}{RESET}")
|
|
79
|
+
|
|
80
|
+
# Simpan keputusan ke fail teks
|
|
81
|
+
log_teks = f"Ujian Tekanan: Low={bacaan_low}psi ({suhu_low:.1f}°C), High={bacaan_high}psi ({suhu_high:.1f}°C) | Diag: {txt_low} & {txt_high}"
|
|
82
|
+
simpan_log(log_teks)
|
|
83
|
+
print(f"\n{HIJAU}[i] Rekod analisis berjaya disimpan ke fail 'log_ac.txt'{RESET}")
|
|
84
|
+
|
|
85
|
+
elif pilihan == "2":
|
|
86
|
+
suhu_target = float(input("\nMasukkan Suhu Didih yang anda mahukan (°C): "))
|
|
87
|
+
tekanan_diperlukan = cari_tekanan_dari_suhu(suhu_target)
|
|
88
|
+
|
|
89
|
+
print(f"\n{TEBAL}--- KEPUTUSAN FORMULA TERBALIK ---{RESET}")
|
|
90
|
+
print(f"Suhu Didih Sasaran: {suhu_target:.1f}°C")
|
|
91
|
+
print(f"Tekanan Tolok Meter Diperlukan: {TEBAL}{KUNING}{tekanan_diperlukan:.1f} psi{RESET}")
|
|
92
|
+
|
|
93
|
+
if 0 <= suhu_target <= 4:
|
|
94
|
+
print(f"{HIJAU}\n[+] INFO: Ini adalah julat terbaik untuk sistem pendingin hawa kereta yang optimum!{RESET}")
|
|
95
|
+
elif suhu_target < 0:
|
|
96
|
+
print(f"{KUNING}\n[-] AMARAN: Suhu di bawah 0°C berisiko menyebabkan sistem membeku jika berjalan lama.{RESET}")
|
|
97
|
+
|
|
98
|
+
log_teks = f"Carian Suhu Target: {suhu_target}°C -> Perlu {tekanan_diperlukan:.1f} psi"
|
|
99
|
+
simpan_log(log_teks)
|
|
100
|
+
|
|
101
|
+
else:
|
|
102
|
+
print(f"{MERAH}[!] Pilihan tidak sah. Sila pilih 1 atau 2 sahaja.{RESET}")
|
|
103
|
+
|
|
104
|
+
except ValueError:
|
|
105
|
+
print(f"{MERAH}[!] Ralat: Sila masukkan angka nombor sahaja!{RESET}")
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import math
|
|
2
|
+
import sys
|
|
3
|
+
import os
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
|
|
6
|
+
# Pangkalan Data Pemalar Antoine (Output: Bar Absolute, Input: °C)
|
|
7
|
+
DATA_GAS = {
|
|
8
|
+
"1": {"nama": "R134a", "A": 9.936, "B": 2147.9, "C": 242.3},
|
|
9
|
+
"2": {"nama": "R32", "A": 10.271,"B": 2059.6, "C": 252.1},
|
|
10
|
+
"3": {"nama": "R410A", "A": 9.970, "B": 1993.4, "C": 242.7},
|
|
11
|
+
"4": {"nama": "R22", "A": 9.748, "B": 2017.2, "C": 247.8},
|
|
12
|
+
"5": {"nama": "R290", "A": 9.400, "B": 1990.7, "C": 253.9}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
# Pangkalan Data Spesifikasi Julat Optimum Mengikut Jenama
|
|
16
|
+
DATA_JENAMA = {
|
|
17
|
+
"1": {"nama": "DAIKIN", "sh_min": 3.0, "sh_max": 7.0, "sc_min": 4.0, "sc_max": 8.0},
|
|
18
|
+
"2": {"nama": "PANASONIC", "sh_min": 4.0, "sh_max": 8.0, "sc_min": 5.0, "sc_max": 9.0},
|
|
19
|
+
"3": {"nama": "YORK", "sh_min": 5.0, "sh_max": 10.0, "sc_min": 5.0, "sc_max": 10.0},
|
|
20
|
+
"4": {"nama": "STANDARD/CUSTOM", "sh_min": 3.0, "sh_max": 8.0, "sc_min": 4.0, "sc_max": 10.0}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
def kira_tekanan_antoine(pilihan_gas, suhu_c):
|
|
24
|
+
gas = DATA_GAS[pilihan_gas]
|
|
25
|
+
A, B, C = gas["A"], gas["B"], gas["C"]
|
|
26
|
+
ln_P = A - (B / (suhu_c + C))
|
|
27
|
+
P_bar_abs = math.exp(ln_P)
|
|
28
|
+
P_psi_abs = P_bar_abs * 14.5038
|
|
29
|
+
P_psi_gauge = P_psi_abs - 14.7
|
|
30
|
+
return P_psi_gauge
|
|
31
|
+
|
|
32
|
+
def kira_suhu_antoine(pilihan_gas, tekanan_psi_gauge):
|
|
33
|
+
gas = DATA_GAS[pilihan_gas]
|
|
34
|
+
A, B, C = gas["A"], gas["B"], gas["C"]
|
|
35
|
+
P_psi_abs = tekanan_psi_gauge + 14.7
|
|
36
|
+
if P_psi_abs <= 0:
|
|
37
|
+
return -273.15
|
|
38
|
+
P_bar_abs = P_psi_abs / 14.5038
|
|
39
|
+
ln_P = math.log(P_bar_abs)
|
|
40
|
+
suhu_c = (B / (A - ln_P)) - C
|
|
41
|
+
return suhu_c
|
|
42
|
+
|
|
43
|
+
def diagnosis_sistem(jenis, nilai, cfg):
|
|
44
|
+
sh_min, sh_max = cfg["sh_min"], cfg["sh_max"]
|
|
45
|
+
sc_min, sc_max = cfg["sc_min"], cfg["sc_max"]
|
|
46
|
+
|
|
47
|
+
if jenis == "Superheat":
|
|
48
|
+
if nilai < sh_min:
|
|
49
|
+
return f"AMARAN: Superheat terlalu rendah (<{sh_min}°C)! Risiko cecair masuk ke kompresor (Floodback)."
|
|
50
|
+
elif sh_min <= nilai <= sh_max:
|
|
51
|
+
return f"NORMAL: Tahap Superheat berada dalam julat optimum ({sh_min}°C - {sh_max}°C)."
|
|
52
|
+
else:
|
|
53
|
+
return f"AMARAN: Superheat terlalu tinggi (>{sh_max}°C)! Kurang gas penyejuk atau sekatan pada TXV."
|
|
54
|
+
elif jenis == "Subcooling":
|
|
55
|
+
if nilai < sc_min:
|
|
56
|
+
return f"AMARAN: Subcooling terlalu rendah (<{sc_min}°C)! Kurang cas gas atau kondenser kotor."
|
|
57
|
+
elif sc_min <= nilai <= sc_max:
|
|
58
|
+
return f"NORMAL: Tahap Subcooling berada dalam julat optimum ({sc_min}°C - {sc_max}°C)."
|
|
59
|
+
else:
|
|
60
|
+
return f"AMARAN: Subcooling terlalu tinggi (>{sc_max}°C)! Terlebih cas gas (Overcharged)."
|
|
61
|
+
return "Tiada diagnosis."
|
|
62
|
+
|
|
63
|
+
def simpan_log(mesej_log):
|
|
64
|
+
try:
|
|
65
|
+
with open("log_multigas.txt", "a", encoding="utf-8") as fail_log:
|
|
66
|
+
fail_log.write(mesej_log + "\n" + "-"*50 + "\n")
|
|
67
|
+
except Exception as e:
|
|
68
|
+
print(f"[-] Gagal menyimpan log: {e}")
|
|
69
|
+
|
|
70
|
+
def cari_log_plat():
|
|
71
|
+
if not os.path.exists("log_multigas.txt"):
|
|
72
|
+
print("[-] Tiada rekod fail log dijumpai.")
|
|
73
|
+
return
|
|
74
|
+
|
|
75
|
+
carian = input("Masukkan No. Plat / ID Pelanggan untuk dicari: ").strip().upper()
|
|
76
|
+
if not carian:
|
|
77
|
+
print("[-] Carian dibatalkan. Kata kunci kosong.")
|
|
78
|
+
return
|
|
79
|
+
|
|
80
|
+
print(f"\n--- HASIL CARIAN UNTUK: {carian} ---")
|
|
81
|
+
|
|
82
|
+
with open("log_multigas.txt", "r", encoding="utf-8") as fail:
|
|
83
|
+
kandungan = fail.read()
|
|
84
|
+
|
|
85
|
+
# Memisahkan log berdasarkan garisan pemisah standard cecair
|
|
86
|
+
blok_log = kandungan.split("-" * 50)
|
|
87
|
+
jumpai = False
|
|
88
|
+
|
|
89
|
+
for blok in blok_log:
|
|
90
|
+
if f"Unit/Plat : {carian}" in blok or f"Unit/Plat : {carian}" in blok:
|
|
91
|
+
print(blok.strip())
|
|
92
|
+
print("-" * 50)
|
|
93
|
+
jumpai = True
|
|
94
|
+
|
|
95
|
+
if not jumpai:
|
|
96
|
+
print(f"[-] Tiada sejarah rekod dijumpai untuk '{carian}'.")
|
|
97
|
+
|
|
98
|
+
def urus_log():
|
|
99
|
+
print("\n=======================================")
|
|
100
|
+
print(" MENU SEJARAH LOG")
|
|
101
|
+
print("=======================================")
|
|
102
|
+
print(" [1] Papar Semua Sejarah Log")
|
|
103
|
+
print(" [2] Cari Sejarah Mengikut No. Plat / ID")
|
|
104
|
+
print(" [3] Padam/Reset Semua Log")
|
|
105
|
+
print(" [4] Kembali ke Menu Utama")
|
|
106
|
+
print("=======================================")
|
|
107
|
+
pilihan = input("Pilih tindakan (1-4): ").strip()
|
|
108
|
+
|
|
109
|
+
if pilihan == "1":
|
|
110
|
+
if os.path.exists("log_multigas.txt"):
|
|
111
|
+
print("\n--- ISI KANDUNGAN LOG MULTIGAS ---")
|
|
112
|
+
with open("log_multigas.txt", "r", encoding="utf-8") as fail:
|
|
113
|
+
kandungan = fail.read()
|
|
114
|
+
print(kandungan if kandungan.strip() else "Fail log kosong.")
|
|
115
|
+
else:
|
|
116
|
+
print("[-] Tiada rekod fail log dijumpai.")
|
|
117
|
+
elif pilihan == "2":
|
|
118
|
+
cari_log_plat()
|
|
119
|
+
elif pilihan == "3":
|
|
120
|
+
sahkan = input("Adakah anda pasti mahu memadam semua rekod log? (ya/tidak): ").strip().lower()
|
|
121
|
+
if sahkan == "ya":
|
|
122
|
+
try:
|
|
123
|
+
open("log_multigas.txt", "w", encoding="utf-8").close()
|
|
124
|
+
print("[+] Semua rekod log telah dipadamkan.")
|
|
125
|
+
except Exception as e:
|
|
126
|
+
print(f"[-] Gagal memadam log: {e}")
|
|
127
|
+
else:
|
|
128
|
+
print("[-] Operasi pemadaman dibatalkan.")
|
|
129
|
+
elif pilihan == "4":
|
|
130
|
+
return
|
|
131
|
+
else:
|
|
132
|
+
print("[-] Pilihan tidak sah.")
|
|
133
|
+
|
|
134
|
+
def main():
|
|
135
|
+
print("=======================================")
|
|
136
|
+
print(" MULTIGAS REFRIGERANT CALCULATOR")
|
|
137
|
+
print("=======================================")
|
|
138
|
+
print("Sila pilih menu utama:")
|
|
139
|
+
print(" [1] Pengiraan Gas Penyejuk & Diagnosis")
|
|
140
|
+
print(" [2] Urus Sejarah Log (log_multigas.txt)")
|
|
141
|
+
print(" [3] Keluar Program")
|
|
142
|
+
print("=======================================")
|
|
143
|
+
|
|
144
|
+
menu_utama = input("Pilih menu (1-3): ").strip()
|
|
145
|
+
|
|
146
|
+
if menu_utama == "2":
|
|
147
|
+
urus_log()
|
|
148
|
+
return
|
|
149
|
+
elif menu_utama == "3":
|
|
150
|
+
print("[+] Terima kasih kerana menggunakan kalkulator ini.")
|
|
151
|
+
sys.exit()
|
|
152
|
+
elif menu_utama != "1":
|
|
153
|
+
print("[-] Pilihan tidak sah!")
|
|
154
|
+
return
|
|
155
|
+
|
|
156
|
+
print("\n=======================================")
|
|
157
|
+
print(" PILIHAN GAS PENYEJUK")
|
|
158
|
+
print("=======================================")
|
|
159
|
+
print(" [1] Gas R134a\n [2] Gas R32\n [3] Gas R410A\n [4] Gas R22\n [5] Gas R290")
|
|
160
|
+
print("=======================================")
|
|
161
|
+
|
|
162
|
+
pilihan_gas = input("Pilih nombor gas (1-5): ").strip()
|
|
163
|
+
if pilihan_gas not in DATA_GAS:
|
|
164
|
+
print("[-] Pilihan gas tidak sah!")
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
gas_aktif = DATA_GAS[pilihan_gas]["nama"]
|
|
168
|
+
print(f"\n[+] Gas Aktif: {gas_aktif}")
|
|
169
|
+
|
|
170
|
+
print("\nSila pilih jenama sistem / aircond:")
|
|
171
|
+
print(" [1] DAIKIN\n [2] PANASONIC\n [3] YORK\n [4] STANDARD / CUSTOM")
|
|
172
|
+
pilihan_jenama = input("Pilih nombor jenama (1-4): ").strip()
|
|
173
|
+
|
|
174
|
+
if pilihan_jenama not in DATA_JENAMA:
|
|
175
|
+
pilihan_jenama = "4"
|
|
176
|
+
|
|
177
|
+
cfg_jenama = DATA_JENAMA[pilihan_jenama]
|
|
178
|
+
nama_jenama = cfg_jenama["nama"]
|
|
179
|
+
print(f"[+] Jenama Dipilih: {nama_jenama}")
|
|
180
|
+
|
|
181
|
+
id_pelanggan = input("\nMasukkan ID Pelanggan / No. Plat Kenderaan: ").strip().upper()
|
|
182
|
+
if not id_pelanggan:
|
|
183
|
+
id_pelanggan = "TIADA MAKLUMAT"
|
|
184
|
+
|
|
185
|
+
print("\nMenu Operasi Pengiraan:")
|
|
186
|
+
print(" [1] Analisis Tekanan (psi) -> Cari Suhu Tepu")
|
|
187
|
+
print(" [2] Input Suhu Sasaran (°C) -> Cari Tekanan (psi)")
|
|
188
|
+
print(" [3] Analisis Superheat & Diagnosis (Guna Tekanan Suction)")
|
|
189
|
+
print(" [4] Analisis Subcooling & Diagnosis (Guna Tekanan Liquid)")
|
|
190
|
+
|
|
191
|
+
pilihan_operasi = input("Pilih operasi (1-4): ").strip()
|
|
192
|
+
masa_sekarang = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
193
|
+
|
|
194
|
+
if pilihan_operasi == "1":
|
|
195
|
+
try:
|
|
196
|
+
tekanan_input = float(input(f"Masukkan Tekanan {gas_aktif} semasa (psi): "))
|
|
197
|
+
suhu_hasil = kira_suhu_antoine(pilihan_gas, tekanan_input)
|
|
198
|
+
|
|
199
|
+
print("\n--- KEPUTUSAN FORMULA ---")
|
|
200
|
+
print(f"Pelanggan/Unit: {id_pelanggan}")
|
|
201
|
+
print(f"Jenama Sistem : {nama_jenama}")
|
|
202
|
+
print(f"Gas Penyejuk : {gas_aktif}")
|
|
203
|
+
print(f"Tekanan Meter : {tekanan_input:.1f} psi")
|
|
204
|
+
print(f"Suhu Tepu : {suhu_hasil:.1f}°C")
|
|
205
|
+
|
|
206
|
+
log_data = (f"Tarikh/Masa : {masa_sekarang}\n"
|
|
207
|
+
f"Unit/Plat : {id_pelanggan}\n"
|
|
208
|
+
f"Jenama : {nama_jenama}\n"
|
|
209
|
+
f"Gas Penyejuk: {gas_aktif}\n"
|
|
210
|
+
f"Operasi : Analisis Tekanan -> Cari Suhu\n"
|
|
211
|
+
f"Input : {tekanan_input:.1f} psi\n"
|
|
212
|
+
f"Output : Suhu Tepu {suhu_hasil:.1f}°C")
|
|
213
|
+
simpan_log(log_data)
|
|
214
|
+
print("[+] Keputusan telah disimpan ke log_multigas.txt")
|
|
215
|
+
except ValueError:
|
|
216
|
+
print("[-] Input tekanan tidak sah.")
|
|
217
|
+
|
|
218
|
+
elif pilihan_operasi == "2":
|
|
219
|
+
try:
|
|
220
|
+
suhu_input = float(input(f"Masukkan Suhu Didih {gas_aktif} yang dimahukan (°C): "))
|
|
221
|
+
tekanan_hasil = kira_tekanan_antoine(pilihan_gas, suhu_input)
|
|
222
|
+
|
|
223
|
+
print("\n--- KEPUTUSAN FORMULA ---")
|
|
224
|
+
print(f"Pelanggan/Unit: {id_pelanggan}")
|
|
225
|
+
print(f"Jenama Sistem : {nama_jenama}")
|
|
226
|
+
print(f"Gas Penyejuk : {gas_aktif}")
|
|
227
|
+
print(f"Suhu Sasaran : {suhu_input:.1f}°C")
|
|
228
|
+
print(f"Tekanan Meter : {tekanan_hasil:.1f} psi")
|
|
229
|
+
|
|
230
|
+
log_data = (f"Tarikh/Masa : {masa_sekarang}\n"
|
|
231
|
+
f"Unit/Plat : {id_pelanggan}\n"
|
|
232
|
+
f"Jenama : {nama_jenama}\n"
|
|
233
|
+
f"Gas Penyejuk: {gas_aktif}\n"
|
|
234
|
+
f"Operasi : Input Suhu -> Cari Tekanan\n"
|
|
235
|
+
f"Input : {suhu_input:.1f}°C\n"
|
|
236
|
+
f"Output : Tekanan {tekanan_hasil:.1f} psi")
|
|
237
|
+
simpan_log(log_data)
|
|
238
|
+
print("[+] Keputusan telah disimpan ke log_multigas.txt")
|
|
239
|
+
except ValueError:
|
|
240
|
+
print("[-] Input suhu tidak sah.")
|
|
241
|
+
|
|
242
|
+
elif pilihan_operasi in ["3", "4"]:
|
|
243
|
+
jenis_analisis = "Superheat" if pilihan_operasi == "3" else "Subcooling"
|
|
244
|
+
nama_paip = "Suction/Gas" if jenis_analisis == "Superheat" else "Liquid/Cecair"
|
|
245
|
+
|
|
246
|
+
try:
|
|
247
|
+
tekanan_input = float(input(f"Masukkan Tekanan pada Paip {nama_paip} (psi): "))
|
|
248
|
+
suhu_paip_sebenar = float(input(f"Masukkan Suhu Sebenar Permukaan Paip {nama_paip} (°C): "))
|
|
249
|
+
|
|
250
|
+
suhu_tepu = kira_suhu_antoine(pilihan_gas, tekanan_input)
|
|
251
|
+
|
|
252
|
+
if jenis_analisis == "Superheat":
|
|
253
|
+
nilai_hasil = suhu_paip_sebenar - suhu_tepu
|
|
254
|
+
formula_teks = f"{suhu_paip_sebenar:.1f}°C (Suhu Paip) - {suhu_tepu:.1f}°C (Suhu Tepu)"
|
|
255
|
+
else:
|
|
256
|
+
nilai_hasil = suhu_tepu - suhu_paip_sebenar
|
|
257
|
+
formula_teks = f"{suhu_tepu:.1f}°C (Suhu Tepu) - {suhu_paip_sebenar:.1f}°C (Suhu Paip)"
|
|
258
|
+
|
|
259
|
+
status_diag = diagnosis_sistem(jenis_analisis, nilai_hasil, cfg_jenama)
|
|
260
|
+
|
|
261
|
+
print(f"\n--- KEPUTUSAN FORMULA {jenis_analisis.upper()} ({nama_jenama}) ---")
|
|
262
|
+
print(f"Pelanggan/Unit : {id_pelanggan}")
|
|
263
|
+
print(f"Gas Penyejuk : {gas_aktif}")
|
|
264
|
+
print(f"Suhu Tepu (Sat): {suhu_tepu:.1f}°C")
|
|
265
|
+
print(f"Nilai {jenis_analisis} : {nilai_hasil:.1f}°C ({formula_teks})")
|
|
266
|
+
print(f"Status Sistem : {status_diag}")
|
|
267
|
+
|
|
268
|
+
log_data = (f"Tarikh/Masa : {masa_sekarang}\n"
|
|
269
|
+
f"Unit/Plat : {id_pelanggan}\n"
|
|
270
|
+
f"Jenama : {nama_jenama}\n"
|
|
271
|
+
f"Gas Penyejuk: {gas_aktif}\n"
|
|
272
|
+
f"Operasi : Analisis {jenis_analisis}\n"
|
|
273
|
+
f"Input : Tekanan={tekanan_input:.1f} psi, Suhu Paip={suhu_paip_sebenar:.1f}°C\n"
|
|
274
|
+
f"Output : {jenis_analisis}={nilai_hasil:.1f}°C\n"
|
|
275
|
+
f"Diagnosis : {status_diag}")
|
|
276
|
+
simpan_log(log_data)
|
|
277
|
+
print("[+] Keputusan diagnosis telah disimpan ke log_multigas.txt")
|
|
278
|
+
|
|
279
|
+
except ValueError:
|
|
280
|
+
print("[-] Input data teknikal tidak sah.")
|
|
281
|
+
else:
|
|
282
|
+
print("[-] Pilihan operasi tidak sah!")
|
|
283
|
+
|
|
284
|
+
if __name__ == "__main__":
|
|
285
|
+
while True:
|
|
286
|
+
main()
|
|
287
|
+
print("\n" + "="*50 + "\n")
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import math
|
|
2
|
+
import sys
|
|
3
|
+
import os
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
|
|
6
|
+
# Pangkalan Data Pemalar Antoine (Output: Bar Absolute, Input: °C)
|
|
7
|
+
DATA_GAS = {
|
|
8
|
+
"1": {"nama": "R134a", "A": 9.936, "B": 2147.9, "C": 242.3},
|
|
9
|
+
"2": {"nama": "R32", "A": 10.271,"B": 2059.6, "C": 252.1},
|
|
10
|
+
"3": {"nama": "R410A", "A": 9.970, "B": 1993.4, "C": 242.7},
|
|
11
|
+
"4": {"nama": "R22", "A": 9.748, "B": 2017.2, "C": 247.8},
|
|
12
|
+
"5": {"nama": "R290", "A": 9.400, "B": 1990.7, "C": 253.9}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
# Data Spesifikasi & Anggaran Harga Standard Bengkel Malaysia (RM)
|
|
16
|
+
DATA_JENAMA_KERETA = {
|
|
17
|
+
"1": {"nama": "PERODUA (Myvi, Alza, Bezza, Axia)", "sh_min": 3.0, "sh_max": 6.5, "sc_min": 5.0, "sc_max": 11.0, "harga_topup": 40.0, "harga_full": 80.0},
|
|
18
|
+
"2": {"nama": "PROTON (Saga, Persona, X50, X70)", "sh_min": 3.5, "sh_max": 7.0, "sc_min": 6.0, "sc_max": 12.0, "harga_topup": 50.0, "harga_full": 90.0},
|
|
19
|
+
"3": {"nama": "HONDA (City, Civic, HR-V)", "sh_min": 3.0, "sh_max": 6.0, "sc_min": 5.0, "sc_max": 10.0, "harga_topup": 60.0, "harga_full": 120.0},
|
|
20
|
+
"4": {"nama": "TOYOTA (Vios, Yaris, Hilux)", "sh_min": 3.0, "sh_max": 6.5, "sc_min": 5.0, "sc_max": 11.0, "harga_topup": 60.0, "harga_full": 120.0},
|
|
21
|
+
"5": {"nama": "STANDARD / JENAMA LAIN", "sh_min": 3.0, "sh_max": 8.0, "sc_min": 4.0, "sc_max": 12.0, "harga_topup": 50.0, "harga_full": 100.0}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
def kira_tekanan_antoine(pilihan_gas, suhu_c):
|
|
25
|
+
gas = DATA_GAS[pilihan_gas]
|
|
26
|
+
A, B, C = gas["A"], gas["B"], gas["C"]
|
|
27
|
+
ln_P = A - (B / (suhu_c + C))
|
|
28
|
+
P_bar_abs = math.exp(ln_P)
|
|
29
|
+
P_psi_abs = P_bar_abs * 14.5038
|
|
30
|
+
P_psi_gauge = P_psi_abs - 14.7
|
|
31
|
+
return P_psi_gauge
|
|
32
|
+
|
|
33
|
+
def kira_suhu_antoine(pilihan_gas, tekanan_psi_gauge):
|
|
34
|
+
gas = DATA_GAS[pilihan_gas]
|
|
35
|
+
A, B, C = gas["A"], gas["B"], gas["C"]
|
|
36
|
+
P_psi_abs = tekanan_psi_gauge + 14.7
|
|
37
|
+
if P_psi_abs <= 0:
|
|
38
|
+
return -273.15
|
|
39
|
+
P_bar_abs = P_psi_abs / 14.5038
|
|
40
|
+
ln_P = math.log(P_bar_abs)
|
|
41
|
+
suhu_c = (B / (A - ln_P)) - C
|
|
42
|
+
return suhu_c
|
|
43
|
+
|
|
44
|
+
def diagnosis_sistem(jenis, nilai, cfg):
|
|
45
|
+
sh_min, sh_max = cfg["sh_min"], cfg["sh_max"]
|
|
46
|
+
sc_min, sc_max = cfg["sc_min"], cfg["sc_max"]
|
|
47
|
+
|
|
48
|
+
if jenis == "Superheat":
|
|
49
|
+
if nilai < sh_min:
|
|
50
|
+
return "AMARAN: Superheat rendah! Risiko cecair merosakkan kompresor.", cfg["harga_full"], "Perlu Flus & Isi Semula"
|
|
51
|
+
elif sh_min <= nilai <= sh_max:
|
|
52
|
+
return "NORMAL: Sistem dalam keadaan optimum dan sejuk.", 0.0, "Tiada (Sistem OK)"
|
|
53
|
+
else:
|
|
54
|
+
return "AMARAN: Superheat tinggi! Kurang gas atau TXV rosak.", cfg["harga_topup"], "Saran Topup Gas / Servis TXV"
|
|
55
|
+
elif jenis == "Subcooling":
|
|
56
|
+
if nilai < sc_min:
|
|
57
|
+
return "AMARAN: Subcooling rendah! Kurang gas atau kipas lemah.", cfg["harga_topup"], "Saran Topup Gas"
|
|
58
|
+
elif sc_min <= nilai <= sc_max:
|
|
59
|
+
return "NORMAL: Kondenser berfungsi dengan baik.", 0.0, "Tiada (Sistem OK)"
|
|
60
|
+
else:
|
|
61
|
+
return "AMARAN: Subcooling tinggi! Terlebih isi gas.", 40.0, "Perlu Buang/Sebut Suai Gas"
|
|
62
|
+
return "Tiada diagnosis.", 0.0, "Tiada"
|
|
63
|
+
|
|
64
|
+
def simpan_log(mesej_log):
|
|
65
|
+
try:
|
|
66
|
+
with open("log_multigas.txt", "a", encoding="utf-8") as fail_log:
|
|
67
|
+
fail_log.write(mesej_log + "\n" + "-"*50 + "\n")
|
|
68
|
+
except Exception as e:
|
|
69
|
+
print(f"[-] Gagal menyimpan log: {e}")
|
|
70
|
+
|
|
71
|
+
def cari_log_plat():
|
|
72
|
+
if not os.path.exists("log_multigas.txt"):
|
|
73
|
+
print("[-] Tiada rekod fail log dijumpai.")
|
|
74
|
+
return
|
|
75
|
+
carian = input("Masukkan No. Plat Kenderaan untuk dicari: ").strip().upper()
|
|
76
|
+
if not carian:
|
|
77
|
+
return
|
|
78
|
+
print(f"\n--- REKOD SEJARAH SERVIS UNTUK KENDERAAN: {carian} ---")
|
|
79
|
+
with open("log_multigas.txt", "r", encoding="utf-8") as fail:
|
|
80
|
+
kandungan = fail.read()
|
|
81
|
+
blok_log = kandungan.split("-" * 50)
|
|
82
|
+
jumpai = False
|
|
83
|
+
for blok in blok_log:
|
|
84
|
+
if f"No. Plat : {carian}" in blok:
|
|
85
|
+
print(blok.strip())
|
|
86
|
+
print("-" * 50)
|
|
87
|
+
jumpai = True
|
|
88
|
+
if not jumpai:
|
|
89
|
+
print(f"[-] Tiada sejarah servis dijumpai untuk no. plat '{carian}'.")
|
|
90
|
+
|
|
91
|
+
def urus_log():
|
|
92
|
+
print("\n=======================================")
|
|
93
|
+
print(" MENU REKOD & SEJARAH SERVIS")
|
|
94
|
+
print("=======================================")
|
|
95
|
+
print(" [1] Papar Semua Log Servis\n [2] Cari Sejarah Servis (Ikut No. Plat)\n [3] Padam Semua Data Log\n [4] Kembali")
|
|
96
|
+
pilihan = input("Pilih tindakan (1-4): ").strip()
|
|
97
|
+
if pilihan == "1":
|
|
98
|
+
if os.path.exists("log_multigas.txt"):
|
|
99
|
+
with open("log_multigas.txt", "r", encoding="utf-8") as fail:
|
|
100
|
+
print(fail.read())
|
|
101
|
+
else:
|
|
102
|
+
print("[-] Fail log kosong.")
|
|
103
|
+
elif pilihan == "2":
|
|
104
|
+
cari_log_plat()
|
|
105
|
+
elif pilihan == "3":
|
|
106
|
+
if input("Sahkan RESET semua data? (ya/tidak): ").strip().lower() == "ya":
|
|
107
|
+
open("log_multigas.txt", "w", encoding="utf-8").close()
|
|
108
|
+
print("[+] Log dibersihkan.")
|
|
109
|
+
|
|
110
|
+
def main():
|
|
111
|
+
print("=======================================")
|
|
112
|
+
print(" AUTOMOTIVE REFRIGERANT CALCULATOR")
|
|
113
|
+
print("=======================================")
|
|
114
|
+
print(" [1] Analisis Gas & Diagnosis Aircond Kereta\n [2] Semak Sejarah Servis Kereta\n [3] Keluar")
|
|
115
|
+
menu_utama = input("Pilih menu (1-3): ").strip()
|
|
116
|
+
|
|
117
|
+
if menu_utama == "2":
|
|
118
|
+
urus_log()
|
|
119
|
+
return
|
|
120
|
+
elif menu_utama == "3":
|
|
121
|
+
sys.exit()
|
|
122
|
+
elif menu_utama != "1":
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
print("\n=======================================")
|
|
126
|
+
print(" PILIHAN GAS PENYEJUK")
|
|
127
|
+
print("=======================================")
|
|
128
|
+
print(" [1] R134a (Kereta Standard/Lama)\n [2] R32\n [3] R410A\n [4] R22\n [5] R290")
|
|
129
|
+
pilihan_gas = input("Pilih nombor gas (1-5): ").strip()
|
|
130
|
+
if pilihan_gas not in DATA_GAS: return
|
|
131
|
+
gas_aktif = DATA_GAS[pilihan_gas]["nama"]
|
|
132
|
+
|
|
133
|
+
print("\nSila pilih jenama kenderaan:")
|
|
134
|
+
print(" [1] PERODUA\n [2] PROTON\n [3] HONDA\n [4] TOYOTA\n [5] LAIN-LAIN")
|
|
135
|
+
pilihan_jenama = input("Pilih nombor (1-5): ").strip()
|
|
136
|
+
cfg_jenama = DATA_JENAMA_KERETA.get(pilihan_jenama, DATA_JENAMA_KERETA["5"])
|
|
137
|
+
nama_jenama = cfg_jenama["nama"]
|
|
138
|
+
|
|
139
|
+
id_pelanggan = input("\nMasukkan No. Plat Kenderaan: ").strip().upper()
|
|
140
|
+
if not id_pelanggan: id_pelanggan = "TIADA NO PLAT"
|
|
141
|
+
|
|
142
|
+
print("\nMenu Operasi Pengiraan:")
|
|
143
|
+
print(" [1] Analisis Tekanan (psi) -> Cari Suhu Tepu Evaporator\n [2] Input Suhu Sasaran (°C) -> Cari Tekanan\n [3] Analisis Superheat & Diagnosis (Paip Kasar Low-Side)\n [4] Analisis Subcooling & Diagnosis (Paip Halus High-Side)")
|
|
144
|
+
pilihan_operasi = input("Pilih operasi (1-4): ").strip()
|
|
145
|
+
masa_sekarang = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
146
|
+
|
|
147
|
+
if pilihan_operasi in ["1", "2"]:
|
|
148
|
+
try:
|
|
149
|
+
if pilihan_operasi == "1":
|
|
150
|
+
tekanan_input = float(input(f"Masukkan Tekanan {gas_aktif} semasa (psi): "))
|
|
151
|
+
suhu_hasil = kira_suhu_antoine(pilihan_gas, tekanan_input)
|
|
152
|
+
print(f"\n[+] Suhu Tepu Gas: {suhu_hasil:.1f}°C")
|
|
153
|
+
else:
|
|
154
|
+
suhu_input = float(input(f"Masukkan Suhu Evaporator sasaran (°C): "))
|
|
155
|
+
tekanan_hasil = kira_tekanan_antoine(pilihan_gas, suhu_input)
|
|
156
|
+
print(f"\n[+] Tekanan Meter Diperlukan: {tekanan_hasil:.1f} psi")
|
|
157
|
+
except ValueError: print("[-] Input tidak sah.")
|
|
158
|
+
|
|
159
|
+
elif pilihan_operasi in ["3", "4"]:
|
|
160
|
+
jenis_analisis = "Superheat" if pilihan_operasi == "3" else "Subcooling"
|
|
161
|
+
nama_paip = "Kasar (Low-Side)" if jenis_analisis == "Superheat" else "Halus (High-Side)"
|
|
162
|
+
try:
|
|
163
|
+
tekanan_input = float(input(f"Masukkan Tekanan Paip {nama_paip} (psi): "))
|
|
164
|
+
suhu_paip_sebenar = float(input(f"Masukkan Suhu Permukaan Paip {nama_paip} (°C): "))
|
|
165
|
+
suhu_tepu = kira_suhu_antoine(pilihan_gas, tekanan_input)
|
|
166
|
+
|
|
167
|
+
nilai_hasil = (suhu_paip_sebenar - suhu_tepu) if jenis_analisis == "Superheat" else (suhu_tepu - suhu_paip_sebenar)
|
|
168
|
+
status_diag, anggaran_kos, saranan = diagnosis_sistem(jenis_analisis, nilai_hasil, cfg_jenama)
|
|
169
|
+
|
|
170
|
+
print(f"\n--- KEPUTUSAN DIAGNOSIS {jenis_analisis.upper()} ---")
|
|
171
|
+
print(f"No. Plat : {id_pelanggan}\nJenama Kereta : {nama_jenama}\nNilai {jenis_analisis} : {nilai_hasil:.1f}°C")
|
|
172
|
+
print(f"Status Sistem : {status_diag}\nSaranan Tindakan: {saranan}")
|
|
173
|
+
print(f"Anggaran Kos : RM {anggaran_kos:.2f} (Tertakluk pada keadaan komponen)")
|
|
174
|
+
|
|
175
|
+
log_data = (f"Tarikh/Masa : {masa_sekarang}\nNo. Plat : {id_pelanggan}\nJenama : {nama_jenama}\n"
|
|
176
|
+
f"Operasi : Analisis {jenis_analisis}\nNilai : {nilai_hasil:.1f}°C\n"
|
|
177
|
+
f"Diagnosis : {status_diag}\nAnggaran Kos: RM {anggaran_kos:.2f}")
|
|
178
|
+
simpan_log(log_data)
|
|
179
|
+
except ValueError: print("[-] Input teknikal tidak sah.")
|
|
180
|
+
|
|
181
|
+
if __name__ == "__main__":
|
|
182
|
+
while True:
|
|
183
|
+
main()
|
|
184
|
+
print("\n" + "="*50 + "\n")
|