Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions Api/.NET API.csproj
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFrameworks>net9.0;net10.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AssemblyName>KoenZomers.Tado.Api</AssemblyName>
<RootNamespace>KoenZomers.Tado.Api</RootNamespace>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.6.0.0</Version>
<Version>0.7.0.0</Version>
<Authors>Koen Zomers</Authors>
<Description>API in .NET 9 to communicate with a Tado home heating/cooling system</Description>
<Description>API in .NET9 and .NET10 to communicate with a Tado home heating/cooling system</Description>
<PackageProjectUrl>https://github.com/KoenZomers/TadoApi</PackageProjectUrl>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\KoenZomers.Tado.Api.snk</AssemblyOriginatorKeyFile>
<PackageReleaseNotes>- Switched to .NET 9 and updated to use new device code grant flow</PackageReleaseNotes>
<PackageReleaseNotes>- Added target .NET10 and improved new device code grant flow with cancellation tokens</PackageReleaseNotes>
<PackageLicenseUrl></PackageLicenseUrl>
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<PackageReadmeFile>README.md</PackageReadmeFile>
Expand All @@ -30,12 +30,12 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="10.0.0" />
</ItemGroup>

</Project>
107 changes: 70 additions & 37 deletions Api/Controllers/Http.cs

Large diffs are not rendered by default.

421 changes: 256 additions & 165 deletions Api/Controllers/Tado.cs

Large diffs are not rendered by default.

90 changes: 44 additions & 46 deletions Api/Converters/DeviceTypeConverter.cs
Original file line number Diff line number Diff line change
@@ -1,57 +1,55 @@
using System;
using System.Text.Json;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace KoenZomers.Tado.Api.Converters
namespace KoenZomers.Tado.Api.Converters;

/// <summary>
/// Converts the Tado device type returned by the Tado API to the DeviceTypes enumerator in this project
/// </summary>
public class DeviceTypeConverter : JsonConverter<Enums.DeviceTypes?>
{
/// <summary>
/// Converts the Tado device type returned by the Tado API to the DeviceTypes enumerator in this project
/// </summary>
public class DeviceTypeConverter : JsonConverter<Enums.DeviceTypes?>
public override Enums.DeviceTypes? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
public override Enums.DeviceTypes? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
if (reader.TokenType != JsonTokenType.String)
{
return null;
}

var enumString = reader.GetString();
if (string.IsNullOrEmpty(enumString))
{
if (reader.TokenType != JsonTokenType.String)
{
return null;
}

var enumString = reader.GetString();
if (string.IsNullOrEmpty(enumString))
{
return null;
}

return enumString switch
{
"HEATING" => Enums.DeviceTypes.Heating,
"HOT_WATER" => Enums.DeviceTypes.HotWater,
_ => null
};
return null;
}

public override void Write(Utf8JsonWriter writer, Enums.DeviceTypes? value, JsonSerializerOptions options)
return enumString switch
{
if (value == null)
{
"HEATING" => Enums.DeviceTypes.Heating,
"HOT_WATER" => Enums.DeviceTypes.HotWater,
_ => null
};
}

public override void Write(Utf8JsonWriter writer, Enums.DeviceTypes? value, JsonSerializerOptions options)
{
if (value == null)
{
writer.WriteNullValue();
return;
}

switch (value)
{
case Enums.DeviceTypes.Heating:
writer.WriteStringValue("HEATING");
break;

case Enums.DeviceTypes.HotWater:
writer.WriteStringValue("HOT_WATER");
break;

default:
writer.WriteNullValue();
return;
}

switch (value)
{
case Enums.DeviceTypes.Heating:
writer.WriteStringValue("HEATING");
break;

case Enums.DeviceTypes.HotWater:
writer.WriteStringValue("HOT_WATER");
break;

default:
writer.WriteNullValue();
break;
}
break;
}
}
}
}
98 changes: 48 additions & 50 deletions Api/Converters/DurationModeConverter.cs
Original file line number Diff line number Diff line change
@@ -1,62 +1,60 @@
using System;
using System.Text.Json;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace KoenZomers.Tado.Api.Converters
namespace KoenZomers.Tado.Api.Converters;

/// <summary>
/// Converts the duration mode type returned by the Tado API to the DurationModes enumerator in this project
/// </summary>
public class DurationModeConverter : JsonConverter<Enums.DurationModes?>
{
/// <summary>
/// Converts the duration mode type returned by the Tado API to the DurationModes enumerator in this project
/// </summary>
public class DurationModeConverter : JsonConverter<Enums.DurationModes?>
public override Enums.DurationModes? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.String)
{
return null;
}

var enumString = reader.GetString();
if (string.IsNullOrEmpty(enumString))
{
return null;
}

