Skip to content

Releases

v1.0.0-beta.2

v1.0.0-beta.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 09 Nov 08:52
ca4a1db

Important

This is a prerelease. It is meant to be tried, and its public API can still change before the stable release. A plain dotnet add package YeelightClient keeps installing the latest stable version.

A prerelease for trying out, like 1.0.0-beta.1, with one change: the library now targets .NET 10 only. Everything in 1.0.0-beta.1 (below) is in this version too. Its
public API can still change before 1.0.0, so report what you find in an issue. A prerelease is not installed by a plain
dotnet add package YeelightClient: use dotnet add package YeelightClient --version 1.0.0-beta.2 (or --prerelease for the newest prerelease).

Changed

  • The library targets net10.0 only, the current LTS release of .NET (supported until November 2028). net8.0 is gone: .NET 8 reaches the end of its support on
    10 November 2026, and a new library has no reason to carry it. An application that targets .NET 8 or .NET 9 cannot use this version; it can stay on 1.0.0-beta.1
    (net8.0 and net10.0). An application on .NET 11 or a later version uses it as it is.
  • The package asks for Microsoft.Extensions.Logging.Abstractions 10.0.0, and no longer for 8.0.0. NuGet restores the lowest version that is asked for, so an application
    that asks for nothing else now gets the logging abstractions that match its runtime, and not the 8.x line, which is out of support from November 2026.
  • The connection to a light uses an IPv4 socket when the light is given by its address. A light is an IPv4 device (the client already only believed, searched and
    listened on IPv4), and the socket that .NET makes by default takes both IPv4 and IPv6 and connects to an IPv4 address through its IPv6 side: on a computer with software that
    watches IPv6 that takes about ten times as long (25 ms against 2 ms for a connection to the same computer on one, and more with several at once).

Install

dotnet add package YeelightClient --version 1.0.0-beta.2

YeelightClient 1.0.0-beta.2 on NuGet | Documentation | CHANGELOG

Assets

File What it is
YeelightClient.1.0.0-beta.2.nupkg The package: the exact file that was pushed to nuget.org and to GitHub Packages.
YeelightClient.TestApp-1.0.0-beta.2-win-x64.zip The Yeelight Client test app. Unzip it and start YeelightClient.TestApp.exe. It is self-contained (nothing else has to be installed), built for Windows 10 version 1809 and later, x64. It is not code signed, so Windows may warn that the publisher is unknown; compare the checksum below.
YeelightClient.1.0.0-beta.2.intoto.jsonl The build provenance attestation of the files above and of the library in the package (a Sigstore bundle). With it the files can be checked without asking GitHub for the attestation, see Verify.

SHA-256:

1a43f8488372974215aa91d611cff8e3fceeade8a8ec7a9275cabbfa05dbc860  YeelightClient.1.0.0-beta.2.nupkg
47a40d76a12a1e0e416ebb9d3d57e377d5a9d9b15d6d5c82e4dc481ddcab6620  YeelightClient.TestApp-1.0.0-beta.2-win-x64.zip
95357af463fdd10f4ba4126c50d80410b1290bcd8d26b9efca73b93970503301  YeelightClient.1.0.0-beta.2.intoto.jsonl

Verify

The files above, and the library inside the package, have a signed build provenance attestation: GitHub states that the publish.yml workflow of this repository made them, from the commit of this release, on a GitHub-hosted runner. Check one with the GitHub CLI:

gh attestation verify YeelightClient.1.0.0-beta.2.nupkg --repo tinodo/yeelightclient --signer-workflow tinodo/yeelightclient/.github/workflows/publish.yml --source-ref refs/tags/v1.0.0-beta.2

The attestation is also a file of this release, YeelightClient.1.0.0-beta.2.intoto.jsonl. With it the command does not ask GitHub for the attestation (it still fetches the keys that check the signature):

gh attestation verify YeelightClient.1.0.0-beta.2.nupkg --bundle YeelightClient.1.0.0-beta.2.intoto.jsonl --repo tinodo/yeelightclient --signer-workflow tinodo/yeelightclient/.github/workflows/publish.yml --source-ref refs/tags/v1.0.0-beta.2

nuget.org signs the package that it serves, so the .nupkg from nuget.org is not byte for byte the file above. To check the library that you use, run the same command on the DLL in your NuGet cache: ~/.nuget/packages/yeelightclient/1.0.0-beta.2/lib/net10.0/YeelightClient.dll.

Found a problem? Please report it in an issue.

v1.0.0-beta.1

v1.0.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Nov 07:38
2223d8e

Important

This is a prerelease. It is meant to be tried, and its public API can still change before the stable release. A plain dotnet add package YeelightClient keeps installing the latest stable version.

The first release of Yeelight Client, a prerelease for trying out: a complete .NET client for Yeelight smart lights, with the whole of the
Yeelight WiFi Light Inter-Operation Specification behind typed, async C#. Its public API
can still change before 1.0.0, so report what you find in an issue. A prerelease is not installed by a plain
dotnet add package YeelightClient: use dotnet add package YeelightClient --version 1.0.0-beta.1 (or --prerelease for the newest prerelease). The GitHub release of
this version has the package, the test app and the attestation of where the files come from as downloads.

