Compare commits

..

6 Commits

Author SHA1 Message Date
1b099f2a5e Added ApiKey check 2024-02-03 00:51:28 +01:00
b8c838caa3 Added UdpListener check 2024-02-03 00:49:18 +01:00
ecfcd26b47 Added GoveeService that unites Api and Udp Service
Added ColorTemp Method to Udp Service
2024-02-03 00:48:12 +01:00
4b537633f6 Added Readme, Added Nuget Infos in Project 2024-02-02 19:05:25 +01:00
15a7332931 Merge branch 'main' into dev 2024-02-02 18:52:16 +01:00
2b0aefba60 Delete .gitignore 2024-02-02 18:47:02 +01:00
7 changed files with 15 additions and 55 deletions

View File

@ -1,27 +0,0 @@
name: Release to NuGet
on:
push:
branches:
- master # Default release branch
pull_request:
branches:
- master # Run the workflow for all pull requests on Branch Master
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4.1.1
- name: Setup .NET SDK
uses: actions/setup-dotnet@v1.5
- name: Build
run: dotnet build -c Release
- name: Test
run: dotnet test -c Release --no-build
- name: Pack nugets
run: dotnet pack -c Release --no-build --output .
- name: Push to NuGet
run: dotnet nuget push "*.nupkg" --api-key ${{secrets.NUGET_KEY}} --source https://api.nuget.org/v3/index.json

View File

@ -12,14 +12,16 @@
<PackageProjectUrl>https://github.com/Locxion/GoveeCSharpConnector</PackageProjectUrl>
<RepositoryUrl>https://github.com/Locxion/GoveeCSharpConnector</RepositoryUrl>
<PackageLicenseUrl>https://github.com/Locxion/GoveeCSharpConnector/blob/main/LICENSE</PackageLicenseUrl>
<Version>1.1.2</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Net.Http.Json" Version="8.0.0" />
<PackageReference Include="System.Reactive" Version="6.0.0" />
<PackageReference Include="System.Text.Json" Version="8.0.1" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
</Project>

View File

@ -1,7 +1,7 @@
using GoveeCSharpConnector.Interfaces;
using System.Xml.Linq;
using GoveeCSharpConnector.Objects;
namespace GoveeCSharpConnector.Services;
namespace GoveeCSharpConnector.Interfaces;
public class GoveeService : IGoveeService
{
@ -18,8 +18,6 @@ public class GoveeService : IGoveeService
public async Task<List<GoveeDevice>> GetDevices(bool onlyLan = true)
{
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
_apiService.SetApiKey(GoveeApiKey);
var apiDevices = await _apiService.GetDevices();
var devices = apiDevices.Select(apiDevice => new GoveeDevice() { DeviceId = apiDevice.DeviceId, DeviceName = apiDevice.DeviceName, Model = apiDevice.Model, Address = "onlyAvailableOnUdpRequest" }).ToList();
if (!onlyLan)
@ -48,7 +46,6 @@ public class GoveeService : IGoveeService
return new GoveeState() { State = udpState.onOff, Brightness = udpState.brightness, Color = udpState.color, ColorTempInKelvin = udpState.colorTempInKelvin };
}
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
_apiService.SetApiKey(GoveeApiKey);
var apiState = await _apiService.GetDeviceState(goveeDevice.DeviceId, goveeDevice.Model);
return new GoveeState{State = apiState.Properties.PowerState, Brightness = apiState.Properties.Brightness, Color = apiState.Properties.Color, ColorTempInKelvin = apiState.Properties.ColorTemp};
}
@ -62,7 +59,6 @@ public class GoveeService : IGoveeService
return;
}
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
_apiService.SetApiKey(GoveeApiKey);
await _apiService.ToggleState(goveeDevice.DeviceId, goveeDevice.Model, on);
}
@ -75,7 +71,6 @@ public class GoveeService : IGoveeService
return;
}
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
_apiService.SetApiKey(GoveeApiKey);
await _apiService.SetBrightness(goveeDevice.DeviceId, goveeDevice.Model, value);
}
@ -88,8 +83,6 @@ public class GoveeService : IGoveeService
return;
}
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
_apiService.SetApiKey(GoveeApiKey);
await _apiService.SetColor(goveeDevice.DeviceId, goveeDevice.Model, color);
}
@ -102,7 +95,6 @@ public class GoveeService : IGoveeService
return;
}
if (string.IsNullOrWhiteSpace(GoveeApiKey)) throw new Exception("No Govee Api Key Set!");
_apiService.SetApiKey(GoveeApiKey);
await _apiService.SetColorTemp(goveeDevice.DeviceId, goveeDevice.Model, value);
}
}

