Skip to content

Releases

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 20:17
9790aad

☕ Like this project? GitHub Sponsors · Ko-fi · Buy Me a Coffee


Added

  • HmIP-BDT-I. The wall dimmer with an extra input on channel 3
    (MULTI_MODE_INPUT_TRANSMITTER) has 8 channels instead of the
    HmIP-BDT's 7, so its dimmer channels sit one higher (transmitter 4,
    virtual receivers 5-7, week profile 8). Data from a device export.

Security

  • Built with Go 1.27.3, which fixes GO-2026-6809 (crypto/x509).
    go.mod targets Go 1.27.3, so a consumer module has to be on Go
    1.27.3 or newer.

v0.10.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 12:09
d77398b

Fixed

  • An HmIP ENUM written by its label is stored as that label's slot.
    A parameter whose MIN is a string (the HmIP-BSL's COLOR: BLACK …
    WHITE) is string-based, and clients write the VALUE_LIST entry
    itself — aiohomematic's _enum_value_is_index rule, openccu-loom's
    EnumWireValue. The simulator converted every label numerically and
    silently stored 0, the first slot, so a COLOR=GREEN write became
    BLACK and a test reading the CCU side could not tell a landed write
    from a dropped one. The label now becomes its index in the stored
    paramset (the value the CCU reports back) and a label outside the
    VALUE_LIST is refused as an invalid value. Index writes are unchanged.

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 05:56
23ba299

