github 3dg1luk43/ha_creality_ws v0.9.9

5 hours ago

0.9.9 - 2026-10-08

List of issues (0.9.9)

TL;DR

  • Check automations that compare raw states: Active Filament Slot and Current Object now report box_1_slot_2, external and not_printing (details under Changed).
  • Print Tuning is now Speed Factor and sets the speed only; flow has its own Flow Factor. Before, 150% speed also meant 150% extrusion.
  • K1-family printers lose the Chamber Target number: none of them has a chamber heater, so it never did anything.
  • A K2 that self-tests at the start of a print is no longer announced as stopped at 0%, and a cancelled print reads "Processing" until the printer has actually stopped.
  • iPhones get the live print card in a form the iOS app can read, every print's card starts fresh, and Stop on iOS asks for confirmation.
  • K1C and K1 Max on firmware 1.3.5.22 get their camera back: it moved to WebRTC, and the integration now notices. A K1C 2025 camera that connects without a picture switches itself to direct WebRTC.
  • With a power switch, the printer reconnects within seconds of power-on, and a command sent while it is unreachable reconnects at once instead of waiting for the next retry.
  • Sensors no longer stay "unavailable" after a printer boots and sends blank values.
  • A printer that gets a new IP address keeps its entities and their history, and a discovered printer is offered for confirmation instead of being added silently.
  • The printer card works with any name, stops rebuilding itself on narrow screens, redraws only when its printer changes, and can hide any of its buttons.
  • Diagnostics: Download diagnostics works, and the diagnostic action returns what it collects, for administrators, with addresses, names and tokens hidden.

