From 24ccf96f5cd671b6cc2ce42ad56ef93fe34ac35d Mon Sep 17 00:00:00 2001 From: Gangoke Date: Sun, 17 May 2026 18:56:35 -1000 Subject: [PATCH] current temp and humidity working --- kobrax_moonraker_bridge.py | 68 +++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/kobrax_moonraker_bridge.py b/kobrax_moonraker_bridge.py index 96bbac6..f21813b 100644 --- a/kobrax_moonraker_bridge.py +++ b/kobrax_moonraker_bridge.py @@ -447,7 +447,7 @@ class KobraXBridge: "connection_error": "", "file_ready": "", "filament_mode": "toolhead", - "ace_drying": {"status": 0, "target_temp": 0, "duration": 0, "remain_time": 0, "humidity": None}, + "ace_drying": {"status": 0, "target_temp": 0, "duration": 0, "remain_time": 0, "humidity": None, "current_temp": None}, } self._ams_slots: list[dict] = [] # flat global list; each entry has global_index + box_id self._ams_loaded_slot: int = -1 # global slot index of currently loaded slot @@ -788,8 +788,8 @@ class KobraXBridge: ace_ids = sorted({int(b.get("id", -1)) for b in boxes if int(b.get("id", -1)) >= 0}) self._ace_box_ids = [i for i in ace_ids if 0 <= i <= 3] - def _humidity_from(src: dict, default=None): - for k in ("humidity", "current_humidity", "cur_humidity", "relative_humidity", "humidity_value"): + def _num_from(src: dict, keys: tuple[str, ...], default=None): + for k in keys: v = src.get(k) if v is not None: try: @@ -798,20 +798,32 @@ class KobraXBridge: return default return default + def _humidity_from(src: dict, default=None): + return _num_from(src, ("humidity", "current_humidity", "cur_humidity", "relative_humidity", "humidity_value"), default) + + def _current_temp_from(src: dict, default=None): + return _num_from(src, ("current_temp", "cur_temp", "temperature", "temp", "drying_temp", "chamber_temp"), default) + per_unit: list[dict] = [] for box in boxes: bid = int(box.get("id", -1)) if bid < 0: continue + bs = box.get("drying_status") or box.get("drying_settings") - if isinstance(bs, dict): + bs = bs if isinstance(bs, dict) else {} + hu = _humidity_from(bs, _humidity_from(box)) + ct = _current_temp_from(bs, _current_temp_from(box)) + + if bs or hu is not None or ct is not None: per_unit.append({ "id": bid, "status": int(bs.get("status", 0)), "target_temp": int(bs.get("target_temp", 0)), "duration": int(bs.get("duration", 0)), "remain_time": int(bs.get("remain_time", 0)), - "humidity": _humidity_from(bs), + "humidity": hu, + "current_temp": ct, }) src = data.get("drying_status") or data.get("drying_settings") @@ -825,15 +837,18 @@ class KobraXBridge: break if isinstance(src, dict): - cur = self._state.get("ace_drying") or {} - self._state["ace_drying"] = { - "status": int(src.get("status", cur.get("status", 0))), - "target_temp": int(src.get("target_temp", cur.get("target_temp", 0))), - "duration": int(src.get("duration", cur.get("duration", 0))), - "remain_time": int(src.get("remain_time", cur.get("remain_time", 0))), - "humidity": _humidity_from(src, cur.get("humidity")), - "units": per_unit, - } + cur = self._state.get("ace_drying") or {} + active = [u for u in per_unit if u.get("status", 0)] + primary = active[0] if active else (per_unit[0] if per_unit else {}) + self._state["ace_drying"] = { + "status": int(src.get("status", cur.get("status", 0))), + "target_temp": int(src.get("target_temp", cur.get("target_temp", 0))), + "duration": int(src.get("duration", cur.get("duration", 0))), + "remain_time": int(src.get("remain_time", cur.get("remain_time", 0))), + "humidity": _humidity_from(src, primary.get("humidity", cur.get("humidity"))), + "current_temp": _current_temp_from(src, primary.get("current_temp", cur.get("current_temp"))), + "units": per_unit, + } elif per_unit: active = [u for u in per_unit if u.get("status", 0)] primary = active[0] if active else per_unit[0] @@ -843,6 +858,7 @@ class KobraXBridge: "duration": int(primary.get("duration", 0)), "remain_time": int(primary.get("remain_time", 0)), "humidity": primary.get("humidity"), + "current_temp": primary.get("current_temp"), "units": per_unit, } @@ -2326,6 +2342,10 @@ nav.bottom-nav{display:none;position:fixed;bottom:0;left:0;right:0; Humidity: - +
+ Current Temp: + - +
@@ -2437,7 +2457,7 @@ var S={nozzle_temp:0,nozzle_target:0,bed_temp:0,bed_target:0, print_state:'standby',filename:'',progress:0,print_duration:0,remain_time:0, curr_layer:0,total_layers:0,printer_name:'Kobra X',firmware_version:'–', camera_url:'',fan_speed:0,print_speed_mode:2,light_on:false,light_brightness:80, - ams_slots:[],filament_mode:'toolhead',ace_units:[],ace_drying:{status:0,target_temp:0,duration:0,remain_time:0,humidity:null,units:[]}}; + ams_slots:[],filament_mode:'toolhead',ace_units:[],ace_drying:{status:0,target_temp:0,duration:0,remain_time:0,humidity:null,current_temp:null,units:[]}}; var tempHistory={n:[],b:[]}; var camOn=false; var currentStep=1; @@ -2459,7 +2479,7 @@ var LANG_DE={ card_progress:'Fortschritt',card_temps:'Temperaturen',card_light_fan:'Lüfter',card_speed:'Druckgeschwindigkeit',card_cam:'Kamera',lbl_elapsed:'Verstrichen:',lbl_remaining:'Restzeit:',lbl_slicer_time:'Slicer-Schätzung:',lbl_layers:'Layer', speed_silent:'🐢 Leise',speed_normal:'⚡ Normal',speed_sport:'🚀 Sport', lbl_light:'💡 Licht',lbl_feed:'Einziehen',lbl_unload:'Ausziehen', - card_ace_dry:'ACE Trocknung',ace_dry_status_off:'Status: Aus',ace_dry_status_on:'Status: Aktiv',ace_dry_status_remaining:'Rest',ace_dry_humidity:'Luftfeuchte',ace_dry_temp:'Temperatur (°C)',ace_dry_duration:'Dauer (Min)',ace_dry_start:'▶ Start',ace_dry_stop:'■ Stop', + card_ace_dry:'ACE Trocknung',ace_dry_status_off:'Status: Aus',ace_dry_status_on:'Status: Aktiv',ace_dry_status_remaining:'Rest',ace_dry_humidity:'Luftfeuchte',ace_dry_current_temp:'Aktuelle Temperatur',ace_dry_temp:'Temperatur (°C)',ace_dry_duration:'Dauer (Min)',ace_dry_start:'▶ Start',ace_dry_stop:'■ Stop', cam_placeholder:'📷 Kamera nicht gestartet',btn_cam_start:'▶ Kamera',btn_cam_stop:'◼ Kamera', btn_pause:'⏸ Pause',btn_resume:'▶ Weiter',btn_cancel:'✕ Stopp', label_nozzle:'Nozzle',label_bed:'Bett',label_fan:'🌀 Lüfter',label_light:'💡 Licht',label_on_off:'Ein / Aus',label_speed:'Geschwindigkeit', @@ -2522,7 +2542,7 @@ var LANG_EN={ card_progress:'Progress',card_temps:'Temperatures',card_light_fan:'Fan',card_speed:'Print Speed',card_cam:'Camera',lbl_elapsed:'Elapsed:',lbl_remaining:'Remaining:',lbl_slicer_time:'Slicer estimate:',lbl_layers:'Layer', speed_silent:'🐢 Silent',speed_normal:'⚡ Normal',speed_sport:'🚀 Sport', lbl_light:'💡 Light',lbl_feed:'Load',lbl_unload:'Unload', - card_ace_dry:'ACE Drying',ace_dry_status_off:'Status: Off',ace_dry_status_on:'Status: Active',ace_dry_status_remaining:'Remaining',ace_dry_humidity:'Humidity',ace_dry_temp:'Temperature (°C)',ace_dry_duration:'Duration (min)',ace_dry_start:'▶ Start',ace_dry_stop:'■ Stop', + card_ace_dry:'ACE Drying',ace_dry_status_off:'Status: Off',ace_dry_status_on:'Status: Active',ace_dry_status_remaining:'Remaining',ace_dry_humidity:'Humidity',ace_dry_current_temp:'Current Temp',ace_dry_temp:'Temperature (°C)',ace_dry_duration:'Duration (min)',ace_dry_start:'▶ Start',ace_dry_stop:'■ Stop', cam_placeholder:'📷 Camera not started',btn_cam_start:'▶ Camera',btn_cam_stop:'◼ Camera', btn_pause:'⏸ Pause',btn_resume:'▶ Resume',btn_cancel:'✕ Stop', label_nozzle:'Nozzle',label_bed:'Bed',label_fan:'🌀 Fan',label_light:'💡 Light',label_on_off:'On / Off',label_speed:'Speed', @@ -2738,6 +2758,7 @@ function applyLang(){ setText('ace-dry-start',T.ace_dry_start); setText('ace-dry-stop',T.ace_dry_stop); setText('d-ace-dry-humidity-label',(T.ace_dry_humidity||'Humidity')+':'); + setText('d-ace-dry-current-temp-label',(T.ace_dry_current_temp||'Current Temp')+':'); var adTemp=document.getElementById('ace-dry-temp');if(adTemp)adTemp.setAttribute('placeholder',T.ace_dry_temp); var adDur=document.getElementById('ace-dry-duration');if(adDur)adDur.setAttribute('placeholder',T.ace_dry_duration); // conn-btn text (nur wenn nicht im Übergangszustand) @@ -2983,7 +3004,7 @@ function applyState(){ ||((s.ams_slots||[]).some(function(sl){return (sl.box_id||-1)>=0;})); var aceCard=document.getElementById('d-ace-dry-card'); if(aceCard)aceCard.style.display=acePresent?'':'none'; - var dry=s.ace_drying||{status:0,target_temp:0,duration:0,remain_time:0,humidity:null}; + var dry=s.ace_drying||{status:0,target_temp:0,duration:0,remain_time:0,humidity:null,current_temp:null}; var dryStatus=document.getElementById('d-ace-dry-status'); if(dryStatus){ if(dry.status){ @@ -2998,6 +3019,11 @@ function applyState(){ var hv=(dry.humidity===null||dry.humidity===undefined||dry.humidity==='')?null:Number(dry.humidity); dryHumidity.textContent=(hv===null||Number.isNaN(hv))?'-':(Math.round(hv)+'%'); } + var dryCurrentTemp=document.getElementById('d-ace-dry-current-temp'); + if(dryCurrentTemp){ + var ct=(dry.current_temp===null||dry.current_temp===undefined||dry.current_temp==='')?null:Number(dry.current_temp); + dryCurrentTemp.textContent=(ct===null||Number.isNaN(ct))?'-':(ct.toFixed(1)+'°C'); + } var dryTemp=document.getElementById('ace-dry-temp'); if(dryTemp&&dry.target_temp>0&&String(dryTemp.value||'')==='55')dryTemp.value=dry.target_temp; var dryDur=document.getElementById('ace-dry-duration'); @@ -4279,6 +4305,7 @@ function loadPrinterTab(){ target_temp = max(30, min(80, target_temp)) duration = max(10, min(24 * 60, duration)) humidity = (self._state.get("ace_drying") or {}).get("humidity") + current_temp = (self._state.get("ace_drying") or {}).get("current_temp") drying_status = { "status": 1, "target_temp": target_temp, @@ -4291,16 +4318,19 @@ function loadPrinterTab(){ "duration": duration, "remain_time": duration, "humidity": humidity, + "current_temp": current_temp, } else: drying_status = {"status": 0} humidity = (self._state.get("ace_drying") or {}).get("humidity") + current_temp = (self._state.get("ace_drying") or {}).get("current_temp") ui_state = { "status": 0, "target_temp": 0, "duration": 0, "remain_time": 0, "humidity": humidity, + "current_temp": current_temp, } payload = { @@ -4558,7 +4588,7 @@ function loadPrinterTab(){ "ams_slots": self._ams_slots, "ams_loaded_slot": self._ams_loaded_slot, "filament_mode": s.get("filament_mode", self._filament_mode), - "ace_drying": s.get("ace_drying", {"status": 0, "target_temp": 0, "duration": 0, "remain_time": 0, "humidity": None}), + "ace_drying": s.get("ace_drying", {"status": 0, "target_temp": 0, "duration": 0, "remain_time": 0, "humidity": None, "current_temp": None}), "ace_units": list(self._ace_box_ids), "thumbnail": self._thumbnail_b64, "connection_error": s["connection_error"],