Added

  • Finding lights, which works on networks where one method alone does not: a search is sent to the multicast group of the lights and as a broadcast, three
    times, from every network that the computer is on (some lights never hear the multicast group, and answer the broadcast), the announcements that the lights send by
    themselves are listened to, and one address can be asked directly (also across a VPN or on another subnet). YeelightClient has StartDiscovery, StopDiscovery,
    SearchNow, StartListening, StopListening, DiscoverAsync, ProbeAsync, FindDevice, WaitForDeviceAsync and RemoveDeviceAsync. When the network addresses
    of the computer change (Wi-Fi comes and goes, a VPN connects) the sockets are made again. A message is only believed when the address in it is the address that it
    came from and it is on a local network, a light that is connected is not moved to another address by an announcement, and a client keeps at most
    YeelightClientOptions.MaxDevices lights (the protocol has no authentication: use it on a network that you trust).
  • Every method of the specification as a typed command that takes a CancellationToken: power (with a transition and a mode), toggle, brightness, colour
    temperature, RGB (as three numbers or a Color), HSV, saving the state as the default, colour flows (ColorFlow, ColorFlowStep), scenes (YeelightScene), adjusting
    without knowing the current value (AdjustAsync and the three percentage commands), the name, a sleep timer, get_prop, and the background light of a device that has one
    (device.Background, the same commands). SendCommandAsync sends anything else, as it is. An argument that a light would refuse is refused before anything is sent, a
    method that a light does not list is refused with a NotSupportedException, and a command that did not succeed throws a YeelightException that says whether the light
    refused it or the way to it failed (YeelightFailureKind).
  • A state that follows the light. A light reports every change to the connections that it has, and the client reads all its properties when a connection is made, so the
    properties of a YeelightDevice (and of its background light) are what the light says, whoever changes it. INotifyPropertyChanged, YeelightClient.DeviceStateChanged and
    YeelightClient.DeviceDiscovered tell about changes, raised by a dispatcher of the client: one at a time, in order, never on the thread that reads from a light (a change
    of a property that is still waiting when the same property changes again is raised once, so a slow handler cannot make the queue grow).
  • Music mode (StartMusicModeAsync, YeelightMusicSession): the client listens, tells the light where, accepts only the connection of the light itself, and sends commands
    over it without the limit of 60 a minute.
  • A connection that holds up: one connection per light that is made again with a wait that grows, commands that fail at once when the connection is lost, a keep-alive that
    finds a half open connection, a limit of 60 commands a minute that makes a command wait for its turn, and a connection that follows a light to its new address.
  • Logging to an ILogger<YeelightClient>: every message that is sent and received at the debug level, connections and searches at the information level.
  • YeelightClient.TestApp, a WinUI 3 application to try every command by hand against real lights or against lights that it simulates, to watch the events and the
    wire, and to explore the protocol. It is a download of the release.
  • A package that is one assembly (net8.0 and net10.0) with its XML documentation, the README, the license and an icon, a symbol package with Source Link, and a build
    provenance attestation that is also a file of the release. The library is compatible with trimming and native AOT.
  • A documentation site, tinodo.github.io/yeelightclient, with guides and an API reference.
  • Tests against a simulated light on the loopback (no test sends a packet to the real network), of the exact messages of every command, of what a hostile network
    neighbour can send, property-based and fuzz tests, a chaos test that cuts the connection at random, and the project's own tooling.

Install

dotnet add package YeelightClient --version 1.0.0-beta.1

YeelightClient 1.0.0-beta.1 on NuGet | Documentation | CHANGELOG

Assets

File What it is
YeelightClient.1.0.0-beta.1.nupkg The package: the exact file that was pushed to nuget.org and to GitHub Packages.
YeelightClient.TestApp-1.0.0-beta.1-win-x64.zip The Yeelight Client test app. Unzip it and start YeelightClient.TestApp.exe. It is self-contained (nothing else has to be installed), built for Windows 10 version 1809 and later, x64. It is not code signed, so Windows may warn that the publisher is unknown; compare the checksum below.
YeelightClient.1.0.0-beta.1.intoto.jsonl The build provenance attestation of the files above and of the libraries in the package (a Sigstore bundle). With it the files can be checked without asking GitHub for the attestation, see Verify.

SHA-256:

1ed0d2e07295130da173a5950c49bbe08af993ce80b5a7f943984aea5b74c583  YeelightClient.1.0.0-beta.1.nupkg
9bce9bd060be4759956b54e2101702b5fb10016d34aa8759c8f8fa5a9797e9c5  YeelightClient.TestApp-1.0.0-beta.1-win-x64.zip
93222bb3698c58e7a073487670f328f4f0e5821750bd755984ac292ebebf54c1  YeelightClient.1.0.0-beta.1.intoto.jsonl

Verify

The files above, and the libraries inside the package, have a signed build provenance attestation: GitHub states that the publish.yml workflow of this repository made them, from the commit of this release, on a GitHub-hosted runner. Check one with the GitHub CLI:

gh attestation verify YeelightClient.1.0.0-beta.1.nupkg --repo tinodo/yeelightclient --signer-workflow tinodo/yeelightclient/.github/workflows/publish.yml --source-ref refs/tags/v1.0.0-beta.1

The attestation is also a file of this release, YeelightClient.1.0.0-beta.1.intoto.jsonl. With it the command does not ask GitHub for the attestation (it still fetches the keys that check the signature):

gh attestation verify YeelightClient.1.0.0-beta.1.nupkg --bundle YeelightClient.1.0.0-beta.1.intoto.jsonl --repo tinodo/yeelightclient --signer-workflow tinodo/yeelightclient/.github/workflows/publish.yml --source-ref refs/tags/v1.0.0-beta.1

nuget.org signs the package that it serves, so the .nupkg from nuget.org is not byte for byte the file above. To check the library that you use, run the same command on the DLL in your NuGet cache: ~/.nuget/packages/yeelightclient/1.0.0-beta.1/lib/net8.0/YeelightClient.dll.

Found a problem? Please report it in an issue.