Fixes

  • A self-test at the start of a K2 print was announced as "stopped at 0%" (#124): the printer reports one printing frame, then self-tests for minutes. The stop detector only counted printing and paused as a running job, so after 15 seconds it called the self-test a cancelled print and replaced the live card with that notification. A self-test is now part of the job; a print cancelled during one is still announced once the self-test ends. Thanks to @sammyke007 for the diagnosis and the tested patch.
  • The iOS live print card was sent in a form the iPhone discards (#125): every companion app got the payload in the all-strings form Android requires. The iOS app reads the card's timer flag as a true/false value and its end time as a number, so the strings made it discard every update without a trace. Refreshes also buzzed the phone instead of arriving silently, and Stop lost its confirmation. iPhones and iPads now get real values; Android is unchanged. Thanks to @jrspowers for the report and the side-by-side payload comparison.
  • A printer on a switched plug could take up to five minutes to come back (#45, #121): since 0.9.1 the switch was only checked on a manual Reconnect, the opposite of what was intended. Cutting the plug under a live connection went unnoticed, so switching it back on did not restart the connection, and the integration kept retrying a dark printer with a delay that grew to five minutes. The switch now decides power-on and power-off, the integration checks it every 10 seconds while it is off, and a connection that ran for a while starts its retry delay from the beginning. Thanks to @vumario and @chammp for the reports.
  • Sensors stayed "unavailable" after the printer was switched on (#121): a printer that is still booting sends some values blank. A blank is not a number, so Home Assistant refused the update and the sensor kept its "unavailable" state until the printer happened to send that value again. Blank and non-numeric values now show as "unknown" until a real number arrives. The progress sensor also showed the previous print's percentage at the start of a new one. Thanks to @chammp for the log that showed the blank values.
  • Changing a printer's IP address doubled every entity (#39): entity and device ids include the address, so a new one, set on the Connection page or picked up by discovery, created a second device with _2 entities and left the originals unavailable along with their history and every automation that used them. The integration now moves the device and entities to the new address when it starts. Entities already doubled by an earlier version are left as they are, because merging them could rename entities you have since used elsewhere.
  • Discovered printers were added without asking: any network device with "k1", "k2" or "creality" in its name was set up silently, and a printer you had deleted came back the next time it announced itself. Discovered printers now appear under Discovered and are added only once you confirm. A printer that reappears at a new address is matched by its network name and moved instead of added twice.
  • No camera image on a K1C or K1 Max with firmware 1.3.5.22 (#46): that firmware replaced the printer's MJPEG camera server with WebRTC. The integration picked the camera type once, at first setup, and never checked again, and the Auto setting in the camera options chose MJPEG for every K1 without looking at what the printer reports. The type is now read from the printer each time the integration starts, and a running camera is rebuilt as soon as the printer shows it is the other kind. Auto is now saved as Auto, so later firmware changes are picked up too. If you chose Auto in the camera options before this release, choose it again: it was saved as MJPEG. Thanks to @BCschwifty for the report and the diagnostics.
  • A printer card named with characters outside Western European ones showed an error instead of the card: a name such as "Tiskárna č.1", or one with an en dash, Chinese or an emoji, made the card fail to load, and renaming a card to one in the editor was silently not saved.
  • On a narrow screen the printer card rebuilt itself every two seconds: when the temperature row wrapped onto a second line the card asked the dashboard for more room, the dashboard answered with a new copy of the card, and the copy asked again. It now remembers the size it measured.
  • The printer card redrew itself completely on every state change anywhere in Home Assistant, not only its printer's, which cost CPU on tablets and wall panels and dropped keyboard focus. It now updates only when something it shows changes.
  • The diagnostic action returned nothing, and the data it logged exposed the camera's access token: the README, the bug form and the issue bot all asked for the action's response, but it only wrote the data to the log, unredacted, including printer addresses, phone names and the camera's access token, and it ignored its include_sensitive_data option. It now returns the data as its response, hides those details unless that option is set, and the integration supports Home Assistant's own Download diagnostics with the same content. The action answers administrators only, since its response can include camera addresses and tokens.
  • A "0% Starting" live card and a print-started event appeared a while after a print finished: the printer keeps the finished file selected and later resets its progress to 0, which looked like the same file being printed again. Only a print that actually runs again counts as a new one now. The same mistake made some printers announce a cancelled print twice ("stopped at 40%", then "stopped at 0%").
  • An error the printer never clears was announced again at the start of every print (#125): a Creality Hi reporting the same error code for two days sent an error alert, with a camera snapshot, each time a print began, and a stuck "filament ran out" flag did the same. An error or runout that was already there when a print starts is no longer news; one that appears, or clears and comes back, during the print still is.
  • A finished print could leave no notification at all: when a print ends, the live card is dismissed and the "finished" notification takes its place under the same name. The two were sent at the same time, so a slow dismissal could arrive second and remove the notification it was meant to make room for. They are now sent one after the other, and a phone that refuses a notification is reported in one log line.
  • Printers with a large library of files kept dropping the connection: the list of files the printer sends when a print starts was cut off at 1 MB, about 1300 files, and the connection was closed and reopened instead, three times for every new print. Lists up to 16 MB are accepted now.
  • Reloading the integration cut off anyone watching a K2 or WebRTC camera (#88): go2rtc describes a stream that is being watched differently from one that is idle, the integration took that for a wrong setup, and deleted and recreated the stream under the viewers. A stream that is already serving the printer is now left alone.
  • A go2rtc server you run yourself on the default address was forgotten at every restart: on a Home Assistant install without its own go2rtc, a camera pointed at localhost:11984 lost that setting each time the integration started, and the camera failed with "go2rtc component not loaded". The setting is now kept.
  • The CFS card said "Saved" when the printer never received the change: if the printer could not be reached, the material change was dropped but the action still reported success, so the card showed "Saved". It now reports the failure, and the card says the save failed. With several printers selected, the reachable ones are still updated.
  • A printer with only the external spool holder showed its spool twice: without a CFS, the external spool got "Box 0 Slot 1" sensors as well as the "External" ones. New installs get the "External" sensors only; an existing install keeps the extra ones, so dashboards that use them are not broken.
  • A CFS unit that showed up later got no sensors until a restart: a second CFS chained on while Home Assistant was running, or a CFS that reported after the external spool holder at startup, was never given entities. A change in the set of boxes now triggers the same discovery a first report does.
  • Typing in the CFS card's editor lost the cursor after every character: each change rebuilt the editor, so a title had to be typed one letter at a time, and changing the display mode jumped back to the first tab. The editor is now built once and keeps its focus and tab.
  • In a sections dashboard the CFS card covered the card below it: the card asked for a fixed height and then drew past it, by about 170 pixels for one CFS on a phone. It now takes exactly the height it needs.
  • A renamed or deleted power switch kept the printer offline for good: the integration treated a power switch it could not find as "off" and never connected again, with nothing in the log at the normal level. A switch that is still missing two minutes after startup is now ignored, the printer connects, and a repair in Settings > Repairs names the switch so you can choose another one.
  • The live print card said "Finishing" and "0s" while the printer was still heating (#125): with no time estimate yet, the card fell back to "Finishing", and a card that appeared part-way through a print said "Starting". It now says Starting while the printer heats or self-tests, Finishing only when its time estimate has run out, and Printing otherwise, and leaves the time out until there is one.
  • The print preview arrived late, or not at all, when a print started: the preview picture only changed when something happened to ask for it, so dashboards kept showing the previous print's picture for up to five minutes, and the "started" notification often went out without one. A new print now replaces the picture straight away and its first notification carries it.
  • Upgrading from a version that installed the cards under /local/ left broken dashboard resources behind: the old entries were rewritten into addresses that do not exist, which every dashboard then failed to load. They are now removed; the correct entries were already added separately.
  • The CFS card's external spool read "Generic PLA PLA" (#115): the material type was added after a name that already included it. A colour sensor reporting "unknown" also turned a spool grey instead of using the colour the printer had stored for it.
  • Home Assistant started up to 15 seconds later for every printer that was switched off: setup waited for the printer's first message before carrying on, even though the entities do not need it. It no longer waits, so an offline printer sets up at once and shows as unavailable until it answers.
  • A command the printer did not receive showed "Unknown error", or nothing at all: changing a temperature, fan or light while the connection was dropping failed with "Unknown error" and a stack trace in the log, the home and stop buttons did nothing without a word, and a new temperature target showed as set although it never reached the printer. These now say the printer is not connected, and a target appears only once the printer was sent it.
  • The CFS material action's errors and the CFS and diagnostic notifications were always in English: they were written into the code instead of the translation files. They now follow Home Assistant's language, and a rejected value names the field in words, such as "The maximum temperature (200) must not be below the minimum temperature (240)".
  • The filament runout notification put an English word into other languages, and "finishing soon" could say "0 minutes": the runout text included the print's state as the internal word ("printing"), and the reminder dropped the seconds, so 40 seconds left read as 0 minutes. The state now comes from the translations, and the reminder rounds up and says "min".
  • The cards' names in the "add card" picker and the printer card's default title were always in English: they now follow your language. New printer cards are no longer created with the name "3D Printer" written into them, and existing cards still named that show the title in your language.
  • The integration's actions were missing while a printer failed to start, and the CFS refresh action took any input: the actions were registered by the first printer's setup, so an automation calling one failed with "action not found". They are now registered when the integration loads. The CFS refresh action also ignored a misspelt field and refreshed every printer; it now rejects it.
  • A wrong IP address on the Connection page was saved without a word: a typo left the printer unavailable, and the address of another printer in the integration moved this printer's device onto that one. A new address is now checked first, and the page says when nothing answers there or another printer already uses it.
  • Deleting the printer's device brought it straight back, without its customisations: it also forgot the printer's network address details used to follow it to a new IP. The current device can no longer be deleted (delete the integration entry to remove a printer); a leftover device from an old address still can.
  • Stop and power-off could do nothing in a kiosk or wall-panel browser: they asked for confirmation with the browser's own pop-up, which some of those browsers switch off and answer "no" to without showing it. They now ask through Home Assistant's dialog, which works everywhere, including the companion app.
  • The CFS material dialog could be covered by the card below it, and a saved colour preset could not be removed on an iPhone or iPad (it took a right-click). The dialog now always sits on top, and a preset is removed with a long press or the Delete key.
  • The printer card's custom button only ever switched fans and covers on, and enabled automations instead of running them. It now toggles fans and covers and runs an automation.
  • The cards asked the server for their translations over and over: in a language the cards have no translation for, every card on the page requested the missing file again, and each card type loaded the English text separately. A page now loads each file once, and an updated translation is picked up instead of a stale copy.
  • Card settings you never touched were frozen into your dashboard: the editors wrote every option, with its default value, into the card's configuration, so a better default in a later release never reached an existing card. They now store only what you changed. A new card added from the picker is set up for your first printer straight away.
  • Setting up the CFS card meant choosing up to 51 sensors one by one: its editor now has a printer picker and a "Fill all fields from the printer" button, which place every CFS unit, slot and the external spool by themselves. Fields you already chose are kept unless you press the button.
  • The cards were hard to use with a keyboard and hard to read on some themes: keyboard focus on the printer card's buttons was invisible, the switched-off light and power icons were black on dark grey in dark themes, and the CFS card's temperature was light orange on white in light themes. Focus now shows a ring, those colours follow the theme (until you pick your own), the editors' tabs can be reached with Tab, the CFS card's messages are read out by screen readers, its pulsing dot rests when the system asks for reduced motion, and the material dialog keeps keyboard focus inside it and hands it back when it closes.
  • "Update entity" on any of the printer's entities failed with an error: the integration had no refresh method, so homeassistant.update_entity, and cards or automations that call it, logged "Update method not implemented". It now returns the latest data the printer sent.
  • The K2 Base never showed its chamber target: on that model the target only comes from Moonraker, and the integration asked Moonraker for it in a form Moonraker reads as a request for an object called "objects", so nothing came back. The request now names the chamber fan the way Moonraker expects. Checked against Moonraker's source and a simulated K2 Base, not yet on the printer itself: K2 Base owners, please report whether the chamber target now shows.
  • A K2 could be missed as a K2 Base: the board code that identifies it often arrives a moment after the model name, and a first message without it settled the question for good, leaving the chamber target unread.
  • The device page kept showing the firmware a printer had when it was first added: the version was only re-read when the integration itself was updated. It now changes as soon as the printer reports a new one, without reconnecting.
  • Direct WebRTC sent the printer connection candidates it could not use: the candidates' tags were read under names Home Assistant does not use, so the filter meant to keep the video's never applied. The printer now gets the video connection's candidates. The connection is also closed properly when Home Assistant shuts down, instead of being retried until it stops.
  • An MJPEG camera view could hang for good, and a switched-off printer filled the log with camera warnings: the live view opened the printer's stream with no time limit, so a camera that stopped sending held the connection open indefinitely, and every dashboard refresh of a switched-off printer's camera tried to reach it and logged a warning. The live view now gives up after 10 seconds without a picture, still images ask the printer for one frame instead of opening the whole stream, and a printer that cannot answer shows its last picture without being asked.
  • A K2 Plus or K2 Pro could stay an on/off light after updating (#102): an install from before dimming existed learned that the light dims from its saved model only when a power switch said the printer was off. With no switch and the printer off, the light stayed on/off until Home Assistant started with the printer on. It now dims either way.
  • A command sent while the printer was unreachable waited for the next retry, which can be five minutes away: the integration counted a connection that was between attempts as connected. Stop, Pause and the other commands now try to reconnect at once and report an error if that fails.
  • "Connection failing repeatedly ... Attempting mDNS fallback" every five minutes while a printer stayed unreachable with its power switch on (#84). There was no mDNS fallback. The warning now says the integration is retrying, once per outage.
  • A K1C 2025 camera that connects but never shows a picture now switches itself to direct WebRTC (#46): its WebRTC answer names other payload types than the ones it sends, and go2rtc drops every packet while browsers accept them. In Auto mode, when go2rtc is connected to the printer and receives no video on two snapshot attempts in a row, the camera moves to WebRTC direct and stays there. Direct WebRTC plays in the browser but has no still images or recording. The K2 family is left on go2rtc, which works there. Not yet confirmed on a K1C 2025: reports on #46 are welcome.
  • The iOS live print card could stay missing for good after one was swiped away (#125): Home Assistant keeps a Live Activity token per notification tag and sends every push to it as an update while it lasts, so after a card was dismissed on the phone, the next print's card never started. A new print now clears the tag on iPhones first, so its card starts fresh. Not yet confirmed on a phone: #125 stays open until it is.
  • Print Status said "Idle" while a cancelled print was still stopping: a K1C reports state 7 while a cancel finishes the move under way, which took 45 s in a print cancelled while homing, and the integration read that as idle. It now shows "Processing" until the printer reports the stop. The stop notification is unchanged: one, when the printer reports it.

Added

  • Flow Factor, a number that sets the extrusion flow rate on its own (see Speed Factor under Changed).
  • Real-Time Speed sensor (mm/s), the toolhead's current speed as the printer reports it. Off by default, like the position sensors: it changes many times a second while printing.
  • Hide any button on the printer card: Hidden Buttons in the card editor (hidden_buttons in YAML) keeps Pause, Resume, Stop, Light, Power or the custom button off the card whatever the printer is doing (#37).

Changed

  • Print Tuning is now Speed Factor, and sets the print speed only. It used to set the flow rate to the same percentage, so 150% speed also extruded 150%. Flow has its own Flow Factor number now. The entity keeps its id; only its default name changes, so a renamed entity keeps your name.

  • The K1 family no longer gets a Chamber Target: a K1C reports a chamber target although no K1-family printer has a chamber heater, so the control did nothing. It is removed at the next start. The chamber temperature sensor stays.

  • No notification for a CFS change or refresh that worked: each save in the CFS card left two in the notification list, although the card shows its own result. Failures still notify, and the action still reports them to automations.

  • Two sensors' raw states changed so they can be translated. Home Assistant shows the same text as before, in your language now, but a template or automation that compares the raw state needs the new value:

    • Active Filament Slot: External is now external, and Box 1 Slot 2 is now box_1_slot_2.
    • Current Object: not printing is now not_printing.

    A CFS slot with no name or type now reads "Unknown" in your language, instead of the English word.

  • Print Status, Filament Status and Print Control list their possible states, so an automation's state trigger offers them in a drop-down instead of a text field.

  • Diagnostic entities are grouped as diagnostics: Print Control, the maximum temperatures and the Reconnect button now sit with the other diagnostic entities, out of the main controls.

  • The print head position sensors start disabled on new installs. They change many times a second while printing and fill the history database for anyone who never looks at them. Existing installs keep them as they are; enable them on the device page if you want them.

  • K2 and Ender 3 V3 KE devices show their model name. The device page said F012 for a K2 Pro, F008 for a K2 Plus; it now says K2 Pro or K2 Plus, with that code as the model ID. The Model sensor still reports the code, as before.

  • "Enable debug logging" now includes the WebSocket and go2rtc libraries, which is where a dropped connection or a camera stream failure shows its cause.

Internal

  • The printer simulator is rebuilt as tools/simulator/, with a control page at /ui/ on its control port (on the test box: http://127.0.0.1:8323/ui/). It now behaves like a real printer:

    • full frames on connect, then only the changes, with numbers sent as strings on the K1 family;
    • self-test at the start of a print, the real stop and finish sequences, pause, runout and errors;
    • power cuts and dropped connections;
    • CFS units that come and go;
    • an MJPEG camera on the real port, the print preview, and Moonraker for the K2 Base.

    The camera picture is a short loop stored with it, so nothing is encoded while it runs. It is what found the K2 Base chamber target never arriving.

  • Tests inside a real Home Assistant (tools/tests_ha, its own CI job). They cover setup, unload and reload, the config and options flows, a printer moving to a new address, and the power switch. Until now every test ran against a stub of Home Assistant.

  • Regression tests for eleven closed bugs that had none (#11, #28, #29, #31, #40, #53, #84, #99, #102, #103, #106), and a record of what eight real printers report about themselves, which the model detection and the simulator are checked against.

0.9.8 - 2026-09-26

List of issues (0.9.8)

Requires Home Assistant 2026.7.0. The live print card needs the companion
app's Live Activity support, added in that release. HACS will not offer this
version to older cores, and a manual install fails setup with an explicit
message. Stay on 0.9.7 if you cannot update.

Don't miss a new ha_creality_ws release

NewReleases is sending notifications on new releases.