Repository navigation
Replies: 5 comments 4 replies
|
hey @MaxRink , we're definitely interested. I have been thinking about how to integrate that for some time now, especially since there are reverse-engineered implementations popping up. I am not familiar with E64WS control method, can you explain a bit more? At the moment I know about a BLE controlled grinder and a Websocket controlled grinder. My initial idea was to use plugins to control grinders - and your idea about extending the Grinder data model could fit into that too perhaps. In the sense, that Grinder object gains the interface for controlling parameters as well as an optional Please check if #146 would help with this idea. There are other interesting things hanging on it too, so it would be nice to confirm we can solve a lot with one task. I'll also move this to discussions, where we'll be more free to discuss before formalizing a plan. |
|
Another potential pathway to the grinder control might be through the generic |
|
Following up with a more concrete assisted-dial-in shape, including how it overlaps the existing bean, grinder, workflow, and tasting discussions. This remains exploratory. Build on the existing modelsDecaid's grinder model already distinguishes numeric settings from named values and supports small/big setting and RPM increments (current model). The existing discussions remain the right homes for their underlying schemas:
Grinder comparison modelFor recommendations, the model additionally needs:
A raw setting must never be compared across different grinders or calibration epochs. Smart-grinder communication is a separate capability; issue #146 is already discussing permission-gated plugin transports and workflow-change events that could support it. Taste and outcome inputKeep the existing enjoyment score and free-form notes, while optionally adding a small structured vocabulary useful for suggestions. A first iteration could capture balance/direction and defects such as sour, bitter, astringent, weak, or harsh, plus optional flavor observations. The vocabulary should be tested with real users before promoting a large tasting schema into typed core fields. #66 already contains a much broader tasting-field proposal and should remain the schema discussion. Recommendation behaviorAssisted dial-in should be suggestion-only:
Comparable history should require, at minimum:
The first useful implementation can be deterministic rather than AI-based: find the last-known-good comparable shot, compare extraction outcome and taste feedback, then suggest one bounded change. Advice should avoid changing grind and machine recipe simultaneously unless the evidence can explain why. Roaster-provided settings or profiles can be a starting prior, but must be visibly attributed and treated as recommendations for the named hardware rather than universal truth. The separate interoperability discussion covers that source data: #721 Beanconqueror and roaster interoperability Questions
|
|
I'm very interested in this. Would be cool to be able to sync the DE1 and commercial GbS grinders in a cafe environment. |
|
Streamline.js: plugins can now add to the dashboard (relevant to question 5) Re the skin entry point question: the latest commits on Reference: docs/plugin-surfaces.md (kinds, limits, actions, tile modes and a worked example). What a plugin can add (Kinds):
Actions are Grinder example A grinder plugin such as the E64 driver, or the assisted dial-in plugin, could answer {
"version": 1,
"surfaces": [
{ "id": "gear", "kind": "tile-line", "tile": "grind",
"text": "E64 · 1200 rpm" },
{ "id": "last", "kind": "tile-hint", "tile": "grind",
"text": "Last 6.4", "title": "Last good shot of this coffee",
"action": { "type": "set", "field": "grinderSetting", "value": 6.4 } },
{ "id": "dialin", "kind": "header-button", "label": "Dial-in",
"action": { "type": "open", "view": "main", "presentation": "overlay" } }
]
}How that maps to this discussion:
The manifest needs |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
I have a Mahlkönig E64 WS at home and have been exploring how a connected grinder, a Decent and a scale can work together. I would like to keep the device integration, assisted dial-in and any future automatic adjustments as separate pieces, so the useful parts also work with manual grinders.
What is already delivered
Decaid now has the connected Grinder domain and generic driver runtime from #889 / #896, plus validated control metadata and plugin-owned surfaces from #949 / #962. A driver can maintain multiple independent instances, while the host selects one connected Grinder.
The external E64 plugin is implemented as a read-only
type: grinderdriver. It publishes generic state and exposes vendor diagnostics; it does not change settings or run the motor. Its hardware-free CI exercises actual host QuickJS/API behavior, two mock grinders, errors, lifecycle changes and credential redaction. Physical firmware compatibility remains a separate check. Platform-trusted WSS is supported; custom self-signed trust remains proposed in #758.Recommendation UX belongs in a skin or community application, following the maintainer direction on #866. I have implemented decaid-assisted-dialin-plugin, an independent application plugin using the existing shot APIs, events, plugin storage and HTTP endpoints. The first implementation and richer follow-up suggestions are tracked in its own repository; the first reference-shot/feedback/UI slice is implemented. The plugin owns its HTTP UI and does not register a fictitious device to obtain a settings row.
The first slice is published at
cbda7af9887f3b6980b8df9bc7562965c11f5941; all four CI jobs pass. This includes 29 behavioral and controlled HTML-script checks, actual Decaid package parsing, and a real QuickJS/API/storage fixture for useful recommendations, mark/unmark, concurrent writes and reload persistence. The current bean batch, persistent grinder identity and profile execution contents are required. Optional comparison fields missing on both sides are shown as warnings; current setup entries do not backfill historical shots. Changes to profile presentation metadata are ignored, while changed execution content prevents a match.The initial UI is opened through the plugin endpoint; native/browser rendering, custom API ports and physical firmware validation remain separate. Installation, bounded history refresh and safe error/recovery behavior are documented in the repository. It makes no grinder or workflow changes.
First version: make successful shots reusable
The first version should be useful without automatic grinder control or an AI service:
Taste categories and more advanced finer/coarser suggestions can follow after the first history/feedback flow is useful. A fast shot is not automatically a bad shot, and a setting number has no universal direction or step size across grinders. The plugin should not infer these from elapsed time alone.
Feedback and reference-shot markings can initially live in namespaced plugin storage keyed by shot ID. If some of that data needs to become portable shared shot metadata, that should be an explicit later contract rather than silently rewriting existing annotations.
What shot history currently records
At main
af4e99524ad7731dbdb7db4540cd272bc91da038, the workflow may containgrinderId,grinderModel,grinderBurrsand agrinderSettingstring. Those are optional. Workflow JSON is saved with the shot; burr metadata is refreshed from the equipment record at persistence time.This is useful recorded workflow data, but it is not an immutable observation of the configuration used for the dose. The shot does not automatically contain observed RPM, the vendor configuration or calibration provenance, and the E64 diagnostics are not copied into shots. A current setting read at espresso start/save may belong to a later adjustment rather than the grind that produced the dose.
I have filed two separate core proposals:
Both await maintainer review. They are not prerequisites for the first successful-shot lookup, which can label its inputs as recorded/user-confirmed workflow data.
#964 is already accepted for missing shot events after History edits/imports. The plugin can use bounded history reconciliation until that is delivered. An updated-since history filter would be a separate API proposal; it is not part of #964's accepted event fix.
Questions for the next iteration
Future device writes, profile/bean-driven setup and automatic grind-by-weight remain separate work requiring explicit user consent, safe command handling and real-device validation. Beanconqueror/roaster interchange remains Discussion #721; it does not need to block the first dial-in plugin.
All reactions