import logging, sys, asyncio, random, json from pathlib import Path # ============================================================ # LOGGER SETUP # ============================================================ logger = logging.getLogger("ai_engine_dummy") logger.setLevel(logging.INFO) # Handler untuk tampil di console handler = logging.StreamHandler(sys.stdout) formatter = logging.Formatter("[%(asctime)s] %(levelname)s → %(message)s", "%H:%M:%S") handler.setFormatter(formatter) logger.addHandler(handler) # ============================================================ # HELPER FUNCTION (opsional untuk simulasi delay) # ============================================================ async def async_sleep_random(min_s=0.2, max_s=0.8): """ Helper untuk simulasi waktu inferensi secara acak. """ durasi = random.uniform(min_s, max_s) await asyncio.sleep(durasi) # ============================================================ # HELPER # ============================================================ def _metadata(): """ load file metadata.json into json data """ path = Path("metadata/product.json") if not path.exists(): return {"status": "error", "message": "metadata.json not found"} with open(path, "r") as f: data = json.load(f) return data def _color_map(): path = Path("metadata/defect.json") if not path.exists(): return [] with open(path, "r") as f: return json.load(f) def model_by_id_metadata(part_id): """ part_id = "4" # id part / product get model_path from metadata by part_id """ metadata = _metadata() id_part = part_id item = next((x for x in metadata if x["id"] == id_part), None) model_path = item['model_path'] return model_path def model_by_pin_metadata(pin_api): """ pin_api = "JI4ACL-GCSBYHBK03" # PIN API from part / product get model_path from metadata by pin_api """ metadata = _metadata() pin_api = pin_api item = next((x for x in metadata if x["pin_api"] == pin_api), None) model_path = item['model_path'] return model_path def color_defect(defect_name): """ Return BGR tuple color for OpenCV bounding box. """ defect_name = defect_name.lower() data = _color_map() item = next((x for x in data if x["class"].lower() == defect_name), None) if item is None: return (0, 255, 0) # Default GREEN jika tidak ditemukan hex_color = item["color"].lstrip('#') r = int(hex_color[0:2], 16) g = int(hex_color[2:4], 16) b = int(hex_color[4:6], 16) return (b, g, r) # Convert to BGR