return enumString switch
{
"MANUAL" => Enums.DurationModes.UntilNextManualChange,
"TADO_MODE" => Enums.DurationModes.UntilNextTimedEvent,
"TIMER" => Enums.DurationModes.Timer,
_ => null
};
}

public override void Write(Utf8JsonWriter writer, Enums.DurationModes? value, JsonSerializerOptions options)
{
public override Enums.DurationModes? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
if (value == null)
{
if (reader.TokenType != JsonTokenType.String)
{
return null;
}

var enumString = reader.GetString();
if (string.IsNullOrEmpty(enumString))
{
return null;
}

return enumString switch
{
"MANUAL" => Enums.DurationModes.UntilNextManualChange,
"TADO_MODE" => Enums.DurationModes.UntilNextTimedEvent,
"TIMER" => Enums.DurationModes.Timer,
_ => null
};
writer.WriteNullValue();
return;
}

public override void Write(Utf8JsonWriter writer, Enums.DurationModes? value, JsonSerializerOptions options)
switch (value)
{
if (value == null)
{
case Enums.DurationModes.UntilNextManualChange:
writer.WriteStringValue("MANUAL");
break;

case Enums.DurationModes.UntilNextTimedEvent:
writer.WriteStringValue("TADO_MODE");
break;

case Enums.DurationModes.Timer:
writer.WriteStringValue("TIMER");
break;

default:
writer.WriteNullValue();
return;
}

switch (value)
{
case Enums.DurationModes.UntilNextManualChange:
writer.WriteStringValue("MANUAL");
break;

case Enums.DurationModes.UntilNextTimedEvent:
writer.WriteStringValue("TADO_MODE");
break;

case Enums.DurationModes.Timer:
writer.WriteStringValue("TIMER");
break;

default:
writer.WriteNullValue();
break;
}
break;
}
}
}
88 changes: 43 additions & 45 deletions Api/Converters/PowerStatesConverter.cs
Original file line number Diff line number Diff line change
@@ -1,57 +1,55 @@
using System;
using System.Text.Json;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace KoenZomers.Tado.Api.Converters
namespace KoenZomers.Tado.Api.Converters;

/// <summary>
/// Converts the power state returned by the Tado API to the PowerStates enumerator in this project
/// </summary>
public class PowerStatesConverter : JsonConverter<Enums.PowerStates?>
{
/// <summary>
/// Converts the power state returned by the Tado API to the PowerStates enumerator in this project
/// </summary>
public class PowerStatesConverter : JsonConverter<Enums.PowerStates?>
public override Enums.PowerStates? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
public override Enums.PowerStates? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
if (reader.TokenType != JsonTokenType.String)
{
return null;
}

var enumString = reader.GetString();
if (string.IsNullOrEmpty(enumString))
{
if (reader.TokenType != JsonTokenType.String)
{
return null;
}

var enumString = reader.GetString();
if (string.IsNullOrEmpty(enumString))
{
return null;
}

return enumString switch
{
"ON" => Enums.PowerStates.On,
"OFF" => Enums.PowerStates.Off,
_ => null
};
return null;
}

public override void Write(Utf8JsonWriter writer, Enums.PowerStates? value, JsonSerializerOptions options)
return enumString switch
{
if (value == null)
{
"ON" => Enums.PowerStates.On,
"OFF" => Enums.PowerStates.Off,
_ => null
};
}

public override void Write(Utf8JsonWriter writer, Enums.PowerStates? value, JsonSerializerOptions options)
{
if (value == null)
{
writer.WriteNullValue();
return;
}

switch (value)
{
case Enums.PowerStates.On:
writer.WriteStringValue("ON");
break;

case Enums.PowerStates.Off:
writer.WriteStringValue("OFF");
break;

default:
writer.WriteNullValue();
return;
}

switch (value)
{
case Enums.PowerStates.On:
writer.WriteStringValue("ON");
break;

case Enums.PowerStates.Off:
writer.WriteStringValue("OFF");
break;

default:
writer.WriteNullValue();
break;
}
break;
}
}
}
27 changes: 13 additions & 14 deletions Api/Enums/DeviceTypes.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
namespace KoenZomers.Tado.Api.Enums
namespace KoenZomers.Tado.Api.Enums;

/// <summary>
/// Defines the types of Tado devices that can be switched
/// </summary>
public enum DeviceTypes : short
{
/// <summary>
/// Defines the types of Tado devices that can be switched
/// Heating
/// </summary>
public enum DeviceTypes : short
{
/// <summary>
/// Heating
/// </summary>
Heating,
Heating,

/// <summary>
/// Hot water
/// </summary>
HotWater
}
}
/// <summary>
/// Hot water
/// </summary>
HotWater
}
Loading
Loading