Added

  • 2-channel HB-LC-Bl1-Velux. The AskSin firmware of this homebrew
    Velux actuator builds as a 1- or a 2-channel device under the same
    TYPE. The 2-channel variant (two BLIND channels) is added as
    HB-LC-Bl1-Velux-2ch.json next to the existing 1-channel file; the
    device keeps reporting HB-LC-Bl1-Velux. The filename is only the
    catalogue key, so pass HB-LC-Bl1-Velux-2ch to restrict a run to
    this variant. Data from a device export
    (SukramJ/aiohomematic#3447).

Security

  • Built with Go 1.27.2, which fixes Go standard-library vulnerabilities
    (net/http and HTTP/2, crypto/tls, net/textproto, html/template).
    golangci-lint v2.14.0 (reads Go 1.27.2's export data).

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 10:23
175931e

Changed

  • BREAKING (pkg/litefake): heating groups answer members the way
    an openccu-lite box does. members, former_members and
    devices_to_configure are objects ({id, serial, type}) instead of
    bare ids; a create and an update answer the group's detail plus the
    members as devices_to_configure; the detail carries
    device_name as <name> <device>, every offered type as
    {id, label} and no type_label; the type labels are the box's
    (Heating_Control, HmIP-Heizungssteuerung). The candidates of a
    group type are seeded with the new Options.GroupCandidates; a
    member that is no candidate is dropped without an error, as on a
    box, and a channel that belongs to a group is listed as leftover.
    A test that created a group with an arbitrary member id now has to
    seed that id as a candidate. Read and written on a box on
    2026-10-03; CONTRACT.md records the observations.

  • Requires Go 1.27.1. go.mod targets Go 1.27.1 and CI and release
    builds use it, the same patch release openccu-loom builds with.

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 13:51
eef7894

godevccu is now the reference implementation and maintains its own
device data. pydevccu is archived; no behaviour or data is taken from
it any more.

Changed

  • BREAKING: Homegear-mode getVersion reports godevccu-<version>
    instead of pydevccu-0.2.0, and hmconst.PydevccuVersion is removed.
    Clients that detect the simulator by the pydevccu substring must
    look for godevccu.
  • Documentation describes godevccu as the reference implementation;
    pydevccu is only named as the origin of existing behaviour.

Removed

  • make data and script/copy_data.sh: the device and paramset
    descriptions in internal/embed/data/ are maintained in this
    repository. Add a device in the format of Homematic(IP) Local's
    export_device_definition ZIP.

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 03:31
62b78a3

Changed

  • Requires Go 1.27. go.mod targets Go 1.27 and CI builds with it;
    a consumer module has to be on Go 1.27 or newer. golangci-lint is now
    installed from source in CI, because the prebuilt binary is built with
    an older Go and refuses a module that targets a newer one.

Fixed

  • litefake: a refused login answers like the box. POST /api/auth/v1/login
    with an unknown user or a wrong password now answers
    401 {"error":"invalid-credentials","message":"invalid credentials"} — the
    answer observed on a real openccu-lite box (1.0.0-dev.32), identical for both
    cases. litefake answered the generic route error unauthenticated, so a client
    could not be tested against telling a refused login apart from a missing
    session. The contract records it (CONTRACT §A.2).

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 09:54
e483a59

Added

  • CLI: -devices restricts the loaded device types outside lite mode
    (the library already had Config.Devices).

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 08:49
b870ee2

Scenario API and interface-process behaviours modelled on
hm-simulator by Sebastian
Raff (MIT) — thanks for documenting what rfd and hmipserver actually
answer. Every behaviour below that concerns the CCU comes from that
documentation and was not measured for godevccu; DOCUMENTATION.md
lists the source of each.

Added

  • Fault injection: VirtualCCU.InjectFault(iface, FaultRule) makes
    the next calls of a method answer a fault, answer late, never answer,
    or close the connection — on XML-RPC, its TLS twin and BIN-RPC alike;
    ClearFaults drops the rules and releases held calls.
  • Interface restarts: DropConnection, StopInterface,
    StartInterface(iface, forgetClients) and RestartInterface stop an
    interface process (its port refuses connections) and bring it back on
    the same port, forgetting its clients or calling them back
    (system.listMethods on BidCos, then listDevices).
  • Introspection: WriteLog (every client setValue/putParamset
    over XML-RPC, BIN-RPC and JSON-RPC, with rejected parameters and the
    fault) and CallbackLog (every call to a client with sent/answered
    time), ConfigPending, PoisonedChannels, Ports.
  • Control port: VirtualCCU.ControlHandler() serves the scenario
    API as POST /scenario/<call>; the CLI exposes it with
    -control-port. -ports-json <file|-> writes the bound ports once
    every server listens; port 0 now lets the system pick; -realism
    and -interfaces Name=port,… reach the realism preset and the
    separate interface listeners from the command line.
  • Realism fields: InitSemantics (init keyed by exact url,
    deleteDevices before newDevices, VERSION diff, HmIP resend),
    MasterModel (rfd's and hmipserver's MASTER write models with sticky
    and queued CONFIG_PENDING and poisoned channels), InterfaceQuirks
    (no PONG from hmipserver, derived getServiceMessages with rfd's
    "", SENDER_BROKEN on rfd's unfiltered getLinks, rfd's metadata
    faults) — all three part of RealismCCU() — and
    ServiceMessagesFault, which stays out of the preset.

Fixed

  • Re-registering or removing a client now stops its batched-event
    dispatcher; before, a client re-registered under the same interface id
    with a new url kept receiving batched events at the old url.

Changed

  • Persisted init registrations (PersistInit) are written as a list of
    {interface_id, url}; the earlier map format is still read.
  • The Realism.FaultCodes doc comment listed codes that did not match
    internal/ccu/faults.go; it now names −2/−3/−5 as implemented.

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 06:57
1037d6f

Added

  • pkg/litefake models the box's auth mode off (CONTRACT.md §A.2,
    expanded from the openccu-lite security documentation):
    Options.AuthOff and the knob Fake.SetAuthOff make
    GET /api/auth/v1/state answer every caller — any credential or
    none — with the fixed anonymous administrator session object
    carrying auth_off: true. Its identifier strings come from
    Options.AuthOffAccount / Options.AuthOffSID (defaults
    DefaultAuthOffAccount, DefaultAuthOffSID): litefake placeholders,
    since the contract does not fix the real box's values. Only the state
    answer is modelled; route authorization is unchanged, and the
    normal-mode answers carry no auth_off member.

Fixed

  • pkg/litefake mints session ids in the box's shape — 26 characters
    of uppercase A-Z2-7 (CONTRACT.md §A.2, per the openccu-lite
    documentation). They were lowercased before, so a downstream
    shape check refused every litefake-minted id; caught by
    OpenCCU-Loom's box-shell SSO conformance test on its first run.

Changed

  • README and DOCUMENTATION list LITE as the fourth backend mode: the
    fake openccu-lite box pkg/litefake serves, with its topology, its
    API surfaces, the CLI/library entry points and the CONTRACT.md
    provenance spelled out.

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 15:48

Added

  • pkg/litefake — a fake openccu-lite box. occulited's HTTP API
    (token auth with method tiers, the XML-RPC proxy with its verbatim
    init refusal, the SSE event stream with resume/filters/resync and
    stream limits, /state, metadata, system, pairing, UPnP), composed
    on top of per-interface simulator listeners the way occulited sits on
    a real box's interface processes. Moved here from OpenCCU-Loom's test
    harness (tests/harness/litefake) so any client can use it; written
    from the condensed wire contract in pkg/litefake/CONTRACT.md. That
    contract is pre-1.0, so the package may change in minor releases.
  • -mode lite on the CLI: serve the fake box standalone on a fixed
    address (-lite-listen, default :2121), loading every embedded
    device type
    by default; -lite-devices restricts the fleet,
    -lite-tokens, -lite-interfaces and -lite-tls steer auth,
    topology and transport.
  • litefake.Options.ListenAddr: bind the box API to a fixed
    address; empty keeps the loopback-ephemeral in-process test default.