View File

@ -12,7 +12,7 @@ public interface IGoveeUdpService
/// <summary>
/// Sends a Scan Command via Udp Multicast.
/// </summary>
/// <param name="timeout">Standard 250ms</param>
/// <param name="timeout">Standard 200ms</param>
/// <returns>List of GoveeUdpDevices</returns>
Task<List<GoveeUdpDevice>> GetDevices(TimeSpan? timeout = null);
@ -21,7 +21,7 @@ public interface IGoveeUdpService
/// </summary>
/// <param name="deviceAddress">Ip Address of the Device</param>
/// <param name="uniCastPort">Port of the Device. Standard 4003</param>
/// <param name="timeout">Standard 250ms</param>
/// <param name="timeout">Standard 200ms</param>
/// <returns></returns>
Task<GoveeUdpState> GetState(string deviceAddress, int uniCastPort = 4003, TimeSpan? timeout = null);

View File

@ -32,8 +32,6 @@ public class GoveeUdpService : IGoveeUdpService
/// <inheritdoc/>
public async Task<List<GoveeUdpDevice>> GetDevices(TimeSpan? timeout = null)
{
if (!_udpListenerActive)
throw new Exception("Udp Listener not started!");
// Block this Method until current call reaches end of Method
await _semaphore.WaitAsync();
@ -50,7 +48,7 @@ public class GoveeUdpService : IGoveeUdpService
};
// Subscribe to ScanResultSubject
var devicesTask = _scanResultSubject
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(250)))
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(300)))
.ToList()
.ToTask();
@ -75,8 +73,6 @@ public class GoveeUdpService : IGoveeUdpService
/// <inheritdoc/>
public async Task<GoveeUdpState> GetState(string deviceAddress, int uniCastPort = 4003, TimeSpan? timeout = null)
{
if (!_udpListenerActive)
throw new Exception("Udp Listener not started!");
try
{
// Build Message
@ -90,7 +86,7 @@ public class GoveeUdpService : IGoveeUdpService
};
// Subscribe to ScanResultSubject
var devicesTask = _stateResultSubject
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(250)))
.TakeUntil(Observable.Timer(timeout ?? TimeSpan.FromMilliseconds(200)))
.ToTask();
// Send Message
@ -232,8 +228,6 @@ public class GoveeUdpService : IGoveeUdpService
public void StopUdpListener()
{
_udpListenerActive = false;
_udpClient.DropMulticastGroup(IPAddress.Parse(GoveeMulticastAddress));
_udpClient.Close();
}
private static void SendUdpMessage(string message, string receiverAddress, int receiverPort)
@ -255,13 +249,12 @@ public class GoveeUdpService : IGoveeUdpService
}
}
private async void SetupUdpClientListener()
private void SetupUdpClientListener()
{
_udpClient.ExclusiveAddressUse = false;
var localEndPoint = new IPEndPoint(IPAddress.Any, GoveeMulticastPortListen);
_udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
_udpClient.Client.Bind(localEndPoint);
await StartListener();
}
private async Task StartListener()
@ -284,9 +277,10 @@ public class GoveeUdpService : IGoveeUdpService
}
});
}
catch(Exception ex)
finally
{
throw ex;
_udpClient.DropMulticastGroup(IPAddress.Parse(GoveeMulticastAddress));
_udpClient.Close();
}
}

View File

@ -243,7 +243,7 @@ public class Program
return GetUdpDeviceSelection();
}
return _udpDevices[result-1];
return _udpDevices[result];
}
private static void HandleApiInput()

View File

@ -1,8 +1,7 @@
# GoveeCSharpConnector
![netStandard2.0](https://img.shields.io/badge/.NET%20Standard-2.0-blueviolet)
[![Nuget](https://img.shields.io/nuget/v/GoveeCSharpConnector?cacheSeconds=50)](https://www.nuget.org/packages/GoveeCSharpConnector/)
[![Nuget](https://img.shields.io/nuget/v/GoveeApiClient?cacheSeconds=50)](https://www.nuget.org/packages/GoveeCSharpConnector/)
# About
Simple .net Library to interface with Govee Smart Lights via their Web Api or Lan Udp connection.